模型: YOLOv10n (from yolov10n.yaml, 2.78M params) 环境: torch 2.9.0 + torch_npu 2.9.0.post1 + CANN 8.5.1 (Ascend910B4) 用途: 在华为昇腾 NPU 上运行 YOLOv10 目标检测推理与训练
YOLOv10 是 Ultralytics 发布的实时目标检测模型,采用 无 NMS 训练 / 一致双重分配 (Consistent Dual Assignments) 架构,在保持高精度的同时显著降低推理延迟。本仓库提供 YOLOv10 在 华为昇腾 Ascend NPU 上的完整适配方案与性能优化结果。
postprocess() 做 top-k 选择,避免传统 YOLO 的 CPU NMS| 功能 | 状态 | 说明 |
|---|---|---|
device='npu' 设备选择 | ✅ | ultralytics/utils/torch_utils.py 已原生支持 |
| Conv2d / BN / SiLU / MaxPool2d | ✅ | CANN 自动图编译下沉为 aclnn 算子 |
Depthwise Conv (g=ch) | ✅ | SCDown / v10Detect cls head NPU 原生高效 |
| 问题 | 修复方式 |
|---|---|
time_sync() 仅同步 CUDA | npu_compat.time_sync_any() |
cuda_memory_usage() 仅处理 CUDA | npu_compat.memory_usage_any() |
profile_ops() 调用 torch.cuda.empty_cache() | npu_compat.empty_cache_any() |
init_seeds() 仅设 CUDA seed | npu_compat.init_seeds_any() |
get_gpu_info() 仅查询 CUDA | npu_compat.get_device_info_any() |
attempt_compile() warmup 仅 sync CUDA | npu_compat.warmup_model_npu() |
GPUInfo 仅支持 NVIDIA NVML | npu_compat.NPUInfo 类 |
autocast() device 参数 hardcode 为 "cuda" | npu_compat.autocast_any() |
测试条件: 输入 (1, 3, 640, 640),预热 5 次,取 18 次稳定迭代中位数
| 环境 | 端到端耗时 | 相对提升 |
|---|---|---|
| CPU 基线 | ~708 ms | 1x |
| NPU 默认 (TASK_QUEUE_ENABLE=1) | 26.04 ms | 27.2x |
| NPU + TASK_QUEUE_ENABLE=2 | 20.70 ms | 34.2x |
| NPU + TASK_QUEUE_ENABLE=2 + patches | 20.94 ms | 33.8x |
关键结论:
TASK_QUEUE_ENABLE=2 带来约 20% 性能提升,有效消除 host-bound Free Timeexport TASK_QUEUE_ENABLE=2
python -c "
import sys; sys.path.insert(0, '.')
from optimize_yolov10_npu import get_optimized_yolov10n
model = get_optimized_yolov10n(device='npu:0')
import torch
img = torch.randn(1, 3, 640, 640, device='npu:0')
out = model(img)
print(out[0].shape) # (1, 300, 6) [x1,y1,x2,y2,conf,cls]
"import npu_compat
npu_compat.patch_ultralytics_for_npu() # 应用所有 patches
from ultralytics import YOLO
model = YOLO("yolov10n.pt")
model.to("npu:0")
results = model.predict("image.jpg", device="npu:0")from npu_compat import init_seeds_any, autocast_any
init_seeds_any(seed=42, deterministic=True)
with autocast_any(enabled=True, device="npu:0"):
loss = model(batch)| 文件 | 说明 |
|---|---|
npu_compat.py | NPU 兼容层:设备探测、计时同步、内存管理、种子设置、设备信息查询、layout 优化封装、monkey-patch 工具 |
optimize_yolov10_npu.py | 一站式优化脚本:模型构建 + patch 应用 + 环境调优 + 推理封装 + benchmark |
profile_yolov10_npu.py | 性能 profiling 脚本:CPU/NPU 基线对比、torch.profiler 算子分析、瓶颈诊断 |
yolov10_npu_profile.json | 算子级 profiling 原始数据 |
YOLOV10_NPU_ADAPTATION_REPORT.md | 详细适配报告 |
DFL 模块 和 Attention 模块 的 transpose 后补 contiguous(),消除部分隐式格式转换开销。
TASK_QUEUE_ENABLE=2) 实现 Host 侧任务队列与 NPU 执行流水线重叠_predict_once 的循环遍历、dict 构造等 host-bound 场景得到改善ascend-optimization 提供的融合算子主要面向 LLM,YOLOv10 为纯 CNN 架构:
| 算子 | 适用场景 | 结论 |
|---|---|---|
npu_fusion_attention | 序列因果 Attention | 不可直接替换(PSA 布局/语义不匹配) |
npu_prompt_flash_attention | 全量 Flash Attention | 不可直接替换 |
| 标准 Conv/BN/SiLU | CNN backbone | CANN 图编译已充分优化,无需替换 |
与上游 Ultralytics 一致:AGPL-3.0
报告生成时间: 2026-05-09 Skill: ascend-optimization / gitcode-publish