java icon indicating copy to clipboard operation
java copied to clipboard

Map tensorflow/c/c_api_experimental.h header file

Open saudet opened this issue 3 years ago • 7 comments
trafficstars

So that we can call goodies like TF_LoadPluggableDeviceLibrary(), see issues #409.

/cc @ashesfall

saudet avatar Jan 18 '22 01:01 saudet

Thanks @saudet , looks good, I’ve triggered a CI build before merging

karllessard avatar Jan 18 '22 13:01 karllessard

@saudet , I got a bunch of errors on Windows, any clue?

jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_SetLogicalCpuDevices
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CheckpointReaderGetVariable
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextEnableGraphCollection
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_DeleteAttrBuilder
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextOptionsSetTfrt
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ExecutorWaitForAllPendingNodes
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_InsertConfigKeyValue
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_SetXlaMinClusterSize
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_CancellationManagerStartCancel
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_MonitoringDeleteStringGauge3
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextGetExecutorForThread
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_DeleteShapeAndTypeListArray
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_SetXlaAutoJitMode
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_NewAttrBuilder
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_MonitoringDeleteStringGauge4
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_GraphDebugString
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_ImportGraphDefOptionsSetValidateColocationConstraints
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextOptionsSetTfrtDistributedRuntime
jnitensorflow.obj : error LNK2001: unresolved external symbol TFE_GetServerDef
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_CreatePackedTensorHandle
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_TensorHandleDeviceType
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_MonitoringNewStringGauge3
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CheckpointReaderGetVariableShape
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_NewCheckpointReader
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_DeleteCheckpointReader
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_NewTensorHandleFromTensor
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_AttrBuilderSetType
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CheckpointReaderSize
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_ShapeAndTypeListSetDtype
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CheckpointReaderGetTensor
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_InitMain
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_GetContextId
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_HostAddressSpace
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_ShapeAndTypeListSetShape
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_ShapeAndTypeListSetUnknownShape
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_GetExecutedOpNames
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_CancellationManagerIsCancelled
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CreateRunOptions
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_SetXlaConstantFoldingDisabled
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_NewCancellationManager
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CheckpointReaderHasTensor
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextGetFunctionDef
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_TensorHandleGetStatus
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_GetNumberAttrForOpListInput
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_DeletePluggableDeviceLibraryHandle
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CheckpointReaderGetVariableDataType
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_TensorHandleDeviceID
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ExecutorClearError
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_NewExecutor
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_SetXlaEnableLazyCompilation
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CheckpointReaderGetVariableNumDims
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_DeleteExecutor
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_SetTfXlaCpuGlobalJit
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_InferShapes
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_PickUnusedPortOrDie
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_FunctionDebugString
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_LoadPluggableDeviceLibrary
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_AttrBuilderSetTypeList
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_GetConfigKeyValue
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_AbortCollectiveOps
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_MonitoringDeleteBuckets
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_EnqueueNamedTensor
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_EnableCollectiveOps
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ExecutorIsAsync
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_DeleteCancellationManager
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_AllocateHostTensor
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_MonitoringNewExponentialBuckets
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_NewShapeAndTypeList
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_GetXlaConstantFoldingDisabled
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_MakeInternalErrorStatus
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_OpSetCancellationManager
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_CollectiveOpsCheckPeerHealth
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_MonitoringNewStringGauge4
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_DequeueNamedTensor
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextSetSoftDevicePlacement
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_DeleteConfigKeyValue
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_EnableXLACompilation
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextDisableGraphCollection
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ReportErrorToCluster
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextSetExecutorForThread
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_ContextSetLogDevicePlacement
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_CreateConfig
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_DeleteShapeAndTypeList
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_AttrBuilderCheckCanRunOnDevice
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_NewTensorHandleFromScalar
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TFE_OpReset
jnitensorflow.obj : error LNK2001: unresolved external symbol __imp_TF_OpIsStateful
jnitensorflow.dll : fatal error LNK1120: 87 unresolved externals

karllessard avatar Jan 18 '22 16:01 karllessard

Hum, it looks like the experimental APIs are not exported on Windows. I remember bumping into that previously. I suppose we can always hack the Bazel build to export them... TF Core's build seems to be using this Python script to exclude symbols, but I don't see where it's removing any of the "experimental" functions: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/def_file_filter/def_file_filter.py.tpl

Ah, yes, I remember now. The experimental APIs are not actually compiled at all by Bazel. We need to compile them separately, like this: https://github.com/tensorflow/java/blob/ae74151016b6817e2b8171f6e6611e40b65049a0/tensorflow-core/tensorflow-core-api/pom.xml#L341-L344 The problem with that though is that the experimental APIs themselves need to link with the internal API, which is not (cannot) be exported on Windows... 🤦 Why can't they just create multiple DLLs like PyTorch does it, seriously.

It does work on Linux and Mac though, but then we're alienating Windows users...

saudet avatar Jan 19 '22 00:01 saudet

If we're doing this mainly for pluggable device support then I think the only extant device is the one Apple released for macOS, so it doesn't matter too much if it's not working on Windows.

Craigacp avatar Jan 19 '22 00:01 Craigacp

Well well well, look at that, the Python binaries on PyPI do export it on Windows:

$ winedump -j export python/_pywrap_tensorflow_internal.pyd | grep TF_LoadPluggableDeviceLibrary
  0089FAB0 42047 TF_LoadPluggableDeviceLibrary

So this sounds like a bug in the C/C++ build of TF Core.

saudet avatar Jan 19 '22 04:01 saudet

I exposed a bunch of things manually as part of the custom gradients PR, you might be able to add this to this list.

rnett avatar Jan 19 '22 04:01 rnett

I exposed a bunch of things manually as part of the custom gradients PR, you might be able to add this to this list.

Thanks! But it's not the symbols, but the functions themselves that are missing. For some reason Bazel doesn't compile the experimental APIs when building libraries for the C/C++ API, but it does compile them when building for the Python API.

saudet avatar Jan 19 '22 04:01 saudet