首页 文章

tensorflow将softmax op放在cpu而不是gpu上

提问于
浏览
1

我有一个具有多个输入和多个层的张量流模型,以及最终的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 图层的数据类型为 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!

  • 构建目录包含许多与“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 回答

  • 0

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

相关问题