tensorflow将softmax op置于cpu而不是gpu

时间:2017-12-04 15:40:16

标签: c++ tensorflow keras gpu

我有一个具有多个输入和多个层的张量流模型,以及最终的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 - LoadGraph()ReadBinaryProto()中的session->Create()函数),然后再次记录设备展示位置,我发现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图层的数据类型为float32out/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!

  • 构建目录包含许多与&#34; softmax&#34;相关的文件。 (例如`tf_core_gpu_kernels_generated_softmax_op_gpu.cu.cc.obj.Release.cmake)。但是,不知道如何检查每个编译步骤。

  • 当我查看&#34; tf_core_gpu_kernels.lib&#34; (可以用7Z打开.lib;)),有&#34; tf_core_gpu_kernels_generated_softmax_op_gpu.cu.cc.lib&#34;等文件。 - 所以我认为编译内核本身并没有错误

  • 但是:检查&#34; tensorflow.dll&#34; (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 个答案:

答案 0 :(得分:0)

我找到了一种解决方法 - 解决方法是在某些步骤(tf_core_gpu_kernels.lib)中加入create_def_file.py。更多详情:GitHub Issue 15254