gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:53:52 26 4
gpt4 key购买 nike

我有一个包含多个输入和多个层的 tensorflow 模型,以及一个最终的 softmax 层。该模型在 Python 中训练(使用 Keras 框架),然后保存并使用有助于 TensorFlow 的 CMake 构建的 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 中的 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>,))。

进一步调查显示:

  • 在 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”的文件 - 所以我相信编译内核没有任何问题本身

  • 但是:检查“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,内存利用率也很低)。

最佳答案

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

关于c++ - tensorflow 将 softmax op 放在 cpu 而不是 gpu 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47636903/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com