AutoFuse SFT 快速上手:双卡昇腾 NPU 上运行 Qwen3-1.7B 自动融合开关对比与性能分析
AutoFuse SFT 快速上手双卡昇腾 NPU 上运行 Qwen3-1.7B 自动融合开关对比与性能分析【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion导读autofuse/examples/af_sft_quickstart是 CANN graph-autofusion 仓库中面向昇腾Ascend平台的Qwen3-1.7B SFT指令微调AutoFuse 快速体验用例它在一台 Linux aarch64 主机的两张空闲 Ascend NPU 上串行执行 AutoFuse 关闭AF OFF与开启AF ON两套短训练 profiling并自动生成中文report.md对比报告用于快速获得自动融合是否带来训练加速的方向性证据。读完本文你将掌握该用例从环境检查、依赖安装、模型数据准备到对比运行、报告解读、常见问题排查的完整实战流程并理解check_env.sh与run_compare.sh两个脚本背后的校验与统计逻辑。需要特别说明的是本例的结果是单轮 Quick 方向性证据不等价于多轮正式收益训练墙钟耗时是性能结论的主证据profiling 仅用于解释耗时阶段的变化不能替代训练结论。一、用例背景为什么需要AF OFF/ON 对比AutoFuse 是 graph-autofusion 项目开源的自动融合组件其核心思路是算法网络中大量 Vector 计算之间存在频繁的内存搬运形成 Memory Bound 瓶颈AutoFuse 通过自动将多个相邻算子融合为一个 Ascend C 算子减少算子数量与输入输出搬运从而释放昇腾算力详见 autofuse/README.md。SFT 训练场景尤其是小模型 长序列 通信密集的分布式配置是典型的融合收益待验证场景。因此本用例设计了最小化的对比实验AF OFF不使用自动融合作为基线AF ON开启自动融合观察是否更快同时为两侧各采集一份 profiling 数据用于解释耗时的阶段构成计算、通信、重叠、空闲。整个流程由两个 Bash 脚本驱动check_env.sh环境预检与 run_compare.sh对比执行与报告生成所有操作均由用户在本目录下手动执行脚本只检查、不安装或修改系统组件。二、前置条件与约束开始前请逐项确认以下条件来自 README.md条件要求操作系统Linux aarch64Python3.12昇腾设备两张不同且空闲的 Ascend NPU磁盘至少 30 GiB 空闲空间CANN完整 CANN且 Toolkit、AutoFuse、Runtime、HCCL、OPP 的构建日期均不早于20260715驱动、固件和 CANN 由系统管理员预先安装。本例只检查不安装或修改系统组件。CANN 各组件的构建日期是硬性门槛这是因为自动融合后端与torch_npu、HCCL 等组件存在版本绑定关系版本混用是后续运行失败最常见的原因之一。所有命令均在本目录执行并建议在同一个 Bash 终端中按顺序运行cd autofuse/examples/af_sft_quickstart三、检查环境check_env.sh 校验了什么将CANN_ROOT改为目标机器上的实际路径后执行export CANN_ROOT/usr/local/Ascend/ascend-toolkit/latest bash check_env.sh --cann-root $CANN_ROOT --devices 0,1 --python python3.12全部项目必须显示[PASS]。出现[FAIL]时按输出中的action修复并重试检查失败时停止不要继续安装或训练。从 check_env.sh 的源码可以明确看到它逐项核验的内容每项失败都会打印[FAIL] 项: current...; required...; action...参数合法性--cann-root、--devices两个不同十进制整数范围 0..65535、--python可执行文件路径或命令名缺一不可系统平台uname -s必须为 Linux 且uname -m为 aarch64基础命令bash、选定的 Python、git、npu-smi、sha256sum、find均需在 PATH 中Python 版本major.minor必须精确为3.12CANN root 完整性必须存在set_env.sh、opp/、lib64/三个关键要素CANN 组件构建日期脚本依次解析share/info/asc-devkit/version.infoToolkit、share/info/graph_autofusion/version.infoAutoFuse、share/info/runtime/version.infoRuntime、share/info/hccl/version.infoHCCL、opp/version.infoOPP中的timestamp/build字段要求格式为20YYMMDD且 20260715源码中MIN_CANN_BUILD_DATE20260715磁盘空间当前文件系统可用空间需 30 GiB源码中REQUIRED_DISK_KIB$((30 * 1024 * 1024))NPU 可用性npu-smi info与npu-smi info -m均需成功且请求的两个逻辑 NPU ID 能映射到不同物理设备的/dev/davinci*字符设备节点脚本会解析逻辑 ID 到物理 ID 的映射表并逐一比对。四、安装 Python 依赖创建独立 venv 并激活然后加载目标 CANN 环境python3.12 -m venv third_party/venv source third_party/venv/bin/activate source $CANN_ROOT/set_env.sh python -m pip install --upgrade pip setuptools wheel第一组核心依赖torch 生态与数据处理python -m pip install \ torch2.12.0 torch-npu2.12.0rc1 triton3.7.0 \ torchdata0.11.0 torchao0.17.0 datasets5.0.0 \ pandas2.2.3 numpy1.26.4 scipy1.13.1 \ tokenizers0.23.1 safetensors0.7.0 fsspec2026.4.0 \ tyro1.0.15 tensorboard2.20.0 wandb0.28.1 \ einops0.8.2 pillow12.3.0 PyYAML6.0.3 \ modelscope1.38.1 huggingface-hub1.24.0 pyarrow21.0.0第二组辅助依赖日志、可视化、遥测等python -m pip install \ decorator5.1.1 psutil6.0.0 loguru0.7.3 matplotlib3.11.1 \ msguard0.0.8 openpyxl3.1.5 \ opentelemetry-exporter-otlp-proto-grpc1.33.1 \ opentelemetry-exporter-otlp-proto-http1.33.1 \ tzdata2026.3 plotly6.9.0 argparse1.4.0 pybind113.0.4 \ attrs24.2.0两点注意事项来自原文档不需要安装triton-ascend本 Qwen3-1.7B SFT 配置不使用相关可选算子不要运行pip check公共torch的 CUDA 依赖元数据不适用于本 Ascend 用例pip check会误报。五、安装源码项目创建源码与 wheel 目录依次克隆三个上游项目并检出文档指定的 commitmkdir -p third_party/src third_party/wheels git clone https://gitcode.com/GitHub_Trending/to/torchtitan.git third_party/src/torchtitan git -C third_party/src/torchtitan checkout --detach ac13e536c84e7f6647b14fa9375c3c8a8a2b8578 git clone https://gitcode.com/cann/torchtitan-npu.git third_party/torchtitan-npu git -C third_party/torchtitan-npu checkout --detach 5830760386d590722c4acf694383f4e5c4c0ada1 git clone https://gitcode.com/Ascend/torchair.git third_party/src/torchair git -C third_party/src/torchair checkout --detach 3c9418c2804fbb93c2ca5f0c6b9055cbc873f7d1将三个项目打成普通 wheel 并安装不使用pip install -epython -m pip wheel --no-deps --wheel-dir third_party/wheels third_party/src/torchtitan python -m pip wheel --no-deps --wheel-dir third_party/wheels third_party/torchtitan-npu python -m pip wheel --no-deps --wheel-dir third_party/wheels \ third_party/src/torchair/experimental/_inductor_npu_ext/python shopt -s nullglob torchtitan_wheels(third_party/wheels/torchtitan-*.whl) torchtitan_npu_wheels(third_party/wheels/torchtitan_npu-*.whl) inductor_wheels(third_party/wheels/inductor_npu_ext-*.whl) [[ ${#torchtitan_wheels[]} -eq 1 ]] || { printf expected one torchtitan wheel\n 2; exit 1; } [[ ${#torchtitan_npu_wheels[]} -eq 1 ]] || { printf expected one torchtitan-npu wheel\n 2; exit 1; } [[ ${#inductor_wheels[]} -eq 1 ]] || { printf expected one inductor-npu-ext wheel\n 2; exit 1; } python -m pip install --no-deps --force-reinstall \ ${torchtitan_wheels[0]} ${torchtitan_npu_wheels[0]} ${inductor_wheels[0]}其中torchtitan-npu提供昇腾适配模型定义、训练脚本、NPU profiling 配置inductor_npu_ext是 AutoFuse 作为 PyTorch Inductor 自动融合后端所需的扩展模块——这与 graph-autofusion 主仓 README 中描述的Inductor 路径作为 PyTorch Inductor 的自动融合后端详见 TorchAir 项目的集成方式一致见 autofuse/README.md。六、准备模型和数据mkdir -p assets/hf assets/data/wordle modelscope download --model Qwen/Qwen3-1.7B \ --local_dir assets/hf/Qwen3-1.7B export WORDLE_STAGING$PWD/assets/.wordle-download rm -rf -- $WORDLE_STAGING hf download willcb/V3-wordle data/train-00000-of-00001.parquet --repo-type dataset \ --local-dir $WORDLE_STAGING install -D -m 0644 \ $WORDLE_STAGING/data/train-00000-of-00001.parquet \ $PWD/assets/data/wordle/train-00000-of-00001.parquet rm -rf -- $WORDLE_STAGING export WORDLE_PARQUET$PWD/assets/data/wordle/train-00000-of-00001.parquet cp ../af_sft_benchmark/assets.sha256 ./assets.sha256 sha256sum --check assets.sha256说明模型通过 ModelScope 下载Qwen/Qwen3-1.7B到assets/hf/训练数据为 Hugging Face 上的willcb/V3-wordle数据集中的单个 parquet 文件Wordle 风格问答数据资产摘要文件assets.sha256来自同级 benchmark 目录用于校验模型与数据与已验证资产一致11 个文件必须全部显示OK否则停止不要跳过校验摘要失败表示模型或数据与已验证资产不同需删除失败文件后重新下载再校验。七、检查 Python 与 NPU在继续之前先做一次轻量冒烟检查确认 Python 侧依赖可导入且两张 NPU 可见export ASCEND_RT_VISIBLE_DEVICES0,1 env -u LD_PRELOAD -u PYTHONHOME -u CONDA_PREFIX python - PY import torch, torch_npu, torchtitan, torchtitan_npu, triton import inductor_npu_ext count torch.npu.device_count() print(count) assert count 2 PY预期打印2。使用env -u清除LD_PRELOAD、PYTHONHOME、CONDA_PREFIX是为了避免宿主机上的其他环境变量干扰昇腾运行时——这与 run_compare.sh 内部在每次运行前unset LD_PRELOAD PYTHONHOME CONDA_PREFIX的做法一脉相承。八、运行对比run_compare.sh 的执行逻辑export TORCHTITAN_NPU_DIR$PWD/third_party/torchtitan-npu export NGPU2 bash run_compare.sh \ --cann-root $CANN_ROOT \ --model $PWD/assets/hf/Qwen3-1.7B \ --data $WORDLE_PARQUET \ --devices 0,1 \ --output-dir $PWD/results脚本参数从 run_compare.sh 源码可见参数必填默认值说明--cann-root PATH是无CANN 安装根目录必须包含set_env.sh--model PATH是无Qwen3-1.7B 本地目录assets/hf/Qwen3-1.7B--data PATH是无Wordle parquet 数据文件--devices IDS否0,1两个不同 NPU ID范围 0..65535--output-dir PATH否results结果输出根目录不能是符号链接且不允许 group/world 可写脚本会校验属主与权限位脚本串行执行的任务脚本会串行执行四次任务每两次为一组AF OFF 在前、AF ON 在后次序模式步骤数种子说明1AF OFF 训练10 steps42基线训练2AF ON 训练10 steps42开启--compile.enable的训练3AF OFF profiling12 steps43开启 profilingprofile_step_start 6、profile_step_end 114AF ON profiling12 steps43开启 profiling 的融合训练报告使用训练steps 6-10的墙钟均值四次运行使用独立缓存脚本为off_train、on_train、off_profile、on_profile各建一个独立缓存目录并将TORCH_EXTENSIONS_DIR、TRITON_CACHE_DIR、TORCHINDUCTOR_CACHE_DIR隔离避免缓存污染对比结果。训练相关固定配置为MODULEtorchtitan_npu.models.qwen3、CONFIGsft_qwen3_1_7b_wordle、TRAIN_SEQUENCE_LENGTH1024、全局 batch size 4并设置TORCHINDUCTOR_SIZE_ASSERTS0等环境变量。若 AF OFF 训练失败后续任务直接跳过并以空日志占位。此外脚本支持两个可选覆盖点AF_SFT_TRAIN_COMMAND自定义绝对路径的训练命令用于替换默认 runner与PYTHON_BASE_LIBPython 基础库路径用于向LD_LIBRARY_PATH追加运行时依赖。输出目录安全性每次运行会创建独立的results/UTC timestamp-pid-attempt/目录最多尝试 16 次目录权限 0700umask 077脚本在执行过程中还会持续校验该目录的身份设备号inode未被替换防止结果被篡改或目录被误操作。九、查看报告report.md 的结论与指标每次运行结束后report.md会生成在独立结果目录中results/UTC timestamp-pid-attempt/ ├── af_off.log ├── af_on.log ├── profiling_off.log ├── profiling_on.log ├── profiling_off/ ├── profiling_on/ └── report.md训练结论性能结论的主证据AF_ON_FASTERAF ON 平均耗时更低收益为正NO_GAINAF ON 没有更快RUN_FAILED训练失败或稳定步骤无效。报告中的收益按(OFF 均值 - ON 均值) / OFF 均值 * 100%计算正值表示 AF ON 更快耗时越低越好。从 run_compare.sh 的统计代码可以看到具体口径从af_off.log/af_on.log中正则提取step: N与elapsed_time_per_step: 值先剥离 ANSI 转义序列要求 steps 6-10 恰好完整出现、无重复、数值为有限正数然后取五步算术平均作为该侧平均耗时。Profiling 状态只解释阶段变化不替代训练结论COMPARABLE两侧 profiling 可比较UNAVAILABLEprofiling 失败或结果缺失INCOMPARABLE结果存在但不满足配对比较条件。COMPARABLE的判定非常严格要求两侧命令退出状态为 0两侧step_trace_time.csv恰好各 1 个CSV 包含全部必需列且 Step 5-9 完整无重复两侧Device_id一致所有阶段数值为非负有限数。阶段指标单位 us阶段含义Computing计算耗时Communication(Not Overlapped)未被计算覆盖的通信耗时Overlapped计算与通信重叠耗时不能与其他阶段简单相加Free空闲耗时Stage完整阶段耗时需要注意Profiler 参数start6、end11对应 active steps 6-10CSV 中 Step 5-9 逐行映射这些训练步报告按列取均值。报告末尾会明确提示这是单轮 Quick 方向性证据不等价于多轮正式收益阶段时间不能直接归因于整网收益。报告同时会记录模型、数据、CANN 路径的 SHA-256 摘要前缀及五类 CANN 组件的构建日期保证结论可回溯。十、常见问题与排查CANN 库版本混用若torch_npu报undefined symbol通常是LD_LIBRARY_PATH中混入了其他 CANN。处理方式打开未加载其他 CANN 的新终端只设置目标CANN_ROOT再激活 venv 并加载目标 CANN不要在同一终端依次加载多个 CANNcd autofuse/examples/af_sft_quickstart export CANN_ROOT/usr/local/Ascend/ascend-toolkit/latest source third_party/venv/bin/activate source $CANN_ROOT/set_env.shHugging Face 无法访问官方站点不可达时通过镜像重试 Wordle 下载HF_ENDPOINThttps://hf-mirror.com hf download \ willcb/V3-wordle data/train-00000-of-00001.parquet --repo-type dataset \ --local-dir $WORDLE_STAGING镜像下载后仍必须执行sha256sum --check assets.sha256。出现 Triton warningtorchtitan_npu可能提示 NPU 使用需要triton-ascend。本 Qwen3-1.7B SFT 配置不使用相关可选算子两卡 smoke 和训练通过即可不需要额外安装该包。资产摘要失败摘要失败表示模型或数据与已验证资产不同。不要跳过校验删除失败文件后重新下载再执行sha256sum --check assets.sha256。十一、清理和重跑只重建 Python 和源码环境保留模型、数据和报告deactivate 2/dev/null || true rm -rf third_party/venv third_party/src third_party/torchtitan-npu third_party/wheels彻底从零重跑deactivate 2/dev/null || true rm -rf third_party assets results assets.sha256始终不要删除或修改系统 CANN、驱动和固件——环境检查脚本同样只读校验不会改动系统组件。十二、扩展阅读从 Quickstart 走向更多 AutoFuse 场景本用例展示的是torchtitan torchtitan-npu inductor_npu_ext这条 Inductor 路径下的端到端融合对比。如果想在更小的粒度上体验 AutoFuse 的融合能力与 profiling 收益仓库还提供了 PyTorch 与 TensorFlow 两类 Sample 用例见 autofuse/README.md 与 autofuse/examples/pytorch/README.md例如将add ge、mul reducesum等相邻算子融合为单个算子并通过torch.compile(..., options{npu_backend: ascendc})一行启用。若希望理解融合算子内部的编译细节可参考AUTOFUSE_DFX_FLAGS、TORCH_COMPILE_DEBUG等调测变量的使用说明以及docs/zh/autofuse/design/下的架构文档。总而言之af_sft_quickstart提供了一个严格受控、可复现、可审计的 AutoFuse 收益验证闭环环境预检保证版本一致独立缓存保证对比公平SHA-256 校验保证资产可信结构化report.md保证结论可回溯。对希望在昇腾双卡环境上快速评估 AutoFuse 对 SFT 训练加速效果的开发者这是一个开箱即用的起点。【免费下载链接】graph-autofusionGraph-autofusion 是一个面向昇腾Ascend芯片的轻量级、解耦式组件集合旨在通过自动融合技术加速模型执行。 目前已开源 SuperKernel 组件和 Autofuse 组件未来将持续开放更多自动融合相关模块。项目地址: https://gitcode.com/cann/graph-autofusion创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考