2017-05-29 53 views
10

我有一个小型Web服务器,它根据句子获取输入,并需要使用Tensorflow服务返回模型预测。它使用我们的单GPU能够很好地工作,但是现在我希望启用批处理,以便Tensorflow Serving在GPU上一次处理它们之前等待输入的句子。在Tensorflow服务中调试批处理(没有观察到效果)

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

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

我错过了什么吗?如何检查批次的问题?


注意,这是从How to do batching in Tensorflow Serving?不同,因为这个问题只检查如何从一个客户端发送多个请求,而不是如何让Tensorflow服务的幕后的配料为多个独立的请求。

回答

4

(我不熟悉服务器框架,但我很熟悉HPC与CUBLAS和cuDNN,图书馆TF用来做它的点积和回旋的GPU)

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

I/O开销,其中我的意思是网络传输,磁盘访问(用于大数据),串行化,反序列化和类似的东西。这些事情在数据的大小上往往是线性的。为了研究这个开销,我建议你部署2个模型:一个你真正需要的,一个是微不足道的,但使用相同的I/O,然后减去另一个需要的时间。

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

如果瓶颈在I/O中,加速GPU工作是无足轻重的。

请注意,即使增加批量大小使GPU速度更快,它可能会使整体速度变慢,因为GPU现在必须等待整批的I/O完成才能开始工作。

cuDNN缩放:之类的东西matmul需要大批量实现自己的最佳吞吐量,但使用卷积cuDNN可能不会(至少它没有被我的经验,但这可能取决于版本和GPU拱)

内存,GPU内存或PCIe带宽限制型号:如果您的型号的瓶颈出现在这些瓶颈中的任何一个,它可能不会受益于更大的批量。

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


顺便说一句,因为每performance guide,有一两件事你可以尝试使用NCHW布局,如果你是不是已经。那里还有其他提示。