TensorFlow C++ 评估性能比 Python 一更差

Posted

技术标签:

【中文标题】TensorFlow C++ 评估性能比 Python 一更差【英文标题】:Tensorflow C++ evaluation performance worse than Python one 【发布时间】:2016-03-22 20:39:09 【问题描述】:

我在 Tensorflow 中构建了一个 LSTM 分类器(使用 Python),现在我正在做一系列基准测试来衡量执行性能。基准代码加载在训练期间保存的模型并针对多个输入执行它。我有一个 Python 基准和一个 C++ 基准。

使用 Python(在 CPU 上)时,每个输入都会得到 5ms,使用 C++ 时会得到 68ms。我期待 C++ 版本至少具有相似的性能。

什么会导致这种差异?我不熟悉 Tensorflow 的内部结构,但我的猜测之一是 Python 版本使用 BLAS(我的 numpy 与 blas 链接)而 C++ 没有。如果是,那是否意味着某些图形操作是在 Python 中执行的?

【问题讨论】:

c++ 编译时是否开启了优化标志? C++ 和 Python 都应该使用相同的后端(基于 Eigen)进行实际计算,所以差异很奇怪。如果您执行不受带宽限制的大型操作,是否有区别? (即,将两个 4k x 4k 矩阵相乘) 找到答案了吗? 构建有问题,清理和重建以某种方式解决了它。 【参考方案1】:

我不确定现在发布答案是否为时已晚。我遇到了同样的问题,并从 tensorflow github 页面得到了答案:

https://github.com/tensorflow/tensorflow/issues/3471

解决方案很简单,只需使用-c opt 标志。

【讨论】:

对于以后发现这个的人来说,现在的标志似乎是 --config=opt (github.com/tensorflow/tensorflow/issues/7259)【参考方案2】:

您能否尝试一个更简单的基准来缩小问题范围。以下在 CPU 上需要 2-5 秒

import tensorflow as tf
a=tf.Variable(tf.random_normal([8192, 8192], stddev=0.35))
b=tf.Variable(tf.random_normal([8192, 8192], stddev=0.35))
c=tf.matmul(a, b)

sess.run([tf.initialize_all_variables()])

import time
start_time = time.time()
sess.run(c)
print time.time()-start_time

【讨论】:

10.4 CPU 和 0.58 GPU。 lscpu:架构:x86_64 CPU 操作模式:32 位、64 位字节顺序:小端 CPU:12 在线 CPU 列表:每个内核 0-11 个线程:每个插槽 2 个内核:6 个插槽:1 个 NUMA 节点:1 个供应商 ID:GenuineIntel CPU 系列:6 型号:62 步进:4 CPU MHz:1200.117 BogoMIPS:4190.02 虚拟化:VT-x L1d 缓存:32K L1i缓存:32K L2缓存:256K L3缓存:15360K 使用 C++ 的计时怎么样?您可以使用print tf.get_default_graph().as_graph_def() 获取graphdef。初始化操作称为init:0,矩阵乘法为MatMul:0 花了 419 秒……我想我的盒子或代码确实有问题。这是我使用的代码:github.com/raduk/tensorflow_tests/blob/master/test.py 和 github.com/raduk/tensorflow_tests/blob/master/test.cc 嗯,也许使用不同的线程?但这并不能解释 20 倍的 CPU 时间差异。可能值得就此向 test.cc repro 提出问题

以上是关于TensorFlow C++ 评估性能比 Python 一更差的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的卷积实现比 Tensorflow 的慢?

稀疏矩阵与密集矩阵乘法 C++ Tensorflow

风控建模之性能评估

带有 TensorRT 的 C++ Tensorflow API

windows安装tensorflow的一个教训

如何在 Tensorflow 的训练之间进行评估