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

⚠️ 注意:有限维护

本项目不再积极维护。现有版本仍然可用,但没有计划的更新、错误修复、新功能或安全补丁。用户应注意漏洞可能得不到解决。

模型推理优化清单

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

通用系统优化

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

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

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

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

  • 对于长度动态的输入序列(例如,用于 NLP 的 transformer)的模型推理,确保分词器不过度填充输入。如果一个 transformer 是用填充到固定长度(例如 512)进行训练,并以相同的填充进行部署,那么在短序列上运行时会不必要地慢(数量级)。

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

模型推理优化

仅在其他因素(“低垂的果实”)经过广泛评估和解决后,才开始模型推理优化。

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

  • 对 GPU 推理使用 fp16。在带有 Tensor Cores 的新 GPU 上,速度很可能会翻倍,精度损失可忽略不计。从技术上讲,fp16 是一种量化类型,但由于它在推理时很少出现精度损失,因此应该始终尝试。正如这篇文章所示,使用 fp16 可以加速大型神经网络应用。

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

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

  • 尝试优化的推理引擎,如 onnxruntime、tensorRT、lightseq、ctranslate-2 等。这些引擎通常除了模型量化之外,还提供额外的优化,如算子融合。

  • 尝试模型蒸馏。这更为复杂,通常需要训练数据,但潜在收益可能很大。例如,MiniLM 在精度上达到了原始 BERT base 模型的 99%,而速度快了 2 倍。

  • 如果在 CPU 上工作,可以尝试核心绑定。有关如何使用此功能的更多信息,请参阅这篇博文

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

虽然本清单并非详尽无遗,但检查这些项可能会帮助您从模型推理管线中榨取更多性能。

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

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

查看教程

资源

查找开发资源并获得问题解答

查看资源