【Jetson】一、初识Jetson Orin Nano Super 老黄带给我们惊喜了?

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
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值