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

Debugging batching in Tensorflow Serving (no effect observed)

我有一个小型 Web 服务器,它根据句子获取输入,需要 return 使用 Tensorflow Serving 进行模型预测。使用我们的单个 GPU 一切正常,但现在我想启用批处理,这样 Tensorflow Serving 会稍等片刻以对传入的句子进行分组,然后再在 GPU 上以一批处理它们。

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

但是,当向服务服务器发送请求时,批处理的影响很小。同时发送 50 个请求与发送 5 个请求的时间使用量几乎呈线性关系。有趣的是,服务器的 predict() 函数是 运行 每个请求一次(参见 here),这表明批处理处理不当。

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


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

(我不熟悉服务器框架,但我非常熟悉 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 带宽受限模型: 如果您的模型的瓶颈在于其中任何一个,它可能无法从更大的批量大小中获益。

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


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