拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

昇腾 AutoFuse TensorFlow 算子融合实战abs reduce_sum 的 Elementwise 与 Reduce 融合示例【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusionAutoFuseAutofuse 组件是 CANN graph-autofusion 仓库中面向昇腾Ascend芯片的自动融合能力它通过在 GEGraph 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算子第二步沿axis1执行 Reduce 类型的reduce_sum算子。融合的目标是把上述两步合并为单个 Kernel 下发执行减少算子启动开销与中间张量的搬移这正是自动融合在推理场景下的典型收益。除本样例外仓库还提供了 Elementwise Elementwiseabs relu exp 与 Elementwise Broadcastabs add relu 两个对照样例三者共同覆盖了 TensorFlow 网络中最常见的三类融合组合参见 TensorFlow 场景用例演示。双运行模式tf1 与 tf2-compat脚本通过--mode参数选择 TensorFlow 版本两种模式的 NPU 接入方式与图 API 均不同如下表所示模式TensorFlow 版本NPU 接入方式图 APItf1TensorFlow 1.15.0npu_bridge通过 import 副作用注册tf.placeholderSessionNpuOptimizertf2-compatTensorFlow 2.6.5npu_device.compat.enable_v1()tf.compat.v1.placeholdertf.compat.v1.Session两种模式在 common/tf_runner.py 中分别有独立入口run_tf1()直接import npu_bridge依靠导入时的副作用完成 NPU 算子注册随后以原生tf.placeholder、tf.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 仓库根目录执行。运行用例前需要依次完成安装 CANN 软件包按 安装指导 正确安装 toolkit 与 ops 包并配置环境变量搭建 TensorFlow 环境x86_64 架构可直接 pip 安装aarch64 架构需源码编译详见 TensorFlow 环境部署文档 与 aarch64 架构 TF 源码编译可选的一键脚本仅 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_ID0执行命令显式开启 Reduce 融合Reduce 融合默认不使能需要在激活 TensorFlow 环境后通过AUTOFUSE_FLAGS环境变量显式开启# TensorFlow 1.15 环境 source scripts/env_install/tensorflow/env/activate_tf1.sh export AUTOFUSE_FLAGS--enable_autofusetrue;--autofuse_enable_passreduce 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_autofusetrue;--autofuse_enable_passreduce python3 autofuse/examples/tensorflow/af_tf_eleandreduce/test_abs_reducesum.py --mode tf2-compat环境变量中两个开关的分工为--enable_autofusetrueAutoFuse 自动融合的总开关--autofuse_enable_passreduce指定启用 Reduce 融合 pass本用例必须显式配置因为 Reduce 融合默认关闭。从源码看AUTOFUSE_FLAGS是 AutoFuse 框架的标准配置入口在 auto_fuse_config_parser.cc 中通过MM_SYS_GET_ENV(MM_ENV_AUTOFUSE_FLAGS, env_value)读取该环境变量并解析为融合配置项说明示例中的用法即框架层对外暴露的统一开关机制。示例文档中--autofuse_enable_passreduce的具体取值映射到仓库内其余示例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, axis1) return reduce_sum_0, {data1: input_data}它只做三件事定义[128, 192]的 float16 占位符、生成[-1, 1]区间的随机输入数据、串联tf.abs与tf.reduce_sum(axis1)得到输出张量。随后脚本调用公共入口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_dictfeed_dict)执行完毕后调用export_new_profiling()用msprof --exporton导出本次新增的 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_trace、task_time、hccl、aicpu均开启aic_metrics取PipeUtilizationmsproftx关闭其中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 --exporton --outputprofile_dir完成导出。这正是文档中脚本已内置 Profiling 配置的代码级实现。预期结果与融合验证方法脚本构造abs → reduce_sum计算图并在 NPU 上执行 100 步推理脚本执行无报错仅表示用例运行成功是否真正发生融合需要通过 Dump 图或 Profiling 数据进一步确认。验证步骤如下按上文命令执行脚本在 Profiling 输出目录中查找算子执行摘要./profiling/PROF_*/mindstudio_profiler_output/op_summary_*.csv观察算子列表融合生效时可看到以autofuse_reduce_前缀命名的融合 Kernel其中同时包含Abs与 ReduceSum 计算且独立的Abs、ReduceSumKernel 不再出现。这里给出判定融合生效的两个判据正向判据出现autofuse_reduce_前缀的融合 Kernel其内部承载了 abs 与 reduce_sum 两份计算反向判据原本应该单独下发的Abs、ReduceSum两个独立 Kernel 从执行摘要中消失。需要说明的是不同 CANN 版本生成的融合 Kernel 名称可能略有差异若前缀不完全一致可结合算子输入输出形状与张量流向综合判断。此外融合带来的收益如 Kernel 启动次数减少、中间张量读写消除可通过task_time、aic_metricsPipeUtilization等采集项进一步量化分析。小结通过本示例可以完整走通环境准备 → 显式开启融合 → 运行用例 → 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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门