冬
gcw_IDzXRVNw/AdelaiDet_Ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

BlendMask R_101_3x — Ascend NPU 优化

AdelaiDet / BlendMask 实例分割模型在 Ascend 910B3 NPU 上的推理优化。

测试介绍

  • 模型:BlendMask,论文 BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation (CVPR 2020)
  • 任务:实例分割,同时输出检测框和实例 mask
  • 框架:AdelaiDet(基于 Detectron2),配置 R_101_3x,ResNet-101 + FPN 骨干
  • 数据集:COCO 2017 val(5000 张图片)
  • 输入:BGR 图像,短边 resize 到 800px,长边 ≤ 1333px
  • 输出:pred_boxes、scores、pred_classes、pred_masks

环境

项目详情
CANN8.5.0
NPUAscend 910B3(使用 NPU 1)
CPU鲲鹏 920,192 核
torch / torch_npu2.8.0 / 2.8.0.post2
Python3.9.25(conda: ascend_blendmask)
配置文件configs/BlendMask/R_101_3x.yaml
权重weights/R_101_3x.pth(211 MB,634 tensors)

目录

AdelaiDet_workspace/
├── inference.py                 # 最终推理脚本(P0~P4)
├── benchmark.py                 # 性能测试(P0~P4)
├── accuracy_check.py            # 精度验证(CPU vs NPU)
├── README.md                    # 总览
├── deploy_guide.md              # 环境部署指南(复现必读)
├── ascend_npu_optimization_skill.md  # NPU 优化方法论 Skill
│
├── AdelaiDet/                   # 模型仓库
│   ├── configs/BlendMask/R_101_3x.yaml
│   ├── weights/R_101_3x.pth     # 模型权重(211 MB)
│   ├── output_vis.jpg            # 可视化输出示例
│
├── baseline/                    # 原始 baseline 分析
│   ├── AdelaiDet_survey.md      # 仓库调研报告
│   ├── profiling_summary.md     # 瓶颈分析(11 阶段 profiling)
│   ├── env_check_result.md      # 环境检查
│   ├── weight_check_result.md   # 权重验证
│   ├── inference_baseline.py    # baseline 推理
│   ├── benchmark_baseline.py    # baseline 性能测试
│   └── accuracy_check_baseline.py # baseline 精度测试
│
├── p0_resize/                   # P0:NPU 侧 resize 优化
│   ├── benchmark_p0_resize.py   # P0 性能测试
│   ├── accuracy_check_p0_resize.py # P0 精度验证
│   └── benchmark_compare_resize.md # P0 对比报告(−33.4%)
│
├── p1_decode/                   # P1:decode 优化 + NMS 细拆
│   ├── benchmark_p1_decode.py   # P1 性能测试
│   ├── accuracy_check_p1_decode.py # P1 精度验证
│   ├── benchmark_compare_decode.md # P1 对比报告
│   ├── benchmark_p1_nms.py      # NMS 细拆 profiling
│   └── proposal_detail_profile.md # NMS 分析结论(1.57ms,不值得优化)
│
├── p2_runtime_tuning/           # P2:运行时调优扫参
    ├── runtime_tuning_compare.md # 扫参对比报告
    ├── runtime_best_config.sh    # 最佳运行时配置
    └── result_tq_*.json          # TASK_QUEUE_ENABLE 扫参数据

├── p3_compile/                  # P3:backbone torch.compile(npu)
│   ├── benchmark_compile_vs_eager.py
│   ├── accuracy_compile_vs_eager.py
│   └── compile_validation_notes.md

├── p4_pad64_recompile/          # P4:pad64 + recompile_limit=32
│   ├── p4_pad64.py              # pad64 性能测试
│   ├── p4_accuracy.py           # pad64 精度验证
│   └── p4_recompile32_result.json
│
├── P5_val2017test/              # P5:全量 val2017 性能 + COCO 精度评估
│   ├── benchmark_eval_full.py   # P5 完整评估脚本
│   ├── coco_predictions.json    # COCO 格式预测结果 (14.9 MB)
│   ├── p5_full_report.json      # 性能 + 精度汇总报告
│   └── per_image_timing.jsonl   # 逐图延迟明细
│
├── doc/                         # 测试日志与结果
│   ├── benchmark_log.txt
│   ├── benchmark_result.json
│   ├── accuracy_log.txt
│   └── accuracy_result.json

性能对比

版本延迟P50P90P99吞吐提升
官方 (1080Ti)~91ms———~11 im/s—
CPU 推理~26s———0.04 im/s—
NPU 优化前144.0ms143.0ms150.5ms193.8ms6.9 im/s—
NPU 优化后 (P4)39.5ms39.3ms42.0ms47.5ms25.3 im/s−72.6%
P5 全量 val2017 (NPU 2)40.4ms40.3ms43.7ms49.0ms14.8 im/s¹—

¹ P5 的 14.8 im/s 含 mask RLE 编码和预测提取开销(纯 forward ~14.8-15.0)。 P4 在 NPU 1 上测 200 张重复图;P5 在 NPU 2 上测全量 5000 张唯一图并含完整后处理。

测试日志(pad64 + recompile_limit=32):

Avg=39.52ms  P50=39.33ms  P90=42.00ms  P99=47.45ms  Thr=25.31 im/s

