1 系统安装
- 建议参考官方文档,这里仅说一下可能存在的问题,具体安装过程不在赘述该内容。本人使用的AMD笔记本通过VMware虚拟机安装的Ubuntu20.04系统,中间虚拟机内存必须最少大于80G可用,刷了几次后成功,中间会出错可能需要重启后尝试即可。
- 系统盘建议使用M2内存而不是TF存储卡
系统常用命令
- 设置环境变量
vim ~/.bashrc
export PATH=/usr/src/tensorrt/bin:$PATH
source ~/.bashrc
- 文件共享
sudo apt-get update
sudo apt-get install samba -y
mkdir sambashare
// sambashare 是共享文件夹的名称,你可以设置你喜欢的名称以及你想要的存储位置
sudo vi /etc/samba/smb.conf
// 拉到文件的最后,将下面的语句添加到文件尾部
[sambashare]
comment = Samba on JetsonNano
path = /home/username/sambashare
read only = no
browsable = yes
// 注意:这里的username需要改成你的系统的用户名。也就是说path是你要设置的共享文件夹路径。
// 添加完成之后保存退出
sudo service smbd restart
sudo smbpasswd -a username
2 Super模式
- 使用
jtop
命令可用查看系统性能情况
- 显示当前的电源模式:
sudo /usr/sbin/nvpmodel -q
- 切换电源模式:
sudo nvpmodel -m 0 # 15W
sudo nvpmodel -m 1 # 25W
sudo nvpmodel -m 2 # 45W MAXN_SUPER
- 切换到super模式:
- /usr/bin/jetson_clocks:是禁用DVFS并将CPU / GPU / EMC时钟设置为最大值的脚本
- DVFS (Dynamic voltage and frequency scaling )技术的目的是调节各处理器的电压值
sudo jetson_clocks # 开启super
sudo jetson_clocks --show # 查看板子当前的工作状态
sudo jetson_clocks --store # 保存当前的DVFS模式,然后关闭DVFS
sudo jetson_clocks --restore # 运行相应的任务,任务结束后使用
3 运行一个CNN
- 依据官方文档,运行resnet50,并尝试使用tensorrt的性能分析工具trtexec分析模型性能
- 使用如下命令
# 获取模型
wget https://github.com/onnx/models/raw/refs/heads/main/validated/vision/classification/resnet/model/resnet50-v1-12.onnx
# 运行并分析
trtexec --onnx=resnet50-v1-12.onnx --shapes=data:4x3x224x224 --fp16 --noDataTransfers --useCudaGraph --useSpinWait
- 得到Performance summary关键信息,在这,批量大小为 4 的 ResNet-50 模型可以以每秒 133 次推理的吞吐量(由于批量大小为 4,因此每秒 133x4 张图像)和 7.47681 毫秒的中位延迟运行。
- 那super模式呢,我们打开最大电源模式45w,开启super配置,在这,吞吐量 215,时延 4.63525 ms,性能有明显的提升
- 这里有一些小的技巧:
- 使用CUDA图形(–useCudaGraph)可能会减少队列时间
- 添加–noDataTransfer以禁用H2D/D2H数据传输
- 更多配置选项参考官方文档
4 最佳性能优化方式-量化
- 加速模型推理的最佳手段是使用量化模型
- 安装量化工具
pip3 install onnx
pip3 install nvidia-pyindex
pip3 install onnx-graphsurgeon
pip3 install onnxruntime
pip3 install onnxconverter_common
pip3 install --no-cache-dir --extra-index-url https://pypi.nvidia.com nvidia-modelopt
- 使用ModelOptimizer,运行获得量化的ONNX模型:
python3 -m modelopt.onnx.quantization --onnx_path resnet50-v1-12.onnx --quantize_mode int8 --output_path resnet50-v1-12-quantized.onnx
- 在这,使用随机数据运行校准,将量化/反量化操作插入到图表中,然后使用量化/反量化操作将ONNX模型保存到resnet50-v1-12-quantized.onnx。
- 使用15W以及45W Super模式运行该量化模型,得到性能数据:
trtexec --onnx=resnet50-v1-12-quantized.onnx --shapes=data:4x3x224x224 --stronglyTyped --noDataTransfers --useCudaGraph --useSpinWait
- 我们使用–stronglyTyped标志而不是–fp16标志来要求TensorRT严格遵循量化ONNX模型中的数据类型,包括所有INT8量化/去量化操作。
- 普通模式
- Throughput: 245.022 qps
- Latency: median = 4.07983 ms
- Super模式
- Throughput: 387.724 qps
- Latency: median = median = 2.5777 ms
5 如何进行的int8量化
- 可以参考这篇文章中量化的章节,这里放一下量化前后模型的结构对比,看出量化反量化节点是怎么插入模型中的
6 逐层分析
- 逐层分析将帮助确定每层对延迟有多大贡献,以及性能瓶颈在哪一层。执行如下命令得到:
trtexec --onnx=resnet50-v1-12-quantized.onnx --shapes=data:4x3x224x224 --stronglyTyped --noDataTransfers --useCudaGraph --useSpinWait --profilingVerbosity=detailed --dumpLayerInfo --dumpProfile --separateProfileRun
- –profilingVerbosity=detailed标志允许捕获详细的图层信息
- –dumpLayerInfo标志显示日志中的每层信息
- –dumpProfile --separateProfileRun标志显示日志中的每层运行时延迟。
- 通过上面的打印信息可以看出,经过图优化的
resnetv17_stage1_conv3_weight + resnetv17_stage1_conv3_weight_QuantizeLinear + resnetv17_stage1_conv3_fwd
层,耗时0.1516 ms,占据了网络的3.3%的耗时 - 此外,更详细的dump信息,包括:层名称、输入和输出张量名称、张量形状、张量数据类型、卷积参数、策略名称和元数据。元数据字段显示该层对应于哪个ONNX操作。由于TensorRT具有图融合优化,因此一个引擎层可能对应于原始模型中的多个ONNX操作。
- trtexec的耗时统计策略
默认情况下,trtexec等待至少200毫秒,并运行推理至少10次迭代或至少3秒,以时间较长者为准。
可以通过添加–warmUp=500、–iterations=100和–duration=60标志来修改这些参数,这意味着至少运行预热500毫秒,并运行推理至少100次迭代或至少60秒,以时间较长者为准。
有关其他trtexec标志的详细说明,请参阅trtexec部分或运行trtexec --help。
7 运行一个LLM
- 安装依赖
sudo apt-get install cmake
cmake --version
- 安装llama.cpp
- llama.cpp的官方安装指导链接
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
cmake -B build -DGGML_CUDA=ON -DLLAMA_CURL=OFF # 开启cuda编译
cmake --build build --parallel --config Release # 多核编译加速
cd build
sudo make install
- 当然,也可以安装tensorrt-llm
git clone https://github.com/NVIDIA/TensorRT-LLM.git
- 以llama.cpp为例:
- 环境变量
GGML_CUDA_ENABLE_UNIFIED_MEMORY=1
可用于在Linux中启用统一内存。这允许切换到系统RAM,而不是在GPU VRAM耗尽时崩溃。 - 为了加快编译速度,添加-j参数来并行运行多个作业。例如,
cmake --build build --config Release -j 4
将并行运行4个作业。
- 环境变量
- 下载qwen3-1.7B模型文件,GGUF格式,使用Qwen3-1.7B-Q4_0.gguf,大约需要1G存储空间,以下方式任选其一
- 为什么下载GGUF格式?可以参考文章
# 方式1:命令行下载
modelscope download --model unsloth/Qwen3-1.7B-GGUF # 这个有个文件会中断下载导致报错
# 方式2:git下载
git clone https://www.modelscope.cn/unsloth/Qwen3-1.7B-GGUF.git
# 方式3:脚本下载(推荐!)
from modelscope import snapshot_download
model_dir = snapshot_download('unsloth/Qwen3-1.7B-GGUF')
- 如果需要将hf模型转为GGUF格式,可以使用如下命令
python convert_hf_to_gguf.py --outfile ./ds-r1-distill-llama-8b ./ds-r1-distill-llama-8b
# python convert_hf_to_gguf.py --outfile <輸出檔案資料夾> <模型所在資料夾>
- 运行测试模型
-ngl 29表示加载29层到GPU计算,这会加速推理的速度
./build/bin/llama-cli -m ../../../Qwen3-1.7B-GGUF/Qwen3-1.7B-Q4_0.gguf -ngl 29
- 看到GPU加载的layers和buffer size就是表明模型在GPU完成的计算
- 最后对比一下super模式和普通模式的性能差异,差异从token的速度来看大约有50%的性能提升
- 普通
- super
- 普通