快捷方式

⚠️ 注意:维护有限

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

性能指南

如果您有兴趣优化使用 TorchServe 服务的 PyTorch 模型的内存使用、延迟或吞吐量,本指南将为您提供帮助。

我们还在此处创建了一份快速清单,列出了本页面未涵盖的其他可尝试事项。您可以在此处找到该清单。

优化 PyTorch

有许多技巧可以优化用于生产环境的 PyTorch 模型,包括但不限于蒸馏、量化、融合、剪枝、设置环境变量等,我们鼓励您进行基准测试,看看哪种方法最适合您。

一般来说,优化模型很困难,最简单的方法可能是导出到某些运行时,如 ORT、TensorRT、IPEX 或 FasterTransformer。我们在 TorchServe GitHub 页面上提供了许多关于如何集成这些运行时的示例。如果您喜欢的运行时不受支持,请随时提交 PR。

torch.compile

从 PyTorch 2.0 开始,torch.compile 为大量模型提供了开箱即用的加速(约 1.8 倍)。您可以参考此 仪表板,它每晚跟踪此情况。

使用 torch.compile 完全优化的模型性能提升高达 10 倍

使用较小批量大小时,将 torch.compilemode="reduce-overhead" 配合使用可以提高性能,因为它利用了 CUDA graphs。

您可以在此处找到 torch.compile 与 TorchServe 配合使用的所有示例。

关于 torch.compile GenAI 示例的详细信息可以在此链接中找到。

ONNX 和 ORT 支持

TorchServe 原生支持 ONNX 模型,这些模型可以通过 ORT 加载,用于加速 CPU 和 GPU 推理。ONNX 的操作方式与常规 PyTorch 模型略有不同,在进行转换时,您需要明确设置输入和输出维度并命名。请参阅此示例

概括来说,TorchServe 允许您执行以下操作:

  1. 打包序列化的 ONNX 权重 torch-model-archiver --serialized-file model.onnx ...

  2. 使用 ort_session = ort.InferenceSession(self.model_pt_path, providers=providers, sess_options=sess_options)base_handler.py 加载这些权重,该方法支持 CPU 和 GPU 推理的合理默认设置

  3. 允许您使用自定义处理器定义自定义预处理和后处理函数,以按 ONNX 模型期望的格式传入数据

要在 TorchServe Docker 上使用 ONNX 和 GPU,我们需要构建一个以 NVIDIA CUDA 运行时 作为基础镜像的镜像,如此处所示。

TensorRT

TorchServe 也支持通过 TensorRT 优化的模型。要利用 TensorRT 运行时,您可以按照这些说明转换模型,完成后,您将获得序列化的权重,可以使用 torch.jit.load() 加载这些权重。

转换后,PyTorch 对待 Torchscript 模型和 TensorRT 模型的方式没有区别。

Better Transformer

来自 PyTorch 的 Better Transformer 为 Transformer 编码器推理实现了 torch.nn.TransformerEncoder 的向后兼容的快速路径,并且不需要模型作者修改其模型。BetterTransformer 的改进在许多常见执行场景下可以带来超过 2 倍的加速和吞吐量提升。您可以在此处此处找到有关 Better Transformer 的更多信息。

优化 TorchServe

如果您尝试从 config.properties 文件中提高 TorchServe 的性能,您应该更改的主要设置是 batch_sizebatch_delay。更大的批量大小意味着更高的吞吐量,但会牺牲延迟。

其次重要的设置是 worker 数量和 GPU 数量,这将对 CPU 和 GPU 性能产生显著影响。

并发和 worker 数量

TorchServe 暴露了配置,允许用户配置 CPU 和 GPU 上的 worker 线程数量。有一个重要的配置属性可以根据工作负载加快服务器速度。注意:以下属性在重负载下影响更大。

在 CPU 上运行 TorchServe

如果在 CPU 上使用 TorchServe,您可以通过在 config.properties 中设置以下项来提高性能:

cpu_launcher_enable=true
cpu_launcher_args=--use_logical_core

这些设置通过启动器核心绑定显著提高了性能。有关此改进背后的理论,请参阅此博客,其要点可快速概括如下:

  • 在启用超线程的系统中,通过核心绑定将线程亲和性仅设置为物理核心,从而避免使用逻辑核心。

  • 在具有 NUMA 的多插槽系统中,通过核心绑定将线程亲和性设置为特定插槽,从而避免跨插槽远程内存访问。

在 GPU 上运行 TorchServe

有一个配置属性 number_of_gpu,它告诉服务器每个模型使用特定数量的 GPU。在我们向服务器注册多个模型的情况下,这适用于所有已注册的模型。如果此值设置得较低(例如:0 或 1),将导致 GPU 利用不足。相反,如果设置得较高(>= 系统上可用的最大 GPU 数量),则每个模型将生成相应数量的 worker。显然,这将导致对 GPU 的不必要争用,并可能导致线程到 GPU 的调度次优。

ValueToSet = (Number of Hardware GPUs) / (Number of Unique Models)

NVIDIA MPS

虽然 NVIDIA GPU 允许多个进程在 CUDA 内核上运行,但这也有其自身的缺点,即:

  • 内核的执行通常是串行化的

  • 每个进程创建自己的 CUDA 上下文,这会占用额外的 GPU 内存

为了克服这些缺点,您可以利用 NVIDIA 多进程服务 (MPS) 来提高性能。您可以在此处找到有关如何在 TorchServe 中利用 NVIDIA MPS 的更多信息。

NVIDIA DALI

NVIDIA 数据加载库 (DALI) 是一个用于数据加载和预处理以加速深度学习应用的库。它可以作为流行深度学习框架中内置数据加载器和数据迭代器的可移植替代品。DALI 提供了一系列高度优化的构建块,用于加载和处理图像、视频和音频数据。您可以在此处找到 DALI 优化与 TorchServe 集成的示例。

基准测试

为了更轻松地比较各种模型和 TorchServe 配置,我们添加了一些辅助脚本,它们将性能数据(如 p50、p90、p99 延迟)以清晰的报告形式输出到此处,并且大多需要您通过 JSON 或 YAML 指定一些配置。您可以在此处找到有关 TorchServe 基准测试的更多信息。

性能分析

TorchServe 原生支持 PyTorch profiler(性能分析器),这将帮助您找到代码中的性能瓶颈。

如果您创建了自定义的 handleinitialize 方法覆盖 BaseHandler,则必须定义 self.manifest 属性才能运行 _infer_with_profiler

export ENABLE_TORCH_PROFILER=TRUE

访问此链接,了解更多关于 PyTorch profiler(性能分析器)的信息。

更多资源

TorchServe 在 Animated Drawings 应用中的应用

要深入了解如何在应用程序中微调 TorchServe 性能,请参阅此文章。此处显示的案例研究使用了 Meta 的 Animated Drawings App 来提高 TorchServe 性能。

性能清单

我们还在此处创建了一份快速清单,列出了本页面未涵盖的其他可尝试事项。您可以在此处找到该清单。

文档

获取 PyTorch 的全面开发者文档

查看文档

教程

获取针对初学者和高级开发者的深度教程

查看教程

资源

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

查看资源