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 通过整合精度优化来加速深度学习工作负载,例如 INT8FP16。这些降低精度的格式可以在保持准确性的同时显著加快推理速度。这在低延迟是关键要求的实时应用中尤其有价值。

INT8FP16 优化在以下方面尤其有效:

  • 视频流媒体:基于人工智能的视频处理任务(例如物体检测)可从这些优化中受益,因为它可以减少处理帧所需的时间。
  • 推荐系统:通过加速处理大量用户数据的模型的推理,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 上进行的推理速度(以每秒令牌数为单位)的比较:

ModelPrecisionInput/Output LengthH100 (80GB)A100 (80GB)L40S FP8
GPTJ 6BFP8128/12834,95511,2066,998
GPTJ 6BFP82048/1282,8001,354747
LLaMA v2 7BFP8128/12816,98510,7256,121
LLaMA v3 8BFP8128/12816,70812,0858,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_INT32dims: [-1]}
]
output [{name: "logits"data_type: TYPE_FP32dims: [-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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net core8 使用JWT鉴权(附当前源码)

说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。 该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。 说明:OverallAuth2.0 是一个简单、易懂、功能强…

YOLOv8——测量高速公路上汽车的速度

引言 在人工神经网络和计算机视觉领域,目标识别和跟踪是非常重要的技术,它们可以应用于无数的项目中,其中许多可能不是很明显,比如使用这些算法来测量距离或对象的速度。 测量汽车速度基本步骤如下: 视频采集&#x…

游戏如何应对云手机刷量问题

云手机的实现原理是依托公有云和 ARM 虚拟化技术,为用户在云端提供一个安卓实例,用户可以将手机上的应用上传至云端,再通过视频流的方式,远程实时控制云手机。 市面上常见的几款云手机 原本需要手机提供的计算、存储等能力都改由…

python文件读写知识简记

简单记录一下python文件读写相关知识 一、打开文件 python使用open函数打开文件,函数原型如下 open(file, moder, buffering-1, encodingNone, errorsNone, newline None, closefdTrue, openerNone) file 文件地址 mode 文件打开模式,可设定为如下的…

深度学习实战:UNet模型的训练与测试详解

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 1、云实例:配置选型与启动1.1 登录注册1.2 配置 SSH 密钥对1.3 创建实例1.4 登录云实例 2、云存储:数据集上传…

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 文章目录 系列文章目录前言一、ArkTS基本介绍1、 ArkTS组成2、组件参数和属性2.1、区…

YOLOV8 OpenCV + usb 相机 实时识别

1 OpenCV 读相机 import cv2cap cv2.VideoCapture(0) while (1):# get a frameret, frame cap.read()# show a framecv2.imshow("capture", frame)if cv2.waitKey(1) & 0xFF ord(q):# cv2.imwrite("/opt/code/image/fangjian2.jpeg", frame)#passb…

Linux基础知识-1

Linux和Windows最大差异:目录。在Windows中,磁盘是被分成了很多区的,比如C盘,D盘,不同的文件放在不同的盘下面。下图为Windows的磁盘管理,可以看到磁盘0被划分为了不同的区域,C盘,D盘等&#xf…

[深度学习]Pytorch框架

1 深度学习简介 应用领域:语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年,chatGPT出现,进入AIGC发展阶段3 PyTorch框架简…

2024 年 CSS 终于增加了垂直居中特性,效率翻倍!

在 2024 年的Chrome 123 版本中&#xff0c; CSS 原生可以使用 1 个 CSS 属性 align-content: center进行垂直居中。 有何魅力&#xff1f; 这个特性的魅力在哪儿呢&#xff1f;我举例给你看一下 <div style"align-content:center; height:200px; background: #614e…

计算机网络:物理层 --- 基本概念、编码与调制

目录 一. 物理层的基本概念 二. 数据通信系统的模型 三. 编码 3.1 基本概念 3.2 不归零制编码 3.3 归零制编码 3.4 曼切斯特编码 3.5 差分曼切斯特编码 ​编辑 四. 调制 4.1 调幅 4.2 调频 4.3 调相 4.4 混合调制 今天我们讲的是物理…

影刀RPA实战:网页爬虫之携程酒店数据

1.实战目标 大家对于携程并不陌生&#xff0c;我们出行定机票&#xff0c;住酒店&#xff0c;去旅游胜地游玩&#xff0c;都离不开这样一个综合性的网站为我们提供信息&#xff0c;同时&#xff0c;如果你也是做旅游的公司&#xff0c;那携程就是一个业界竞争对手&#xff0c;…

[Spring]Spring MVC 请求和响应及用到的注解

文章目录 一. Maven二. SpringBoot三. Spring MVC四. MVC注解1. RequestMapping2. RequestParam3. PathVariable4. RequestPart5. CookieValue6. SessionAttribute7. RequestHeader8. RestController9. ResponseBody 五. 请求六. 响应 一. Maven Maven是⼀个项⽬管理⼯具。基于…

Python | Leetcode Python题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; class Trie:def __init__(self):# 左子树指向表示 0 的子节点self.left None# 右子树指向表示 1 的子节点self.right Noneclass Solution:def findMaximumXOR(self, nums: List[int]) -> int:# 字典树的根节点root Trie()# 最高位的二…

Java基础知识扫盲

目录 Arrays.sort的底层实现 BigDecimal(double)和BigDecimal(String)有什么区别 Char可以存储一个汉字吗 Java中的Timer定时调度任务是咋实现的 Java中的序列化机制是咋实现的 Java中的注解是干嘛的 Arrays.sort的底层实现 Arrays.sort是Java中提供的对数组进行排序的…

LabVIEW编程能力如何能突飞猛进

要想让LabVIEW编程能力实现突飞猛进&#xff0c;需要采取系统化的学习方法&#xff0c;并结合实际项目进行不断的实践。以下是一些提高LabVIEW编程能力的关键策略&#xff1a; 1. 扎实掌握基础 LabVIEW的编程本质与其他编程语言不同&#xff0c;它是基于图形化的编程方式&…

使用 UWA Gears 定位游戏内存问题

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 内存不足、内存泄漏和过度使用等问题&#xff0c;常常导致游戏出现卡顿、崩溃&#xff0c;甚至影响…

CSS | 如何来避免 FOUC(无样式内容闪烁)现象的发生?

一、什么是 FOUC(无样式内容闪烁)? ‌FOUC&#xff08;Flash of Unstyled Content&#xff09;是指网页在加载过程中&#xff0c;由于CSS样式加载延迟或加载顺序不当&#xff0c;导致页面出现闪烁或呈现出未样式化的内容的现象。‌ 这种现象通常发生在HTML文档已经加载&…

Redis数据结构之哈希表

这里的哈希表说的是value的类型是哈希表 一.相关命令 1.hset key field value 一次可以设置多个 返回值是设置成功的个数 注意&#xff0c;哈希表中的键值对&#xff0c;键是唯一的而值可以重复 所以有下面的结果&#xff1a; key中原来已经有了f1&#xff0c;所以再使用hse…

RTSP学习

RTSP基本原理 实时流传输协议(RTSP:RealTimeStreaming Protocol1)是一种网络传输协议,旨在发送低延迟流。 该协议由RealNetworks,Netscape和哥伦比亚大学的专家在1996年开发。它定义了应如何打包流中的数据以进行传输。 类似一个控制命令的协议play teardown 负责音视频的数据…