我有一个具有多个输入和多个层的张量流模型,以及最终的softmax层 . 该模型使用Python进行训练(使用Keras框架),然后使用C程序完成保存和推理,该程序有助于构建TensorFlow的CMake(基本上遵循这些指令:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/cmake) .
在python(tensorflow-gpu)中,所有操作都使用GPU(使用 log_device_placement
):
out/MatMul: (MatMul): /job:localhost/replica:0/task:0/gpu:0
2017-12-04 14:07:38.005837: I C:\tf_jenkins\home\workspace\rel-in\M\windows-gpu\PY\35\tensorflow\core\common_runtime\simple_placer.cc:872] out/MatMul: (MatMul)/job:localhost/replica:0/task:0/gpu:0
out/BiasAdd: (BiasAdd): /job:localhost/replica:0/task:0/gpu:0
2017-12-04 14:07:38.006201: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\simple_placer.cc:872]
out/BiasAdd: (BiasAdd)/job:localhost/replica:0/task:0/gpu:0
out/Softmax: (Softmax): /job:localhost/replica:0/task:0/gpu:0
2017-12-04 14:07:38.006535: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\simple_placer.cc:872] out/Softmax: (Softmax)/job:localhost/replica:0/task:0/gpu:0
要保存图形,使用 freeze_graph
脚本(上面生成日志的脚本再次加载.pb格式的冻结图形) .
当我使用C程序并加载冻结图(紧跟https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/label_image/main.cc - ReadBinaryProto()
和 session->Create()
中的 LoadGraph()
函数),并再次记录设备放置时,我发现Softmax放在CPU上(所有其他操作都在GPU上):
dense_6/MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
dense_6/BiasAdd: (BiasAdd): /job:localhost/replica:0/task:0/device:GPU:0
dense_6/Relu: (Relu): /job:localhost/replica:0/task:0/device:GPU:0
out/MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
out/BiasAdd: (BiasAdd): /job:localhost/replica:0/task:0/device:GPU:0
out/Softmax: (Softmax): /job:localhost/replica:0/task:0/device:CPU:0
这种放置也可以通过高CPU /低GPU利用率来确认,并且通过分析应用程序也很明显 . out
图层的数据类型为 float32
( out/Softmax -> (<tf.Tensor 'out/Softmax:0' shape=(?, 1418) dtype=float32>,)
) .
进一步调查显示:
- 在C中创建softmax-op并将其放在GPU上显式抛出此错误消息:
Cannot assign a device for operation 'tsoftmax': Could not satisfy explicit device specification '/device:GPU:0' because no supported kernel for GPU devices is available.
-
对
tensorflow::LogAllRegisteredKernels()
的调用也显示Softmax仅适用于CPU! -
构建目录包含许多与“softmax”相关的文件(例如`tf_core_gpu_kernels_generated_softmax_op_gpu.cu.cc.obj.Release.cmake) . 但是,不知道如何检查每个编译步骤 .
-
当我查看"tf_core_gpu_kernels.lib"(可以用7Z打开.lib;))时,有像“
tf_core_gpu_kernels_generated_softmax_op_gpu.cu.cc.lib
”这样的文件 - 所以我相信编译内核本身并没有错 -
But :检查"tensorflow.dll"(Dependency Walker)显示只包含Softmax的CPU内核(有const
tensorflow::SoftmaxOp<struct Eigen::ThreadPoolDevice,double>
等功能,但没有GPU的功能,如const tensorflow::SoftplusGradOp<struct Eigen::GpuDevice,float>
) .
设置:Tensorflow 1.3.0,Windows 10,GPU:NVidia GTX 1070(8GB RAM,内存利用率也很低) .
1 回答
我找到了一种解决方法 - 解决方法是在某些步骤(
create_def_file.py
)中包含tf_core_gpu_kernels.lib
. 更多细节:GitHub Issue 15254