【问题标题】:tensorflow places softmax op on cpu instead of gputensorflow 将 softmax op 放在 cpu 而不是 gpu 上
【发布时间】: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


    【解决方案1】:

    我找到了一种解决方法 - 解决方法是在某些步骤中包含 tf_core_gpu_kernels.lib (create_def_file.py)。更多细节在这里:GitHub Issue 15254

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2021-03-11
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      相关资源
      最近更新 更多