【发布时间】:2018-05-18 03:03:33
【问题描述】:
我有一个具有多个输入和多个层的张量流模型,以及一个最终的 softmax 层。该模型在 Python 中进行训练(使用 Keras 框架),然后使用有助于 CMake 构建 TensorFlow 的 C++ 程序进行保存和推理(基本上遵循这些说明: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)。不过,不知道如何检查每个编译步骤。
1234563自己
但是:检查“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,内存利用率也很低)。
【问题讨论】:
标签: c++ tensorflow keras gpu