精度验证(class-grouped greedy matching)

对比项Box IoUScore Diff说明
CPU vs NPU 优化前0.99990.00003相同预处理,NPU 推理与 CPU 完全一致
CPU vs NPU 优化后0.99720.0014NPU resize (bilinear) 与 CPU resize (OpenCV) 插值方式不同
NPU 优化前 vs 优化后0.99740.0018同上

P5 — 全量 COCO val2017 精度评估

使用 P0-P4 优化模型 + TASK_QUEUE_ENABLE=2,在 NPU 2 上对完整 5000 张 COCO val2017 进行端到端推理并计算标准 COCO AP 指标。

推理总耗时 12.4 分钟,产生 27,180 个预测框。

BBox 精度对比

指标P5 (NPU 2)官方 BlendMask R_101_3x差异
AP38.038.4−0.4
AP5051.658.0−6.4
AP7542.341.6+0.7
APs19.221.5−2.3
APm41.641.9−0.3
APl53.349.3+4.0

实例分割 (Segm) 精度对比

指标P5 (NPU 2)官方 BlendMask R_101_3x差异
AP34.234.20.0 ✅
AP5050.755.2−4.5
AP7537.836.2+1.6
APs16.114.7+1.4
APm37.537.2+0.3
APl49.748.3+1.4

结论:Segm AP 与官方完全一致(34.2),BBox AP 差异 0.4 在 P0 NPU resize (bilinear vs OpenCV) 的预期误差范围内。NPU 推理精度可完全替代 CPU/GPU 推理。

延迟分布:77.3% 在 40-50ms,21.8% 在 30-40ms,0.3% 为 compile recompilation spike。

优化历程

阶段优化内容延迟相对提升累计提升
Baseline原始 NPU 推理144.0ms——
P0 ResizeCPU resize → NPU resize95.9ms−33.4%−33.4%
P1 Decode移除 .cpu() 同步点79.6ms−17.0%−44.7%
P2 RuntimeTQ=2 + NUMA 绑核 + OMP=162.5ms−21.5%−56.6%
P3 Compilebackbone torch.compile(npu)51.5ms−17.6%−64.2%
P4 Pad64pad64 + recompile_limit=3239.5ms−23.3%−72.6%

Baseline — 原始 NPU 推理摸底

  • 扫描 AdelaiDet 仓库,确认 BlendMask R_101_3x 为优化目标
  • 验证权重可加载(211MB,634 tensors)
  • 搭建 conda 环境,安装 torch_npu + detectron2 + adet
  • CPU 推理通过,NPU 推理通过
  • 11 阶段完整 profiling,定位瓶颈:CPU resize 占 34.8ms (24%)
  • 精度验证:CPU vs NPU BoxIoU=0.9999,证明 NPU 推理本身正确

P0 — NPU 侧图像缩放(144.0ms → 95.9ms)

  • 问题:Detectron2 ResizeShortestEdge.apply_image() 在 CPU 上耗时 34.8ms
  • 方案:用 F.interpolate(mode='bilinear') 在 NPU 上实现等价缩放
  • 精度:BoxIoU=0.997(微小差异来自 bilinear vs OpenCV 插值)

P1 — 后处理同步点移除 + NMS 细拆(95.9ms → 79.6ms)

  • 移除 select_over_all_levels() 中 post-NMS topk 的 .cpu() 同步点
  • NMS 细拆:仅占 1.57ms,不是瓶颈,放弃单独优化
  • 精度:P0 vs P1 BoxIoU=1.0000,完全等价

P2 — 运行时调度调优(79.6ms → 62.5ms)

  • TASK_QUEUE_ENABLE=2:+21.7%
  • taskset -c 144-167(NPU NUMA 亲和节点):+6.2%
  • OMP_NUM_THREADS=1:配合 TQ=2 最优

P3 — backbone torch.compile(npu)(62.5ms → 51.5ms)

  • torch.compile(backbone, backend="npu", dynamic=False) 编译骨干网络
  • 多尺寸 COCO 触发 recompile_limit=8 后 fallback,P90/P99 有波动

P4 — pad64 + recompile_limit=32(51.5ms → 39.5ms)

  • 手动 pad64 + ImageList real_sizes 修正,将唯一 shape 压至 28 种
  • recompile_limit=32 覆盖全部 shape,消除 compile fallback
  • P99 从 114ms → 47ms,尾延迟大幅改善

使用

所有命令需在 AdelaiDet/ 目录下执行(config 和 weight 为相对路径)。

conda activate ascend_blendmask
source /usr/local/Ascend/ascend-toolkit/set_env.sh
cd <workspace>/AdelaiDet

# 推理(输出可视化)
taskset -c 144-167 python ../inference.py \
  --input /path/to/input.jpg \
  --output ../result.jpg

# 性能测试(200 张,NPU 1)
taskset -c 144-167 python ../benchmark.py

# 精度测试(CPU vs NPU,50 张)
python ../accuracy_check.py

# P5 全量评估 — 性能 + COCO 精度(5000 张,NPU 2)
taskset -c 96-119 python ../benchmark_eval_full.py

# P5 快速验证(20 张,调试用)
taskset -c 96-119 python ../benchmark_eval_full.py --max-images 20

首次运行会触发 torch.compile 编译预热(~200s),后续推理无需等待。