← 返回主页

视觉扩散策略的压缩与边缘部署

HomeBot-WM 主线实验报告 · Diffusion Policy (image Push-T, 262M) → Jetson AGX Orin

演示

任务 Push-T:一个质点 agent(蓝色圆点)把 T 形块(灰色)推去与目标轮廓(绿色)对齐。coverage(覆盖率)= T 块与目标区的重叠比例(0–1),即本任务的 score,≥0.95 记成功。

⚠ 画面里没有机械臂 / 机器人本体——Push-T 是 Diffusion Policy 的标准 2D 抽象基准,agent 是直接施力的质点。选它当载体是因为它轻量、能在 8GB 上从头训练,而本项目的交付物是任务无关的压缩方法链(ONNX→INT8→DDIM→TensorRT)。

agent(质点·施力点) T 块(被推物体) 目标轮廓 当前动作指令

① Jetson AGX Orin 实机闭环 · TensorRT · FP16 vs INT8 对照

在 Orin 实机上用 TensorRT 引擎跑闭环(eval_trt_pusht.py,ctypes 直驱、全程无 torch),左右分屏 = 同一 seed、同一初始噪声下的 FP16(左)与 TRT 原生 INT8(右)。DDIM-50,2× 速播放,画面取环境原生 512×512 渲染(不影响策略的 96×96 观测路径)。

图 1 · Orin 实机闭环 rollout:FP16(左)vs TRT 原生 INT8(右)——同一 seed、同一初始噪声 · DDIM-50 · 2× 速播放

三段对照(刻意选了双向摆动,不是只挑 INT8 失败的)

  1. seed 10006 · FP16 1.00 vs INT8 1.00 —— 打平。
  2. seed 10011 · FP16 0.97 vs INT8 0.59 —— INT8 退化。
  3. seed 10002 · FP16 0.51 vs INT8 1.00 —— INT8 反而更好。

为什么单集看不出结论:Push-T 闭环是混沌系统,INT8 的 ~7–9% 动作发散被逐步放大,单集差异双向摆动达 ±0.5~1.0(这 16 个 seed 里 INT8 只在 6 个上更低、7 个上反而更高)。系统性代价 −0.12 只有多集聚合后才显现——报告表 5 用 6 噪声种子 × n=50 配对得 t=−6.97、p<0.001。

Orin 绝对分低于 pc-3070(这 16 seed 上 FP16 均值 0.54 vs 0.81):dog 的 pymunk 是 7.3.1、pc-3070 是 6.2.1,叠加混沌放大,故只有同平台 FP16-vs-INT8 配对有效,跨平台绝对分不可比。

② 压缩策略闭环 rollout(pc-3070 CPU 录制)

下面 4 段是压缩后策略(Diffusion Policy → DDIM-50 + onnxruntime QDQ INT8,即报告表 2 中与 FP32 统计不可分的那条无损路线)在 4 个不同初始位姿上的闭环 rollout(2× 速播放)。

图 2 · 压缩策略(DDIM-50 + onnxruntime QDQ INT8)在 4 个不同初始位姿上的闭环 rollout · pc-3070 CPU 录制 · 2× 速播放

逐段说明(与视频内「片段 N/4」标识对应)

  1. 片段 1 · seed 10001 · coverage 1.00 —— T 块完美对齐目标(满分)。
  2. 片段 2 · seed 10002 · coverage 1.00 —— 另一初始位姿,同样满分。
  3. 片段 3 · seed 10000 · coverage 0.96 —— 接近完美对齐。
  4. 片段 4 · seed 10004 · coverage 0.72 —— 部分对齐(展示非满分情形)。

同一策略、同一压缩配置,仅初始位姿不同;4 段中 3 段 coverage ≥ 0.96。完整 n=50 统计见下方「评测结果」板块。

注:策略是反应式模仿(行为克隆),无「对齐即停」机制,整个回合持续输出动作;coverage 取回合内最大值,故个别片段末尾把块推出对齐位不会降低该段分数——这是 Push-T + 模仿策略的固有行为,非压缩引入。

