适用于 Ultralytics YOLO 模型的 Ambarella CVflow 导出#
在 Ambarella SoC 上部署 Ultralytics YOLO 模型需要使用 Ambarella 的编译工具进行模型针对 CVflow 架构优化的模型在推理时性能更佳。此 Ultralytics 分支将 Ambarella 的 SpongeTorch 压缩工具包直接集成到训练、验证和导出流程中,使开发者能够生成用于在 Ambarella 硬件上高效部署的优化模型。
本指南涵盖当前的目标检测部署工作流,从压缩感知训练到设备端推理(完整流程请参见工作流概览)。
AmbaPB 检查点格式是 ONNX IR 规范的 Ambarella 专用扩展,它支持 CVflow 计算基元并打包了 SDK 工具生成的工件。它是用于在部署前验证编译模型准确性的主机端工件;为目标设备生成的独立 Cavalry 二进制文件才是真正在板端运行的文件。
此工作流依赖于未在 PyPI 上提供的专有 Ambarella SDK 组件。要获取所需的 SDK 软件包,请在开发者专区注册并通过 Cooper™ 开发者平台申请访问权限。
此集成由 Ambarella 维护。有关该分支、SpongeTorch 或 SDK 的问题,请向 Ambarella 支持报告。
什么是 Ambarella?#
Ambarella 总部位于加利福尼亚州圣克拉拉,是一家设计边缘 AI SoC 的半导体公司。其处理器结合了图像信号处理、视频编码和片上 AI 计算,广泛应用于安防、汽车、机器人、工业和消费类设备中。
什么是 CVflow?#
CVflow 是 Ambarella 的视觉处理架构。它使用独立于 CPU 和 GPU 的专用视觉引擎来运行计算机视觉和神经网络工作负载。在诸如 PyTorch 等框架中训练的模型在引擎上运行之前,需使用 Ambarella SDK 编译为 CVflow 的本地格式。
当前的 CVflow SoC 系列及其典型应用:
| SoC 系列 | 典型应用 |
|---|---|
| CV72 / CV75 | 4K AI 安防摄像头、智能摄像头、工业视觉 |
| CV5 / CV52 | 无人机、运动相机、机器人、多摄像头系统 |
| N1-655 | 本地部署式生成式 AI 和多路视频分析设备 |
为什么要在 Ambarella 上部署 YOLO?#
- 每瓦性能:CVflow SoC 专为全天候运行的边缘 AI 而设计,能够在摄像头级功耗预算内运行实时目标检测。
- 压缩感知训练:SpongeTorch 在训练期间应用剪枝,帮助模型在保持准确性的同时变得更稀疏、更高效,从而适应 CVflow 部署。
- 集成相机流水线:Ambarella SoC 结合了图像信号处理器(ISP)、超高清视频编码和 CVflow,以低功耗支持各种相机系统,因此单个 Ambarella SoC 即可处理完整的 AI 相机流水线。
工作流概览#
该流水线分为六个阶段:
- 压缩感知训练 — 使用 SpongeKit 配置(
amba_config)进行训练,使 SpongeTorch 在训练期间逐步应用非结构化剪枝。在后训练量化(PTQ)准确性无法满足要求的情况下,SpongeTorch 还支持量化感知训练(QAT),但该路径尚未接入当前的 Ultralytics 集成中,计划在未来的版本中推出。 - ONNX 导出 — 使用相同的
amba_config导出压缩后的检查点,在 ONNX 图中保留压缩结构。 - 编译 — 使用 SDK 编译工具将 ONNX 模型编译为 AmbaPB 检查点,这些工具会为 CVflow 引擎应用后训练量化(PTQ)。
- 主机验证 — 通过 AmbaPB 后端运行编译后的
*.ambapb.ckpt.onnx模型,并使用 Ultralytics 的predict/val在部署前验证准确性。 - Cavalry 转换 — 使用 SDK 工具将验证后的 AmbaPB 检查点转换为 Cavalry 二进制文件。
- 在设备上运行 — 使用 Ambarella 的 SDK 运行时库在设备上运行 Cavalry 二进制文件。
SpongeTorch 训练和导出工作流是可选的,可以替换为纯 ONNX 导出(请参阅在没有 SpongeTorch 的情况下导出)。
前置条件#
安装#
安装此 Ultralytics 分支,然后设置 Ambarella CVflow SDK(其中包含编译工具和 cvflowbackend 库),并安装与其一同分发的 spongetorch wheel:
# Install this Ultralytics fork from source
git clone https://github.com/Ambarella-Inc/ultralytics
cd ultralytics
git checkout amba_v8.4.46
pip install -e .
# Access and set up the Ambarella SDK compilation tools
# After the environment is ready, install the spongetorch library
pip install /path/to/spongetorch-*.whlAutoBackend 通过 SDK 编译工具的 tv2 命令(tv2 -libpath cvflowbackend)来定位 cvflowbackend,因此在运行使用编译模型的推理或验证之前,必须安装 SDK 编译工具并将其添加到您的 PATH 中。
SpongeKit 配置文件#
SpongeTorch 由 SpongeKit 配置文件(protobuf 文本格式,.prototxt)驱动,该文件定义了剪枝轮次、稀疏度目标和压缩时间表。从您的 Ambarella SDK 版本中获取示例配置和匹配的架构文档。为了保持训练、验证和部署之间的一致性,每当验证需要重新准备模型时,请使用训练配置,并且在导出压缩检查点时务必始终使用相同的配置。
Amba 参数#
以下两个参数控制 train、val 和 export 模式中的 SpongeTorch 集成:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
amba_config | str | None | 传递给 spongetorch.prepare() 的 SpongeKit 配置路径。启用压缩感知训练和 SpongeTorch 感知导出。 |
amba_chipset | str | None | 传递给 spongetorch.set_target_chipset() 的目标芯片组名称,例如 CV72。 |
该分支还新增了一个通用导出参数:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
export_file | str | None | 自定义导出输出路径/名称,例如 '/tmp/model.onnx' 或 'model.onnx'。 |
压缩感知训练#
启用 SpongeTorch 压缩,训练(或微调)你的模型:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco8.yaml",
epochs=100,
amba_config="config.prototxt",
amba_chipset="CV72",
)设置 amba_config 后,训练器会在设置时使用 spongetorch.prepare() 包装模型和优化器。压缩按步数计划逐步应用,因此网络在变得稀疏的同时能够学会保持准确性。训练好的检查点存储了 SpongeTorch 的稀疏状态(_orig/_mask 张量),后续的导出步骤需要用到这些张量。配置文件会作为 amba_config.prototxt 复制到运行目录中,以确保可重复性。
在 SpongeTorch 压缩计划超过其 end_step 之前,best.pt 和 last.pt 会被有意不保存——半压缩检查点无法使用。确保 epochs 足够长,以便配置中的计划完成;日志会报告何时开始保存检查点。如果训练在计划完成前结束,最终 epoch 仍会在警告下保存,但不应部署此类检查点。
为了获得最佳准确率,先正常训练你的模型(或从预训练检查点开始),然后在训练好的权重上使用 amba_config 进行较短的压缩微调。
验证压缩检查点#
使用相同配置,在编译前验证准确率:
yolo val model=runs/detect/train/weights/best.pt data=coco8.yaml \
amba_config=config.prototxt amba_chipset=CV72验证器会在需要时重新应用 spongetorch.prepare(),并禁用 Conv+BN 融合,以保留压缩结构。将 mAP 与未压缩基线进行比较;如果准确率下降过大,请调整 SpongeKit 配置并重新训练。
导出为 ONNX#
使用训练期间使用的相同 amba_config 导出压缩检查点:
from ultralytics import YOLO
model = YOLO("runs/detect/train/weights/best.pt")
model.export(
format="onnx",
amba_config="config.prototxt",
amba_chipset="CV72",
)导出器重建模型,使用您的配置重新应用 spongetorch.prepare(),将稀疏检查点权重重新加载到准备好的结构中,并在禁用 Conv+BN 融合的情况下追踪到 ONNX,从而生成 SDK 编译工具期望的精确格式的图。
保留模型元数据#
ONNX 导出将模型任务、类名、步幅和输入大小嵌入到 ONNX 文件中,而 AmbaPB 后端则从编译模型旁边的 metadata.yaml 附带文件中读取此信息。除非您的 SDK 编译工具创建了此附带文件,否则请在编译前从 ONNX 模型中将其提取出来:
import onnx
from ultralytics.utils import YAML
model = onnx.load("model.onnx")
YAML.save("metadata.yaml", {item.key: item.value for item in model.metadata_props})将 metadata.yaml 与编译后的 *.ambapb.ckpt.onnx 或 *.ambapb.fastckpt.onnx 文件放在同一目录中。
- 检查点必须包含 SpongeTorch 压缩状态。尝试在设置了
amba_config的情况下导出未压缩的检查点会引发:“检查点没有 SpongeTorch 剪枝状态... 导出前请使用 amba 训练中的压缩检查点。” - 该配置必须与训练期间使用的配置相匹配。使用不同的配置可能会导致无法正确加载检查点权重。
使用 SDK 工具进行编译#
按照 SDK 的编译指南,使用 SDK 编译工具为目标芯片组编译导出的 ONNX 模型。这些工具将图映射到 CVflow AI 引擎上(应用后训练量化(PTQ)、调度和内存规划),并生成用于主机验证的 AmbaPB 检查点。
后训练量化(PTQ)使用校准图像应用 INT8 量化(按照 SDK 编译指南中的说明准备),并且编译工具在准确性和运行时延迟之间进行平衡:将更多操作映射到 INT8 可以降低延迟但可能会降低准确性,而将更多操作保留在 FP16 中则可以以较高的延迟保持准确性。当后训练量化(PTQ)无法在延迟预算所需的 INT8 级别达到准确性目标时,使用 SpongeTorch 的量化感知训练(QAT)便是预期的补救措施 — 它训练模型以适应更激进的 INT8 量化,从而在较低延迟的运行点恢复准确性。该集成中尚未提供量化感知训练(QAT),计划在未来的版本中推出。
要让 Ultralytics 识别编译后的模型,其文件名必须以 .ambapb.ckpt.onnx 或 .ambapb.fastckpt.onnx 结尾。
使用编译后的模型运行推理#
编译后的 AmbaPB 模型可直接通过 Ultralytics API 加载 — AutoBackend 检测到 .ambapb 后缀并通过 cvflowbackend 路由推理,从而按模型在 AI 引擎上运行的方式执行模型:
from ultralytics import YOLO
model = YOLO("model.ambapb.ckpt.onnx")
# Inference
results = model("https://ultralytics.com/images/bus.jpg")
# Validation
metrics = model.val(data="coco8.yaml")这是部署到硬件前的最终准确率检查,其中包括编译器的全部量化影响。如果编译模型旁边存在 metadata.yaml 文件,后端会从中读取类别名称、步幅和任务信息。后端默认使用 CVflow 推理模式 acinf;将环境变量 ULTRALYTICS_AMBAPB_DEBUG=1 设置为日志记录输入/输出详情,以便调试。
转换为 Cavalry 二进制文件#
在 AmbaPB 检查点通过主机验证后,按照 SDK 的编译指南,使用 SDK 编译工具将其转换为用于目标设备的 Cavalry 二进制文件。Cavalry 二进制文件是 SDK 运行时库在板端执行的形式。
部署到开发板#
使用 Ambarella SDK 运行时在您的 Ambarella 设备上加载 Cavalry 二进制文件。预处理和后处理必须与检测模型的编译目标相匹配:0–255 范围内的加黑边 RGB 输入,以及输出上的标准 YOLO 检测解码。有关运行时 API,请参考 SDK 部署文档。
不使用 SpongeTorch 导出#
如果您不需要 SpongeTorch 的训练时剪枝,标准的 Ultralytics 管道也会生成一个 SDK 工具可以编译的模型:
yolo export model=yolo26n.pt format=onnx使用 SDK 编译工具编译生成的 ONNX,这些工具本身会执行后训练量化。此路径以牺牲一些运行时性能和量化准确性为代价,换取了更简单的工作流,在训练时没有 spongetorch 依赖项。
实际应用#
运行在 Ambarella CVflow SoC 上的 Ultralytics YOLO 模型为边缘端全天候视觉提供支持:
- AI 安防摄像头:在 4K IP 摄像头上进行实时人员和车辆检测,功耗预算低于 3 W。
- 无人机和机器人:在 CV5 级别芯片上为导航、巡检和配送提供板载目标检测与跟踪。
- 工业和零售分析:在边缘设备上进行多路人员计数、PPE 检测和货架监控。
总结#
本指南概述了在 Ambarella CVflow SoC 上部署 Ultralytics YOLO 模型当前的工作流:使用 SpongeTorch(amba_config/amba_chipset)进行压缩感知训练、导出压缩检查点的 ONNX、使用 SDK 工具离线编译为 AmbaPB 检查点、通过 Ultralytics 进行主机验证,以及转换为 Cavalry 二进制文件以便使用 Ambarella SDK 进行设备端部署。
有关其他边缘 AI 目标,请参阅相关的 Hailo、Rockchip RKNN、Sony IMX500、Qualcomm QNN、DEEPX 和 Axelera 指南。完整的导出格式列表请参阅导出模式文档和集成页面。
常见问题#
没有。没有
format="ambarella"目标。导出为 ONNX(可选择通过amba_config进行 SpongeTorch 压缩),然后使用 Ambarella SDK 编译工具将 ONNX 模型离线编译为 AmbaPB。您的 SDK 编译工具支持的任何基于 CVflow 的 SoC 都可以作为目标,包括用于 AI 相机的 CV72/CV75 系列以及用于无人机和机器人的 CV5/CV52。
amba_chipset参数用于配置 SpongeTorch 的优化目标;在编译时单独选择匹配的目标。接受的芯片组字符串和可用性取决于安装的 SDK 版本。SpongeTorch 是 Ambarella 的 SpongeKit 模型压缩库(该库也具有 Caffe 和 TensorFlow 变体)的 PyTorch 版本,集成到了 Ultralytics 的 Ambarella 分支中,用于训练时非结构化剪枝(计划在未来的版本中推出量化感知训练)。它是可选的:纯 Ultralytics ONNX 导出也可以使用 SDK 编译工具进行编译,这些工具本身会执行量化,但这会牺牲一些运行时性能和量化准确性。
它们是专有的,不在 PyPI 上。在开发者专区注册以请求 SDK 访问权限;SDK 包含编译工具(带有
cvflowbackend),并且单独分发的spongetorchwheel 与其一同发布。在安装了 Ambarella 分支的情况下运行
yolo val model=model.ambapb.ckpt.onnx data=your_data.yaml。AmbaPB 后端会按编译模型在 CVflow AI 引擎上的运行方式执行该模型,因此报告的 mAP 包含了所有的编译器量化效应。