华为CANN算子优化实践-AutoFuse自动融合在推荐系统中的深度应用(训练营深度实战篇)
随着人工智能在推荐系统中的广泛应用,模型规模和特征维度不断增加,算子执行效率逐渐成为系统性能的核心瓶颈。华为昇腾 CANN 提出的 AutoFuse 自动融合技术,为推荐系统提供了高效的算子执行方案,从原理设计到实践优化,实现了显著的性能提升。本文将从技术原理、实现机制、实践案例以及性能优化策略等方面,系统介绍 AutoFuse 在推荐领域的应用。
华为CANN算子优化实践-AutoFuse自动融合在推荐系统中的深度应用(训练营深度实战篇)
随着人工智能在推荐系统中的广泛应用,模型规模和特征维度不断增加,算子执行效率逐渐成为系统性能的核心瓶颈。华为昇腾 CANN 提出的 AutoFuse 自动融合技术,为推荐系统提供了高效的算子执行方案,从原理设计到实践优化,实现了显著的性能提升。本文将从技术原理、实现机制、实践案例以及性能优化策略等方面,系统介绍 AutoFuse 在推荐领域的应用。
训练营简介
2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。
报名链接:https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro
一、推荐系统中的算子性能挑战
推荐模型通常采用 Embedding + MLP 架构:
- Embedding 层:将高维稀疏特征(如用户ID、商品ID、类别等)映射为低维稠密向量,方便后续网络处理。
- MLP 层(多层感知机):通过多个全连接层和非线性激活函数(如 ReLU),捕捉特征之间的高阶交互关系,实现预测评分或推荐决策。
在这一架构下,模型包含大量 轻量级算子,例如 Add、ReLU、LayerNorm 等,这些算子计算量小、执行频繁,形成密集的计算子图。然而,在实际执行过程中,这类算子存在两个主要性能问题:
- 调度开销高:每个算子单独调度需要频繁访问内存和指令资源,导致算力浪费。
- 内存搬运频繁(Memory Bound):轻量算子之间需要不断读写中间数据,成为内存访问瓶颈。
传统的手工融合方法依赖预定义模式或者自定义内核,需要大量工程工作,并且难以覆盖复杂模型结构。对于长尾特征或动态 shape 模型,手工优化几乎不可维护。在异构硬件(如 NPU)上,还需要兼顾硬件并行性和带宽特性,这让手工优化面临巨大挑战。

二、AutoFuse 自动融合概述
为解决上述问题,华为提出了 AutoFuse 自动融合框架,能够在图级别自动识别可融合子图,并生成适配 NPU 架构的高效执行路径。其核心思路是:
将多个高频、轻量算子自动融合成一个大算子,从而减少算子调度和内存搬运开销,释放 NPU 计算能力,提高模型整体性能。
AutoFuse 支持的关键特性包括:
- 自动融合范围识别:智能分析计算图,确定可融合算子集合
- 自动生成融合 kernel:前端分析图结构,后端生成高效 kernel 和二进制
- Auto Tiling 优化:根据硬件特性自动划分 tile,提升并行执行效率
- 动态 shape 与混合精度支持:适应不同模型和训练策略
在实际推荐模型中,AutoFuse 的性能收益十分显著。例如,在 ETA 网络中,开启 AutoFuse 后算子总耗时下降 35.4%;在 GR 模型中,算子耗时下降 44.6%。

