在Tensorflow服务中调试批处理(未观察到效果)

时间:2017-05-29 20:22:23

标签: tensorflow gpu tensorflow-serving

我有一个小型的Web服务器,可以根据句子获取输入,并需要使用Tensorflow服务返回模型预测。使用我们的单GPU可以很好地工作,但是现在我想启用批处理,以便Tensorflow服务等待一段时间对传入的句子进行分组,然后在GPU上一次处理它们。

我正在使用predesigned server frameworkpredesigned batching framework使用Tensorflow服务的初始版本。我正在使用--batching标记启用批处理,并设置了batch_timeout_micros = 10000max_batch_size = 1000。日志记录确认已启用批处理并且正在使用GPU。

但是,在向服务器发送请求时,批处理的影响很小。同时发送50个请求几乎在时间使用方面与发送5个请求成线性比例。有趣的是,服务器的predict()函数对每个请求都运行一次(参见here),这表明批处理没有得到正确处理。

我错过了什么吗?如何检查批处理有什么问题?

请注意,这与How to do batching in Tensorflow Serving?不同,因为该问题仅检查如何从单个客户端发送多个请求,而不是如何启用Tensorflow服务的多个单独请求的幕后批处理。

1 个答案:

答案 0 :(得分:3)

(我不熟悉服务器框架,但我非常熟悉HPC以及cuBLAS和cuDNN,TF用于在GPU上进行点积和卷积的库)

有几个问题可能导致批量大小令人失望的性能扩展。

I / O开销,我指的是网络传输,磁盘访问(对于大数据),序列化,反序列化和类似的错误。这些东西往往与数据的大小成线性关系。

为了研究这个开销,我建议你部署2个模型:一个你真正需要的模型,一个是微不足道的模型,但使用相同的I / O,然后减去彼此所需的时间。 / p>

这个时间差应该类似于复杂模型运行的时间,当你直接使用它时,没有I / O开销。

如果瓶颈在I / O中,加速GPU工作是无关紧要的。

请注意,即使增加批量大小使GPU更快,也可能使整个事情变得更慢,因为GPU现在必须等待整批的I / O完成甚至开始工作。

cuDNN扩展:matmul之类的东西需要大批量来实现最佳吞吐量,但使用cuDNN的卷积可能不会(至少它不是我的经验,但是这可能取决于版本和GPU拱门)

RAM,GPU RAM或PCIe带宽限制型号:如果您的型号存在任何瓶颈,则可能无法从更大的批量大小中受益。

检查这个的方法是直接运行模型(可能使用模拟输入),将时间与上述时间差进行比较,并将其绘制为批量大小的函数。

顺便说一下,根据performance guide,你可以尝试的一件事是使用NCHW布局,如果你还没有。还有其他提示。