
CANN graph-autofusion 源码构建全指南从环境准备到编译、安装与测试验证【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion本文以 CANN graph-autofusion 开源仓库的 docs/zh/build.md 为骨架系统讲解在昇腾Ascend环境下从零完成源码编译的完整流程涵盖环境准备与验证、依赖安装、在线/离线两种源码获取方式、第三方依赖的代理与离线预下载策略、.run安装包构建、安装卸载以及 UT/ST/覆盖率测试验证。读完本文你将能够独立搭建一套可用的 graph-autofusion 编译环境并熟练使用build.sh完成构建、测试与产物安装的闭环操作。1. 前置知识graph-autofusion 的构建产物是什么graph-autofusion 是面向昇腾芯片的轻量级、解耦式组件集合目前已开源 SuperKernel 与 Autofuse 两大组件。整个项目的编译由仓库根目录的 build.sh 脚本驱动最终通过 CPack 生成自解压安装包build_out/cann-graph-autofusion_${cann_version}_linux-${arch}.run其中${cann_version}是 CANN 版本号${arch}是 CPU 架构aarch64或x86_64。从 build.sh 的源码可以看到构建系统支持四个模块superkernel、autofuse_framework、autofuse_ascendc_api、autofuse_e2e并分别对应不同的 UT/ST 测试入口。编译过程会通过 CMake 的ExternalProject_Add自动下载并编译大量第三方源码包abseil-cpp、boost、json、protobuf、symengine、googletest、mockcpp 等这正是后续章节反复强调网络可达性与离线预下载的原因所在。2. 环境准备与环境验证2.1 基础环境搭建在源码编译前请先完成基础环境搭建具体操作参见 快速安装。该文档提供了三种部署方式CANNLab 一站式开发平台适用于没有昇腾设备的开发者在线直接运行昇腾环境Docker 部署一键部署 CANN 包与必备依赖适用于有昇腾设备、需要快速搭建环境的开发者手动安装手动安装 CANN 包和基础依赖灵活性最高适合体验最新 master 分支能力的开发者。无论选择哪种方式编译 graph-autofusion 前都必须确保已安装 CANN 软件Toolkit 开发套件包和 ops 包若需要运行样例还需安装 NPU 驱动和固件。2.2 验证 CANN 安装是否正常安装完 CANN 包后建议通过查看安装信息文件来验证环境是否正常# 查看CANN Toolkit的version字段提供的版本信息默认路径安装arch表示CPU架构aarch64或x86_64。WebIDE场景下请将/usr/local替换为/home/developer。 cat /usr/local/Ascend/cann/arch-linux/ascend_toolkit_install.info # 查看CANN ops的version字段提供的版本信息默认路径安装opsname表示待查询的ops子包的名称请用户根据实际安装路径替换。WebIDE场景下请将/usr/local替换为/home/developer。 cat /usr/local/Ascend/cann/arch-linux/ascend_ops_install.info两个文件分别记录了 CANN Toolkit 与 CANN ops 的版本字段。注意默认安装路径为/usr/local/Ascendroot 用户或${HOME}/Ascend非 root 用户WebIDECANNLab场景下则应替换为/home/developer。2.3 配置环境变量根据实际场景选择合适的命令# 默认路径安装以root用户为例非root用户将/usr/local替换为${HOME} source /usr/local/Ascend/cann/set_env.sh # 指定路径安装 source ${install_path}/cann/set_env.sh这一步会设置ASCEND_HOME_PATH、ASCEND_TOOLKIT_HOME、ASCEND_OPP_PATH、LD_LIBRARY_PATH等关键环境变量。build.sh 中通过${ASCEND_HOME_PATH}推导ASCEND_INSTALL_PATH并传给 CMake-DASCEND_INSTALL_PATH...cmake/dependencies.cmake 同样依赖ASCEND_HOME_PATH定位 CANN 头文件与库同时 scripts/check_env.sh 也依赖这些环境变量来判定 CANN Toolkit/ops 是否就绪。因此必须先 source 环境脚本再进行编译否则 CMake 将无法找到 CANN 依赖。3. 获取源码3.1 在线方式编译环境可访问网络若编译环境可以访问网络编译过程中会自动下载开源第三方软件直接使用 git clone 即可git clone https://gitcode.com/cann/graph-autofusion.git3.2 离线方式编译环境无法访问网络若编译环境无法访问网络需要在联网环境中完成源码与第三方开源软件的下载再手动上传至编译环境下载源码在联网环境中进入本项目主页通过下载 zip或Clone按钮完成源码下载。下载第三方开源软件包括 makeself 与 cann-cmake开源软件版本下载地址makeself2.5.0makeself-release-2.5.0-patch1.tar.gzcann-cmakemaster-052cmake-master-052.tar.gz上传并解压将源码及第三方开源软件上传到离线编译环境中解压缩源码# 解压缩源码 unzip graph-autofusion.zip整理 open_source 目录在源码同级目录创建open_source目录将第三方开源软件压缩包放入其中解压并改名# 创建open_source目录 mkdir open_source # 将第三方开源软件压缩包放到open_source目录下 mv makeself-release-2.5.0-patch1.tar.gz open_source/ mv cmake-master-052.tar.gz open_source/ # 解压缩第三方开源软件压缩包并改名cann-cmake压缩包保持不变 cd open_source tar -zxvf makeself-release-2.5.0-patch1.tar.gz mv makeself-release-2.5.0 makeself注意 cann-cmake 压缩包保持原名不动只有 makeself 需要解压并改名为makeself。完成后的目录结构如下├── graph-autofusion # 解压后的源码仓 │ ├── cmake │ └── ... ├── open_source # 三方开源软件 │ └── makeself │ ├── COPYING │ ├── Makefile │ ├── README.md │ └── ... │ └── cmake-master-052.tar.gzmakeself 是 CPack 生成自解压.run安装包所依赖的工具cann-cmake 则提供add_cann_third_party、find_cann_package等构建辅助函数cmake/fetch_cann_cmake.cmake 与 cmake/dependencies.cmake 中随处可见对它的引用。4. 安装编译依赖4.1 依赖清单与版本要求以下为源码编译用到的依赖及版本要求[!NOTE] 注意 如使用镜像方式进行项目体验所有依赖已包含在 init_env.sh 中可跳过此安装依赖步骤。Python3 3.8.0建议使用 Python 虚拟环境[!NOTE] 说明 Python 官方已宣布 3.8.x 进入 EOL 状态CANN 将在 10.0.0 停止对该版本的支持请升级到 3.9.x 的版本。创建虚拟环境并激活python3 -m venv venv source venv/bin/activate安装依赖cd graph-autofusion pip3 install -r super_kernel/requirements-dev.txtsuper_kernel/requirements-dev.txt 共声明了 29 个 Python 包依赖全部带有版本下限其中setuptools还额外带有上限68.0.0,80.0.0。核心测试工具链包括pytest7.4.4、pytest-cov4.1.0、pytest-timeout2.4.0、pytest-xdist3.0.0并行测试、coverage[toml]7.2.7覆盖率统计以及numpy、scipy、sympy等数值/符号计算库。patch# Ubuntu/Debian操作系统安装命令示例如下其他操作系统请自行安装 sudo apt-get install patchCMake 3.16.0建议使用 3.20.0 版本# Ubuntu/Debian操作系统安装命令示例如下其他操作系统请自行安装 sudo apt-get install cmakeGCC 7.3.0[!NOTE] 说明默认使用当前环境已安装的 gcc/g不会修改系统默认编译器。如需切换到 gcc15/gcc16请在编译前显式设置CC/CXX例如export CCgcc-15 CXXg-15。也可以设置GCC_VERSION15或GCC_VERSION16由脚本生成对应的编译器命令。切换编译器后请清理build/再重新配置避免 CMake 缓存沿用旧编译器。4.2 检查编译环境环境准备完成后建议执行环境检查脚本确认当前环境是否满足编译要求bash scripts/check_env.shscripts/check_env.sh 会从 9 个维度逐项检查环境检查结果以三种状态标识状态含义处理建议[PASS]检查通过无需处理[WARNING]非关键依赖缺失或版本存在偏差建议修复不影响核心编译[ERROR]关键依赖缺失或版本不兼容必须修复否则无法编译从脚本源码看其检查项包括操作系统与 CPU 架构验证过x86_64/aarch64、Python3 版本与开发头文件Python.h、pip/venv 可用性、CMake 版本、GCC/G、CANN Toolkit 与 CANN opsOPP路径、git/make、29 个 Python 依赖包逐一比对版本以及磁盘/内存/CPU 等系统资源。脚本结束时还会给出汇总报告ERRORS/WARNINGS/PASSED 计数和结论若存在 ERROR 项则以退出码 1 结束。[!NOTE] 注意 环境检查脚本中所有的检查项和版本约束严格来源于 docs/zh/build.md 和 super_kernel/requirements-dev.txt如文档和依赖更新请同步修改 脚本。5. 执行编译进入源码仓根目录执行以下命令进行编译bash build.sh --pkg--pkg表示构建 run 包。执行成功后会在build_out目录下生成cann-graph-autofusion_${cann_version}_linux-${arch}.run。${cann_version}表示 CANN 版本号${arch}表示 CPU 架构如aarch64、x86_64。更多编译参数可以通过bash build.sh -h查看。结合 build.sh 的 usage 输出build.sh支持以下常用选项选项说明--pkg构建 run 包--no-autofuse跳过 autofuse 后端的构建/打包产物-j N编译线程数默认 16实际取 CPU 核数且自动钳制不超过核数如-j 8-u, --ut运行支持的单元测试-s, --st运行支持的系统测试--implpy\|cpp\|all在-u/-s下选择实现类型默认 all--modulename选择模块默认 all支持 superkernel、autofuse_framework、autofuse_ascendc_api、autofuse_e2e-c, --coverage生成覆盖率报告--output_pathPATH输出路径run 包默认生成在./build_out--cann_3rd_lib_pathPATH第三方包路径默认./output/third_party--build-typeTYPE构建类型Debug / Release默认 Release--pkg-typeTYPE包类型run / rpm / deb默认 run-f FILE提供变更文件列表实现智能模块选择见下文其中-f FILE是 CI 场景下的智能选择能力文件列表只涉及super_kernel/时跳过 autofuse 构建与测试只涉及autofuse/时跳过 superkernel 测试两者都变更则全量构建仅涉及 docs/examples 等文档时直接跳过构建退出码 200。6. 编译期第三方依赖的两种网络解决方案编译过程中CMake 会通过ExternalProject_Add从外网如https://gitcode.com/cann-src-third-party/、华为云 OBS 等自动下载 autofuse 和 superkernel AOT UT 所需的第三方源码包abseil-cpp、boost、json、protobuf、symengine、googletest、mockcpp 等。如果编译环境无法直接访问外网如企业内网、Docker 容器默认 bridge 网络请根据实际情况选择以下方案。方案一配置网络代理推荐如果环境中有 HTTP 代理可访问外网设置http_proxy/https_proxy环境变量后执行编译。build.sh会自动将这些代理变量传递给 CMake 子进程# 设置代理根据实际代理地址修改 export http_proxyhttp://user:passwordproxy-server:port export https_proxyhttp://user:passwordproxy-server:port # 执行编译 bash build.sh --pkg[!NOTE] 说明build.sh会自动检测并继承当前 shell 中的http_proxy和https_proxy环境变量无需额外配置。这一点在 build.sh 中有明确实现检测到代理变量后会打印提示并说明 CMake 的 curl 下载会自动继承。如果使用 git 代理通过git config --global http.proxy配置需确认 shell 环境中也设置了对应的环境变量。可通过echo $http_proxy验证。方案二手动预下载第三方包完全离线在不具备任何外网访问能力的环境中可在联网机器上预先下载第三方源码包拷贝到编译环境指定目录后离线编译。在联网机器上下载以下第三方包第三方包版本下载地址abseil-cpp20230802.1https://gitcode.com/cann-src-third-party/abseil-cpp/releases/download/20230802.1/abseil-cpp-20230802.1.tar.gzjson3.11.3https://gitcode.com/cann-src-third-party/json/releases/download/v3.11.3/json-3.11.3.tar.gzboost1.87.0https://gitcode.com/cann-src-third-party/boost/releases/download/v1.87.0/boost_1_87_0.tar.gzprotobuf25.1https://gitcode.com/cann-src-third-party/protobuf/releases/download/v25.1/protobuf-25.1.tar.gzsymengine0.12.0https://gitcode.com/cann-src-third-party/symengine/releases/download/v0.12.0/symengine-0.12.0.tar.gzgoogletest1.14.0https://gitcode.com/cann-src-third-party/googletest/releases/download/v1.14.0/googletest-1.14.0.tar.gzmockcpp2.7https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/mockcpp/mockcpp-2.7.tar.gzmockcpp patch2.7-h5https://gitcode.com/cann-src-third-party/mockcpp/releases/download/v2.7-h5/mockcpp-2.7-h5.patchmakeself2.5.0https://gitcode.com/cann-src-third-party/makeself/releases/download/release-2.5.0-patch1.0/makeself-release-2.5.0-patch1.tar.gz将下载的包拷贝到编译环境的output/third_party/对应子目录下如不存在则创建# 在源码根目录下创建目录结构 mkdir -p output/third_party/{abseil-cpp,json,boost,protobuf,symengine,gtest,mockcpp,makeself} # 将下载的包放入对应目录文件名须与下表一致 # abseil-cpp-20230802.1.tar.gz → output/third_party/abseil-cpp/ # json-3.11.3.tar.gz → output/third_party/json/ # boost_1_87_0.tar.gz → output/third_party/boost/ # protobuf-25.1.tar.gz → output/third_party/protobuf/ # symengine-0.12.0.tar.gz → output/third_party/symengine/ # googletest-1.14.0.tar.gz → output/third_party/gtest/ # mockcpp-2.7.tar.gz → output/third_party/mockcpp/ # mockcpp-2.7-h5.patch → output/third_party/ # 推荐路径 # mockcpp-2.7-h5.patch → output/third_party/pkg/ # 备用路径 # makeself-release-2.5.0-patch1.tar.gz → output/third_party/makeself/mockcpp 离线包和补丁文件放置示例# 推荐放置方式 mkdir -p output/third_party/mockcpp cp mockcpp-2.7.tar.gz output/third_party/mockcpp/ cp mockcpp-2.7-h5.patch output/third_party/ # 如需放到备用路径则使用如下方式 mkdir -p output/third_party/mockcpp output/third_party/pkg cp mockcpp-2.7.tar.gz output/third_party/mockcpp/ cp mockcpp-2.7-h5.patch output/third_party/pkg/如需在编译前手动验证 mockcpp 补丁是否可以应用可在临时目录中执行以下 git 命令正常编译时无需执行CMake 会自动完成该步骤# 在源码根目录下执行使用推荐 patch 放置路径进行验证 GRAPH_AUTOFUSION_HOME$(pwd) rm -rf /tmp/mockcpp_patch_check mkdir -p /tmp/mockcpp_patch_check tar -zxf output/third_party/mockcpp/mockcpp-2.7.tar.gz -C /tmp/mockcpp_patch_check --strip-components1 cd /tmp/mockcpp_patch_check git init git apply --check ${GRAPH_AUTOFUSION_HOME}/output/third_party/mockcpp-2.7-h5.patch # 如需手动应用补丁可继续执行 git apply ${GRAPH_AUTOFUSION_HOME}/output/third_party/mockcpp-2.7-h5.patch如果 patch 放在备用路径请将上述命令中的 patch 路径替换为${GRAPH_AUTOFUSION_HOME}/output/third_party/pkg/mockcpp-2.7-h5.patch。[!NOTE] 说明mockcpp-2.7-h5.patch是 mockcpp 编译必需的补丁文件。使用add_cann_third_party(mockcpp)时CMake 会在解压mockcpp-2.7.tar.gz后自动执行git init git apply ${PATCH_FILE}应用该补丁无需手动打补丁。离线编译时需同时准备mockcpp-2.7.tar.gz和mockcpp-2.7-h5.patch。如果缺少 patch 文件CMake 会尝试从网络下载离线环境下会导致构建失败。mockcpp patch 优先查找路径为output/third_party/mockcpp-2.7-h5.patch如该路径不存在会使用output/third_party/pkg/mockcpp-2.7-h5.patch。patch 会在 CMake 的 ExternalProject patch 阶段自动应用不建议提前手动解压并修改output/third_party/mockcpp源码目录避免被后续构建清理或覆盖。执行编译时通过--cann_3rd_lib_path指定本地路径跳过下载步骤bash build.sh --pkg --cann_3rd_lib_path$(pwd)/output/third_party[!NOTE] 说明如果不指定--cann_3rd_lib_path默认查找路径为./output/third_partybuild.sh 中CANN_3RD_LIB_PATH$BASEPATH/output/third_party因此只要包放在该默认路径下编译时也可省略此参数。CMake 构建脚本会优先检查本地路径是否已存在对应 tarball存在则跳过下载。这一机制在 cmake/fetch_cann_cmake.cmake 中有体现本地存在 cann-cmake 时会直接 include 本地文件否则才走 URL 下载分支。7. 安装与卸载编译产物[!WARNING] 重要 执行 UT/ST 测试前必须先安装编译生成的.run包。否则测试运行时LD_LIBRARY_PATH会加载到 CANN 安装路径下的旧版本动态库导致undefined symbol等运行时错误。7.1 安装本地验证完成后可执行如下命令安装编译生成的软件包。执行安装命令时请确保安装用户对软件包具有可执行权限。# 如果需要指定安装路径则加上 --install-path${install_path} ./build_out/cann-graph-autofusion_${cann_version}_linux-${arch}.run --full --quiet --pylocal[!NOTE] 说明此处的安装路径无论默认还是指定需与前面安装 cann-toolkit 包时的路径保持一致。--full全量模式安装。--install-path指定安装路径不指定则默认安装在/usr/local/Ascendroot 用户或${HOME}/Ascend非 root 用户目录。--quiet静默安装跳过人机交互环节。--pylocal安装 run 包时是否将包内的.whl跟随 run 包安装路径来安装。若选择该参数则.whl安装在${ascend_install_path}/cann/python/site-packages路径下。若不选择该参数则.whl安装在本地 python 路径下例如/usr/local/python3.7.5/lib/python3.7/site-packages。更多安装选项请使用--help选项查看。7.2 卸载若想卸载安装的软件包可执行如下命令# 如果是安装到指定路径情况则加上 --install-path${install_path} ./build_out/cann-graph-autofusion_${cann_version}_linux-${arch}.run --uninstall8. 测试验证UT / ST / 覆盖率安装完成后用户可以进行开发者测试。在执行本章节操作之前确保已完成环境准备并已安装编译生成的.run包。UT 验证bash build.sh -u --cann_3rd_lib_path$(pwd)/output/third_party执行完成后根据输出日志查看 UT 测试执行情况用例执行成功会打印passed并且无failed打印确认所有测试用例通过。ST 验证bash build.sh -s --cann_3rd_lib_path$(pwd)/output/third_party执行完成后根据输出日志查看 ST 测试执行情况用例执行成功会打印passed并且无failed打印确认所有测试用例通过。覆盖率验证bash build.sh -u -c --cann_3rd_lib_path$(pwd)/output/third_party # UT 覆盖率 bash build.sh -s -c --cann_3rd_lib_path$(pwd)/output/third_party # ST 覆盖率 bash build.sh -c --cann_3rd_lib_path$(pwd)/output/third_party # UT 覆盖率 ST 覆盖率执行完成后根据输出日志查看覆盖率情况确认所有测试用例通过。从 build.sh 的实现来看测试执行是按模块分发的superkernel的 Python 侧测试superkernel_py_ut/superkernel_py_st在super_kernel目录下通过pytest tests/ut -m ut -n auto或pytest tests/st -m st -n auto并行执行覆盖率模式下叠加--cov-configscripts/sk_ut_cfg.toml或sk_st_cfg.toml与--covsuperkernel生成 term/html/xml 三种报告superkernel的 C 侧测试superkernel_cpp_ut/superkernel_cpp_st由 CMake 目标run_super_kernel_aot_utest/run_super_kernel_aot_stest驱动覆盖率模式下启用-DENABLE_GCOVON并构建collect_coverage_data目标同时支持--test_case传入 gtest filterautofuse系列模块framework / ascendc_api / e2e则统一转交 scripts/test/run_autofuse_test.sh 执行并透传--ascend_install_path与--ascend_3rd_lib_path。9. 构建完成后的下一步运行样例安装完成后可参考以下两个入口尝试运行样例super_kernel 样例运行autofusion 样例运行运行样例通常需要 NPU 驱动与固件支撑见 docs/zh/quick_install.md 中运行样例依赖驱动与固件的说明编译验证则无需访问 NPU 设备。10. 常见问题排查速查基于上文涉及的脚本与源码汇总编译/测试阶段的高频问题与对策现象可能原因处理建议scripts/check_env.sh报[ERROR]关键依赖缺失或版本过低按脚本提示安装/升级对应依赖如python3 -m venv、apt-get install cmake直至无 ERROR测试运行时undefined symbol未安装编译生成的.run包LD_LIBRARY_PATH命中 CANN 旧库先安装.run包再执行 UT/STCMake 下载第三方包超时/失败编译环境无法访问外网方案一设置http_proxy/https_proxy方案二按 6 章表格预下载到output/third_party并加--cann_3rd_lib_path离线编译 mockcpp 失败缺少mockcpp-2.7-h5.patch将 patch 放入output/third_party/推荐或output/third_party/pkg/备用切换 gcc15/gcc16 后编译异常CMake 缓存沿用旧编译器清理build/目录后重新配置并显式设置CC/CXX仅改文档仍触发全量构建未使用-f FILE智能选择使用-f 变更文件列表让build.sh自动跳过无关模块通过以上步骤你已经可以从源码完整构建、安装并在本地验证 CANN graph-autofusion后续即可基于 docs/zh/build.md 与 docs/zh/quick_install.md 展开 SuperKernel / Autofuse 组件的开发与测试工作。【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考