TensorRT-LLM——优化大型语言模型推理以实现最大性能的综合指南

news2024/11/13 10:01:17

引言

随着对大型语言模型 (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_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/

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

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

相关文章

AD的入门操作

锦囊 1、打开AD后,一般默认打开上一个工程,这个时候如果想要打开新的工程,那就必须要创建一个项目,然后再在项目中添加原理图库和PCB库。 2、大多数情况下,直接使用库,不用自己再画原理图和封装库。 3、…

LeetCode[中等] 49.字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 思路&#xff1a; new Dictionary<string, List<string>>() 存储数据&#xff0c;key为排序之后的字符…

超高速传输 -- 相干光通信和非相干光通信

概述&#xff1a;技术对比 项目非相干光通信相干通信定义不需要相干本振光的光传输系统。采用本振光进行相干检测的光传输系统。调制解调技术发送端&#xff1a;强度调制。 接收端&#xff1a;直接检测。发送端&#xff1a;外调制。 接收端&#xff1a;本振光相干检测。码型幅…

完美的宝塔面板防御策略,基于 fail2ban

之前分享过宝塔面板配合fail2ban&#xff0c;以及开启cloudflare的cdn双重防御的教程&#xff0c;并制作了便捷的脚本这次不靠cloudflare的减速cdn&#xff0c;看看防御效果怎么样 系统环境 debian/ubuntu nginx 宝塔面板 注意要点 1.在宝塔面板开启站点日志 2.添加服务器白名…

加密与安全_HTTPS TLS 1.2 连接(RSA 握手)的整个过程解读

文章目录 HTTPS 数据传输的安全性保障SSL/TLS 作为混合加密系统的典范HTTPS TLS 1.2 连接&#xff08;RSA 握手&#xff09;的整个过程TLS 握手过程解析1. TCP 三次握手 (最顶部的黄色部分)2. TLS 握手阶段 (红色部分)2.1 Client Hello2.2 Server Hello2.3 CA 证书验证2.4 Clie…

[Python数据可视化]Plotly Express: 地图数据可视化的魅力

在数据分析和可视化的世界中&#xff0c;地图数据可视化是一个强大而直观的工具&#xff0c;它可以帮助我们更好地理解和解释地理数据。Python 的 Plotly Express 库提供了一个简单而强大的方式来创建各种地图。本文将通过一个简单的示例&#xff0c;展示如何使用 Plotly Expre…

【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目

之前写过一篇文章&#xff1a;《【JavaWeb】利用IntelliJ IDEA 2024.1.4 Tomcat10 搭建Java Web项目开发环境&#xff08;图文超详细&#xff09;》详细讲解了如何搭建JavaWeb项目的开发环境&#xff0c;里面默认使用的Web版本是4.0版本的。但在某些时候tomcat10可能无法运行we…

24年蓝桥杯及攻防世界赛题-MISC-1

2 What-is-this AZADI TOWER 3 Avatar 题目 一个恐怖份子上传了这张照片到社交网络。里面藏了什么信息&#xff1f;隐藏内容即flag 解题 ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/outguess] └─$ outguess -r 035bfaa85410429495786d8ea6ecd296.jpg flag1.txt Rea…

iKuai使用及设置流程

iKuai使用及设置流程 iKuai安装步骤 一、配置主机 1.电脑连接ETH0网口 2.ETH1网口连接猫上面的千兆口 3.手动配置pc的IP地址和192.168.1.1./24在同一网段 3.浏览器输入192.168.1.1 admin admin 二、外网设置 1.直接联通电信网络设置 2.点击 网络设置-内外网设置-点击接…

LeetCode从入门到超凡(一)枚举算法

前言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的LeetCode学习总结文档&#xff1b;本文主要讲解枚举算法。&#x1f495;&#x1f495;&#x1f60a; 一、基本概念 1.定义 定义&am…

记录小数点

记录data frame小数点后面省略掉0的问题 iloc得到的series .to_list() 0被省略掉 to_list() 可能会将浮点数转换为默认格式。先将数据转换为字符串以保留格式 df_2708.iloc[2,:].apply(lambda x: f{x:.3f}).to_list()自定义保留小数点后几位 def formatter(value):return &q…

【工作流集成】springboot+vue工作流审批系统(实际源码)

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾回收算法

文章目录 垃圾回收机制垃圾判断算法引用计数法可达性分析算法虚拟机栈中的引用&#xff08;方法的参数、局部变量等&#xff09;本地方法栈中 JNI 的引用类静态变量运行时常量池中的常量 垃圾收集算法Mark-Sweep&#xff08;标记-清除&#xff09;算法Copying&#xff08;标记-…

电脑右击没有txt文件

文本文档是一个好工具&#xff0c;小而快&#xff0c;比word快多&#xff0c;一般情况下&#xff0c;记录都会先用txt文本&#xff0c;但是今天发现右击菜单新建里面没有&#xff0c;怎么回事&#xff1f; 这个需要打开注册编辑表修改 一、打开注册编辑表 win R 输入regedi…

JetLinks物联网学习(前后端项目启动)

前后端项目启动 1、后端1.1 pgsql改mysql报错2、elasticSearch7.0版本以上_doc格式取消 2、前端 1、后端 环境准备&#xff1a; 1、window系统7,8&#xff0c;10 。 硬件资源最低要求4c8G&#xff0c;硬盘40G 2、JDK 1.8.0_2xx (需要小版本号大于200) 3、Maven3.6.3 4、Redis …

专题四_位运算( >> , << , , | , ^ )_算法详细总结

目录 位运算 常见位运算总结 1.基础位运算 2.给一个数 n ,确定它的二进制表示中的第 x 位是 0 还是 1 3.运算符的优先级 4.将一个数 n 的二进制表示的第 x 位修改成 1 5.将一个数n的二进制表示的第x位修改成0 6.位图的思想 7.提取一个数&#xff08;n&#xff09;二进…

解决使用阿里云DataV Geo在线地图路径访问403问题

文章目录 1. DataV Geo在线地图路径访问403问题2. 解决方法3. 重启生效 1. DataV Geo在线地图路径访问403问题 最近在写一个省市下钻的demo&#xff0c;用到的是 阿里云DataV Geo在线地图 去动态获取GeoJSON 省市的数据&#xff0c;如下代码 axios.get("https://geo.dat…

Ubuntu24.04 安装opencv4.10

Ubuntu24.04 安装opencv4.10 一、下载OpenCV二、更新系统&#xff0c;安装必要的包1、“E: unable to locate libjasper-dev"的解决方法2、没有公钥&#xff0c;无法验证下列签名 :NO_PUBKEY 的解决方法 三、配置&#xff0c;使用cmake工具1、新建build目录2、在build中&a…

计算机毕业设计 玩具租赁系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

智能 Uber 发票 PDF 合并工具

在现代商务出行中&#xff0c;尤其是在跨国出差中&#xff0c;处理和整合大量 Uber 发票已成为一项不小的挑战。手动整理和合并这些发票不仅耗时&#xff0c;还容易出错。作为开发者&#xff0c;为什么不开发一个自动化工具&#xff0c;将这些任务交给代码来完成呢&#xff1f;…