高通 QNN 量化部署:从 YOLO 权重到 8295 推理评估

2024 年 6 月 9 日 星期日
/ , , , , ,
4
摘要
YOLO → ONNX → QNN 量化 → 8295 推理评估的完整工程链路。200 张校准图的量化策略、INT8 精度验证、后处理对齐。

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

高通 QNN 量化部署:从 YOLO 权重到 8295 推理评估

编写时间:2024-06

代码仓库:Plumess/yolov5-qnn

QNN 量化、推理、评估的工程链路,重点是从 YOLO 权重走到 8295 可评估产物。流程包括环境准备、ONNX 转换、QNN 量化、推理后处理和验证集评估。

总流程

项目结构

qnn/
├── onnx/                  # pt 转 onnx 的产物
├── pt/<version>/weights/  # YOLOv5 权重
├── qnn_out/<version>/     # QNN 量化产物
├── qnn_proc/              # 推理和后处理脚本
├── scripts/               # export / raw / serialize 脚本
├── val/images             # 验证图片
├── val/labels             # 验证标签
├── infer.sh
├── quantity.sh
└── val.sh
QNN 流程截图 1

QNN 流程截图 1
QNN 流程截图 2

QNN 流程截图 2

环境搭建

QNN 环境搭建的关键步骤:

  1. 安装 Conda 或 Miniconda。
  2. 准备 Qualcomm AI Engine SDK 和 QPM。
  3. 配置 QNN_SDK_ROOT
  4. 创建 qnn Python 环境。
  5. 安装 ONNX / ONNXRuntime / ONNX simplifier。
  6. 安装 PyTorch 和 YOLOv5 依赖。
  7. 执行 QNN SDK 自带的依赖检查。

环境变量只保留 SDK 根目录和版本占位:

export QNN_SDK_ROOT="/opt/qcom/aistack/qnn/<QIK_VERSION>"

量化脚本关注点

quantity.sh 里通常只需要暴露少量变量:

MODEL_VERSION="0509"
ENABLE_8295_INFERENCE="false"
eval "$(~/anaconda3/bin/conda shell.bash hook)"

量化校准图要能代表真实输入分布。校准集使用 200 张参考图,这个数量不是绝对标准,但至少比随便抽几张更稳。

qnn-onnx-converter 常用参数

参数用途
--input_networkONNX 模型路径
--input_dim指定输入尺寸
--input_list量化校准 raw 列表
--act_bitwidth激活量化位宽
--weights_bitwidth权重量化位宽
--use_per_channel_quantization权重逐通道量化
--algorithms cle跨层均衡等优化

示意命令:

qnn-onnx-converter \
  --input_network ./onnx/<version>.onnx \
  --input_dim images 1,3,512,960 \
  --input_list ./input_raw.txt \
  --act_bitwidth 8 \
  --weights_bitwidth 8 \
  --use_per_channel_quantization

推理与评估

推理时要把原图转 RAW,QNN 得到中间输出后,再用 Python 脚本做 YOLO 后处理,保存 pred_labels,最后和 val/labels 对齐计算指标。

QNN 的难点不只是转换成功,而是量化后指标是否可接受、车端输入输出是否和训练一致、后处理 anchor/stride 是否同步。只要这三点有一个没对齐,量化模型的评估就会失真。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...