【问题标题】:Debugging batching in Tensorflow Serving (no effect observed)在 Tensorflow Serving 中调试批处理(未观察到效果)
【发布时间】:2017-06-06 03:23:18
【问题描述】:

我有一个小型 Web 服务器,它获取句子输入,需要使用 Tensorflow Serving 返回模型预测。使用我们的单个 GPU 运行良好且运行良好,但现在我想启用批处理,以便 Tensorflow Serving 等待一段时间将传入的句子分组,然后在 GPU 上将它们一起处理。

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

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

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


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

【问题讨论】:

    标签: tensorflow gpu tensorflow-serving


    【解决方案1】:

    (我不熟悉服务器框架,但我非常熟悉 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 布局,如果您还没有的话。那里还有其他提示。

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多