TensorRT-LLM | 大模型部署专用框架

点击下方卡片,关注“自动驾驶之心”公众号

戳我-> 领取自动驾驶近15个方向学习路线

>>点击进入→自动驾驶之心大模型部署技术交流群

编辑 | 自动驾驶之心

TensorRT-LLM是NVIDIA推出的一款高性能深度学习推理优化库,专注于提升大型语言模型(LLM)在NVIDIA GPU上的推理速度和效率。如果您绕不开Nvidia的芯片,那么一定要好好了解这款推理库。

项目链接:https://github.com/NVIDIA/TensorRT-LLM

a29f8cdabd5e9185f7755a64f4b7fb37.png

一、TensorRT-LLM的优势

TensorRT-LLM(TensorRT for Large Language Models)旨在解决大型语言模型在实际应用中面临的性能瓶颈问题。通过提供一系列专为LLM推理设计的优化工具和技术,TensorRT-LLM能够显著提升模型的推理速度,降低延迟,并优化内存使用。

二、TensorRT-LLM的核心功能

1)易于使用的Python API
  • TensorRT-LLM提供了一个简洁易用的Python API,允许用户定义大型语言模型并构建包含先进优化的TensorRT引擎。

  • 该API设计类似于PyTorch,使得具有PyTorch经验的开发者能够轻松迁移和集成。

2)模型优化
  • TensorRT-LLM支持多种量化选项(如FP16、INT8等),用户可以根据具体需求选择合适的配置,实现性能与精度的平衡。

  • 通过层级融合、内核选择和精度调整等优化技术,TensorRT-LLM能够显著提升模型的推理速度。

3)内存管理
  • TensorRT-LLM通过智能内存分配和分页注意力机制,优化了内存使用,降低了内存占用。

4)多线程并行与硬件加速
  • 支持多线程并行处理,提高处理速度。

  • 充分利用NVIDIA GPU的计算能力,加速模型推理。

5)动态批处理
  • TensorRT-LLM支持动态批处理,通过同时处理多个请求来优化文本生成,减少了等待时间并提高了GPU利用率。

6)多GPU与多节点推理
  • 支持在多个GPU或多个节点上进行分布式推理,提高了吞吐量并减少了总体推理时间。

7)FP8支持
  • 配备TensorRT-LLM的NVIDIA H100 GPU能够轻松地将模型权重转换为新的FP8格式,并自动编译模型以利用优化的FP8内核。这得益于NVIDIA Hopper架构,且无需更改任何模型代码。

8)最新GPU支持
  • TensorRT-LLM 支持基于 NVIDIA Hopper、NVIDIA Ada Lovelace、NVIDIA Ampere、NVIDIA Turing 和 NVIDIA Volta 架构的GPU。

三、TensorRT-LLM支持部署的模型

1)LLM系列
5026d757bce60cc4a1c2cf752c499b5f.png c4f1d1d589fae4d9a76a8965cbfb163b.png
2)多模态大模型
d30fe557f938a68ca0342b4c6f55b2dd.png

四、量化相关

INT8 SmoothQuant (W8A8)

SmoothQuant技术在:https://arxiv.org/abs/2211.10438中被介绍。它是一种使用INT8对激活和权重进行推理的方法,同时保持网络(在下游任务中)的准确性。如研究论文所述,必须对模型的权重进行预处理。TensorRT-LLM包含用于准备模型以使用SmoothQuant方法运行的脚本。

关于如何为GPT、GPT-J和LLaMA启用SmoothQuant的示例,可以在版本的examples/quantization文件夹中找到。

INT4和INT8仅权重量化 (W4A16和W8A16)

INT4和INT8仅权重量化技术包括对模型的权重进行量化,并在线性层(Matmuls)中动态地对这些权重进行反量化。激活使用浮点数(FP16或BF16)进行编码。要使用INT4/INT8仅权重量化方法,用户必须确定用于量化和反量化模型权重的缩放因子。

GPTQ和AWQ (W4A16)

GPTQ和AWQ技术分别在https://arxiv.org/abs/2210.17323和https://arxiv.org/abs/2306.00978中介绍。TensorRT-LLM支持在线性层中使用每组缩放因子和零偏移来实现GPTQ和AWQ方法。有关详细信息,请参阅WeightOnlyGroupwiseQuantMatmulPlugin插件和相应的weight_only_groupwise_quant_matmulPython函数。

代码中包括将GPTQ应用于GPT-NeoX和LLaMA-v2的示例,以及使用AWQ与GPT-J的示例。这些示例是实验性实现,并可能在未来的版本中有所改进。

FP8 (Hopper)

TensorRT-LLM包含为GPT-NeMo、GPT-J和LLaMA实现的FP8。这些示例可以在examples/quantization中找到。

五、TensorRT-LLM支持的硬件和软件

8f22df6e5db569044972037e1510bbb9.png 4ad7aca70306fd812176d53d24059da2.png

六、TensorRT-LLM的应用场景

TensorRT-LLM在多个领域展现了其强大的应用能力,包括但不限于:

  1. 在线客服系统:通过实时的对话生成,提供无缝的人工智能辅助服务。

  2. 搜索引擎:利用模型对查询进行增强,提供更精准的搜索结果。

  3. 自动代码补全:在IDE中集成模型,帮助开发者自动完成代码编写。

  4. 内容创作平台:自动生成文章摘要或建议,提升创作者的工作效率。

自动驾驶之心知识星球』欢迎加入交流!重磅,自动驾驶之心科研论文辅导来啦,申博、CCF系列、SCI、EI、毕业论文、比赛辅导等多个方向,欢迎联系我们!

042c815f21a8bb80569a1f1d8693273a.jpeg

① 全网独家视频课程

