昇腾 AutoFuse TensorFlow 算子融合实战:abs + reduce_sum 的 Elementwise 与 Reduce 融合示例
2026/9/18 17:31:14 网站建设 项目流程

昇腾 AutoFuse TensorFlow 算子融合实战:abs + reduce_sum 的 Elementwise 与 Reduce 融合示例

【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾(Ascend)芯片的轻量级、解耦式组件集合,旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件,未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion

AutoFuse(Autofuse 组件)是 CANN graph-autofusion 仓库中面向昇腾(Ascend)芯片的自动融合能力,它通过在 GE(Graph Engine)中运行的 fusion pass 自动识别可融合算子并完成 Kernel 合并。本文以仓库中开箱即用的 TensorFlow 示例af_tf_eleandreduce为主线,完整讲解如何在 TF 1.15 与 TF 2.6.5 兼容模式下运行abs → reduce_sum融合用例,并结合源码剖析模型构建、NpuOptimizer 配置、AUTOFUSE_FLAGS开关解析与 Profiling 结果验证方法。读完本文,你将能够独立复现 Elementwise 与 Reduce 类算子的融合实验,并通过算子执行摘要 CSV 确认融合 Kernel 是否生效。

用例功能概述

示例位于 autofuse/examples/tensorflow/af_tf_eleandreduce,用于验证Elementwise(逐元素)与 Reduce(归约)两类算子之间的融合能力。用例的计算模式为:

  • 输入 shape:[128, 192],数据类型float16
  • 第一步执行 Elementwise 类型的abs算子;
  • 第二步沿axis=1执行 Reduce 类型的reduce_sum算子。

融合的目标是把上述两步合并为单个 Kernel 下发执行,减少算子启动开销与中间张量的搬移,这正是自动融合在推理场景下的典型收益。除本样例外,仓库还提供了 Elementwise + Elementwise(abs + relu + exp) 与 Elementwise + Broadcast(abs + add + relu) 两个对照样例,三者共同覆盖了 TensorFlow 网络中最常见的三类融合组合,参见 TensorFlow 场景用例演示。

双运行模式:tf1 与 tf2-compat

脚本通过--mode参数选择 TensorFlow 版本,两种模式的 NPU 接入方式与图 API 均不同,如下表所示:

模式TensorFlow 版本NPU 接入方式图 API
tf1TensorFlow 1.15.0npu_bridge(通过 import 副作用注册)tf.placeholder+Session+NpuOptimizer
tf2-compatTensorFlow 2.6.5npu_device.compat.enable_v1()tf.compat.v1.placeholder+tf.compat.v1.Session

两种模式在 common/tf_runner.py 中分别有独立入口:

  • run_tf1():直接import npu_bridge,依靠导入时的副作用完成 NPU 算子注册,随后以原生tf.placeholdertf.ConfigProto构建图与会话;
  • run_tf2_compat()import npu_device后调用npu_device.compat.enable_v1()切换到 v1 兼容模式,图 API 统一使用tf.compat.v1前缀。

无论哪种模式,最终都汇聚到统一的run_model():构建模型 → 配置 Session → 在 NPU 上执行 100 步推理 → 导出新增 Profiling 数据。也就是说,用例脚本本身只需关心"定义计算图 + 提供输入数据",运行框架承担了环境差异与性能采集的差异。

运行前置条件

以下命令均在 graph-autofusion 仓库根目录执行。运行用例前需要依次完成:

  1. 安装 CANN 软件包:按 安装指导 正确安装 toolkit 与 ops 包,并配置环境变量;
  2. 搭建 TensorFlow 环境:x86_64 架构可直接 pip 安装,aarch64 架构需源码编译,详见 TensorFlow 环境部署文档 与 aarch64 架构 TF 源码编译;
  3. 可选的一键脚本(仅 x86_64):执行bash scripts/env_install/tensorflow/setup_tf_env.sh自动搭建环境,脚本完成后会生成激活脚本,再按需激活对应版本:
source scripts/env_install/tensorflow/env/activate_tf1.sh # TF 1.15 # 或 source scripts/env_install/tensorflow/env/activate_tf2.sh # TF 2.6.5

注意:aarch64 架构不支持上述一键脚本,请按 aarch64 架构 TF 源码编译 手动编译 TensorFlow。

此外还需激活 CANN 包环境并指定运行设备,通用环境准备可参考 TensorFlow 场景用例演示:

export CANN_INSTALL_PATH=/usr/local/Ascend source $CANN_INSTALL_PATH/driver/bin/setenv.sh source $CANN_INSTALL_PATH/ascend-toolkit/set_env.sh export ASCEND_DEVICE_ID=0

执行命令:显式开启 Reduce 融合

Reduce 融合默认不使能,需要在激活 TensorFlow 环境后,通过AUTOFUSE_FLAGS环境变量显式开启:

# TensorFlow 1.15 环境 source scripts/env_install/tensorflow/env/activate_tf1.sh export AUTOFUSE_FLAGS="--enable_autofuse=true;--autofuse_enable_pass=reduce" python3 autofuse/examples/tensorflow/af_tf_eleandreduce/test_abs_reducesum.py --mode tf1

或:

# TensorFlow 2.6.5 环境(兼容模式) source scripts/env_install/tensorflow/env/activate_tf2.sh export AUTOFUSE_FLAGS="--enable_autofuse=true;--autofuse_enable_pass=reduce" python3 autofuse/examples/tensorflow/af_tf_eleandreduce/test_abs_reducesum.py --mode tf2-compat

