1. 地平线J6工具链迁移概述
作为地平线新一代AI计算平台,J6相比前代J5在工具链和算法部署方面进行了全面升级。本文将详细解析从J5到J6的算法部署迁移路径,帮助开发者快速掌握新平台特性。
J6平台的主要改进包括:
- 工具链全面重构,提供更灵活的Python API
- 量化训练环境兼容J5,支持模型复用
- 新增模型可视化调试工具
- 优化了图像输入处理流程
- 提供更完善的性能分析工具链
提示:迁移前请确保开发环境满足J6要求,建议使用Docker 20.10.10+和NVIDIA Container Toolkit 1.15.0+
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境配置与工具链对比
2.1 基础环境要求
J6对开发环境的要求与J5存在显著差异:
| 组件 | J6要求 | J5要求 |
|---|---|---|
| Python | 3.10/3.11 | 3.8 |
| PyTorch | 2.3.0+cu118 | 1.13.0+cu116 |
| TorchVision | 0.18.0+cu118 | 0.14.0+cu116 |
| ONNX | 1.15.0 | 1.8.0 |
| X86 GCC | 12.2 | 5.4 |
| Linaro GCC | 12.2 | 9.3 |
2.2 工具链组件对比
J6的工具链组件进行了重新设计:
| 功能模块 | J6组件 | J5组件 |
|---|---|---|
| 模型集成 | horizon_tc_ui 3.x.x | horizon_tc_ui 1.x.x |
| 模型转换 | hmct 2.x.x | horizon-nn 1.x.x |
| Pytorch量化插件 | horizon-plugin-pytorch | horizon-plugin-pytorch |
| 编译器 | hbdk4-compiler 4.x.x | hbdk 3.x.x |
重要提示:J5和J6的PTQ模型转换环境无法共存,建议使用Docker隔离开发环境
3. 模型开发与量化
3.1 浮点模型准备
J6支持的框架范围与J5一致,但版本要求更高:
| 参数 | J6要求 | J5要求 |
|---|---|---|
| ONNX版本 | 1.15.0 | 1.8.0 |
| Opset | 10-19 | 10、11 |
| IR版本 | ≤9 | ≤7 |
推荐导出ONNX时使用以下参数:
python复制torch.onnx.export(
model,
dummy_input,
"model.onnx",
opset_version=15,
do_constant_folding=True,
input_names=["input"],
output_names=["output"],
dynamic_axes={"input": {0: "batch"}, "output": {0: "batch"}}
)
3.2 PTQ量化流程
J6的PTQ流程进行了优化:
- 模型检查:
bash复制hb_compile --march nash-e --model ./model.onnx
- 性能评测:
bash复制hb_compile --fast-perf --march nash-e --model ./model.onnx
- 完整转换:
bash复制hb_compile --config config.yaml
关键改进点:
- 校准数据处理与浮点模型完全一致
- 新增
quant_config参数支持灵活配置 - 优化了模型转换产物的一致性
3.3 QAT量化流程
J6的QAT接口进行了重构:
python复制from horizon_plugin_pytorch.quantization import set_fake_quantize, FakeQuantState
from horizon_plugin_pytorch.march import March, set_march
from horizon_plugin_pytorch.quantization.hbdk4 import export
from hbdk4.compiler import save, convert, visualize, compile, hbm_perf
set_march(March.NASH_E)
主要变化:
- 使用
export接口替代J5的torch.jit.trace - 编译接口改为
hbdk4.compiler.compile - 新增模型可视化工具
4. 模型优化与部署
4.1 模型结构调整
4.1.1 输入输出节点命名
python复制hbir_qat_model = export(
base_model,
example_input,
name="my_model",
input_names=("input1","input2"),
output_names=("output1",),
native_pytree=False
)
4.1.2 多Batch拆分
python复制from hbdk4.compiler import load
model = load("qat_model.bc")
func = model[0]
batch_input = ["input_name1"]
for input in func.flatten_inputs[::-1]:
if input.name in batch_input:
# 拆分处理逻辑
4.2 图像输入处理
J6优化了图像输入处理流程:
python复制resizer_input = ["resize"]
pyramid_input = ["pym"]
for input in func.flatten_inputs[::-1]:
if input.name in pyramid_input:
node = input.insert_transpose(permutes=[0, 3, 1, 2])
node = node.insert_image_preprocess(
mode="yuvbt601full2rgb",
divisor=255,
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
支持的处理模式包括:
- YUV转RGB/BGR
- RGB/BGR互转
- 自定义归一化参数
5. 性能分析与调试
5.1 静态性能分析
python复制from hbdk4.compiler import hbm_perf
hbm_perf("model.hbm")
5.2 动态性能测试
Pyramid输入测试:
bash复制hrt_model_exec perf --model_file pyramid.hbm
Resizer输入测试:
bash复制hrt_model_exec perf --model_file resizer.hbm \
--input_file=test.jpg,test.jpg,roi.txt \
--input_img_properties=Y,UV
5.3 精度调试工具
J6提供了更强大的精度分析工具:
- PTQ精度分析:
python复制from horizon_tc_ui.hb_runtime import HBRuntime
sess = HBRuntime("quantized_model.bc")
- QAT模型检查:
python复制from horizon_plugin_pytorch.quantization import prepare_qat
prepare_qat(model) # 自动生成model_check_result.txt
6. 部署实践
6.1 应用开发变化
J6的Tensor处理进行了简化:
c复制// J6的Tensor定义
typedef struct {
void* sysMem; // 单内存指针
hbDNNTensorProperties properties;
} hbDNNTensor;
// 对比J5的多内存指针
typedef struct {
void* sysMem[4]; // 多内存指针
hbDNNTensorProperties properties;
} hbDNNTensor;
6.2 推荐部署流程
- 使用UCP新接口创建推理任务
- 配置输入输出Tensor属性
- 提交推理任务
- 处理推理结果
7. 迁移注意事项
- 环境隔离:J5和J6环境不要混用,建议使用Docker
- 模型兼容性:检查算子支持情况,特别是自定义算子
- 性能对比:迁移后务必进行性能基准测试
- 精度验证:使用J6专用工具进行精度验证
- 部署适配:根据新API调整部署代码
实测建议:先完成PTQ流程迁移,再处理QAT模型,最后调整部署代码
通过本文的详细指南,开发者可以系统性地完成从J5到J6的算法部署迁移。J6平台在易用性、灵活性和性能方面都有显著提升,值得投入精力进行迁移。如果在迁移过程中遇到问题,建议参考地平线官方文档或联系技术支持。
