LLM推理部署(二):英伟达LLM推理部署工具TensorRT-LLM

news2024/11/28 3:43:57

       在大模型时代,各大公司在陆续推出和优化各自的底座大模型,不断刷新榜单,然而大模型的超大参数给生产部署带来了很大的困难,由此也带来大模型部署框架的蓬勃发展(可以参考之前写的LLM推理部署(一):LLM七种推理服务框架总结),本文将介绍英伟达(NVIDIA)在TensorRT基础上针对LLM优化所推出的推理加速引擎TensorRT-LLM(https://nvidia.github.io/TensorRT-LLM/)。

TensorRT-LLM介绍

       TensorRT-LLM针对主流LLM使用TensorRT在GPU高效推理的能力,以NVIDIA Triton(https://developer.nvidia.com/nvidia-triton-inference-server)推理服务器集成为后端,可以在python和C++环境下运行,并且支持单GPU和多GPU(Tensor并行和Pipeline并行)推理,同时也支持量化模式。

      TensorRT-LLM为用户提供了一个易于使用的Python API,类似PyTorch API,比如包含einsum、softmax、matmul或view等功能,layer模块(https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/tensorrt_llm/layers)提供了一些常用的LLM组件,比如Attention、MLP或者完整的Transformer等。主要的python API如下图所示:

图片

TensorRT-LLM安装

对于windows操作系统可以参考:https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/windows

TensorRT-LLM必须从源码安装,参考链接如下:https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/docs/source/installation.md

TensorRT-LLM使用

使用TensorRT-LLM部署大模型大致分为如下三个步骤:

  1. 下载预训练模型权重;

  2. 创建大模型的全优化引擎;

  3. 部署该引擎

下面以BLOOM-560m模型为例介绍使用TensorRT-LLM部署大模型的步骤:

Step0:在docker容器中安装所需要的环境

pip install -r examples/bloom/requirements.txtgit lfs install

Step1:从Huggingface中下载BLOOM-650m模型​​​​​​​

cd examples/bloomrm -rf ./bloom/560Mmkdir -p ./bloom/560M && git clone https://huggingface.co/bigscience/bloom-560m ./bloom/560M

Step2:创建引擎​​​​​​​

# Single GPU on BLOOM 560Mpython build.py --model_dir ./bloom/560M/ \                --dtype float16 \                --use_gemm_plugin float16 \                --use_gpt_attention_plugin float16 \                --output_dir ./bloom/560M/trt_engines/fp16/1-gpu/

Note:关于参数的细节可以参考https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/examples/bloom

Step3:运行引擎​​​​​​​

python summarize.py --test_trt_llm \                    --hf_model_location ./bloom/560M/ \                    --data_type fp16 \                    --engine_dir ./bloom/560M/trt_engines/fp16/1-gpu/

除了上述example之外,我们来看一下具体API的使用说明:

       在模型级别,TensorRT-LLM采用复杂的策略,如内核融合,将其中多个操作合并到单个内核中,以减少启动多个内核的开销。它还利用量化,大大加快了计算速度,减少了内存需求,而不影响模型精度。​​​​​​​

import tensorrtllm as trtllm
 # Initialize the model model = trtllm.LargeLanguageModel('./path_to_your_model')
 # Apply kernel fusion and quantization optimization_flags = trtllm.OptimizationFlag.FUSE_OPERATIONS | trtllm.OptimizationFlag.QUANTIZE optimized_model = model.optimize(flags=optimization_flags)

       在运行时级别,TensorRT-LLM具有连续批处理等功能,允许同时计算多个推理请求,有效地提高GPU利用率和吞吐量。分页注意力是另一个新特性,优化了注意力计算过程中的内存使用,这是大型语言模型的一个常见瓶颈。​​​​​​​

# Enable in-flight batching and paged attention runtime_parameters = {    'in_flight_batching': True,    'paged_attention': True }
 # Build the engine with these runtime optimizations engine = optimized_model.build_engine(runtime_parameters=runtime_parameters)

       在当今的数字时代,速度是至关重要的。TensorRT-LLM可与传统方法相比,提供高达8倍的吞吐量。

       这种性能上的飞跃在很大程度上归功于in_flight_batching。与传统的批处理不同,在传统的批处理中,推理请求是分组处理的(导致单个请求的延迟),而在线批处理重叠了不同请求的计算,在不影响批大小的情况下大大减少了推理时间。​​​​​​​

 input_data = [...] # your input data here results = engine.execute_with_inflight_batching(input_data)

       丰富多样的大型语言模型(llm),每个模型都是为特定任务量身定制的。推理工具的效用因其与各种模型无缝集成的能力而大大增强。TensorRT-LLM在这一领域表现出色,并且提供了广泛的兼容性,从Meta的Llama 1和2到ChatGLM、Falcon、MPT、Baichuan、Starcoder等一系列llm。​​​​​​​

import tensorrtllm as trtllm  # Define and load different LLMs llama_model = trtllm.LargeLanguageModel('./path_to_llama_model') chatglm_model = trtllm.LargeLanguageModel('./path_to_chatglm_model')  # Build optimized engines for different LLMs llama_engine = llama_model.build_engine() chatglm_engine = chatglm_model.build_engine()

       部署人工智能的经济方面通常是人工智能驱动项目可行性的决定性因素。除了原始计算性能之外,TensorRT-LLM的设计还具有成本效益,解决了包括直接和间接费用在内的总拥有成本(TCO)问题。通过提高计算效率,TensorRT-LLM减少了对大量硬件资源的依赖,从而降低了能耗。​​​​​​​

import tensorrtllm as trtllm  # Initialize the model model = trtllm.LargeLanguageModel('./path_to_your_model')  # Optimize the model with energy-efficient settings optimized_model = model.optimize(energy_efficient=True)  # Monitor energy consumption energy_usage = optimized_model.monitor_energy_usage()

       进入大型语言模型(llm)的世界不需要计算机科学博士学位或多年的编程经验。TensorRT-LLM的设计以用户友好为核心。通过其直观的Python API, TensorRT-LLM使LLM优化和推理平民化,使这些先进技术能够为更广泛的受众所使用。​​​​​​​

import tensorrtllm as trtllm  # Initialize and load the model model = trtllm.LargeLanguageModel('./path_to_your_model')  # Perform common operations through easy-to-understand methods model.optimize() model.build_engine() model.execute(input_data)

       模型的规模呈指数级增长,管理计算资源至关重要。TensorRT-LLM的量化支持允许使用较低的精度(如FP8)进行计算,TensorRT-LLM在资源消耗、执行速度和模型精度之间实现了良好的平衡。这不仅加快了推理速度,还减少了内存使用,这对于在受限环境中部署大型模型至关重要。​​​​​​​

import tensorrtllm as trtllm  # Initialize the model model = trtllm.LargeLanguageModel('./path_to_your_model')  # Enable quantization quantized_model = model.enable_quantization(precision='FP8')  # Build and execute the quantized model engine = quantized_model.build_engine() result = engine.execute(input_data)

       作为NVIDIA官方产品,TensorRT-LLM在构建时考虑了适应性,准备与新兴的LLM生态系统集成。随着新模型架构的出现和现有模型的完善,TensorRT-LLM支持与前沿开发的无缝集成。​​​​​​​

 import tensorrtllm as trtllm  # Initialize the model model = trtllm.LargeLanguageModel('./path_to_your_model')  # Update the model with new kernels or architectures updated_model = model.update_components(new_kernels='./path_to_new_kernels',                                        new_architectures='./path_to_new_architectures')  # Re-optimize and deploy the updated model updated_engine = updated_model.build_engine()

TensorRT-LLM支持的GPU类型

       目前支持H100、L40S、A100、A30、V100,除此之外的GPU型号可以使用Volta, Turing, Ampere, Hopper和Ada Lovelace架构运行,不过可能会有限制,比如对数据精度的支持就有所不同,如下表所示:

FP32

FP16BF16FP8INT8INT4
Volta (SM70)YYNNYY
Turing (SM75)YYNNYY
Ampere (SM80, SM86)YYYNYY
Ada-Lovelace (SM89)YYYYYY
Hopper (SM90)YYYYYY

更多可以参考:https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/docs/source/precision.md

TensorRT-LLM支持的核心技术点

图片

       每个大模型对上述技术的支持不同,具体可以参考:https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/examples

TensorRT-LLM支持的大模型

图片

TensorRT-LLM大模型的推理性能

       GPT-J, LLAMA-7B, LLAMA-70B, Falcon-180B模型在H100, L40S 和 A100GPU下测试的性能可以参考:https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/docs/source/performance.md

TensorRT-LLM的一些高级话题

Quantization

https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/docs/source/precision.md

In-flight Batching

https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/docs/source/batch_manager.md

Attention

https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/docs/source/gpt_attention.md

Graph Rewriting

https://github.com/NVIDIA/TensorRT-LLM/blob/release/0.5.0/docs/source/graph-rewriting.md

参考文献:

[1] https://github.com/NVIDIA/TensorRT-LLM

[2] https://nvidia.github.io/TensorRT-LLM/

[3] https://mp.weixin.qq.com/s/pIZ9ceJzTG8kMZMn1m5oQw

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

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

相关文章

如何快速学习编程编程?

语言的选择 选择适合自己的编程语言学习主流的编程语言了解不同语言的特点和适用场景学习资源线上学习资源:在线课程、视频教程、GitHub等线下学习资源:书籍、教程、练习题等 社区交流 加入编程社区,与他人交流学习心得和经验学习方法分阶…

内存空间的扩充

一、覆盖技术 解决程序大小超过物理内存总和问题 1.思想 将程序分为多个段/模块,常用段常驻内存,不常用段在需要时调入内存 2.组成 固定区(存放常驻内存,调入后到运行结束时才调出)覆盖区(存放不常用段,需要时调入,不需…

【优选算法系列】【专题五位运算】第一节.常见的位运算(面试题 01.01. 判定字符是否唯一和268. 丢失的数字)

文章目录 前言常见的位运算一、判定字符是否唯一 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、丢失的数字 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 常见的…

[PyTorch][chapter 60][强化学习-2-有模型学习2]

前言: 前面我们讲了一下策略评估的原理,以及例子. 强化学习核心是找到最优的策略,这里 重点讲解两个知识点: 策略改进 策略迭代与值迭代 最后以下面环境E 为例,给出Python 代码 。 目录: 1: 策略改进 2&…

FSCTF2023-MISC部分WP

FSCTF2023-MISC部分WP 前言:MISC:[FSCTF 2023]Simple Encryption:[FSCTF 2023]萧河:[FSCTF 2023]base套:[FSCTF 2023]行不行啊细狗:[FSCTF 2023]为什么不换换思路捏:[FSCTF 2023]小试牛刀:[FSCT…

Redis内存满的最佳解决方案

文章目录 前言造成内存满原因数据量过大键过期机制不合理内存碎片内存泄漏大量短期数据存储 解决方案1.增加内存2.设置过期时间2.1.在set命令中指定过期时间(秒):2.2.在set命令中指定过期时间(毫秒):2.3.使用expire命令为已有key设置过期时间(秒):2.4.使用pexpire命令为已有key…

Git复制代码

目录 一、常用下载代码 1.登录Git克隆SSH​编辑 2.新建文件然后右键点击Git Bash Here 3.git clone Paste 二. 本地下载 1.从本地进入页面 2.生成代码——>导入——>生成代码后下载 3.解压道相应位置 一、常用下载代码 1.登录Git克隆SSH 2.新建文件然后右键点击…

大厂面试题-什么是拆包和粘包?怎么解决?

目录 问题分析 问题解答 问题分析 拆包和粘包是在网络编程中比较常见的现象。 因为TCP协议底层是面向流的传输,所以数据在传输的过程中会被分割成一个个的数据包(如图) 接收端在接收数据时需要重新组装数据包,但是TCP协议不保证数据包与应用层的数据…

ch0_OSI 七层网络协议介绍

目录 概述 1、三网融合的概念 三网:电信网络、有线电视网络、计算机网络 概念:把上述三种网络融合成一种网络 2、计算机网络的定义、分类 定义:计算机网络是将地理位置不同的独立计算机系统,通过传输介质链接起来&#xff0c…

JS中null和undefined的区别

首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。 undefined 代表的含义是未定义,null 代表的含义是空对象。一般变量声明了但还没有定义的时候会返回 undefined,null主要…

Python基础(11)-- numpy.argpartition函数

1.前言 在深挖自己研究领域的代码过程中,发现np.argpartition函数出现在核心代码部分,并且出现的频率很高,对于我理解这段代码也有很大的帮助,决定彻底搞懂,话不多说,Let’s go! 2.函数解析 …

企业级API资产如何管理

在当今数字化时代,API已成为企业开发和创新的重要工具,如何高效地管理和调度这些资产成为了企业发展的重要课题。API资产管理的出现,为企业解决了这一难题,通过合理管理和利用API资产,企业可以更好地推动业务发展&…

vue工程化开发和脚手架

工程化开发和脚手架 1.开发Vue的两种方式 核心包传统开发模式:基于html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工具(例如:webpack)的环境中开发Vue。 工程化开…

漏洞复现--XXL-JOB默认accessToken身份绕过漏洞

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

视频剪辑合并攻略:随机封面,高效合并,轻松改标题

随着社交媒体的兴起,视频内容已经成为人们获取信息、娱乐和交流的重要方式。视频剪辑作为视频制作的关键步骤之一,不仅需要掌握技术,还需具备一定的创意和审美能力。在本文中,我们将分享云炫AI智剪实用的视频剪辑合并攻略&#xf…

甘特图组件DHTMLX Gantt用例 - 如何拆分任务和里程碑项目路线图

创建一致且引人注意的视觉样式是任何项目管理应用程序的重要要求,这就是为什么我们会在这个系列中继续探索DHTMLX Gantt图库的自定义。在本文中我们将考虑一个新的甘特图定制场景,DHTMLX Gantt组件如何创建一个项目路线图。 DHTMLX Gantt正式版下载 用…

【VR开发】【Unity】【VRTK】3-VR项目设置

任何VR避不开的步骤 如何设置VR项目,无论是PC VR还是安卓VR,我在不同的系列教程中都说过了,不过作为任何一个VR开发教程都难以避免的一环,本篇作为VRTK的开发教程还是对VR项目设置交代一下。 准备好你的硬件 头盔必须是6DoF的,推荐Oculus Quest系列,Rift系列,HTC和Pi…

什么样的耳机适合跑步?适合跑步佩戴的无线耳机推荐

​无论是在烈日炎炎的夏天,还是在寒风刺骨的冬天里健身运动,只要打开音乐就能沉浸其中。运动耳机不仅佩戴稳固舒适,还能提供高品质音质表现。无论在哪里,无论何时,只要打开音乐,你就可以找到你的节奏&#…