十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANN graph-autofusion 的 Elementwise 与 Broadcast 自动融合实战:TensorFlow 下 abs + add + relu 样例详解

CANN graph-autofusion 的 Elementwise 与 Broadcast 自动融合实战:TensorFlow 下 abs + add + relu 样例详解 CANN graph-autofusion 的 Elementwise 与 Broadcast 自动融合实战TensorFlow 下 abs add relu 样例详解【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion本篇技术指南以 graph-autofusion 仓库中 TensorFlow 场景样例 af_tf_eleandbroadcast 为核心讲解如何在昇腾AscendNPU 上通过 AutoFuse 自动融合abs add relu三个算子验证 Elementwise 与 Broadcast 两类算子的融合能力。读完本文你将掌握 AutoFuse 在 TensorFlow 1.15 与 TensorFlow 2.6.5 兼容模式下的启用方式、样例脚本的执行流程以及如何借助 Profiling 数据确认融合是否真正生效。用例背景为什么需要 Elementwise 与 Broadcast 融合在深度学习算法网络中存在大量 Vector 计算如激活、逐元素加减乘除等。这类算子单个执行开销不大但算子与算子之间会产生大量的中间张量搬运使网络陷入 Memory Bound访存受限问题。AutoFuse 是 graph-autofusion 项目开源的自动融合框架它基于 Ascend C具备自动融合范围识别、自动算子代码生成、Auto Tiling 优化、动态 shape 及混合精度等特性通过将多个相邻算子自动融合为一个算子减少网络中的算子数量与内存搬运从而缓解 Memory Bound 问题。更多背景可参考 Autofuse 简介。本项目提供的 TensorFlow 场景用例覆盖三类融合模式Elementwise Elementwiseabs relu expElementwise Broadcastabs add relu本文主题Elementwise Reduceabs reduce_sum其中 Elementwise 与 Broadcast 的融合是典型场景逐元素算子的输入/输出 shape 往往不一致add这类算子需要对低维张量做广播Broadcast后再逐元素计算。能否将广播逻辑一并融合进算子内部直接影响访存效率。用例功能与融合目标本样例的目标是让 AutoFuse 自动融合abs add relu三个算子。其计算图结构与输入数据定义如下输入Shape数据类型作用data1[128, 192]float16经tf.abs取绝对值data2[192]float16在add阶段被广播到[128, 192]add执行时data2会按 Broadcast 规则扩展为[128, 192]参与逐元素相加随后经过relu输出。该用例正是用这种 shape 组合来验证 AutoFuse 对 Elementwise 与 Broadcast 两类算子融合的支持能力。对应的计算图构建代码位于 test_abs_add_relu.py核心逻辑如下def build_model(placeholder_fn): 构建 abs - add(broadcast) - relu 计算图及对应输入数据。 data1 placeholder_fn(tf.float16, shape[128, 192]) data2 placeholder_fn(tf.float16, shape[192]) input_data1 np.random.uniform(-1.0, 1.0, size(128, 192)).astype(np.float16) input_data2 np.random.uniform(-1.0, 1.0, size(192,)).astype(np.float16) abs_0 tf.abs(data1) add_0 tf.add(abs_0, data2) relu_0 tf.nn.relu(add_0) return relu_0, {data1: input_data1, data2: input_data2}build_model通过placeholder_fn回调创建占位符使同一套模型定义既能运行在 TF1 原生 APItf.placeholder下也能运行在 TF2 v1 兼容 APItf.compat.v1.placeholder下。输入数据使用np.random.uniform(-1.0, 1.0)随机生成并转为 float16add的广播行为由 shape 差异天然触发。运行模式与前置环境脚本通过--mode参数选择 TensorFlow 版本与 NPU 接入方式ModeTensorFlow VersionNPU Integration MethodGraph APItf1TensorFlow 1.15.0npu_bridge通过 import 副作用注册tf.placeholderSessionNpuOptimizertf2-compatTensorFlow 2.6.5npu_device.compat.enable_v1()tf.compat.v1.placeholdertf.compat.v1.Session两种模式最终都经由 GEGraph Engine中的 AutoFuse fusion pass 识别可融合算子并完成融合区别仅在于 NPU 算子的注册方式与图 API 的兼容层不同。运行样例前需要在 graph-autofusion 仓库根目录完成环境搭建按快速安装指导安装 toolkit 与 ops 包并配置环境变量按环境编译部署文档搭建 TensorFlow 环境x86_64 可直接 pip 安装aarch64 需源码编译也可使用一键配置脚本自动搭建仅 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 源码编译文档 手动编译。此外还需设置 CANN 环境与设备号并开启自动融合开关# CANN 包安装路径变量定义值根据实际安装位置设置 export CANN_INSTALL_PATH/usr/local/Ascend # 激活 CANN 包中驱动相关环境变量 source $CANN_INSTALL_PATH/driver/bin/setenv.sh # 激活 CANN 包中 toolkit 相关环境变量 source $CANN_INSTALL_PATH/ascend-toolkit/set_env.sh # 假设跑在 device0 export ASCEND_DEVICE_ID0 # 开启自动融合 export AUTOFUSE_FLAGS--enable_autofusetrue其中AUTOFUSE_FLAGS是 AutoFuse 的运行时配置入口--enable_autofusetrue即开启自动融合。该环境变量由 auto_fuse_config_parser.cc 解析并进一步驱动融合开关与 PGO 等可选项的初始化相关配置定义可查看 auto_fuse_config.h。执行命令在仓库根目录激活对应 TensorFlow 环境并确认 AutoFuse 已开启后分别执行TensorFlow 1.15 环境source scripts/env_install/tensorflow/env/activate_tf1.sh export AUTOFUSE_FLAGS--enable_autofusetrue python3 autofuse/examples/tensorflow/af_tf_eleandbroadcast/test_abs_add_relu.py --mode tf1TensorFlow 2.6.5 环境兼容模式source scripts/env_install/tensorflow/env/activate_tf2.sh export AUTOFUSE_FLAGS--enable_autofusetrue python3 autofuse/examples/tensorflow/af_tf_eleandbroadcast/test_abs_add_relu.py --mode tf2-compat脚本实现解析样例脚本本身的模型定义很精简但其运行逻辑依赖 common 目录下的公共框架理解这些公共组件有助于你复用和改造其他融合用例。运行模式分发run_example 负责解析--mode参数可选值为tf1、tf2-compat并分发到对应入口run_tf1通过import npu_bridge的副作用注册 NPU 算子使用tf.placeholder与tf.ConfigProtorun_tf2_compat导入npu_device.compat并调用enable_v1()进入 v1 兼容模式使用tf.compat.v1系列 API。Session 的 NPU 配置configure_npu 通过custom_optimizers挂载NpuOptimizer并注入关键参数use_off_line True离线编译模式生成并执行 NPU 图graph_run_mode 0推理场景profiling_mode Trueprofiling_options开启 Profiling 采集。公共配置项所有可调参数集中在 config.py表格汇总如下配置项默认值说明PROFILING_DIR./profiling绝对路径Profiling 数据输出目录RUN_STEPS100每个示例执行的推理步数步数越多 Profiling 数据越稳定但耗时越长ALLOW_SOFT_PLACEMENTTrue允许 TensorFlow 在目标设备无法执行算子时进行设备回退LOG_DEVICE_PLACEMENTFalse是否打印每个算子的实际设备放置信息默认关闭避免日志膨胀USE_OFF_LINETrueNpuOptimizer 离线编译开关GRAPH_RUN_MODE0图运行模式0 表示推理场景PROFILING_MODETrue是否开启 NPU ProfilingPROFILING_OPTIONSJSON 字符串Profiling 采集项配置见下文PROFILING_OPTIONS的完整取值如下{ output: ./profiling, training_trace: on, task_time: on, hccl: on, aicpu: on, aic_metrics: PipeUtilization, msproftx: off }各字段含义output为 Profiling 数据输出目录training_trace采集迭代轨迹信息task_time采集 Task 执行时间hccl采集 HCCL 通信信息aicpu采集 AI CPU 算子信息aic_metrics采集 AI Core 指标此处使用PipeUtilizationmsproftx采集 msproftx 标记信息本样例关闭。Profiling 数据导出执行完成后profiling_utils.py 会对比执行前后PROF_*目录集合对新增目录调用msprof --exporton --outputdir完成原始数据的导出免去手动执行 msprof 的步骤。预期执行结果与融合验证脚本会构造abs → add(Broadcast) → relu计算图并在 NPU 上执行 100 步推理步数由RUN_STEPS控制。脚本执行无报错即表示用例运行成功但运行成功不等于融合生效需要通过 Dump 图或 Profiling 数据进一步确认。由于脚本已内置 Profiling 配置执行完成后可直接查看./profiling/PROF_*/mindstudio_profiler_output/op_summary_*.csv在op_summary中观察算子执行情况融合生效时可以观察到包含Abs、Add、Relu的 AutoFuse 融合 Kernel其名称通常形如autofuse_pointwise_0_Abs_Add_Relupointwise表明该融合算子属于逐元素/广播融合的代码生成路径且对应的独立Abs、Add、ReluKernel 不再出现融合未生效时op_summary中仍会分别出现三个独立 Kernel。融合的收益本质在于将三次算子下发与多次中间张量搬运合并为一次算子执行直接削减aiv_mte2_time输入搬运耗时与aiv_mte3_time输出搬运耗时这类访存开销这正是 AutoFuse 缓解 Memory Bound 问题的直观体现。调测与进阶参考如果融合未按预期生效可结合以下手段定位使用AUTOFUSE_DFX_FLAGS--codegen_compile_debugtrue;--debug_dir/path-to-dump/落盘每个自动融合算子的内部融合图结构pbtxt 文件可用 Netron 打开观察对照查看 af_tf_eleandeleElementwise Elementwise与 af_tf_eleandreduceElementwise Reduce两个用例判断是算子类别问题还是环境配置问题确认AUTOFUSE_FLAGS--enable_autofusetrue已正确导出到当前 shell且ASCEND_DEVICE_ID与脚本实际运行的设备一致。整体用例的目录结构与更多运行细节可参考 TensorFlow 场景用例演示。【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表