我有一个具有多个输入和多个层的张量流模型,以及最终的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
图层的数据类型为float32
(out/Softmax -> (<tf.Tensor 'out/Softmax:0' shape=(?, 1418) dtype=float32>,)
)。
进一步调查显示:
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,内存利用率也非常低)。
答案 0 :(得分:0)
我找到了一种解决方法 - 解决方法是在某些步骤(tf_core_gpu_kernels.lib
)中加入create_def_file.py
。更多详情:GitHub Issue 15254