三、技术实现原理
AutoFuse 的实现分为 前端分析 和 后端执行 两大部分,每个环节相互协作,实现全流程自动化优化。
3.1 前端:自动融合范围确定
前端负责分析计算图,确定哪些算子可以融合,生成 FusedGraph 数据结构:
- FusedGraph:表示一个融合算子范围,包含若干 AscBackend 节点
- AscBackend 节点:类似于 GE 框架中的 partitioned call,携带子图对象
- AscGraph 子图:包含多个 AscIR 节点,表示融合算子的具体计算逻辑
前端实现逻辑:
- 分析算子依赖关系,识别高频轻量算子
- 根据规则或配置确定融合边界
- 构建子图对象,供后端生成融合 kernel
前端的智能分析可以处理动态 shape,支持模型中存在可变 batch 或特征维度的情况。
3.2 后端:融合算子生成与优化
后端主要负责将 FusedGraph 转化为可执行算子,过程包括:
-
Schedule
- 针对计算和搬运节点生成 TilingGroup
- 合并 TilingGroup,形成归一化策略,提升 NPU 并行度与带宽利用
-
Codegen
- 基于 TilingGroup 生成融合 kernel 源码
- 生成 tiling_func 和 tiling_data,实现高效数据搬运与计算
-
Auto Tiling
- 自动选择 tile 尺寸
- 匹配 NPU 硬件资源,实现计算与存储的最优分配
-
编译与交付
- 生成 Host 和 Device 端交付件
- 完整支持算子执行和 profiling 数据采集
AutoFuse 提供两条技术路线:
- GE 框架路径:自研框架,注重 NPU 硬件亲和性
- PyTorch Inductor 路径:复用生态融合能力(当前版本暂不支持)
通过前端和后端的协同,AutoFuse 可以实现从图分析到融合 kernel 生成的全流程自动化优化。
四、优化实践与实战案例
4.1 环境准备
- 硬件:Atlas 800I A2
- 软件:TensorFlow 1.x + CANN/NPU driver
- AutoFuse 配置:
source /usr/local/Ascend/driver/bin/setenv.sh
source /usr/local/Ascend/latest/bin/setenv.sh
export AUTOFUSE_FLAGS="--enable_autofuse=true;--autofuse_enable_pass=reduce,concat,slice;"
export AUTOFUSE_DFX_FLAGS="codegen_compile_debug=true;"
export DUMP_GRAPH_PATH="./dump_graph"

4.2 构建示例网络
import tensorflow as tf
import numpy as np
from npu_bridge.npu_init import *
data1 = tf.placeholder(tf.float32, shape=[128])
data2 = tf.placeholder(tf.float32, shape=[192, 128])
abs_0 = tf.abs(data1)
add_0 = tf.add(abs_0, data2)
relu_0 = tf.nn.relu(add_0)
sess_config = tf.ConfigProto(allow_soft_placement=True)
custom_op = sess_config.graph_options.rewrite_options.custom_optimizers.add()
custom_op.name = "NpuOptimizer"
custom_op.parameter_map["use_off_line"].b = True
custom_op.parameter_map["profiling_mode"].b = True
feed_dict = {
data1: np.random.rand(128).astype(np.float32),
data2: np.random.rand(192, 128).astype(np.float32)
}
with tf.compat.v1.Session(config=sess_config) as sess:
for _ in range(100):
sess.run(relu_0, feed_dict=feed_dict)
4.3 性能对比
- 不开启 AutoFuse:算子总耗时 15.56 μs
- 开启 AutoFuse:算子融合为单个
autofuse_pointwise算子,总耗时 6.04 μs,性能提升 61.18%
在真实推荐模型中:
| 模型 | 算子耗时下降 |
|---|---|
| ETA | 35.4% |
| MMOE | 10% |
| GR | 44.6% |
通过 AutoFuse,模型在 NPU 上的执行效率得到显著提升,同时减少了内存搬运开销和动态 shape 调度负担。

五、技术总结与未来发展
华为 CANN 的 AutoFuse 自动融合技术,在推荐系统算子优化中展现出以下优势:
- 自动化程度高:从图分析到融合算子生成全流程自动化,无需手工干预
- 性能提升显著:减少算子调度和内存搬运,提高 NPU 利用率
- 适应性强:支持动态 shape 和混合精度,适应复杂模型结构
- 硬件友好:通过 Auto Tiling 和 TilingGroup 优化,实现硬件算力最大化
未来,AutoFuse 将进一步支持新一代昇腾硬件,并扩展至更多深度学习模型场景,为大规模推荐系统提供高效、可维护的算子优化解决方案。
更多推荐




所有评论(0)