ops-conv:卷积算子从 CPU 到昇腾 NPU 的优化之路

Transformer 出现之前,Conv 是 AI 计算的绝对核心。ResNet、EfficientNet、YOLO------所有视觉模型的计算量 90% 来自卷积。即使到了 Transformer 时代,视觉 Transformer(ViT)用 Self-Attention 替代了卷积,但图像预处理链路中依然需要 Conv 算子。

CANN 的 ops-conv 仓库管着卷积算子的实现。卷积的优化思路跟 GEMM 类似------Tile 分块、Cube Unit 执行、L1 复用------但卷积的滑动窗口模式让数据复用方式跟 GEMM 不同。


卷积为什么曾经是 AI 核心

卷积的本质是滑动窗口的加权求和。输入 Feature Map [B, C, H, W] 经过卷积核 [K, C, R, S] 的输出是 [B, K, H_out, W_out]

计算量 ≈ B × K × C × H_out × W_out × R × S。一个 3×3 卷积在 224×224 图像上的计算量约 1.2G FLOPs。


昇腾NPU如何执行卷积

Conv 在 Cube Unit 上执行。Cube Unit 做 16×16 的矩阵乘------卷积的滑动窗口操作被展开成矩阵形式(im2col),然后走 Cube Unit 的 GEMM 路径:

复制代码
输入 Feature Map:切成 16×16 的 Tile
卷积核:每个输入通道的 3×3 窗口展成 9 个元素
        所有通道的窗口展成 9×C 的矩阵
Cube Unit:输入 Tile × 卷积核矩阵 → 输出 Tile
重复以上步骤直到所有窗口计算完成

im2col 展开会增加临时显存占用------3×3 卷积的展开因子是 9 倍。ops-conv 的优化是不做完全展开------每次只展开当前 Tile 需要的窗口数据,展开后的矩阵直接送 Cube Unit,不写 DDR。


Tile 分块为什么关键

卷积的 Tile 分块跟 GEMM 不同------卷积的输入 Tile 在滑动窗口时重叠。相邻的两个卷积窗口共享 (R-1)×W 个输入元素。好的 Tile 策略可以最大化这部分数据的复用:

复制代码
不优化:每个窗口独立搬入输入数据
  窗口 1:搬入 [16×16] → 计算 → 写回
  窗口 2:搬入 [16×16](跟前一个窗口有 15×16 的重叠)→ 计算

优化(overlap-aware tiling):
  窗口 1:搬入 [16+R-1, 16] → 计算输出窗口 1 和 2
  窗口 2:不需要搬运------数据已经在 L1 上了

ops-conv 的 overlap-aware Tiling 在 3×3 卷积上可以减少 30% 的输入数据搬运量。


CNN 与 Transformer 的性能差异

CNN 的 Conv 算子和 Transformer 的 GEMM 在 NPU 上的 Cube 利用率不同:

算子类型 Cube 利用率 主要瓶颈
大 GEMM (M=4096) 85% 搬运带宽
3×3 Conv (224×224) 65% im2col 展开开销
7×7 Conv (小 Feature Map) 45% Tile 碎片

CNN 在小 Feature Map 上的利用率下降因为 Tile 中的有效计算占比低------边缘窗口的 Tile 数据填充降低了 Cube Unit 的有效利用率。

ops-conv 的 Winograd 优化

3×3 卷积除了 Tile 优化外还有 Winograd 算法。Winograd 把输入和卷积核变换到 Winograd 域------在域中做的乘法次数比原始卷积少。3×3 卷积的 Winograd 变换可以节省约 36% 的乘法。

ops-conv 在 Ascend 910 上对 3×3 卷积实现了 Winograd 优化:输入 Feature Map 和 3×3 核变换到 4×4 的 Winograd 域后做 16 次乘法------原始 3×3 卷积要 9 次乘法------但 Winograd 的 16 次乘法可用 Cube Unit 一次搞定,实际吞吐高于 9 次独立的 MAC 操作。

Winograd 的适用场景:3×3 卷积且特征图尺寸较大(H,W > 16)。小特征图的 Winograd 变换开销占比大------ops-conv 对小特征图自动切换到普通 im2col+GEMM 路径。

CNN 推理的性能分布

ResNet-50 在昇腾上的推理延迟分解:

算子类型 延迟占比 Cube 利用率
3×3 Conv 55% 65%
1×1 Conv 25% 78%
ReLU+BN 等 12% N/A(Vector)
Pooling 5% N/A
FC 3% 45%

3×3 卷积是绝对主力。1×1 卷积的 Cube 利用率更高因为 Tile 计算更规整。

参考仓库

ops-conv 卷积算子库

GEMM 矩阵乘优化指南

相关推荐
ZGIAI9 分钟前
ZGI 让那些"等你去处理"的事,真正跑起来
人工智能·架构
ZGIAI17 分钟前
ZGI:别再做Agent Demo了,先问问它在业务里能不能撑过下周三
人工智能·架构
香芋芋圆20 分钟前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
m0_6145235530 分钟前
完整教程|输入一句描述,能不能直接生成一段可以继续剪辑的视频:写结构化描述到生成短样片
人工智能·音视频
stormzhangV1 小时前
AGI 时代终于来了!
人工智能·openai
清风百草1 小时前
【05】AI辅助文档管理:开发者的效率革命
人工智能·ai辅助文档管理·开发者的效率革命
甲维斯2 小时前
Gemini锐评GPT6:我要泼冷水扒底裤!
人工智能
2501_928996222 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
敢敢のwings2 小时前
ACT-2 深度解析:家用机器人如何把“会做”推进到“可靠地做”
人工智能·机器人
DM今天肝到几点?2 小时前
AI 安全进入「攻防同频」:Gemini 3.8 Flash Cyber 上线、Astra 触及关键级、HiddenLayer 融资 1 亿美元
网络·人工智能·深度学习·安全·语言模型·开源·知识图谱