weixin_55674987/yolov10-ascend-plan
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

YOLOv10 Ascend 910 推理性能优化实战(Autoresearch 版)

约束与前提

  • 时间预算:5 小时(终端限时)
  • 版本管理:Git 全链路追踪,每个实验 = 一个 commit/branch
  • 自动回滚:性能/精度回退时自动 git checkout 恢复
  • 双路径:Path A(torch_npu 在线)与 Path B(OM 离线)并行探索
  • 精度红线:与 GPU/CPU 误差 < 1%,不达标立即回滚
  • AtomGit 提交:测试 token 推送能力后决定是否自动推送

前置技能与工具

Skill触发场景说明
ascend-affinity-operatorPath A 算子替换出错 / 需要融合算子torch_npu 融合算子替换,含 npu_fusion_attention、npu_ffn、npu_rms_norm 等 API 速查
ascend-optimizationProfiling 后需运行时优化环境变量调优(TASK_QUEUE_ENABLE、CPU_AFFINITY_CONF)、内存分配器、torch.compile
atc-model-converterPath B ONNX → OM 转换失败ONNX 导出检查、ATC 参数自动发现、ais_bench OM 推理、精度对比
adapt-agent模型无法直接在 NPU 上运行GPU → NPU 代码适配、堵点识别、npu_compat.py 生成
verify-agent精度/性能验证不通过vLLM-Ascend 验证流水线、精度测试、性能基准测试
gitcode-publish需要发布模型到 GitCode / 提交出错README frontmatter 生成、GitCode 仓库创建与推送、提交故障排查

Skill 调用原则:遇到对应环节失败时,优先调用专用 Skill 获取详细排查步骤,而非盲目重试。

Autoresearch 核心机制(借鉴 karpathy/autoresearch)

1. Experiment-as-Commit

# 每个优化尝试前自动创建分支
git checkout -b exp/conv_npu_replace_$(date +%s)
# 修改代码 → 运行 → 记录结果 → commit
git add -A && git commit -m "exp(conv): replace Conv2d with npu_conv2d

- metric_fps: 45.2 → 52.1
- metric_iou_diff: 0.003
- status: PASS
"

2. 结构化结果记录(results.json)

{
  "experiment_id": "exp_001_conv_npu",
  "timestamp": "2026-05-13T15:00:00Z",
  "hypothesis": "Conv2d → npu_conv2d 可提升卷积层性能",
  "changes": ["ultralytics/nn/modules/conv.py"],
  "metrics": {
    "fps": 52.1,
    "latency_p50_ms": 19.2,
    "latency_p99_ms": 22.1,
    "bbox_iou_diff": 0.003,
    "conf_diff": 0.001,
    "memory_mb": 2800
  },
  "status": "PASS",
  "commit_hash": "a1b2c3d"
}

3. Auto-Compare & Auto-Rollback

# 伪代码
if current.fps > best.fps * 1.05 and current.iou_diff < 0.01:
    git_merge_to_main()
    best = current
else:
    git_checkout_main()  # 丢弃当前实验分支
    print(f"Rollback: {exp_id} 未达提升阈值或精度超标")

4. 时间预算分配(5h)

时间段阶段预算说明
0:00-0:30Bootstrap0.5h克隆、环境、基线、git init
0:30-1:30Path A 快速优化1h按收益排序逐个替换亲和算子
1:30-2:30Path B OM 转换1hONNX → ATC → OM + ACL 推理
2:30-3:30Profiling 闭环1hL1 profiling → 定位瓶颈 → 运行时优化
3:30-4:30择优与验证1h双路径对比、精度最终验收
4:30-5:00交付与提交0.5h生成交付件、AtomGit 推送

/goal 闭环定义

goal: YOLOv10 Ascend 910 推理性能在5小时内达标且精度误差<1%
termination:
  success: fps >= baseline_target AND bbox_iou_diff < 0.01 AND conf_diff < 0.01
  failure: time_budget_exceeded (5h) OR consecutive_rollbacks >= 5
metrics:
  primary: fps  # 吞吐量
  secondary: latency_p50_ms, latency_p99_ms
  guardrail: bbox_iou_diff, conf_diff, memory_mb
loop:
  interval: "每个实验完成后立即评估"
  max_iterations: 50  # 5h / 6min per exp ≈ 50 次迭代上限
actions:
  on_pass: git merge → update best → generate_next_hypothesis
  on_fail: git rollback → log_failure → try_alternative_path
  on_timeout: package_current_best → submit_deliverables

Phase 0: Bootstrap(0:00-0:30)