评测结果

测试数据集与协议:Push-T image 闭环基准(Diffusion Policy 文献标准 2D 仿真任务,pymunk 物理)——策略在 Push-T 标准训练划分上从头训练(DDPM-100,8GB 3070);精度为闭环 rollout mean_score(n=50 随机种子),Orin 延迟为实机 predict_action 全墙钟(batch=1 · TensorRT 10.7),TRT 原生 INT8 vs FP16 闭环对比在 Orin 上用 6 噪声种子 × n=50 配对。

完整报告(摘要 + 两张全局地图 + 报告表 1–5 + 诚实边界)见 docs/compression/README.md。下面是关键结果。

87.6%
训练精度
DDPM-100 · 8GB 3070 从头训
0.814
DDIM-50 闭环 mean_score
≈DDPM-100,一半算力
18Hz
Orin DDIM-16 INT8
全墙钟实测(过 10Hz 环)
−0.12
TRT 原生 INT8 闭环掉分
vs FP16 · 6 种子 p<0.001
表 1 · Orin 实测延迟与精度 · 全 predict_action 墙钟(batch=1 · TensorRT 10.7)
配置DDIM 步数精度 (n50)墙钟 (ms)吞吐 (Hz)过 10Hz
全 FP16500.8142384.2✗
全 FP16160.7388312.0✓
unet-INT8 + enc-FP16160.7385518.2✓
unet-INT8 + enc-FP1650.7253033.5✓

推荐部署:精度优先 DDIM-16 + FP16(83ms / 12Hz);速度/内存优先 DDIM-16 + INT8(55ms / 18Hz,牺牲 ~0.12 精度换 1.6× 提速 + ~4× 压缩)。两条 INT8 路线代价不同:onnxruntime QDQ INT8 在 n=50 与 FP32 统计不可分(报告表 2),但 TRT 原生熵校准 INT8 在 Orin 闭环掉 ~0.12(报告表 5)——「INT8 无损」只对 onnxruntime 路线成立、不能外推到 TRT。表中精度列为 onnxruntime 口径;DDIM-50 + INT8 仅 6.8Hz 不过 10Hz。完整五张表与诚实边界见报告。

核心方法

训练 DDPM-100 · 8GB 3070 · 87.6% ONNX 导出 拆 encoder+unet · normalizer 烘焙 INT8 PTQ onnxruntime QDQ DDIM 减步 100→50→16→5 步 TensorRT · Orin DDIM-16 INT8 · 55ms / 18.2Hz
训练 模型压缩 端侧部署

图 3 · 压缩方法链:训练 → ONNX 导出 → INT8 PTQ → DDIM 减步 → TensorRT(Orin)

完整方法学(模型/权重来源、数据集、校准集、指标定义、确切命令、环境版本)见 METHODOLOGY.md;踩坑记录见 PROBLEMS.md。上图为方法总览。

载体模型 = Diffusion Policy(image Push-T 变体,262M = 251.5M 扩散 UNet + 11.2M 视觉编码器)。输入 2 帧观测(每帧 = 96×96 RGB 图像 [0,1] + agent 2D 像素坐标),输出 16 步 2D 动作序列(执行取前 8 步后重规划)。压缩方法链任务无关——换载体只需改 I/O shape 与校准数据。

表 2 · 压缩方法链各环节的做法与理由
环节做法与理由
拆两组件导出扩散采样循环(UNet×N)留在 runtime,只导出 encoder 与 UNet 单步前向——扩散模型部署标准做法,也让步数成为 runtime 旋钮
normalizer 烘焙烘焙进 encoder ONNX,导出图直接吃原始 obs(image [0,1] + agent_pos),动作反归一化留在 runtime
INT8 QDQonnxruntime 静态量化产出 QDQ 图,TensorRT 原生消费(无需单独校准缓存)
DDIM 减步DDPM 不能减步(抽稀即崩至 ~0.5),DDIM 可以且优雅退化——步数直接决定 UNet 调用次数(100×→50×→5×),Orin 墙钟随之近似线性变化