• 文档 >
  • 模型推理优化检查清单
快捷方式

模型推理优化检查清单

此清单描述了诊断模型推理性能问题时应完成的一些步骤。其中一些建议仅适用于 NLP 模型(例如,确保输入没有过度填充和序列分桶),但通用原则也适用于其他模型。

通用系统优化

  • 检查 PyTorch、Nvidia 驱动程序和其他组件的版本,并更新到最新的兼容版本。通常,已知的性能错误已被修复。

  • 收集系统级活动日志,以了解整体资源利用率。了解模型推理管道如何在较高层次上使用系统资源很有用,这是优化的第一步。即使是像 nvidia-smi 和 htop 这样的简单 CLI 工具也会有所帮助。

  • 从对性能影响最大的目标开始。从系统活动日志中应该可以清楚地看出最大的瓶颈在哪里——超越模型推理,因为预处理/后处理可能很昂贵,并且可能对端到端吞吐量产生同样大的影响。

  • 量化并减轻慢速 I/O(如磁盘和网络)对端到端性能的影响。虽然优化 I/O 不在此清单的范围内,但请寻找使用异步、并发、流水线等技术来有效“隐藏” I/O 成本的方法。

  • 对于动态长度输入序列的模型推理(例如,NLP 的 transformers),请确保 tokenizer 没有过度填充输入。如果 transformer 在训练时填充到恒定长度(例如,512),并在部署时使用相同的填充,则在短序列上运行会不必要地慢(数量级)。

  • JPEG 格式输入的视觉模型通常受益于 CPU 上更快的 JPEG 解码,例如 libjpeg-turbo 和 Pillow-SIMD,以及 GPU 上更快的 JPEG 解码,例如 torchvision.io.decode_jpeg 和 Nvidia DALI。正如这个 示例 所示,即使在旧的 K80 GPU 上,Nvidia DALI 也比 torchvision 快约 20%。

模型推理优化

仅在其他因素(“唾手可得的果实”)得到广泛评估和解决后,才开始模型推理优化。

  • 在模型上调用 forward pass 之前使用 with torch.inference_mode() 上下文或在 inference() 方法上使用 @torch.inference_mode() 装饰器可以提高推理性能。这是通过禁用视图跟踪和版本计数器递增来实现的。

  • 对 GPU 推理使用 fp16。在具有张量核心的新型 GPU 上,速度很可能会提高一倍以上,而精度下降可忽略不计。从技术上讲,fp16 是一种量化类型,但由于它很少会因推理而导致精度损失,因此应始终对其进行探索。正如这篇文章所示,使用 fp16 可以提高大型神经网络应用的速度。

  • 对 CPU 推理使用模型量化(即 int8)。探索不同的量化选项:动态量化、静态量化和量化感知训练,以及 Intel Neural Compressor 等提供更复杂量化方法的工具。值得注意的是,量化会带来一定的精度损失,并且在某些硬件上可能并不总是提供显着的加速,因此这可能并不总是正确的方法。

  • 通过智能批处理平衡吞吐量和延迟。在满足延迟 SLA 的同时,尝试更大的批大小以提高吞吐量。

  • 尝试优化的推理引擎,例如 onnxruntime、tensorRT、lightseq、ctranslate-2 等。这些引擎通常提供额外的优化,例如运算符融合,以及模型量化。

  • 尝试模型蒸馏。这更复杂,通常需要训练数据,但潜在的收益可能很大。例如,MiniLM 实现了原始 BERT 基础模型 99% 的精度,同时速度提高了 2 倍。

  • 如果在 CPU 上工作,您可以尝试核心绑定。您可以在这篇博文中找到更多关于如何使用它的信息。

  • 对于不同长度序列的批处理,序列分桶可能会将吞吐量提高 2 倍。在这种情况下,序列分桶的一个简单实现是在将所有输入馈送到模型之前按序列长度对其进行排序,因为这减少了批处理序列时不必要的填充。

虽然此清单并非详尽无遗,但通读这些条目可能会帮助您从模型推理管道中榨取更多性能。


© 版权所有 2020, PyTorch Serve 贡献者。

使用 Sphinx 构建,主题由 theme 提供,并由 Read the Docs 提供支持。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得解答

查看资源