0.1 环境检查

npu-smi info
python -c "import torch; import torch_npu; print(torch_npu.__version__)"

0.2 环境安装(推荐 uv + 国内源)

为避免网络超时,建议使用 uv pip install 并配置国内镜像:

# 安装 uv(如未安装)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 配置国内 PyPI 镜像(清华源)
export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

# 安装依赖(示例)
uv pip install -e ./yolov10
uv pip install onnx onnxslim onnxruntime onnxscript --index-url https://pypi.tuna.tsinghua.edu.cn/simple

0.2a 模型下载(国内镜像加速)

# HuggingFace 国内镜像
export HF_ENDPOINT=https://hf-mirror.com

# ModelScope(备用)
pip install modelscope
export MODELSCOPE_CACHE=/workspace/modelscope_cache

0.3 克隆与初始化

cd /workspace
git clone https://gitcode.com/GitHub_Trending/yo/yolov10.git
cd yolov10
pip install -e .
git init
git add -A && git commit -m "init: clone yolov10 upstream"

0.3 Baseline 跑测 → 自动 commit

python eval/baseline_run.py --device npu --batch 1,8,16

产出 results/baseline.json,自动 commit:

git add results/baseline.json && git commit -m "baseline: NPU inference baseline

- fps_b1: XX, fps_b8: XX, fps_b16: XX
- memory_mb: XX
"

0.4 创建 main-best 分支

git branch main-best  # 始终保持已知最优状态

Phase 1: Path A — torch_npu 在线优化(0:30-1:30)

优化优先级(按预期收益排序)

Exp 1: NMS → npu_batch_nms(预期 +15%)

git checkout -b exp/npu_batch_nms
git checkout main-best -- .
# 修改 ultralytics/utils/ops.py
python eval/perf_eval.py --device npu
# 评估:fps > best * 1.05 且 iou_diff < 0.01 → merge,否则 rollback

Exp 2: Conv2d → npu_conv2d(预期 +10%)

git checkout -b exp/npu_conv2d
# 修改 ultralytics/nn/modules/conv.py
python eval/perf_eval.py

Exp 3: IoU → npu_ciou / npu_diou(预期 +5%)

git checkout -b exp/npu_ciou
# 修改 ultralytics/utils/metrics.py
python eval/perf_eval.py

Exp 4: permute/transpose + contiguous(预期 +3%)

git checkout -b exp/contiguous_layout
# 全图扫描补 .contiguous()
python eval/perf_eval.py

时间控制

  • 每个实验最多 10 分钟(修改 + 运行 + 评估 + commit/rollback)
  • 1 小时内完成 4-6 个实验
  • 如果前 2 个实验均失败,立即切换到 Path B

Phase 2: Path B — OM 离线转换(1:30-2:30)

2.1 PyTorch → ONNX

git checkout -b exp/om_conversion
git checkout main-best -- .
python om_model/export_onnx.py --weights yolov10n.pt --imgsz 640
# 验证 ONNX 精度与 PyTorch 一致
python eval/compare_onnx_torch.py

2.2 ONNX → OM(ATC)

bash om_model/atc_convert.sh
# 若失败 → 调整 opset / 简化图 / 修改输入 shape → 重试
# 最多 3 次尝试

ATC 转换失败时:调用 atc-model-converter Skill 获取详细排查步骤,包括:

  • ONNX 算子兼容性检查 (ge_check_op.json)
  • ATC 参数自动发现 (--auto_tune_flag、 --op_precision_mode)
  • 动态 shape / 控制流处理方案
  • ais_bench OM 推理验证流程

参考 Skill: ATC 模型转换器 — 提供了更详细的 ATC 参数说明、常见问题排查及最佳实践。

2.3 ACL 推理脚本

python inference_acl.py --model om_model/yolov10n.om --device npu
python eval/perf_eval.py --backend acl

2.4 评估与决策

  • OM 精度达标且 FPS > Path A best → git merge main-best
  • OM 精度不达标 → 保留分支但 rollback 到 Path A
  • OM 转换失败 → 丢弃分支,Path A 作为最终方案

Phase 3: Profiling 驱动优化(2:30-3:30)

3.1 L1 Profiling 采集

# 使用 ascend-profiling skill
import torch_npu
prof = torch_npu.profiler.profile(
    activities=[torch_npu.profiler.ProfilerActivity.CPU,
                torch_npu.profiler.ProfilerActivity.NPU],
    on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./Profiling_L1"),
    schedule=torch_npu.profiler.schedule(wait=0, warmup=0, active=1, repeat=1),
    experimental_config=torch_npu.profiler._ExperimentalConfig(
        aic_metrics=torch_npu.profiler.AiCMetrics.PipeUtilization,
        profiler_level=torch_npu.profiler.ProfilerLevel.Level1,
        l2_cache=False
    ),
    record_shapes=True, profile_memory=False
)

