TensorRT-LLM——优化大型语言模型推理以实现最大性能的综合指南
引言
随着对大型语言模型 (LLM) 的需求不断增长,确保快速、高效和可扩展的推理变得比以往任何时候都更加重要。NVIDIA 的 TensorRT-LLM 通过提供一套专为 LLM 推理设计的强大工具和优化,TensorRT-LLM 可以应对这一挑战。TensorRT-LLM 提供了一系列令人印象深刻的性能改进,例如量化、内核融合、动态批处理和多 GPU 支持。这些改进使推理速度比传统的基于 CPU 的方法快 8 倍,从而改变了在生产中部署 LLM 的方式。
本综合指南将探索 TensorRT-LLM 的各个方面,从其架构和主要功能到部署模型的实际示例。
使用 TensorRT-LLM 加速 LLM 推理
TensorRT-LLM 显著提升了 LLM 推理性能。根据 NVIDIA 的测试,基于 TensorRT 的应用程序 8x更快 与仅使用 CPU 的平台相比,推理速度更快。这对于需要快速响应的实时应用(例如聊天机器人、推荐系统和自主系统)来说是一项至关重要的进步。
工作原理
TensorRT-LLM 通过在部署期间使用以下技术优化神经网络来加快推理速度:
- 量化:降低权重和激活的精度,缩小模型尺寸并提高推理速度。
- 层和张量融合:将激活函数和矩阵乘法等操作合并为单个操作。
- 内核调优:为 GPU 计算选择最佳的 CUDA 内核,减少执行时间。
这些优化可确保您的 LLM 模型在各种部署平台(从超大规模数据中心到嵌入式系统)上高效运行。
使用 TensorRT 优化推理性能
TensorRT 基于 NVIDIA 的 CUDA 并行编程模型构建,为 NVIDIA GPU 上的推理提供高度专业化的优化。通过简化量化、内核调整和张量运算融合等流程,TensorRT 可确保 LLM 能够以最小的延迟运行。
一些最有效的技术包括:
- 量化:这在保持较高准确度的同时降低了模型参数的数值精度,有效加快了推理速度。
- 张量融合:通过将多个操作融合到单个 CUDA 内核中,TensorRT 最大限度地减少了内存开销并提高了吞吐量。
- 内核自动调整:TensorRT 自动为每个操作选择最佳内核,针对给定的 GPU 优化推理。
这些技术使 TensorRT-LLM 能够优化深度学习任务(例如自然语言处理、推荐引擎和实时视频分析)的推理性能。
使用 TensorRT 加速 AI 工作负载
TensorRT 通过整合精度优化来加速深度学习工作负载,例如 INT8 和 FP16。这些降低精度的格式可以在保持准确性的同时显著加快推理速度。这在低延迟是关键要求的实时应用中尤其有价值。
INT8 和 FP16 优化在以下方面尤其有效:
- 视频流媒体:基于人工智能的视频处理任务(例如物体检测)可从这些优化中受益,因为它可以减少处理帧所需的时间。
- 推荐系统:通过加速处理大量用户数据的模型的推理,TensorRT 实现大规模实时个性化。
- 自然语言处理(NLP):TensorRT 提高了文本生成、翻译和摘要等 NLP 任务的速度,使其适合实时应用。
使用 NVIDIA Triton 进行部署、运行和扩展
使用 TensorRT-LLM 优化模型后,您可以使用以下工具轻松部署、运行和扩展模型: NVIDIA Triton 推理服务器。Triton 是一款支持动态批处理、模型集成和高吞吐量的开源软件。它为大规模管理 AI 模型提供了灵活的环境。
一些主要功能包括:
- 并发模型执行:同时运行多个模型,最大限度地提高 GPU 利用率。
- 动态配料:将多个推理请求合并为一个批次,从而减少延迟并提高吞吐量。
- 流音频/视频输入:支持实时应用程序中的输入流,例如实时视频分析或语音转文本服务。
这使得 Triton 成为在生产环境中部署 TensorRT-LLM 优化模型的宝贵工具,确保高可扩展性和效率。
TensorRT-LLM 用于 LLM 推理的核心功能
开源 Python API
TensorRT-LLM 提供了高度模块化和 开源 Python API简化了定义、优化和执行 LLM 的过程。该 API 使开发人员能够创建自定义 LLM 或修改预构建的 LLM 以满足他们的需求,而无需深入了解 CUDA 或深度学习框架。
飞行批处理和分页注意力机制
TensorRT-LLM 的突出特点之一是 动态批处理,通过同时处理多个请求来优化文本生成。此功能通过动态批处理序列最大限度地减少了等待时间并提高了 GPU 利用率。
此外, 分页关注 确保即使在处理长输入序列时内存使用率也保持在较低水平。分页注意力机制不会为所有标记分配连续的内存,而是将内存分成可动态重用的“页面”,从而防止内存碎片化并提高效率。
多 GPU 和多节点推理
对于更大的模型或更复杂的工作负载,TensorRT-LLM 支持 多GPU 和 多节点推理。此功能允许将模型计算分布在多个 GPU 或节点上,从而提高吞吐量并减少总体推理时间。
FP8 支持
随着。的到来 FP8 (8 位浮点),TensorRT-LLM 利用 NVIDIA 的 H100 GPU 将模型权重转换为这种格式,以优化推理。FP8 可以减少内存消耗并加快计算速度,这在大规模部署中尤其有用。
TensorRT-LLM 架构和组件
了解 TensorRT-LLM 的架构将有助于您更好地利用其 LLM 推理功能。让我们分解一下关键组件:
模型定义
TensorRT-LLM 允许您使用简单的 Python API 定义 LLM。该 API 构建一个 图形表示 模型,使其更容易管理 GPT 或 BERT 等 LLM 架构中涉及的复杂层。
重量绑定
在编译模型之前,必须将权重(或参数)绑定到网络。此步骤可确保权重嵌入 TensorRT 引擎中,从而实现快速高效的推理。TensorRT-LLM 还允许在编译后更新权重,为需要频繁更新的模型增加了灵活性。
模式匹配与融合
融合行动 是 TensorRT-LLM 的另一个强大功能。通过将多个操作(例如,矩阵乘法与激活函数)融合到单个 CUDA 内核中,TensorRT 最大限度地减少了与多个内核启动相关的开销。这减少了内存传输并加快了推理速度。
插件
为了扩展 TensorRT 的功能,开发人员可以编写 插件—执行特定任务(如优化多头注意力模块)的自定义内核。例如, Flash-注意 插件显著提高了 LLM 注意层的性能。
基准测试:TensorRT-LLM 性能提升
TensorRT-LLM 在各种 GPU 上都表现出了显著的 LLM 推理性能提升。以下是使用 TensorRT-LLM 在不同的 NVIDIA GPU 上进行的推理速度(以每秒令牌数为单位)的比较:
Model | Precision | Input/Output Length | H100 (80GB) | A100 (80GB) | L40S FP8 |
---|---|---|---|---|---|
GPTJ 6B | FP8 | 128/128 | 34,955 | 11,206 | 6,998 |
GPTJ 6B | FP8 | 2048/128 | 2,800 | 1,354 | 747 |
LLaMA v2 7B | FP8 | 128/128 | 16,985 | 10,725 | 6,121 |
LLaMA v3 8B | FP8 | 128/128 | 16,708 | 12,085 | 8,273 |
这些基准测试表明,TensorRT-LLM 在性能上取得了显著的进步,特别是对于较长的序列。
实践:安装和构建 TensorRT-LLM
步骤 1:创建容器环境
为了方便使用,TensorRT-LLM 提供了 Docker 镜像来创建构建和运行模型的受控环境。
docker build --pull \
--target devel \
--file docker/Dockerfile.multi \
--tag tensorrt_llm/devel:latest .
步骤 2:运行容器
运行可以访问 NVIDIA GPU 的开发容器:
docker run --rm -it \
--ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --gpus=all \
--volume ${PWD}:/code/tensorrt_llm \
--workdir /code/tensorrt_llm \
tensorrt_llm/devel:latest
步骤 3:从源代码构建 TensorRT-LLM
在容器内,使用以下命令编译 TensorRT-LLM:
python3 ./scripts/build_wheel.py --trt_root /usr/local/tensorrt
pip install ./build/tensorrt_llm*.whl
当您想要避免与 Python 依赖项相关的兼容性问题或专注于生产系统中的 C++ 集成时,此选项特别有用。构建完成后,您将在 cpp/build/tensorrt_llm
目录,准备与您的 C++ 应用程序集成。
步骤 4:链接 TensorRT-LLM C++ 运行时
将 TensorRT-LLM 集成到 C++ 项目中时,请确保项目的包含路径指向 cpp/include
目录。它包含稳定的、受支持的 API 标头。TensorRT-LLM 库作为 C++ 编译过程的一部分进行链接。
例如,您的项目的 CMake 配置可能包括:
include_directories(${TENSORRT_LLM_PATH}/cpp/include)
link_directories(${TENSORRT_LLM_PATH}/cpp/build/tensorrt_llm)
target_link_libraries(your_project tensorrt_llm)
通过这种集成,您可以在自定义 C++ 项目中利用 TensorRT-LLM 优化,确保即使在低级或高性能环境中也能进行高效推理。
TensorRT-LLM 的高级功能
TensorRT-LLM 不仅仅是一个优化库;它包含几个有助于解决大规模 LLM 部署的高级功能。下面,我们将详细探讨其中一些功能:
1. 动态批处理
传统的批处理需要等待一批数据完全收集之后才能进行处理,这可能会导致延迟。 动态批处理 通过在批次内动态启动已完成请求的推理并同时收集其他请求来改变这种情况。这通过最大限度地减少空闲时间和提高 GPU 利用率来提高整体吞吐量。
此功能在实时应用程序中尤其有价值,例如聊天机器人或语音助手,因为响应时间至关重要。
2. 分页关注
分页关注 是一种用于处理大型输入序列的内存优化技术。分页注意力机制无需为序列中的所有标记分配连续的内存(这可能会导致内存碎片化),而是允许模型将键值缓存数据拆分为“内存页面”。这些页面会根据需要动态分配和释放,从而优化内存使用率。
分页注意力对于处理大序列长度和减少内存开销至关重要,特别是在 GPT 和 LLaMA 等生成模型中。
3. 自定义插件
TensorRT-LLM 允许您使用以下方式扩展其功能 自定义插件。插件是用户定义的内核,可以实现标准 TensorRT 库未涵盖的特定优化或操作。
例如 Flash-注意 插件是一个著名的自定义内核,可优化基于 Transformer 的模型中的多头注意力层。通过使用此插件,开发人员可以大幅加快注意力计算的速度——注意力计算是 LLM 中最耗费资源的组件之一。
要将自定义插件集成到 TensorRT-LLM 模型中,您可以编写自定义 CUDA 内核并将其注册到 TensorRT。该插件将在模型执行期间调用,提供量身定制的性能改进。
4. NVIDIA H8 上的 FP100 精度
与 FP8 精度TensorRT-LLM 利用 NVIDIA 的最新硬件创新 H100 Hopper 架构. FP8 通过以 8 位浮点格式存储权重和激活来减少 LLM 的内存占用,从而加快计算速度而不会牺牲太多准确性。TensorRT-LLM 自动编译模型以利用优化的 FP8 内核,进一步加快推理时间。
这使得 TensorRT-LLM 成为需要顶级性能和能源效率的大规模部署的理想选择。
示例:使用 Triton 推理服务器部署 TensorRT-LLM
对于生产部署,NVIDIA 的 Triton 推理服务器 为大规模管理模型提供了一个强大的平台。在此示例中,我们将演示如何使用 Triton 部署 TensorRT-LLM 优化模型。
步骤 1:设置模型存储库
为 Triton 创建一个模型存储库,它将存储您的 TensorRT-LLM 模型文件。例如,如果您编译了 GPT2 模型,您的目录结构可能如下所示:
mkdir -p model_repository/gpt2/1
cp ./trt_engine/gpt2_fp16.engine model_repository/gpt2/1/
步骤2:创建Triton配置文件
在相同的 model_repository/gpt2/
目录,创建名为 config.pbtxt
告诉 Triton 如何加载和运行模型。以下是 TensorRT-LLM 的基本配置:
name: "gpt2"
platform: "tensorrt_llm"
max_batch_size: 8
input [
{
name: "input_ids"
data_type: TYPE_INT32
dims: [-1]
}
]
output [
{
name: "logits"
data_type: TYPE_FP32
dims: [-1, -1]
}
]
步骤 3:启动 Triton 服务器
使用以下 Docker 命令通过模型存储库启动 Triton:
docker run --rm --gpus all \
-v $(pwd)/model_repository:/models \
nvcr.io/nvidia/tritonserver:23.05-py3 \
tritonserver --model-repository=/models
步骤 4:向 Triton 发送推理请求
一旦 Triton 服务器运行,您就可以使用 HTTP 或 gRPC 向其发送推理请求。例如,使用 curl
发送请求:
curl -X POST http://localhost:8000/v2/models/gpt2/infer -d '{
"inputs": [
{"name": "input_ids", "shape": [1, 128], "datatype": "INT32", "data": [[101, 234, 1243]]}
]
}'
Triton 将使用 TensorRT-LLM 引擎处理请求并返回 logits 作为输出。
使用 TensorRT-LLM 优化 LLM 推理的最佳实践
为了充分利用 TensorRT-LLM 的强大功能,在模型优化和部署过程中遵循最佳实践非常重要。以下是一些关键提示:
1. 优化之前先分析模型
在应用量化或内核融合等优化之前,请使用 NVIDIA 的分析工具(如 Nsight Systems 或 TensorRT Profiler)了解模型执行中的当前瓶颈。这可让您针对特定的改进领域,从而实现更有效的优化。
2. 使用混合精度实现最佳性能
使用 TensorRT-LLM 优化模型时,使用 混合精度 (FP16 和 FP32 的组合)可显著提高速度,同时不会大幅降低准确度。为了在速度和准确度之间取得最佳平衡,请考虑在可用的情况下使用 FP8,尤其是在 H100 GPU 上。
3. 利用分页注意力机制处理大型序列
对于涉及长输入序列的任务,例如文档摘要或多轮对话,请始终启用 分页关注 优化内存使用情况。这可以减少内存开销并防止推理期间出现内存不足错误。
4. 针对多 GPU 设置微调并行性
在多个 GPU 或节点上部署 LLM 时,必须微调以下设置: 张量并行 和 管道并行性 以匹配您的特定工作负载。正确配置这些模式可以通过在 GPU 之间均匀分配计算负载来显著提高性能。
结论
TensorRT-LLM 代表了优化和部署大型语言模型的范式转变。凭借其量化、操作融合、FP8 精度和多 GPU 支持等高级功能,TensorRT-LLM 使 LLM 能够在 NVIDIA GPU 上更快、更高效地运行。无论您是在开发实时聊天应用程序、推荐系统还是大型语言模型,TensorRT-LLM 都能提供突破性能界限所需的工具。
本指南将指导您设置 TensorRT-LLM、使用其 Python API 优化模型、在 Triton 推理服务器上部署以及应用最佳实践以实现高效推理。借助 TensorRT-LLM,您可以加速 AI 工作负载、减少延迟并为生产环境提供可扩展的 LLM 解决方案。
原文地址:https://www.unite.ai/tensorrt-llm-a-comprehensive-guide-to-optimizing-large-language-model-inference-for-maximum-performance/