端到端自动驾驶、仿真测试、自动驾驶C++、BEV感知、BEV模型部署、BEV目标跟踪、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测车道线检测轨迹预测在线高精地图世界模型点云3D目标检测目标跟踪Occupancy、CUDA与TensorRT模型部署大模型与自动驾驶NeRF语义分割自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

8f9c5bce3c4628ff89f94b01fa2b1501.png

网页端官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

国内外最大最专业,近4000人的交流社区,已得到大多数自动驾驶公司的认可!涉及30+自动驾驶技术栈学习路线,从0到一带你入门自动驾驶感知端到端自动驾驶世界模型仿真闭环2D/3D检测、语义分割、车道线、BEV感知、Occupancy、多传感器融合、多传感器标定、目标跟踪)、自动驾驶定位建图SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案大模型,更有行业动态和岗位发布!欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频

1f1a35af460b0db843505a1fd8ebc9e8.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦感知、定位、融合、规控、标定、端到端、仿真、产品经理、自动驾驶开发、自动标注与数据闭环多个方向,目前近60+技术交流群,欢迎加入!扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

457aa1d2cb71434b3c33c59be82d079d.jpeg

④【自动驾驶之心】全平台矩阵

405aae1b147b3fe62eabd23e538feef4.png

### 使用 TensorRT-LLM 部署大型模型 为了在 TensorRT-LLM 中成功部署大型语言模型 (LLMs),需遵循一系列特定的操作流程来确保最佳性能和兼容性。由于每种模型架构都有所不同,TensorRT 进行的是深层次图级优化,因此并非所有 LLMs 均能开箱即用地得到支持[^1]。 #### 准备工作 安装必要的依赖项之前,确认已具备适当版本的 NVIDIA CUDA 工具包及 cuDNN 库。接着通过 pip 或者 conda 安装 TensorRT 及其 Python 绑定: ```bash pip install nvidia-tensorrt tensorrt_llm ``` #### 加载预训练模型 对于想要加载到 TensorRT-LLM 的预训练模型而言,通常需要先将其转换为目标框架格式。这里以 Hugging Face Transformers 提供的一个 PyTorch 模型为例展示这一过程: ```python from transformers import AutoModelForCausalLM, AutoTokenizer model_name = "mistralai/Mistral-7B-Instruct-v0.1" tokenizer = AutoTokenizer.from_pretrained(model_name) pytorch_model = AutoModelForCausalLM.from_pretrained(model_name) ``` #### 构建 TensorRT 引擎 一旦拥有合适的输入模型文件路径,就可以利用 `tensorrt_llm` 创建对应的 TensorRT 引擎实例了。下面是一段简单的代码片段用于说明此操作: ```python import tensorrt as trt from tensorrt_llm.models import load_from_hf_hub engine_path = 'path/to/save/engine.trt' with open(engine_path, mode='wb') as f: with trt.Builder(trt.Logger()) as builder, \ builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) as network, \ trt.OnnxParser(network, trt.Logger()) as parser: model_config = load_from_hf_hub(model_name=model_name) # 将PyTorch模型导出为ONNX格式 onnx_file_path = './temp_model.onnx' torch.onnx.export( pytorch_model, args=(torch.randint(high=50256, size=(1, 8), dtype=torch.int64).cuda(),), f=onnx_file_path, input_names=['input_ids'], output_names=["logits"], opset_version=13, ) # 解析 ONNX 文件并配置网络参数 with open(onnx_file_path, 'rb') as model_file: if not parser.parse(model_file.read()): raise RuntimeError('Failed to parse the ONNX file') config = builder.create_builder_config() profile = builder.create_optimization_profile() min_input_shape = {"input_ids": [1, 1]} opt_input_shape = {"input_ids": [1, 8]} max_input_shape = {"input_ids": [1, 64]} profile.set_shape("input_ids", min=min_input_shape["input_ids"],\ opt=opt_input_shape["input_ids"],max=max_input_shape["input_ids"]) config.add_optimization_profile(profile) serialized_engine = builder.build_serialized_network(network, config) f.write(serialized_engine) ``` 这段脚本展示了如何创建一个基于给定 ONNX 模型的新 TensorRT 引擎,并保存至磁盘以便后续使用。注意,在实际应用中可能还需要调整更多选项来适应具体需求。 #### 执行推理请求 最后一步就是编写客户端应用程序向已经准备好的 TensorRT 引擎发送查询请求。这可以通过读取先前生成的序列化引擎数据实现,并建立相应的上下文环境来进行预测计算: ```python def infer(input_text): inputs = tokenizer.encode_plus(prompt=input_text, return_tensors="pt").to('cuda') runtime = trt.Runtime(trt.Logger()) with open(engine_path, 'rb') as f: engine_data = f.read() engine = runtime.deserialize_cuda_engine(engine_data) context = engine.create_execution_context() bindings = [ None, # Input binding index is set to None because we will provide it directly. cuda.mem_alloc(inputs['input_ids'].nelement() * inputs['input_ids'].element_size()), ] stream = cuda.Stream() outputs = np.empty([1], dtype=np.float32) # Transfer data from CPU to GPU and execute inference asynchronously. cuda.memcpy_htod_async(bindings[1], inputs['input_ids'], stream) context.execute_v2(bindings) cuda.memcpy_dtoh_async(outputs, bindings[1], stream) stream.synchronize() result_tensor = torch.tensor(outputs).reshape_as(inputs['input_ids']) generated_tokens = tokenizer.decode(result_tensor.tolist()[0]) return generated_tokens ``` 上述函数接收一段文本作为输入,经过编码处理后传递给 TensorRT 引擎完成推理任务,最终返回解码后的输出字符串表示形式的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值