Qualcomm QNN INT8 量化部署:DMS 模型 Snapdragon NPU 加速指南
核心要点
Ultralytics 官方支持 QNN 导出:
- 本地编译:无需云端、无需 Qualcomm 账号
- INT8 权重 + 16-bit 激活:Hexagon NPU 最优配置
- 性能提升:NPU 比 CPU 快 3-4倍
- 广泛覆盖:Snapdragon 8 Gen 2/3/Elite、X Elite
- 一键导出:model.export(format=”qnn”)
QNN vs 传统部署方案对比
| 方案 |
硬件加速 |
云端依赖 |
账号要求 |
性能 |
| QNN 本地导出 |
✅ NPU/GPU/CPU |
❌ 无 |
❌ 无 |
高 |
| Qualcomm AI Hub |
✅ NPU |
✅ 需要 |
✅ 需要 |
高 |
| SNPE(旧方案) |
✅ NPU |
❌ 无 |
❌ 无 |
中 |
| TFLite CPU |
❌ 仅CPU |
❌ 无 |
❌ 无 |
低 |
Hexagon NPU 性能实测
Android 手机(Xiaomi 17,Snapdragon 8 Elite Gen 5)
| 模型 |
任务 |
CPU INT8 |
GPU INT8 |
NPU QNN |
加速比 |
| YOLO26n |
检测 |
53.3ms |
17.2ms |
11.3ms |
4.7x |
| YOLO26n-seg |
分割 |
76.0ms |
23.9ms |
21.3ms |
3.6x |
| YOLO26n-pose |
姿态 |
57.7ms |
15.2ms |
10.8ms |
5.3x |
| YOLO26n-cls |
分类 |
5.2ms |
4.5ms |
2.4ms |
2.2x |
Windows on Snapdragon(Snapdragon X Elite)
| 模型 |
CPU PyTorch FP32 |
NPU QNN INT8 |
加速比 |
| YOLO26n 检测 |
91.4ms |
27.2ms |
3.4x |
| YOLO26n-pose |
109.6ms |
28.9ms |
3.8x |
| YOLO26n-seg |
138.8ms |
34.3ms |
4.0x |
QNN 导出详解
1. 支持的 HTP 架构
| name |
Hexagon HTP |
Snapdragon 平台 |
| 68 |
v68 |
Snapdragon 888 |
| 69 |
v69 |
Snapdragon 8 Gen 1 |
| 73 |
v73 |
Snapdragon 8 Gen 2, X Elite(默认) |
| 75 |
v75 |
Snapdragon 8 Gen 3 |
| 79 |
v79 |
Snapdragon 8 Elite |
| 81 |
v81 |
Snapdragon 8 Elite Gen 5 |
2. 一键导出代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| """ YOLO DMS 模型导出到 Qualcomm QNN 格式
核心流程: 1. 加载 YOLO 模型 2. 导出为 ONNX 3. 量化为 INT8 权重 + 16-bit 激活 4. 编译为 QNN context binary 5. 输出 *_qnn.onnx 文件 """
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.export( format="qnn", name="73", imgsz=640, data="coco8.yaml", fraction=0.5, )
|
3. DMS 模型导出示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| """ DMS 人脸关键点检测模型导出
模型:YOLO26n-pose(人脸关键点) """
from ultralytics import YOLO
dms_model = YOLO("yolo26n-pose.pt")
dms_model.export( format="qnn", name="75", imgsz=640, data="widerface.yaml", )
|
QNN 部署到 Snapdragon 设备
1. Python API 推理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| """ 在 Snapdragon 设备上运行 QNN 模型
前提条件: - 安装 onnxruntime-qnn - Snapdragon 设备(手机/开发板/笔记本) """
from ultralytics import YOLO
model = YOLO("yolo26n_qnn.onnx")
results = model("driver_image.jpg")
for result in results: boxes = result.boxes for box in boxes: x1, y1, x2, y2 = box.xyxy[0] confidence = box.conf[0] class_id = box.cls[0] print(f"检测: ({x1:.0f}, {y1:.0f}, {x2:.0f}, {y2:.0f}), 置信度: {confidence:.2f}")
|
2. ONNX Runtime 直接调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| """ 使用 ONNX Runtime QNN Execution Provider 直接推理
适用于自定义推理管道 """
import onnxruntime as ort import onnxruntime_qnn as qnn_ep import numpy as np
ort.register_execution_provider_library( "QNNExecutionProvider", qnn_ep.get_library_path() )
devices = [d for d in ort.get_ep_devices() if d.ep_name == "QNNExecutionProvider"]
options = ort.SessionOptions() options.add_provider_for_devices(devices, { "backend_path": qnn_ep.get_qnn_htp_path() })
session = ort.InferenceSession("yolo26n_qnn.onnx", sess_options=options)
input_tensor = np.random.randn(1, 3, 640, 640).astype(np.float32)
outputs = session.run(None, {"images": input_tensor})
print(f"输出形状: {outputs[0].shape}")
|
INT8 量化精度影响
量化配置
| 配置 |
权重精度 |
激活精度 |
推荐场景 |
| w8a16 |
INT8 |
16-bit float |
Hexagon NPU 默认 |
| w8a8 |
INT8 |
INT8 |
极致性能(精度损失大) |
| w4a16 |
INT4 |
16-bit float |
大模型压缩 |
精度损失评估
| 模型 |
FP32 mAP |
INT8 w8a16 mAP |
损失 |
| YOLO26n |
37.5% |
36.8% |
-0.7% |
| YOLO26n-pose |
75.2% |
74.6% |
-0.6% |
| YOLO26n-seg |
32.8% |
32.1% |
-0.7% |
结论:INT8 权重 + 16-bit 激活量化精度损失 <1%,可接受。
DMS 部署到 QCS8255 实战
1. QCS8255 规格参数
| 参数 |
值 |
| NPU |
Hexagon v75(同 8 Gen 3) |
| NPU TOPS |
26 TOPS(INT8) |
| 内存 |
8-16GB |
| 功耗 |
<5W(AI推理) |
| 支持框架 |
QNN, TFLite, ONNX Runtime |
2. 部署流程
1 2 3 4 5 6 7 8 9 10
| python3 export_dms.py
adb push dms_qnn.onnx /data/local/tmp/
adb shell cd /data/local/tmp python3 run_dms.py --model dms_qnn.onnx --source test_video.mp4
|
3. 性能优化建议
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| """ QCS8255 性能优化配置 """
model.export(format="qnn", batch=4)
model.export(format="qnn", imgsz=480)
model.export( format="qnn", data="dms_calibration.yaml", fraction=1.0 )
|
常见问题 FAQ
Q1:QNN 导出需要 Snapdragon 设备吗?
答:不需要。 导出在 x86 主机上完成,使用 onnxruntime-qnn 本地编译 context binary。只需在推理时需要 Snapdragon 设备。
Q2:QNN 与 Qualcomm AI Hub 有什么区别?
| 对比项 |
QNN 本地导出 |
Qualcomm AI Hub |
| 账号要求 |
❌ 无 |
✅ 需要 |
| 云端依赖 |
❌ 无 |
✅ 需要 |
| 编译速度 |
快(本地) |
慢(排队) |
| 功能 |
编译 |
编译+性能分析 |
Q3:INT8 量化精度损失如何?
答:INT8 权重 + 16-bit 激活配置下,精度损失通常 <1%,可接受。
数据来源
IMS 开发启示
- QNN 本地导出是最优方案: 无需云端、无需账号、编译速度快
- INT8 权重 + 16-bit 激活是最佳配置: 精度损失 <1%,性能提升 3-4倍
- QCS8255 部署优先选择 QNN: 原生支持 Hexagon v75 NPU
- 校准数据重要: 使用 DMS 专用数据集校准可提高量化精度
- 批处理优化吞吐量: 批处理4帧可提高 2-3倍吞吐量
总结: Qualcomm QNN 提供了本地编译、无需云端的 Snapdragon NPU 部署方案。INT8 权重 + 16-bit 激活量化配置在精度损失 <1%的情况下,性能提升 3-4倍。IMS 开发应优先采用 QNN 方案部署到 QCS8255 等车载芯片,使用 DMS 专用校准数据集优化量化精度,并考虑批处理优化吞吐量。Ultralytics 官方支持一键导出,极大降低了部署门槛。