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

YOLOv10 Ascend NPU 适配与优化

模型: 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 上的完整适配方案与性能优化结果。

关键架构特点

  • v10Detect (end2end=True): 推理时直接通过 postprocess() 做 top-k 选择,避免传统 YOLO 的 CPU NMS
  • PSA (Position-Sensitive Attention): Backbone 末端的空间注意力模块
  • SCDown + Light cls head: 大量使用 depthwise separable convolution
  • DFL (Distribution Focal Loss): 用于边界框回归的分布学习

NPU 适配状态

原生支持(无需修改)

功能状态说明
device='npu' 设备选择✅ultralytics/utils/torch_utils.py 已原生支持
Conv2d / BN / SiLU / MaxPool2d✅CANN 自动图编译下沉为 aclnn 算子
Depthwise Conv (g=ch)✅SCDown / v10Detect cls head NPU 原生高效

CUDA-Hardcode 修复(已提供兼容层)

问题修复方式
time_sync() 仅同步 CUDAnpu_compat.time_sync_any()
cuda_memory_usage() 仅处理 CUDAnpu_compat.memory_usage_any()
profile_ops() 调用 torch.cuda.empty_cache()npu_compat.empty_cache_any()
init_seeds() 仅设 CUDA seednpu_compat.init_seeds_any()
get_gpu_info() 仅查询 CUDAnpu_compat.get_device_info_any()
attempt_compile() warmup 仅 sync CUDAnpu_compat.warmup_model_npu()
GPUInfo 仅支持 NVIDIA NVMLnpu_compat.NPUInfo 类
autocast() device 参数 hardcode 为 "cuda"npu_compat.autocast_any()

性能基准

测试条件: 输入 (1, 3, 640, 640),预热 5 次,取 18 次稳定迭代中位数

环境端到端耗时相对提升
CPU 基线~708 ms1x
NPU 默认 (TASK_QUEUE_ENABLE=1)26.04 ms27.2x
NPU + TASK_QUEUE_ENABLE=220.70 ms34.2x
NPU + TASK_QUEUE_ENABLE=2 + patches20.94 ms33.8x

关键结论:

  • TASK_QUEUE_ENABLE=2 带来约 20% 性能提升,有效消除 host-bound Free Time
  • YOLOv10n @ 640x640 单图推理约 20-21ms(vs CPU ~700ms),加速比 ~34x
  • 单图推理峰值显存 < 1GB,无内存瓶颈

快速开始

1. 最小改动推理

export 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]
"

2. 在现有 ultralytics 代码中接入 NPU

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")

3. 训练场景

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.pyNPU 兼容层:设备探测、计时同步、内存管理、种子设置、设备信息查询、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详细适配报告

优化详情

Layout 优化

DFL 模块 和 Attention 模块 的 transpose 后补 contiguous(),消除部分隐式格式转换开销。

运行时优化

  • 开启二级任务队列 (TASK_QUEUE_ENABLE=2) 实现 Host 侧任务队列与 NPU 执行流水线重叠
  • Python 层 _predict_once 的循环遍历、dict 构造等 host-bound 场景得到改善

算子替换评估

ascend-optimization 提供的融合算子主要面向 LLM,YOLOv10 为纯 CNN 架构:

算子适用场景结论
npu_fusion_attention序列因果 Attention不可直接替换(PSA 布局/语义不匹配)
npu_prompt_flash_attention全量 Flash Attention不可直接替换
标准 Conv/BN/SiLUCNN backboneCANN 图编译已充分优化,无需替换

环境要求

  • Python 3.10+
  • PyTorch 2.9.0+
  • torch_npu 2.9.0.post1+
  • CANN 8.5.1+
  • Ascend910B4 (或其他兼容 NPU)

许可证

与上游 Ultralytics 一致:AGPL-3.0


报告生成时间: 2026-05-09 Skill: ascend-optimization / gitcode-publish