git checkout 恢复| Skill | 触发场景 | 说明 |
|---|---|---|
ascend-affinity-operator | Path A 算子替换出错 / 需要融合算子 | torch_npu 融合算子替换,含 npu_fusion_attention、npu_ffn、npu_rms_norm 等 API 速查 |
ascend-optimization | Profiling 后需运行时优化 | 环境变量调优(TASK_QUEUE_ENABLE、CPU_AFFINITY_CONF)、内存分配器、torch.compile |
atc-model-converter | Path 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 获取详细排查步骤,而非盲目重试。
# 每个优化尝试前自动创建分支
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
"{
"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"
}# 伪代码
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} 未达提升阈值或精度超标")| 时间段 | 阶段 | 预算 | 说明 |
|---|---|---|---|
| 0:00-0:30 | Bootstrap | 0.5h | 克隆、环境、基线、git init |
| 0:30-1:30 | Path A 快速优化 | 1h | 按收益排序逐个替换亲和算子 |
| 1:30-2:30 | Path B OM 转换 | 1h | ONNX → ATC → OM + ACL 推理 |
| 2:30-3:30 | Profiling 闭环 | 1h | L1 profiling → 定位瓶颈 → 运行时优化 |
| 3:30-4:30 | 择优与验证 | 1h | 双路径对比、精度最终验收 |
| 4:30-5:00 | 交付与提交 | 0.5h | 生成交付件、AtomGit 推送 |
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_deliverablesnpu-smi info
python -c "import torch; import torch_npu; print(torch_npu.__version__)"为避免网络超时,建议使用 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# HuggingFace 国内镜像
export HF_ENDPOINT=https://hf-mirror.com
# ModelScope(备用)
pip install modelscope
export MODELSCOPE_CACHE=/workspace/modelscope_cachecd /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"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
"git branch main-best # 始终保持已知最优状态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,否则 rollbackgit checkout -b exp/npu_conv2d
# 修改 ultralytics/nn/modules/conv.py
python eval/perf_eval.pygit checkout -b exp/npu_ciou
# 修改 ultralytics/utils/metrics.py
python eval/perf_eval.pygit checkout -b exp/contiguous_layout
# 全图扫描补 .contiguous()
python eval/perf_eval.pygit 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.pybash om_model/atc_convert.sh
# 若失败 → 调整 opset / 简化图 / 修改输入 shape → 重试
# 最多 3 次尝试ATC 转换失败时:调用
atc-model-converterSkill 获取详细排查步骤,包括:
- ONNX 算子兼容性检查 (
ge_check_op.json)- ATC 参数自动发现 (
--auto_tune_flag、--op_precision_mode)- 动态 shape / 控制流处理方案
ais_benchOM 推理验证流程
参考 Skill: ATC 模型转换器 — 提供了更详细的 ATC 参数说明、常见问题排查及最佳实践。
python inference_acl.py --model om_model/yolov10n.om --device npu
python eval/perf_eval.py --backend aclgit merge main-best# 使用 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
)python eval/parse_profiling.py --input ./Profiling_L1 --output results/profiling_top_ops.jsonProfiling 分析后:调用
ascend-optimizationSkill 获取运行时优化方案,调用ascend-affinity-operatorSkill 获取算子替换建议。 提取 Top 5 耗时算子。
| 实验 | 环境变量 | 触发条件 |
|---|---|---|
| exp/task_queue | TASK_QUEUE_ENABLE=2 | profiling 显示 Free Time > 20% |
| exp/cpu_affinity | CPU_AFFINITY_CONF=2 | CPU 调度开销高 |
| exp/tcmalloc | LD_PRELOAD=libtcmalloc.so | malloc 热点 |
| exp/alloc_conf | PYTORCH_NPU_ALLOC_CONF=max_split_size_mb:512 | 显存碎片 |
每个实验 10 分钟,按 profiling 结果优先级排序。
| 实验 | 环境/改动 | FPS (batch=1) | 相对基线 | 状态 |
|---|---|---|---|---|
| Baseline | — | 131.10 | — | ✅ |
| Exp 4: contiguous | transpose/permute 后补 .contiguous() | 133.04 | +1.5% | ✅ 已合入 |
| Exp: task_queue | TASK_QUEUE_ENABLE=2 | 151.68 | +15.7% | ✅ 已合入 |
| Exp: cpu_affinity | CPU_AFFINITY_CONF=2 | 152.55 | +16.4% | ✅ 已合入(最佳组合) |
| Exp: fp16 | torch.float16 AMP | 152.87 | +16.6% | ✅ 单点最佳 |
| Exp: torch.compile | torch.compile(model.model) | 150.28 | +14.6% | ✅ 略低于组合 |
| Exp: format_cast | 数据格式转换优化 | 147.72 | +12.7% | ✅ |
Batch 吞吐扩展(TASK_QUEUE_ENABLE=2 CPU_AFFINITY_CONF=2)
| batch | FPS | latency_p50 (ms) | latency_p99 (ms) |
|---|---|---|---|
| 1 | 148.35 | 6.75 | 6.88 |
| 4 | 355.89 | 10.51 | 22.42 |
| 8 | 480.48 | 15.45 | 36.21 |
| 16 | 591.87 | 26.37 | 34.27 |
当前最优 commit: 737eb64 on main-best
TASK_QUEUE_ENABLE=2 + CPU_AFFINITY_CONF=2transpose/permute 后补 .contiguous()(3 处)
ultralytics/models/yolov10/predict.pyultralytics/nn/modules/head.py(RTDETRDecoder + v10Detect)ultralytics/utils/torch_utils.py 增加 npu 设备分支ultralytics/nn/tasks.py 增加 weights_only=False fallback| Skill | 用途 |
|---|---|
ascend-optimization | PyTorch 在线推理运行时/代码/OS 优化 |
ascend-affinity-operator | torch_npu 融合算子替换 |
atc-model-converter | ONNX → OM 转换 + 端到端 OM 推理(2026-05-14 安装) |
atc-model-converter补全了 Path B 的工具链,支持:ONNX 导出检查、ATC 参数自动发现、ais_benchOM 推理、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_conv2d | N/A | torch_npu 无此标准 API,README 中假设不存在 |
python eval/final_compare.py
# 输出:Path A vs Path B 的 fps、latency、精度差异bbox_iou_diff < 0.01,conf_diff < 0.01fps 最高 && 精度达标 的 commitgit tag v1.0-optimizedgit checkout v1.0-optimized# 从最终 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/# 方式 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 包由用户手动上传cat results/final_report.md包含:
| 脚本 | 功能 |
|---|---|
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.py | autoresearch 主循环 |
om_model/export_onnx.py | ONNX 导出 |
om_model/atc_convert.sh | ATC 转换 |
inference_acl.py | ACL 推理入口 |
inference.py | 最终交付推理脚本 |
readme.md | 部署文档 |
SKILL.md | 优化记录与复现指南 |
| 故障现象 | 可能原因 | 推荐调用的 Skill | 紧急处理 |
|---|---|---|---|
ImportError: No module named torch_npu | CANN/torch_npu 未安装 | adapt-agent | 检查 npu-smi info,重装 torch_npu |
RuntimeError: NPU out of memory | 批大小过大 / 显存碎片 | ascend-optimization | 减小 batch,设置 PYTORCH_NPU_ALLOC_CONF |
ATC 转换报错 E19010 | 算子不支持 / 动态 shape | atc-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_cacheif 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()| 时间节点 | 熔断动作 |
|---|---|
| 1h | Path A 无成功实验 → 全力投入 Path B |
| 2h | Path B OM 转换失败 → 放弃 Path B,Path A + profiling 兜底 |
| 3h | 仍无达标方案 → 启用激进优化(降低精度阈值到 2%) |
| 4h | 仍未达标 → 锁定当前 best,开始生成交付件 |
| 4.5h | 停止所有实验,全力完成交付 |
| 5h | 强制终止,提交当前最优结果 |