(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述
上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分,导出模型分为 convert_checkpoint.py (quantize.py) 和 trtllm-build 两个过程。
有些较新的模型不支持这个流程了,比如 DeepSeek-R1 等,需使用 pytorch backend 那套。
1. convert_checkpoint.py
首先确定待转换模型的类型,然后在 examples/models 下面找到对应使用的脚本。本文使用 Qwen2.5-0.5B-Instruct,对应脚本文件是 examples/models/core/qwen/convert_checkpoint.py。
前文 提到,在 convert_checkpoint.py 这个过程主要是确定权重的拆分和计算方式,以及实际采用的量化方式,所以参数主要也是分为这两部分。
1.1 权重的拆分和计算
按照不同的切分方式,将模型权重以某种方式将其加载后放置到不同卡上,使得较大模型也能在多张较小显存的卡上运行。在实际运行时,某张卡仅负责部分权重的加载和运行,然后在需要整体数据时归约各卡的计算结果。
1.1.1 tp_size
将权重按照设置的 tp_size 值切分并加载到不同卡上,每张卡上保存全部激活值。当需要全局信息如计算自注意力的时候,首先将各卡结果归约。在实际设置时,tp_size 必须能整除 num_attention_heads 和 num_kv_heads 等这种维度划分的纬度值。
1.1.2 pp_size
将模型按照层切分到不同卡上,注意 tp_size*pp_size 的值不超过总卡数。
1.1.3 cp_size
暂时跳过,tp_size pp_size 和 cp_size 可以任意组合设置。
1.1.4 moe_tp_size
moe 和集成学习类似,通过多个模型来解决同一个问题,并且将它们的结果整合。如上图,论文 使用稀疏的 moe 块替换稠密的 FFN 层,图中每一个子 FFN 模块称为一个专家,整体还包含一个门控模块。在实际运行时,输入首先过一个门控网络,门控模块输出 softmax 的概率结果来确定输出应该路由到哪些专家并参与运算,同时通过 --moe_top_k 参数来控制参数运算的专家数。
--moe_tp_size 对 moe 模块使用 tp,默认值等于 tp_size 的值。
1.1.5 moe_ep_size
对于 moe 模块,将不同的专家放到不同的卡上,可以和 moe_tp_size 组合使用,默认值是 1,该值必须能够整除专家数。
1.1.6 示例
如设置 tp_size=4 pp_size=2:
python examples/models/core/qwen/convert_checkpoint.py \--model_dir Qwen2.5-0.5B-Instruct \--tp_size 4 \--pp_size 2 \--output_dir Qwen2.5-0.5B-Instruct-pp2-tp4
1.2 量化
量化将权重或激活值从浮点类型转换为另一数值类型,一方面是最快降低模型推理显存占用的方案,另一方面在某些场景下也快于原浮点精度推理。比如,fp16 的 70b 模型需要大约 140G 的显存来存放权重。而如果将其权重量化为 int4 类型,则仅需要约 35G。对于量化,需要处理的是数值范围改变后带来的模型精度降低,从而可能导致模型产生不合理输出的情况。对于 TensorRT-LLM,量化主要针对权重、激活值和 kv cache 这三部分。
1.2.1 weight_only_quantization
权重量化,配合 --weight_only_precision 为 int8 int4 或者 int4_gptq 设置不同的权重量化方法。
int8 和 int4 是基础的量化方法,没有校准。在量化时,一般采用 per_channel 的方式。int4_gptq 是一种更细粒度的量化方法,将通道按照如默认的 128 划分 group,划分部分共用一个缩放系数,可通过 --group_size 设置 group 大小。
1.2.2 smoothquant
既量化权重也量化激活值,论文。大体思想是:由于权重量化相对于激活值量化,更能保证模型的精度(可以参考原论文的相关实验),因此引入一个平滑因子来将量化难度从激活转移到权重上。对于矩阵乘法:
Y = X ⋅ W Y=X\cdot W Y=X⋅W
可变换为:
Y = ( X ⋅ d i a g ( s ) − 1 ) ⋅ ( d i a g ( s ) ⋅ W ) Y=\left(X\cdot{\rm diag(s)}^{-1}\right)\cdot \left({\rm diag(s)}\cdot W\right) Y=(X⋅diag(s)−1)⋅(diag(s)⋅W)
其中,激活值右乘对角矩阵相当于对矩阵按列缩放,权重值左乘对角矩阵相当于对矩阵按行缩放(大学线代知识)。为实现量化难度从激活值转移到权重上,论文将上述变换的参数定义为:
s j = m a x ( ∣ X j ∣ ) α / m a x ( ∣ W j ∣ ) 1 − α {\rm s}_j={\rm max}\left(|X_j|\right)^{\alpha}/{\rm max}\left(|W_j|\right)^{1-\alpha} sj=max(∣Xj∣)α/max(∣Wj∣)1−α
其中 α \alpha α 是定义的超参数,范围是 0 到 1(推荐从 0.5 开始尝试),且论文有取值的消融实验。这样,我们可以先通过数据集离线计算 s {\rm s} s 的值,然后在推理时将该值作用到激活值和权重。在指定 --smoothquant 或 -sq 后会启用默认数据集 ccdv/cnn_dailymail,或使用 --calib_dataset 指定的数据集。
默认情况下,–smoothquant 会采用 per-tensor 的模式,即每个矩阵共用一个缩放系数。TensorRT-LLM 提供了 --per-token 和 --per-channel 的任意组合来分别确定激活值和权重的缩放方式。
1.2.3 int8_kv_cache
使用 int8 类型来存放 KV Cache 值,通过 --int8_kv_cache 指定。
1.2.4 示例
使用 int8 weight only 的量化:
python examples/models/core/qwen/convert_checkpoint.py \--model_dir Qwen2.5-0.5B-Instruct \--use_weight_only \--weight_only_precision int8 \--output_dir Qwen2.5-0.5B-Instruct-int8
2. quantize.py
更多量化方法在 quantize.py 中指定,其中也有 tp_size 等选项。在 quantize.py 中提供了 --qformat 选项指定量化方式,包括:
量化方式 | 说明 |
---|---|
nvfp4 | Blackwell 架构,如 B 卡上的数据格式,没有设备没试过 |
fp8 | Hopper 架构,如 H 卡上的数据格式 |
int8_sq | int8 smoothquant |
int4_awq | 和 gptq 类似,awq 保留部分权重的原始数据类型 |
w4a8_awq | 和上一个参数一样,配合 --awq_block_size 设置 block 大小 |
int8_wo | int8 weight only 量化 |
int4_wo | int4 weight only 量化 |
full_prec | 不量化 |
--kv_cache_dtype 可以设置 int8 或 fp8 来指定 kv cache 的数据类型。此外,为了实现混合精度,如 MLP 量化为 int4,其余部分为 int8。可通过 json 文件(命名为 quant_cfg.json)为模型不同部分设置不同精度:
{"quant_algo": "MIXED_PRECISION","kv_cache_quant_algo": "FP8","quantized_layers": {"transformer.layers.0.attention.qkv": {"quant_algo": "FP8"},"transformer.layers.0.attention.dense": {"quant_algo": "FP8"},"transformer.layers.0.mlp.fc": {"quant_algo": "W4A16_AWQ","group_size": 128,"has_zero_point": false,"pre_quant_scale": true},"transformer.layers.0.mlp.proj": {"quant_algo": "W8A8_SQ_PER_CHANNEL"},..."transformer.layers.31.mlp.proj": {"quant_algo": "FP8"}}
}
3. trtllm-build
trtllm-build 输入是上面 convert_checkpoint.py 的输出目录,这里只列出常见的选项,没用过的暂时不列举了。
3.1 基本选项
3.1.1 长度相关
max_batch_size max_input_len max_seq_len 和 max_num_tokens 这几个配合使用,参考 说明。总的来说,由于 TensorRT 的静态特性,将 max_batch_size max_input_len 和 max_seq_len 设置得足够大以满足场景需求,然后控制 max_num_tokens 的值。如果 max_num_tokens 值太大,在 build 阶段的 warmup 等过程会提前暴露出如 oom 等错误。
3.1.2 max_beam_width
beam search 的返回结果数量,用于需产生多样化输出的场景。
3.1.3 kv_cache_type
kv cache 的存储和调度方式,默认为 paged kv cache。
3.2 logits 处理
如果需要收集 prefill 阶段(–gather_context_logits)和 decode (–gather_generation_logits) 阶段的 logits,或者都需要(–gather_all_token_logits),则需开启对应选项。
3.3 lora 相关
没用过,暂时跳过。
3.4 speculative decoding
没用过,暂时跳过。
3.5 plugin 相关
当 --remove_input_padding 开启时,不同输入组成一个一维向量,连同各输入长度送入模型。否则,对于不同输入,较短的输入会被填充到最大长度,这会带来额外的空间和计算浪费。
选项 --tokens_per_block 用在 paged kv cache 中,用于设置每个 block 的大小,默认为 32。
选项 --use_paged_context_fmha 可开启 kv cache 复用,以及 context chunking 功能(将长上下文分段 prefill)。
其他一些默认开启的设置,没有怎么设置用过。
4. run.py
导出模型后,可使用 run.py 快速验证和运行,如 tp_size*pp_size 等于 4:
mpirun -n 4 run.py --max_output_len 128 --input_text "What is AI?"
5. 总结
本文主要记录了原 tensorrt backend 的模型导出部分,后续可能用得也不多了,做个备份,还有其他内容可以想起来的时候补充。
相关文章:

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...