我有一个小型的Web服务器,可以根据句子获取输入,并需要使用Tensorflow服务返回模型预测。使用我们的单GPU可以很好地工作,但是现在我想启用批处理,以便Tensorflow服务等待一段时间对传入的句子进行分组,然后在GPU上一次处理它们。
我正在使用predesigned server framework和predesigned batching framework使用Tensorflow服务的初始版本。我正在使用--batching
标记启用批处理,并设置了batch_timeout_micros = 10000
和max_batch_size = 1000
。日志记录确认已启用批处理并且正在使用GPU。
但是,在向服务器发送请求时,批处理的影响很小。同时发送50个请求几乎在时间使用方面与发送5个请求成线性比例。有趣的是,服务器的predict()
函数对每个请求都运行一次(参见here),这表明批处理没有得到正确处理。
我错过了什么吗?如何检查批处理有什么问题?
请注意,这与How to do batching in Tensorflow Serving?不同,因为该问题仅检查如何从单个客户端发送多个请求,而不是如何启用Tensorflow服务的多个单独请求的幕后批处理。
答案 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布局,如果你还没有。还有其他提示。