性能指南¶
如果您有兴趣优化使用 TorchServe 提供的 PyTorch 模型的内存使用、延迟或吞吐量,那么本指南适合您。
我们还在此处创建了一个快速清单,供在本页涵盖的内容之外尝试其他操作。您可以在此处找到清单。
优化 PyTorch¶
有许多技巧可以优化 PyTorch 模型以进行生产,包括但不限于蒸馏、量化、融合、修剪、设置环境变量,我们鼓励您进行基准测试,看看什么最适合您。
一般来说,优化模型很困难,最简单的方法是导出到一些运行时,如 ORT 、 TensorRT 、 IPEX 或 FasterTransformer 。我们在 TorchServe github 页面上提供了许多有关如何集成这些运行时的示例。如果您最喜欢的运行时不受支持,请随时打开 PR。
torch.compile
从 PyTorch 2.0 开始,为大量模型提供开箱即用的加速 ( ~1.8x)。您可以参考此控制面板,该控制面板每晚跟踪一次。torch.compile
经过全面优化的模型显示性能提升高达 10 倍torch.compile
当使用较小的批处理大小时,使用 with 可以提高性能,因为它使用 CUDA 图形mode="reduce-overhead"
torch.compile
您可以在此处找到使用 TorchServe 的所有示例torch.compile
有关 GenAI 示例的详细信息,请访问此链接torch.compile
ONNX 和 ORT 支持
TorchServe 对 ONNX 模型提供原生支持,可以通过 ORT 加载这些模型,以加速 CPU 和 GPU 推理。ONNX 的运行方式与常规 PyTorch 模型略有不同,因为在运行转换时,您需要显式设置和命名输入和输出维度。请参阅此示例。
概括地说,TorchServe 允许您做的是
打包序列化的 ONNX 权重
torch-model-archiver --serialized-file model.onnx ...
从 using 加载这些权重,它支持 CPU 和 GPU 推理的合理默认值
base_handler.py
ort_session = ort.InferenceSession(self.model_pt_path, providers=providers, sess_options=sess_options)
允许您定义自定义预处理和后处理函数,以使用 Custom 处理程序以 onnx 模型期望的格式传入数据
要在 TorchServe Docker 上将 ONNX 与 GPU 一起使用,我们需要使用 NVIDIA CUDA 运行时构建一个映像作为基础映像,如下所示
TensorRT
TorchServe 还支持通过 TensorRT 优化的模型。要利用 TensorRT 运行时,您可以按照这些说明转换模型,完成后,您将拥有序列化的权重,您可以使用 .
转换后,PyTorch 处理 Torchscript 模型与 TensorRT 模型的方式没有区别。
更好的变压器
PyTorch 的 Better Transformer 实现了向后兼容的 Transformer 编码器推理快速路径,并且不需要模型作者修改其模型。对于许多常见的执行场景,BetterTransformer 的加速和吞吐量改进可以超过 2 倍。
您可以在此处和此处找到有关 Better Transformer 的更多信息。torch.nn.TransformerEncoder
优化 TorchServe¶
如果您尝试从 中提高 TorchServe 的性能,则应更改的主要设置是 和 。较大的批处理大小意味着更高的吞吐量,但代价是更低的延迟。config.properties
batch_size
batch_delay
第二个最重要的设置是工作线程数和 GPU 数,它们将对 CPU 和 GPU 性能产生巨大影响。
并发和工作线程数量
TorchServe 公开了允许用户配置 CPU 和 GPU 上的工作线程数的配置。有一个重要的 config 属性,可以根据工作负载加速服务器。注意:以下属性在繁重的工作负载下影响更大。
CPU 上的 TorchServe
如果在 CPU 上使用 TorchServe,则可以通过在 :config.properties
cpu_launcher_enable=true
cpu_launcher_args=--use_logical_core
这些设置通过 Launcher 核心固定显著提高性能。 本博客讨论了这种改进背后的理论,可以快速总结为:
在启用超线程的系统中,通过仅通过内核固定将线程关联设置为物理内核来避免逻辑内核。
在具有 NUMA 的多套接字系统中,通过内核固定将线程关联设置为特定套接字,从而避免跨套接字远程内存访问。
GPU 上的 TorchServe
有一个名为 config 的 config 属性,它告诉服务器为每个模型使用特定数量的 GPU。如果我们向服务器注册了多个模型,这将适用于所有已注册的模型。如果将其设置为较低的值(例如:0 或 1),则会导致 GPU 利用率不足。相反,设置为高值 (>= 系统上可用的最大 GPU 数) 会导致每个模型生成尽可能多的工作程序。显然,这将导致对 GPU 的不必要争用,并可能导致线程到 GPU 的调度次优。number_of_gpu
ValueToSet = (Number of Hardware GPUs) / (Number of Unique Models)
NVIDIA MPS
虽然 NVIDIA GPU 允许在 CUDA 内核上运行多个进程,但这也有其自身的缺点,即:
内核的执行通常是序列化的
每个进程都会创建自己的 CUDA 上下文,该上下文会占用额外的 GPU 内存
要解决这些缺点,您可以利用 NVIDIA 多进程服务 (MPS) 来提高性能。您可以在此处找到有关如何将 NVIDIA MPS 与 TorchServe 结合使用的更多信息。
英伟达 DALI
NVIDIA 数据加载库 (DALI) 是一个用于数据加载和预处理的库,用于加速深度学习应用程序。它可以用作常用深度学习框架中内置数据加载器和数据迭代器的便携式直接替代品。DALI 提供了一组高度优化的构建块,用于加载和处理图像、视频和音频数据。 您可以在此处找到 DALI 优化与 TorchServe 集成的示例。
标杆¶
为了更容易比较各种模型和 TorchServe 配置,我们添加了一些帮助程序脚本,这些脚本在此处的干净报告中输出性能数据,如 p50、p90、p99 延迟,并且主要要求您通过 JSON 或 YAML 确定某些配置。 您可以在此处找到有关 TorchServe 基准测试的更多信息。
分析¶
TorchServe 具有对 PyTorch 分析器的原生支持,这将帮助您发现代码中的性能瓶颈。
如果创建了覆盖 BaseHandler 的自定义或方法,则必须定义该属性才能运行 .handle
initialize
self.manifest
_infer_with_profiler
export ENABLE_TORCH_PROFILER=TRUE
访问此链接以了解有关 PyTorch 分析器的更多信息。
更多资源¶
Animated Drawings 应用程序上的 TorchServe
有关在应用程序中微调 TorchServe 性能的一些见解,请查看这篇文章。此处显示的案例研究使用 Animated Drawings App 表单 Meta 来提高 TorchServe 性能。
性能检查表
我们还在此处创建了一个快速清单,供在本页涵盖的内容之外尝试其他操作。您可以在此处找到清单。