3.2 自动解析瓶颈

python eval/parse_profiling.py --input ./Profiling_L1 --output results/profiling_top_ops.json

Profiling 分析后:调用 ascend-optimization Skill 获取运行时优化方案,调用 ascend-affinity-operator Skill 获取算子替换建议。 提取 Top 5 耗时算子。

3.3 运行时优化实验(按需启用)

实验环境变量触发条件
exp/task_queueTASK_QUEUE_ENABLE=2profiling 显示 Free Time > 20%
exp/cpu_affinityCPU_AFFINITY_CONF=2CPU 调度开销高
exp/tcmallocLD_PRELOAD=libtcmalloc.somalloc 热点
exp/alloc_confPYTORCH_NPU_ALLOC_CONF=max_split_size_mb:512显存碎片

每个实验 10 分钟,按 profiling 结果优先级排序。


优化结论与实验结果(已执行)

实验结果汇总

实验环境/改动FPS (batch=1)相对基线状态
Baseline—131.10—✅
Exp 4: contiguoustranspose/permute 后补 .contiguous()133.04+1.5%✅ 已合入
Exp: task_queueTASK_QUEUE_ENABLE=2151.68+15.7%✅ 已合入
Exp: cpu_affinityCPU_AFFINITY_CONF=2152.55+16.4%✅ 已合入(最佳组合)
Exp: fp16torch.float16 AMP152.87+16.6%✅ 单点最佳
Exp: torch.compiletorch.compile(model.model)150.28+14.6%✅ 略低于组合
Exp: format_cast数据格式转换优化147.72+12.7%✅

Batch 吞吐扩展(TASK_QUEUE_ENABLE=2 CPU_AFFINITY_CONF=2)

batchFPSlatency_p50 (ms)latency_p99 (ms)
1148.356.756.88
4355.8910.5122.42
8480.4815.4536.21
16591.8726.3734.27

最终采用的优化方案

当前最优 commit: 737eb64 on main-best

  • 运行时优化: TASK_QUEUE_ENABLE=2 + CPU_AFFINITY_CONF=2
  • 代码层优化: transpose/permute 后补 .contiguous()(3 处)
    • ultralytics/models/yolov10/predict.py
    • ultralytics/nn/modules/head.py(RTDETRDecoder + v10Detect)
  • 设备适配: ultralytics/utils/torch_utils.py 增加 npu 设备分支
  • 加载兼容: ultralytics/nn/tasks.py 增加 weights_only=False fallback

已安装的 Skill

Skill用途
ascend-optimizationPyTorch 在线推理运行时/代码/OS 优化
ascend-affinity-operatortorch_npu 融合算子替换
atc-model-converterONNX → OM 转换 + 端到端 OM 推理(2026-05-14 安装)

atc-model-converter 补全了 Path B 的工具链,支持:ONNX 导出检查、ATC 参数自动发现、ais_bench OM 推理、ONNX vs OM 精度对比、端到端 e2e_infer_om.py 生成。

剩余优化空间

优先级优化项预期收益说明
高OM 离线转换 (Path B)潜在 >20%atc-model-converter skill 已就绪,om_model/yolov10n.onnx 已导出,ATC 转换待执行
高Conv+BN fuse+5~10%Ultralytics 原生支持 model.fuse(),需验证 predict 路径是否已自动 fuse
中FP16 + 运行时叠加+2~5%当前 FP16 (152.87) 和运行时组合 (152.55) 分开测试,叠加效果未知
中tcmalloc 替换+0~5%需 allocator-bound 迹象明确时启用
低npu_batch_nms / npu_conv2dN/Atorch_npu 无此标准 API,README 中假设不存在

Phase 4: 择优与最终验证(3:30-4:30)

4.1 双路径对比表

python eval/final_compare.py
# 输出:Path A vs Path B 的 fps、latency、精度差异

4.2 精度最终验收

  • COCO val2017 或自定义数据集上跑 100 张图
  • 对比 NPU vs GPU vs CPU 的 mAP、IoU、conf
  • 指标:bbox_iou_diff < 0.01,conf_diff < 0.01

4.3 确定最终方案

  • 选择 fps 最高 && 精度达标 的 commit
  • git tag v1.0-optimized
  • git checkout v1.0-optimized