环境变量中两个开关的分工为:

  • --enable_autofuse=true:AutoFuse 自动融合的总开关;
  • --autofuse_enable_pass=reduce:指定启用 Reduce 融合 pass(本用例必须显式配置,因为 Reduce 融合默认关闭)。

从源码看,AUTOFUSE_FLAGS是 AutoFuse 框架的标准配置入口:在 auto_fuse_config_parser.cc 中通过MM_SYS_GET_ENV(MM_ENV_AUTOFUSE_FLAGS, env_value)读取该环境变量并解析为融合配置项,说明示例中的用法即框架层对外暴露的统一开关机制。示例文档中--autofuse_enable_pass=reduce的具体取值映射到仓库内其余示例(eleandele、eleandbroadcast)中并未出现,可推断其为针对 Reduce 类算子融合的专项 pass 开关,具体命名在 AutoFuse 简介 与 通用配置头文件 中可继续追溯。

脚本源码拆解:从计算图到 Session

用例主体 test_abs_reducesum.py 非常精简,核心是build_model()函数:

def build_model(placeholder_fn): """构建 abs -> reduce_sum 计算图及对应输入数据。""" data1 = placeholder_fn(tf.float16, shape=[128, 192]) input_data = np.random.uniform(-1.0, 1.0, size=(128, 192)).astype(np.float16) abs_0 = tf.abs(data1) reduce_sum_0 = tf.reduce_sum(abs_0, axis=1) return reduce_sum_0, {data1: input_data}

它只做三件事:定义[128, 192]的 float16 占位符、生成[-1, 1]区间的随机输入数据、串联tf.abstf.reduce_sum(axis=1)得到输出张量。随后脚本调用公共入口run_example(build_model, ...),由 common/tf_runner.py 完成剩余工作:

  • 解析--mode参数并选择run_tf1/run_tf2_compat
  • configure_npu()中向sess_config添加名为NpuOptimizer的自定义优化器,并写入离线编译、推理模式与 Profiling 参数;
  • 创建 Session 后循环执行 100 步sess.run(output_tensor, feed_dict=feed_dict)
  • 执行完毕后调用export_new_profiling()msprof --export=on导出本次新增的 Profiling 数据。

公共运行参数集中在 common/config.py,关键项如下:

配置项默认值含义
RUN_STEPS100每用例执行的推理步数,步数越多 Profiling 数据越稳定,但运行时间更长
ALLOW_SOFT_PLACEMENTTrue允许设备无法执行时进行算子软放置回退
LOG_DEVICE_PLACEMENTFalse是否打印算子设备放置日志(默认关闭以免刷屏)
USE_OFF_LINETrueNpuOptimizer 离线编译开关,True 表示离线编译生成并执行 NPU 图
GRAPH_RUN_MODE0图运行模式,0 表示推理场景
PROFILING_MODETrue开启 NPU Profiling,在./profiling下生成采集数据
PROFILING_OPTIONSJSON 字符串采集项:training_tracetask_timehcclaicpu均开启,aic_metricsPipeUtilizationmsproftx关闭

其中PROFILING_OPTIONS的完整内容为:

{"output":"./profiling","training_trace":"on","task_time":"on","hccl":"on","aicpu":"on","aic_metrics":"PipeUtilization","msproftx":"off"}

采集数据的导出由 common/profiling_utils.py 负责:先记录运行前已有的PROF_*目录集合,运行结束后对比出新增目录,再对每个新增目录调用msprof --export=on --output=<profile_dir>完成导出。这正是文档中"脚本已内置 Profiling 配置"的代码级实现。

预期结果与融合验证方法

脚本构造abs → reduce_sum计算图并在 NPU 上执行 100 步推理,脚本执行无报错仅表示用例运行成功,是否真正发生融合,需要通过 Dump 图或 Profiling 数据进一步确认。

验证步骤如下:

  1. 按上文命令执行脚本;
  2. 在 Profiling 输出目录中查找算子执行摘要:./profiling/PROF_*/mindstudio_profiler_output/op_summary_*.csv
  3. 观察算子列表:融合生效时,可看到以autofuse_reduce_前缀命名的融合 Kernel,其中同时包含Abs与 ReduceSum 计算,且独立的AbsReduceSumKernel 不再出现。

这里给出判定融合生效的两个判据:

  • 正向判据:出现autofuse_reduce_前缀的融合 Kernel,其内部承载了 abs 与 reduce_sum 两份计算;
  • 反向判据:原本应该单独下发的AbsReduceSum两个独立 Kernel 从执行摘要中消失。

需要说明的是,不同 CANN 版本生成的融合 Kernel 名称可能略有差异,若前缀不完全一致,可结合算子输入输出形状与张量流向综合判断。此外,融合带来的收益(如 Kernel 启动次数减少、中间张量读写消除)可通过task_timeaic_metrics(PipeUtilization)等采集项进一步量化分析。

小结

通过本示例可以完整走通"环境准备 → 显式开启融合 → 运行用例 → Profiling 验证"的 AutoFuse 实验闭环,并掌握 Elementwise 与 Reduce 两类算子在昇腾 NPU 上的融合形态。该用例也是理解仓库其他 TensorFlow 融合样例(eleandele、eleandbroadcast)的模板:三者共用 common 运行框架,区别仅在build_model定义的计算链。若要进一步深入融合背后的图优化与 Kernel 生成机制,可继续阅读 AutoFuse 简介、AutoFuse 设计文档 及融合配置解析实现 auto_fuse_config_parser.cc。

【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾(Ascend)芯片的轻量级、解耦式组件集合,旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件,未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询