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.rhkb.cn/news/425479.html

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

相关文章

Double Write

优质博文:IT-BLOG-CN 一、存在的问题 为什么需要Double Write: InnoDB的PageSize是16kb,其数据校验也是针对这16KB来计算的,将数据写入磁盘是以Page为单位的进行操作的。而计算机硬件和操作系统,写文件是以4KB作为基…

Python基础语法(1)上

常量和表达式 我们可以把 Python 当成一个计算器,来进行一些算术运算。 print(1 2 - 3) print(1 2 * 3) print(1 2 / 3) 这里我们可能会有疑问,为什么不是1.6666666666666667呢? 其实在编程中,一般没有“四舍五入”这样的规则…

基于Python DoIPClient库的DoIP上位机开发手顺

代码 address, announcement DoIPClient.await_vehicle_announcement()logical_address announcement.logical_addressip, port addressprint(ip, port, logical_address) 效果 代码 address, announcement DoIPClient.get_entity(ecu_ip_addresssIp, protocol_version3…

二叉树OJ题——相同的树

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 相同的树 二、解题思路 时间复杂度:O(min(n,m)) 三、解题代码

解决IDEA每次创建新项目时都要指定Maven仓库和Maven配置文件的问题

文章目录 0. 前言1. 打开新项目的设置2. 搜索 Maven 相关的配置3. 更改Maven主路径、配置文件、本地仓库4. 更改新项目的Maven配置后没生效 0. 前言 在 IDEA 中每次创建新项目时,使用的都是默认的 Maven 仓库和默认的配置文件,需要我们手动修改&#xf…

利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(三)

简介 随着生成式人工智能的兴起,传统的 BI 报表功能已经无法满足用户对于自动化和智能化的需求,今天我们将介绍亚马逊云科技平台上的AI驱动数据可视化神器 – Quicksight,利用生成式AI的能力来加速业务决策,从而提高业务生产力。…

SpringSecurity原理解析(八):CSRF防御解析

一、CsrfFilter CsrfFilter 主要功能是用来防止csrf攻击 一、什么是CSRF攻击 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF&#xff0c…

【IP协议】IP协议报头结构

文章目录 IP 协议报头结构4位版本4位首部长度8位服务类型16位总长度16位标识、3位标志、13位片偏移8位生存时间8位协议16位首部校验和32源 IP 地址、32位目的 IP 地址 IP 协议报头结构 4位版本 实际上只有两个取值 4 > IPv4(主流)6 > IPv6 IPv2&…

浅谈人工智能之基于ollama本地大模型结合本地知识库搭建智能客服

浅谈人工智能之基于ollama本地大模型结合本地知识库搭建智能客服 摘要 随着人工智能技术的飞速发展,基于大型语言模型(LLMs)的智能客服系统逐渐成为提升企业服务质量和效率的关键工具。然而,对于注重数据隐私和安全的企业而言,使用云服务可能会引发数据泄露的风险。因此…

【C++题解】1996. 每个小组的最大年龄

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1996. 每个小组的最大年龄 类型:二维数组 题目描述: 同学们在操场上排成了一个 n 行 m 列的队形,每行的同学属于一个小组,请问每个小…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

SPI学习笔记

SPI SPI是一种同步串行通信接口规范,它允许一个主设备与一个或多个从设备进行全双工通信。SPI用于短距离通信,主要应用于嵌入式系统。 SPI通信过程 1.初始化:SPI主机首先将SS或CS线拉低,以选择特定的从设备并开始通信。 2.数据…

linux文件系统权限详解

注:目录的执行权限代表是否可以进入。 一、文件权限控制对文件的访问: 可以针对文件所属用户、所属组和其他用户可以设置不同的权限 权限具有优先级。user权限覆盖group权限,后者覆盖other权限。 有三种权限类别:读取、写入和执行 读权限:对文件:可读取文件…

集群聊天服务器项目【C++】(五)网络模块和业务模块

经过前面介绍相关的库和工具,比如Json、CMake、muduo等,我们可以开始编写本项目的代码了。 1.项目目录创建 一般一个项目由以下结构组成: bin文件夹存放:可执行程序build文件夹存放:编译过程中的临时文件include文…

电子竞技信息交流平台|基于java的电子竞技信息交流平台系统小程序(源码+数据库+文档)

电子竞技信息交流平台系统小程序 目录 基于java的电子竞技信息交流平台系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设…

“拍照赚钱”的任务定价(2017数学建模国赛b题)

文章目录 题目说明解题思路第一问第二问第三问第四问 部分结果图项目地址 题目 赛题地址 说明 数模国赛前的练手题。其实我个人感觉这道题很散,都是找一些规律进行总结统计,最多结合一些机器学习算法进行预测拟合之类的我刚开始用matlab,后…

【演化博弈论】:双方演化博弈的原理与过程

目录 一、演化博弈的原理1. 基本概念2. 参与者的策略3.演化过程 二、MATLAB 代码解读(博弈参与主体(双方)策略选择的动态演化讨程)三、MATLAB 代码解读(博弈主体随着时间策略选择的动态演化讨程)四、结论 演…

Java 枚举 新特性

Java 枚举(enum)自JDK 1.5引入以来,随着版本的升级不断增强。本文将回顾枚举的演进,尤其是结合switch语句的应用,展示枚举如何在现代Java中变得更加灵活。 1. JDK 1.5:Java 枚举的诞生 在JDK 1.5之前&…

TAG:BladeLLM 的纯异步推理架构

作者:张子鹏 PAI引擎团队 随着 GQA/MLA/MoE 等模型结构不断发展,大语言模型的推理逐步解除了显存限制,逐渐向着高并发、高吞吐的方向发展。推理引擎的运行时开销也变得不可忽视。主流 LLM 推理框架的运行时开销大致来自: Python …

黑马十天精通MySQL知识点

一. MySQL概述 安装使用 MySQL安装完成之后,在系统启动时,会自动启动MySQL服务,无需手动启动。 也可以手动的通过指令启动停止,以管理员身份运行cmd,进入命令行执行如下指令: 1 、 net start mysql80…