Phase 5: 交付与 AtomGit 提交(4:30-5:00)

5.1 交付件生成

# 从最终 commit 提取代码
mkdir -p deliverables
cp inference.py deliverables/
cp readme.md deliverables/
cp -r eval/ deliverables/
cp -r logs/ deliverables/
cp -r screenshots/ deliverables/
cp SKILL.md deliverables/

5.2 AtomGit 提交测试

# 方式 A: 使用 ATOMGIT_USER_TOKEN
REPO_URL="https://oauth2:${ATOMGIT_USER_TOKEN}@gitcode.com/yourname/yolov10-ascend.git"
git remote add origin "$REPO_URL"
git push -u origin main

# 方式 B: 如 token 推送失败,生成 tar 包由用户手动上传

5.3 结果报告

cat results/final_report.md

包含:

  • 总耗时
  • 实验次数 / 成功次数 / 回滚次数
  • 最终 fps / 精度指标
  • AtomGit 仓库地址

关键脚本清单(需预置)

脚本功能
eval/baseline_run.py跑基线,产出 baseline.json
eval/perf_eval.py性能评测:fps、延迟、显存
eval/accuracy_eval.py精度评测:IoU、conf、mAP
eval/compare_gpu_cpu.py三端对比
eval/parse_profiling.py解析 profiling 结果
eval/final_compare.py双路径最终对比
eval/auto_experiment.pyautoresearch 主循环
om_model/export_onnx.pyONNX 导出
om_model/atc_convert.shATC 转换
inference_acl.pyACL 推理入口
inference.py最终交付推理脚本
readme.md部署文档
SKILL.md优化记录与复现指南

故障排查与 Skill 调用速查表

故障现象可能原因推荐调用的 Skill紧急处理
ImportError: No module named torch_npuCANN/torch_npu 未安装adapt-agent检查 npu-smi info,重装 torch_npu
RuntimeError: NPU out of memory批大小过大 / 显存碎片ascend-optimization减小 batch,设置 PYTORCH_NPU_ALLOC_CONF
ATC 转换报错 E19010算子不支持 / 动态 shapeatc-model-converter检查 ge_check_op.json,尝试 opset 降级
ATC 转换报错 E10035输入 shape 不固定atc-model-converter固定输入 shape,使用 --input_shape
精度误差 > 1%算子实现差异 / fp16 溢出ascend-affinity-operator + verify-agent回滚到上一步,检查融合算子精度
SetPrecisionMode 错误多卡 device_map 冲突ascend-optimization设置 ASCEND_RT_VISIBLE_DEVICES 限制单卡
Profiling 显示 Free Time > 20%Host-bound / 算子下发慢ascend-optimization启用 TASK_QUEUE_ENABLE=2
torch.compile 报错图捕获失败ascend-optimization检查 dynamic shape,尝试 FULL_DECODE_ONLY
模型下载超时网络问题—使用 HF_ENDPOINT=https://hf-mirror.com 或 ModelScope
uv pip install 失败依赖冲突—使用 uv pip install --index-url https://pypi.tuna.tsinghua.edu.cn/simple
GitCode 推送失败 / 提交被拒Token 过期 / 仓库路径错误gitcode-publish检查 ATOMGIT_USER_TOKEN,确认仓库路径
Git hooks 检查失败代码格式 / 安全检查未通过gitcode-publish查看 hook 日志,修复后重试

国内镜像配置速查

# PyPI 清华源
export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

# HuggingFace 国内镜像
export HF_ENDPOINT=https://hf-mirror.com

# ModelScope(备用)
pip install modelscope
export MODELSCOPE_CACHE=/workspace/modelscope_cache

回滚策略(Rollback Rules)

if experiment.accuracy_diff > 0.01:
    rollback("精度超标")
elif experiment.fps < best.fps * 0.95:
    rollback("性能倒退 > 5%")
elif experiment.memory_mb > best.memory_mb * 1.3:
    rollback("显存暴涨 > 30%")
elif experiment.latency_p99_ms > best.latency_p99_ms * 1.2:
    rollback("尾部延迟恶化 > 20%")
else:
    merge_to_main_best()

时间熔断机制

时间节点熔断动作
1hPath A 无成功实验 → 全力投入 Path B
2hPath B OM 转换失败 → 放弃 Path B,Path A + profiling 兜底
3h仍无达标方案 → 启用激进优化(降低精度阈值到 2%)
4h仍未达标 → 锁定当前 best,开始生成交付件
4.5h停止所有实验,全力完成交付
5h强制终止,提交当前最优结果