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

pir*_*pir 9 gpu tensorflow tensorflow-serving

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

我正在使用预先设计的服务器框架预先设计的批处理框架,使用Tensorflow服务的初始版本.我正在使用--batching标志启用批处理并设置batch_timeout_micros = 10000max_batch_size = 1000.日志记录确认已启用批处理并且正在使用GPU.

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

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


请注意,这与如何在Tensorflow服务中进行批处理不同因为该问题仅检查如何从单个客户端发送多个请求,而不是如何启用Tensorflow服务的多个单独请求的幕后批处理.

Max*_*axB 3

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

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

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

为了研究这一开销,我建议您部署 2 个模型:一个是您实际需要的,另一个是微不足道的,但使用相同的 I/O,然后从一个模型中减去另一个模型所需的时间。

当您直接使用复杂模型而没有 I/O 开销时,此时间差应该类似于运行复杂模型所需的时间。

如果瓶颈在于 I/O,那么加速 GPU 工作就无关紧要了。

请注意,即使增加批处理大小使 GPU 更快,它也可能使整个过程变慢,因为 GPU 现在必须等待整个批处理的 I/O 完成才能开始工作。

cuDNN 缩放:诸如matmul需要大批量才能实现最佳吞吐量之类的事情,但使用 cuDNN 进行卷积可能不需要(至少这不是我的经验,但这可能取决于版本和 GPU 架构)

RAM、GPU RAM 或 PCIe 带宽受限模型:如果您的模型的瓶颈在于其中任何一个,则它可能不会从更大的批量大小中受益。

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


顺便说一句,根据性能指南,您可以尝试的一件事是使用 NCHW 布局(如果您还没有这样做)。还有其他提示。