Nvidia在Jetson NX上模型量化

Nvidia 模型量化

整体流程:

需求:在Jetson NX 边缘计算盒上进行模型量化,仅处理yolov5检测模型。

使用前准备:1. Jetson计算盒。2. x86的linux服务器。3 .pt模型。

使用项目:https://github.com/wang-xinyu/tensorrtx/tree/yolov5-v7.0/yolov5

需要两个环境的原因是,生成wts需要torch环境,而Jetson是arm环境,不方便安装torch。

项目准备:

  1. 确定训练.pt模型的yolov5版本,在yolov5的README文件中可以查看。当前支持yolov5 v1.0、v2.0、v3.0、v3.1、v4.0、v5.0、v6.0、v6.2、v7.0。
  2. 下载.pt对应的yolov5官方代码:git clone -b v7.0 https://github.com/ultralytics/yolov5.git。
  3. 下载与之对应的tensorrtx项目代码:git clone -b yolov5-v7.0 https://github.com/wang-xinyu/tensorrtx.git。

项目执行:

  1. 生成.wts中间件(建议在x86_64的服务器中操作)。

    cd yolov5/   # ultralytics官方yolov5项目
    # wget https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt
    cp [tensorrtx]/yolov5/gen_wts.py .  # 拷贝tensorrtx项目中的脚本至yolov5下
    python gen_wts.py -w yolov5s.pt -o yolov5s.wts   # 生成.wts中间件
    # A file 'yolov5s.wts' will be generated.
    
  2. 构建生成yolov5s.engine(需要在Jetson盒子中生成)。

    cd [tensorrtx]/yolov5/   
    # Update kNumClass in src/config.h if your model is trained on custom dataset
    mkdir build
    cd build
    # cp [ultralytics-yolov5]/yolov5s.wts . # 👿将刚才生成的wts文件拷贝至tensorrtx的build中,由于不是一个环境,此处需要手动
    cmake ..
    make
    
    # 👿将src/config.h中将constexpr static int kNumClass = 80;更改为模型的实际类别数,否则转化为engine会报错,更改后再次make
    make
    
    # 生成.engine:./yolov5_det -s yolov5s.wts yolov5s.engine s
    ./yolov5_det -s [.wts] [.engine] [n/s/m/l/x/n6/s6/m6/l6/x6 or c/c6 gd gw]  // serialize model to plan file
    # 验证.engine效果:./yolov5_det -d yolov5s.engine ../images 
    ./yolov5_det -d [.engine] [image folder]  // deserialize and run inference, the images in [image folder] will be processed.
    
  3. INT8量化(前面使用FP16)

    • 准备构建量化表的图像。此处的图像需要来自于模型的训练集,200张左右即可,以文件夹的形式放至第二步中的build路径下即可。

    • src/config.h 中将宏由#define USE_FP16更改为USE_INT8并重新 make.

    • make
      
      # 重新生成INT8的.engine:./yolov5_det -s yolov5s.wts yolov5s.engine s
      ./yolov5_det -s [.wts] [.engine] [n/s/m/l/x/n6/s6/m6/l6/x6 or c/c6 gd gw]  // serialize model to plan file
      # 验证INT8.engine效果:./yolov5_det -d yolov5s.engine ../images 
      ./yolov5_det -d [.engine] [image folder]  // deserialize and run inference, the images in [image folder] will be processed.
      
说明
 1. 需要下载官方yolov5项目以及tensorrtx项目,其二者要对应,均需与.pt的版本对应。
 2. 经实际测试,量化后的效果较差。
 3. 仅尝试处理检测模型。
### Nvidia Jetson Xavier NX 上部署 YOLOv8 的教程 #### 环境准备 为了成功在 Nvidia Jetson Xavier NX 上部署 YOLOv8 模型,首先需要完成设备的基础环境配置。这包括硬件扩展支持以及软件开发工具链的搭建。 - **存储空间扩展** 由于 Jetson Xavier NX 默认 eMMC 存储仅有 16GB,不足以满足复杂模型训练和推理的需求,建议通过 TF 卡作为系统盘来增加可用存储容量[^3]。具体操作涉及安装适配的 TF 卡驱动程序并重新配置启动顺序以优先加载外部存储介质中的操作系统。 - **CUDA 和 cuDNN 安装** CUDA 是 NVIDIA 提供的一种并行计算平台及编程模型,cuDNN 则是一套针对深度神经网络优化的 GPU 加速库。对于 Jetson Xavier NX 而言,默认推荐版本为 CUDA 10.2 及 cuDNN 8.0[^2]。这些组件能够显著提升卷积运算效率从而加快检测速度。 #### TensorRT 使用 Alpha 封装库进行模型转换与优化 TensorRT 是专为高性能 AI 推理设计的 SDK,在嵌入式平台上尤其重要因为它可以有效降低延迟同时提高吞吐量。本案例采用 TensorRT-Alpha 封装库简化了从 PyTorch 或 ONNX 文件向 TensorRT engine 的迁移过程[^1]。 以下是具体的步骤说明: 1. **PyTorch/YOLOv8 导出至 ONNX** 需要先利用官方脚本或者自定义方法把预训练好的权重文件导成通用中间表示形式即 `.onnx` 格式的模型。 ```python import torch model = torch.hub.load('ultralytics/yolov5', 'yolov8n') # 替换为你实际使用的型号如 yolov8s/l/x/m... dummy_input = torch.randn(1, 3, 640, 640).to(device='cuda') input_names = ["input_0"] output_names = ["output_0"] torch.onnx.export( model, dummy_input, "yolov8n.onnx", verbose=False, opset_version=12, do_constant_folding=True, input_names=input_names, output_names=output_names, dynamic_axes=None ) ``` 2. **ONNX -> TRT Engine (借助 TensorRT Python API)** 进一步将上述生成的 `*.onnx` 输入给 TensorRT 编译器构建最终运行时引擎实例化对象以便后续调用执行预测任务逻辑代码片段如下所示: ```python from polygraphy.backend.trt import CreateConfig, Profile, TrtRunner, engine_from_bytes, save_engine from polygraphy.comparator import DataLoader from polygraphy.logger import G_LOGGER import numpy as np def load_data(): data_loader = DataLoader() inp_data = np.random.rand(1, 3, 640, 640).astype(np.float32) data_loader.add_inputs({"input": inp_data}) return data_loader config = CreateConfig(profiles=[Profile().add("input", min=(1, 3, 320, 320), opt=(1, 3, 640, 640), max=(1, 3, 1920, 1920))]) with open("yolov8n.onnx", "rb") as f, TrtRunner(engine_from_bytes(f.read(), config=config)) as runner: outputs = runner.infer(feed_dict={"input": next(load_data())["input"]})['output'] print(outputs.shape) # 输出应匹配预期尺寸比如 [batch_size,num_boxes,(x,y,w,h)+conf+class_scores] ``` 以上展示了如何基于 Polygraphy 工具集快速验证导入后的张量形状正确与否等内容。 --- ### 性能优化技巧 当完成了基本框架移植之后还可以考虑以下几个方面进一步挖掘性能潜力: - 批次大小调整:适当增大 batch size 很可能带来更佳的整体表现但需权衡内存占用情况; - 数据精度控制:尝试 FP16/INT8量化方式减少浮点数位宽进而节省资源消耗; - 图像分辨率裁剪:依据应用场景选取合适的输入图像尺度既能保证识别效果又能缩短耗时; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值