ARTICLE DETAIL

资讯详情

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

Autofuse 自动融合框架实战指南:基于昇腾 CANN graph-autofusion 的算子融合、上板验证与性能调测

Autofuse 自动融合框架实战指南:基于昇腾 CANN graph-autofusion 的算子融合、上板验证与性能调测 Autofuse 自动融合框架实战指南基于昇腾 CANN graph-autofusion 的算子融合、上板验证与性能调测【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusionAutoFuse 是 CANN graph-autofusion 仓库中基于 Ascend C 的自动融合框架用于解决算法网络中大量 Vector 计算导致的 Memory Bound 问题。本文以 autofuse/README.md 为核心骨架结合仓库源码与示例系统讲解 AutoFuse 的架构组成、源码构建与安装、PyTorch/TensorFlow 双框架上板验证流程以及 TORCH_COMPILE_DEBUG、AUTOFUSE_DFX_FLAGS 等调测手段与 Profiling 性能分析方法。读完本文你将能够独立完成 AutoFuse 环境搭建、用例执行、融合效果确认与性能收益评估。AutoFuse 是什么为什么需要自动融合在算法网络中存在大量的 Vector向量计算算子。当这些算子以单算子形式逐个下发执行时每个算子的输入、输出都要在片外存储与片上存储如 Unified Buffer之间反复搬运数据。由于数据搬运速度远慢于片上计算速度整个网络很快被内存搬运所拖累出现典型的Memory Bound访存受限问题昇腾芯片的算力无法被充分释放。AutoFuse 的解决思路是自动将多个算子融合为一个算子。通过减少网络中算子的数量消除算子之间冗余的中间结果落盘与再读取从而减少内存搬运次数缓解 Memory Bound提升模型执行性能。根据 autofuse/README.md 的说明AutoFuse 具备以下核心能力自动融合范围识别在计算图中自动识别哪些算子可以被安全地融合为一个融合算子自动算子代码生成为融合后的算子自动生成 Ascend C kernel 代码无需手写Auto Tiling 优化自动完成 Tiling 切分与调度适配多核并行与片上资源约束动态 shape 支持融合算子能够适配输入 shape 在运行期才确定的动态场景混合精度支持融合过程中可保持并正确处理混合精度的计算语义。AutoFuse 当前提供PyTorch与TensorFlow两种框架的 Sample 用例未来可能支持更多框架。详细介绍可参考昇腾官方文档《Autofuse自动融合》。Autofuse 目录结构解析在 graph-autofusion 仓库中AutoFuse 的全部代码位于 autofuse 目录下各子目录职责如下autofuse/ ├── ascendc # ascendc api 定义 ├── ascir # 算子注册 ascir ├── att # 自动 tiling 生成 模块 ├── cmake # cmake 脚本文件 ├── codegen # kernel 代码生成 模块 ├── common # 通用工具方法 ├── compiler # 对外API 接口 ├── examples # 示例脚本演示典型用法 ├── graph_metadef # 基本图接口 ├── inc # 供 GE 调用接口 ├── optimize # 调度切分 模块 ├── scripts # 脚本路径 ├── tests # 测试用例与测试框架 ├── tools # 调试与分析工具 ├── v35 # 昇腾950 芯片相关优化 ├── CMakeLists.txt # CMake 配置文件 ├── blacklist.txt # 工程配置文件 ├── README.md # 中文说明文档 └── README_en.md # 英文说明文档从源码结构看一个融合算子从识别到产出大致贯穿以下模块融合范围识别与图优化位于 autofuse/optimize其中的 optimize.h 定义了Optimizer类负责对融合图执行前处理GraphPass、AutoSchedule 调度、Buf/Que 内存分配最终产出FusedScheduledResultAuto Tiling 生成位于 autofuse/att通过gen_tiling_impl等自动生成 Tiling 实现Kernel 代码生成位于 autofuse/codegen将融合后的 IR 生成为 Ascend C kernel 源码对外接口与编译位于 autofuse/compiler其中的 Python 编译适配层如 ascendc_compile.py负责把生成的 kernel 编译为可执行产物并管理 Host 侧 PCH 缓存~/.cache/autofuse_pch_cache与编译时间线~/.cache/autofuse_compile_traceAscend C API位于 autofuse/ascendc/api提供add、mul、gather、reduce等算子实现供生成的融合 kernel 调用。源码构建与安装AutoFuse 随 graph-autofusion 仓库一起编译。完整的构建流程环境准备、环境验证、源码下载、依赖安装、编译、安装卸载、UT/ST 测试请参考 docs/zh/build.md这里提炼关键步骤环境准备按 docs/zh/quick_install.md 安装 CANN Toolkit 开发套件包和 ops 算子包运行样例还需 NPU 驱动和固件下载源码git clone https://gitcode.com/cann/graph-autofusion.git离线环境可通过下载 zip 包并准备makeself、cann-cmake等第三方软件放入open_source/目录安装依赖Python3 3.8.0建议虚拟环境、patch、CMake 3.16.0建议 3.20.0、GCC 7.3.0。若需切换到 gcc15/gcc16在执行构建前显式设置export CCgcc-15 export CXXg-15或设置GCC_VERSION15/GCC_VERSION16交由脚本生成对应编译器命令。注意不要使用update-alternatives修改系统默认 gcc切换编译器后请先清理build/避免 CMake 缓存继续使用旧编译器配置编译bash build.sh --pkg执行成功后会在build_out目录下生成cann-graph-autofusion_${cann_version}_linux-${arch}.run。编译过程中 CMake 会通过ExternalProject_Add从外网自动下载第三方源码包abseil-cpp、boost、json、protobuf、symengine、googletest、mockcpp 等内网环境可配置http_proxy/https_proxy或使用--cann_3rd_lib_path$(pwd)/output/third_party指定本地预下载包路径安装./build_out/cann-graph-autofusion_${cann_version}_linux-${arch}.run --full --quiet --pylocal其中--full为全量模式安装--quiet静默安装--pylocal将包内 .whl 跟随 run 包安装路径安装如需指定路径可加--install-path${install_path}需与 CANN Toolkit 安装路径一致。卸载使用--uninstall参数。重要提示执行 UT/ST 测试前必须先安装编译生成的.run包否则测试运行时LD_LIBRARY_PATH会加载到 CANN 安装路径下的旧版本动态库导致undefined symbol等运行时错误。上板验证环境准备用户如果希望在昇腾设备上体验 AutoFuse 的功能与性能建议先参考 docs/zh/quick_install.md 完成环境搭建然后按 docs/zh/build.md 增量安装 graph-autofusion 仓编译生成的 CANN 包。环境准备有三种方式CANNLab 一站式开发平台提供在线可直接运行的昇腾环境默认安装最新商发版 CANN 包适合没有昇腾设备的开发者Docker 部署一键部署 CANN 包和必备依赖当前 OS 仅支持 Ubuntu适合有昇腾设备且需快速搭建环境的开发者运行样例时需通过--device /dev/davinci0等参数将 NPU 设备文件映射进容器手动安装按《CANN 软件安装指南》安装驱动、固件、Toolkit 与 ops 包适合想体验最新 master 分支能力的开发者。安装 torch_npuAutoFuse 的 PyTorch 上板依赖torch_npu。为确保使用与 AutoFuse AscendC 后端匹配的torch_npuDaily 环境建议使用仓库提供的环境安装脚本不建议直接通过 PyPI 安装 torch_npupip3 install numpy pip3 install pyyaml pip3 install setuptools在 graph-autofusion 仓库根目录执行 PyTorch 环境安装脚本bash scripts/env_install/pytorch/setup_torch_npu_daily.sh其他环境依赖CMake 3.16.0 GCC 7.3.0在 openEuler 系统上sudo yum install cmake gcc在 Ubuntu 系统上sudo apt-get install cmake gcc设置环境变量执行用例前需设置以下环境变量以指定运行 NPU 设备# 用户自己的 driver 包安装路径 source /usr/local/Ascend/driver/bin/setenv.sh # 用户自己的 CANN 包安装路径 source /usr/local/Ascend/ascend-toolkit/set_env.sh # 假设跑在 0 卡和脚本保持一致 export ASCEND_DEVICE_ID0PyTorch 场景用例AutoFuse 的 PyTorch 集成基于torch.compile AscendC 后端完成算子融合。仓库提供了三个示例用例详见 autofuse/examples/pytorch/README.md用例目录融合模式说明af_pointwiseadd ge加法和比较算子融合af_reducemul reducesum乘法和求和归约算子融合af_gathergather add索引取数 逐元素加法图模式暂未支持融合等待 issue175 完成后可融合前置要求CANN 包版本要求9.0.0 及以上正确安装 toolkit 和 ops 包torch_npu版本要求2.9.0 及以上Python 环境安装与激活方式参考 docs/env_install/pytorch/env_pytorch.md。用例代码剖析以 af_add_ge.py 为例其核心流程为构造模型 →torch.compile指定 AscendC 后端 → 创建输入 → Profiling 采集。模型定义与编译入口如下class MyModel(nn.Module): def __init__(self): super().__init__() def forward(self, x, y, z): result torch.ge(torch.add(x, y), z) return result model MyModel().to(DEVICE) model torch.compile( model, dynamicFalse, fullgraphTrue, options{npu_backend: ascendc}, )三个用例均开启 NPU Profilingtorch_npu.profiler.profile循环执行 100 步推理运行结束后在当前目录生成profiling目录可通过性能分析文件查看算子执行情况和融合结果。完整的可运行代码分别见 af_add_ge.py、af_mul_reducesum.py 与 af_gather_add.py。执行与结果确认假设用例名为test.py直接执行python3 test.py程序执行完成后在如下目录中查看算子执行详情profiling/PROF_时间戳/mindstudio_profiler_output打开其中的op_summary_时间戳.csv如果算子列表中存在名称以autofused_开头的 Kernel表示相关算子已经成功融合为一个融合算子。TensorFlow 场景用例TensorFlow 场景下AutoFuse 通过 GEGraph Engine中的 AutoFuse fusion pass 自动识别可融合算子并完成融合。仓库提供了三个用例详见 autofuse/examples/tensorflow/README.md用例目录融合模式af_tf_eleandeleabs relu expElementwise Elementwiseaf_tf_eleandbroadcastabs add reluElementwise Broadcastaf_tf_eleandreduceabs reduce_sumElementwise Reduce环境搭建参考 docs/env_install/tensorflow/env_tf.mdx86_64 可直接 pip 安装aarch64 需源码编译详见 build_tf_aarch64.md。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环境变量设置与 PyTorch 场景类似额外需要开启自动融合开关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 # 开启自动融合 export AUTOFUSE_FLAGS--enable_autofusetrue各用例脚本均执行 100 步推理无报错表示用例执行成功是否发生融合需要通过 Dump 图或 Profiling 进一步确认。调测相关环境变量详解AutoFuse 上板验证时可以通过以下环境变量控制调试输出与编译行为。TORCH_COMPILE_DEBUGtorch 原生环境变量启用详细调试日志以及编译中间产物保存export TORCH_COMPILE_DEBUG1注意多次执行相同脚本会因为缓存存在而跳过编译可配合TORCHINDUCTOR_FORCE_DISABLE_CACHES使用强制每次执行都重新编译。TORCHINDUCTOR_FORCE_DISABLE_CACHEStorch 原生环境变量禁用 Inductor 缓存每次执行都会重新编译export TORCHINDUCTOR_FORCE_DISABLE_CACHES1注意会显著增加图启动耗时实际部署时请勿使用该环境变量。ASCEND_LAUNCH_BLOCKING可选torch_npu 原生环境变量启用 Ascend 内核同步执行每次 kernel 下发都会等待完成便于确定首个报错的 kernelexport ASCEND_LAUNCH_BLOCKING1注意会显著降低下发性能实际部署时请勿使用该环境变量。AUTOFUSE_DFX_FLAGSAutoFuse 自身的 DFX 环境变量可落盘每个自动融合算子对应的内部融合图结构pbtxt 文件可以使用 netron.app 打开观察export AUTOFUSE_DFX_FLAGS--codegen_compile_debugtrue;--debug_dir/path-to-dump/AutoFuse 后端会在设置的 dump 路径下生成每个融合算子的 dump 图。编译性能诊断由codegen_compile_debugtrue单独控制例如export AUTOFUSE_DFX_FLAGS--codegen_compile_debugtrue开启编译性能诊断后会输出每个 LLVM pass 的耗时-ftime-reportper-pass生成编译器时间线 JSON 文件默认保存到~/.cache/autofuse_compile_trace终端会输出[CompileTrace] 文件路径。Host 编译会复用已有 PCH缓存未命中时尝试创建。PCH 缓存目录为~/.cache/autofuse_pch_cachePCH 缓存或创建失败时会自动回退到普通 Host 编译。这一机制与 autofuse/compiler/python/ascendc_compile.py 中定义的PCH_CACHE_ROOT、COMPILE_TRACE_ROOT路径实现一一对应。结果分析与性能评估通过 torch_compile_debug 判断融合是否发生用户开启TORCH_COMPILE_DEBUG后调试信息会输出到当前执行目录下的torch_compile_debug子目录以autofused_为前缀的目录是torch_npuAscendC 后端生成的融合算子产物每个目录对应一个融合算子的白盒结构可用于查看融合范围和代码生成结果其余目录为 PyTorch Inductor 生成的原生产物。如果未生成以autofused_为前缀的目录说明当前编译过程中没有产生融合算子。此时可以根据终端输出中的Fallback aten.xxxx $reason: xx原因信息分析未发生融合的原因。通过 Profiling 对比性能收益对于 Sample 用例可以注释整个torch.compile(...)代码块使模型以非编译模式执行作为未使能自动融合的对照场景# model torch.compile( # model, # dynamicFalse, # fullgraphTrue, # options{npu_backend: ascendc}, # )分别采集未使能自动融合和使能自动融合两种场景的 Profiling 数据并对比相同计算范围内所有相关算子的总耗时。详细的 Profiling 性能分析工具使用方法可参见昇腾官方《Profiling 性能分析工具指南》。融合提升比与搬运耗时指标需要注意的是不是模型里所有的算子都能被融合。对于在 Inductor 层未被 lowering 的算子最后仍然以单算子形式存在。融合提升比的计算公式为融合提升比 (融合前所有算子耗时 - 融合后所有算子耗时) / 融合前所有算子耗时更进一步的可以观察融合算子相比于单算子的aiv_mte2_time输入搬运耗时和aiv_mte3_time输出搬运耗时的提升情况——这正是 AutoFuse 减少内存搬运、缓解 Memory Bound 的直接证据。精度问题的排查可参考昇腾官方《精度调试工具指南》。复杂网络使能 AutoFuse用户在网络中使能 AutoFuse 时无需单独导入inductor_npu_ext只需在torch.compile中指定 AscendC 后端model torch.compile( model, dynamicFalse, fullgraphTrue, options{npu_backend: ascendc}, )其中dynamicFalse表示关闭动态 shape当前用例以静态 shape 演示fullgraphTrue要求整个计算图在一个 Graph 中完成编译若图中含有未支持的算子会报错options{npu_backend: ascendc}指定使用昇腾 AscendC 后端从而触发 AutoFuse 的融合与代码生成链路。这也是从示例用例迁移到真实复杂网络时的标准接入方式。【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表