Ascend Extension for torchtitan
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[docs] auto-fix severe documentation issues under docs Co-authored-by: 1Fire4<wangdingyi2@huawei.com> # message auto-generated for no-merge-commit merge: !410 merge auto/doc-fix into master [docs] auto-fix severe documentation issues under docs Created-by: hitwdy Commit-by: 1Fire4 Merged-by: cann-robot Description: ## 描述 本 PR 由 torchtitan-npu 文档每日体检自动生成,修复严重文档问题,并追加修复 2026-07-09 体检报告中的 S2 拼写问题,使文档引用与源码实现保持一致。 主要更新: - 修复 accuracy-debug skill 中过期的量化 patch 路径说明。 - 将 torchtitan_npu/converters/__init__.py 中 _auto_search_conveter() 更正为 _auto_search_converter(),并同步模块内调用,匹配 docs/feature_guides/model_custom.md 中的引用。 ## 类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改 bug 的代码变动) - [ ] 构建过程或辅助工具的变动 - [x] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 无 ## 其他信息 无 See merge request: cann/torchtitan-npu!410 | 8 天前 | |
[test] (deepseek-v4): add TP+compile smoke test Co-authored-by: zhangwei1177<zhangwei1177@huawei.com> # message auto-generated for no-merge-commit merge: !416 merge dsv4-tp-compile-smoke-v2 into master [test] (deepseek-v4): add TP+compile smoke test Created-by: zhangwei1177 Commit-by: zhangwei1177 Merged-by: cann-robot Description: ## 描述 为 torchtitan-npu 代码仓添加 TP + torch.compile 冒烟用例。直接采用 AutoFuse codegen 完整流程进行编译耗时长,冷编译易触发 CI 超时,因此采用 bypass-codegen 方式:保留 Dynamo→Inductor 图捕获全流程,但将 NPU/Triton fusion kernel codegen 重定向到 eager fallback,在验证编译链路正确性的同时大幅减少编译时间。 ## 类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [ ] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 单独运行 TP+compile 冒烟用例 python tests/smoke_tests/integration_test.py ./outputs --test_name deepseek_v4_tp_compile_bypass --ngpu 2 运行全部冒烟测试(CI 流水线) bash .ci/smoke_test.sh ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!416 | 6 天前 | |
[feat] Add hooks for Claude Code , OpenCode and CodeX to automatically load skills. Co-authored-by: 1Fire4<wangdingyi2@huawei.com> # message auto-generated for no-merge-commit merge: !165 merge dev_add_agent_hook into master [feat] Add hooks for Claude Code , OpenCode and CodeX to automatically load skills. Created-by: hitwdy Commit-by: 1Fire4 Merged-by: cann-robot Description: ## 描述 增加claude code和opencode及codex的hook以自动加载skill,无需手动执行setup_agent.sh ## 类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) See merge request: cann/torchtitan-npu!165 | 1 个月前 | |
[feat] Add hooks for Claude Code , OpenCode and CodeX to automatically load skills. Co-authored-by: 1Fire4<wangdingyi2@huawei.com> # message auto-generated for no-merge-commit merge: !165 merge dev_add_agent_hook into master [feat] Add hooks for Claude Code , OpenCode and CodeX to automatically load skills. Created-by: hitwdy Commit-by: 1Fire4 Merged-by: cann-robot Description: ## 描述 增加claude code和opencode及codex的hook以自动加载skill,无需手动执行setup_agent.sh ## 类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) See merge request: cann/torchtitan-npu!165 | 1 个月前 | |
修改脚本cann包链接 Co-authored-by: liuyuanchen1<liuyuanchen1@huawei.com> # message auto-generated for no-merge-commit merge: !265 merge cann2 into master 修改脚本cann包链接 Created-by: liuyuanchen1 Commit-by: liuyuanchen1 Merged-by: cann-robot Description: ## 描述 请提供此Pull Request的预期功能,以方便检视。 ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [x] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 不涉及 ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!265 | 1 个月前 | |
[docs] add PR/Issue template Co-authored-by: depeng1994<zhangdepeng2@huawei.com> # message auto-generated for no-merge-commit merge: !11 merge master into master [docs] add PR/Issue template Created-by: depeng1994 Commit-by: depeng1994 Merged-by: cann-robot Description: [docs] add PR/Issue template See merge request: cann/torchtitan-npu!11 | 5 个月前 | |
[docs] 修改docs/recipe/training_curves.png 图片文件存放路径及github.io渲染失败 Co-authored-by: liuyuanchen1<liuyuanchen1@huawei.com> # message auto-generated for no-merge-commit merge: !434 merge feature1 into master [docs] 修改docs/recipe/training_curves.png 图片文件存放路径及github.io渲染失败 Created-by: liuyuanchen1 Commit-by: liuyuanchen1 Merged-by: cann-robot Description: ## 描述 1、docs/recipe/training_curves.png 图片文件存放路径挪到文件夹 docs/assets 路径下 2、https://torchtitan-npu.github.io/torchtitan-npu/渲染错误 ## 类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 不涉及代码修改。 ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!434 | 3 天前 | |
[feat] Add hooks for Claude Code , OpenCode and CodeX to automatically load skills. Co-authored-by: 1Fire4<wangdingyi2@huawei.com> # message auto-generated for no-merge-commit merge: !165 merge dev_add_agent_hook into master [feat] Add hooks for Claude Code , OpenCode and CodeX to automatically load skills. Created-by: hitwdy Commit-by: 1Fire4 Merged-by: cann-robot Description: ## 描述 增加claude code和opencode及codex的hook以自动加载skill,无需手动执行setup_agent.sh ## 类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) See merge request: cann/torchtitan-npu!165 | 1 个月前 | |
[docs] add user_guide.md Co-authored-by: CjianForBetter<2318164299@qq.com> # message auto-generated for no-merge-commit merge: !116 merge user_guide into master [docs] add user_guide.md Created-by: CjianForBetter Commit-by: CjianForBetter Merged-by: cann-robot Description: ## 描述 1.修改readme.md文档,并增加安装说明和快速入门文档,方便用户上手。 2.多机脚本scripts/run_train_multinodes.sh文件的config,由于toml文件名更改了,直接运行会显示toml文件找不到,因此需要同步更改 ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [x] 文档内容更新 ## Checklist: - [ ] 我的代码遵循这个项目的代码风格 - [ ] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 简要描述测试方案,并附上自验证记录。 ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!116 | 3 个月前 | |
[refactor] remove dsv4-sft config and migrate to CLI Co-authored-by: depeng1994<zhangdepeng2@huawei.com> Co-authored-by: zzyyjj012<yangzj012@qq.com> # message auto-generated for no-merge-commit merge: !427 merge sft-preprocess into master [refactor] remove dsv4-sft config and migrate to CLI Created-by: zzyyjj012 Commit-by: depeng1994;zzyyjj012 Merged-by: cann-robot Description: ## 描述 SFT 的样本解析属于数据集格式适配,不应散落在模型 config_registry.py 中。本 PR 将 GSM8K、TAU 和 Wordle 的 chat processor 收敛到 torchtitan_npu/hf_datasets/chat_processors.py,并补齐 ChatDataLoader 的 CLI 配置入口。DeepSeek-V4 SFT 因此可以复用 CPT config,通过 CLI 选择 dataloader、processor、dataset 和 encoder,不再维护专用 SFT registry config。 ### 主要修改 1. **公共 chat processor** - 提供 process_gsm8k_sample、process_tau_sample 和 process_wordle_sample。 - chat_processor 使用完整 Python import path,例如 torchtitan_npu.hf_datasets.chat_processors.process_tau_sample。 - import_chat_processor() 在 ChatDataLoader 初始化前解析 callable;不维护短名映射。 2. **ChatDataLoader CLI 配置** - TrainerConfig.dataloader 支持 HuggingFaceTextDataLoader.Config | ChatDataLoaderConfig,可通过 dataloader:chat_data_loader_config 选择 ChatDataLoader。 - ChatDataLoaderConfig 新增 chat_processor、dataset_split、data_files 和 dataset_config_name。 - load_dataset_kwargs 与 sample_processor 保留为 Python-only 配置并从 CLI 隐藏,避免重复入口。 - _prepare_upstream_loader_config() 使用浅拷贝生成上游配置,不修改 registry 持有的原配置。 3. **DeepSeek-V4 SFT launcher** - 删除 sft_deepseek_v4_flash_16k_128die_tau 和 sft_deepseek_v4_flash_1k_128die_gsm8k,统一复用 deepseek_v4_flash_4k_128die。 - examples/deepseek_v4/sft_deepseek_v4_flash_16k_A3.sh 将可覆盖的 Trainer 参数集中到 EXTRA_ARGS。 - "$@" 位于 dataloader/chat encoder 子命令之前;隔离线之后的子命令由 launcher 固定,不能通过 CLI 覆盖。 - 默认数据目录为 ./tests/assets/tau_historical_sft,DATA_FILES 可按实际数据文件显式指定。 4. **多机启动参数统一** - 单机和多机 launcher 对外统一使用 NGPU。 - scripts/run_train_multinodes.sh 内部使用 NPUS_PER_NODE=${NGPU},并传给 torchrun --nproc_per_node。 - 支持通过 NODE_IPS、MASTER_ADDR、MASTER_PORT、NNODES 和 NODE_RANK 配置多机环境。 5. **Qwen、文档和测试** - Qwen GSM8K/Wordle config 改用完整 processor import path,Wordle 解析逻辑移到公共数据处理模块。 - 更新 SFT recipe、quickstart 和 custom CP 文档。 - 增加 TAU demo parquet、processor/ChatDataLoader 单测和 SFT launcher 回归测试。 - 恢复 sft_deepseek_v4_flash_16k_A3.sh 的 executable bit。 CLI 示例: bash dataloader:chat_data_loader_config \ --dataloader.dataset_path ./tests/assets/tau_historical_sft \ --dataloader.chat_processor torchtitan_npu.hf_datasets.chat_processors.process_tau_sample \ --dataloader.data_files demo_train_00000_of_00001.parquet \ --dataloader.dataset_config_name default \ dataloader.chat_encoder:dsv4_encoder_config \ --dataloader.chat_encoder.encoding_module_path /path/to/encoding_dsv4.py ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [x] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 ### 1. 单元测试 bash pytest -q tests/unit_tests/models/test_config_registry.py -q 结果: text 23 passed, 14 warnings ### 2. DeepSeek-V4 SFT 精度对齐 使用小模型、确定性计算、关闭 checkpoint/profiling,对比修改前后 5 step loss / grad_norm。 TAU: - 入口脚本:examples/deepseek_v4/sft_deepseek_v4_flash_16k_A3.sh - 数据集:./tests/assets/tau_historical_sft/demo_train_00000_of_00001.parquet - 结果:修改前后 loss 和 grad_norm 完全一致 text step loss(before) loss(current) grad_norm(before) grad_norm(current) 1 12.21151 12.21151 0.5795 0.5795 2 12.17868 12.17868 0.5803 0.5803 3 12.18796 12.18796 0.6376 0.6376 4 12.19076 12.19076 0.5418 0.5418 5 12.18073 12.18073 0.6494 0.6494 premerge-accuracy-check 结果: text Numerical Stability Report - PASS loss max_abs_diff: 0.000000e+00 grad_norm max_abs_diff: 0.000000e+00 GSM8K: - 使用 DSV4 SFT 小模型配置 - 确定性计算开启 - 修改前后 loss 对齐 ### 3. Qwen SFT 精度对齐 - Qwen 相关 SFT 精度已对齐。 - 当前 PR 仅调整 processor 注册和 Wordle 数据预处理归属。 - Qwen SFT config 的整体整改不包含在本 PR,后续单独提交。 请提供此Pull Request的预期功能,以方便检视。 ## 其他信息 - DeepSeek-V4 原有两个 SFT config 名称已删除;调用方需要改用 deepseek_v4_flash_4k_128die 加 CLI 覆盖。 - chat_processor 只接受完整 Python import path,不支持 tau_openai_tools、gsm8k_reasoning 等短名。 - Qwen SFT 的公开 config 名称保持不变;本 PR 只调整 processor 的归属和解析方式。 See merge request: cann/torchtitan-npu!427 | 1 天前 | |
[refactor] remove dsv4-sft config and migrate to CLI Co-authored-by: depeng1994<zhangdepeng2@huawei.com> Co-authored-by: zzyyjj012<yangzj012@qq.com> # message auto-generated for no-merge-commit merge: !427 merge sft-preprocess into master [refactor] remove dsv4-sft config and migrate to CLI Created-by: zzyyjj012 Commit-by: depeng1994;zzyyjj012 Merged-by: cann-robot Description: ## 描述 SFT 的样本解析属于数据集格式适配,不应散落在模型 config_registry.py 中。本 PR 将 GSM8K、TAU 和 Wordle 的 chat processor 收敛到 torchtitan_npu/hf_datasets/chat_processors.py,并补齐 ChatDataLoader 的 CLI 配置入口。DeepSeek-V4 SFT 因此可以复用 CPT config,通过 CLI 选择 dataloader、processor、dataset 和 encoder,不再维护专用 SFT registry config。 ### 主要修改 1. **公共 chat processor** - 提供 process_gsm8k_sample、process_tau_sample 和 process_wordle_sample。 - chat_processor 使用完整 Python import path,例如 torchtitan_npu.hf_datasets.chat_processors.process_tau_sample。 - import_chat_processor() 在 ChatDataLoader 初始化前解析 callable;不维护短名映射。 2. **ChatDataLoader CLI 配置** - TrainerConfig.dataloader 支持 HuggingFaceTextDataLoader.Config | ChatDataLoaderConfig,可通过 dataloader:chat_data_loader_config 选择 ChatDataLoader。 - ChatDataLoaderConfig 新增 chat_processor、dataset_split、data_files 和 dataset_config_name。 - load_dataset_kwargs 与 sample_processor 保留为 Python-only 配置并从 CLI 隐藏,避免重复入口。 - _prepare_upstream_loader_config() 使用浅拷贝生成上游配置,不修改 registry 持有的原配置。 3. **DeepSeek-V4 SFT launcher** - 删除 sft_deepseek_v4_flash_16k_128die_tau 和 sft_deepseek_v4_flash_1k_128die_gsm8k,统一复用 deepseek_v4_flash_4k_128die。 - examples/deepseek_v4/sft_deepseek_v4_flash_16k_A3.sh 将可覆盖的 Trainer 参数集中到 EXTRA_ARGS。 - "$@" 位于 dataloader/chat encoder 子命令之前;隔离线之后的子命令由 launcher 固定,不能通过 CLI 覆盖。 - 默认数据目录为 ./tests/assets/tau_historical_sft,DATA_FILES 可按实际数据文件显式指定。 4. **多机启动参数统一** - 单机和多机 launcher 对外统一使用 NGPU。 - scripts/run_train_multinodes.sh 内部使用 NPUS_PER_NODE=${NGPU},并传给 torchrun --nproc_per_node。 - 支持通过 NODE_IPS、MASTER_ADDR、MASTER_PORT、NNODES 和 NODE_RANK 配置多机环境。 5. **Qwen、文档和测试** - Qwen GSM8K/Wordle config 改用完整 processor import path,Wordle 解析逻辑移到公共数据处理模块。 - 更新 SFT recipe、quickstart 和 custom CP 文档。 - 增加 TAU demo parquet、processor/ChatDataLoader 单测和 SFT launcher 回归测试。 - 恢复 sft_deepseek_v4_flash_16k_A3.sh 的 executable bit。 CLI 示例: bash dataloader:chat_data_loader_config \ --dataloader.dataset_path ./tests/assets/tau_historical_sft \ --dataloader.chat_processor torchtitan_npu.hf_datasets.chat_processors.process_tau_sample \ --dataloader.data_files demo_train_00000_of_00001.parquet \ --dataloader.dataset_config_name default \ dataloader.chat_encoder:dsv4_encoder_config \ --dataloader.chat_encoder.encoding_module_path /path/to/encoding_dsv4.py ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [x] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 ### 1. 单元测试 bash pytest -q tests/unit_tests/models/test_config_registry.py -q 结果: text 23 passed, 14 warnings ### 2. DeepSeek-V4 SFT 精度对齐 使用小模型、确定性计算、关闭 checkpoint/profiling,对比修改前后 5 step loss / grad_norm。 TAU: - 入口脚本:examples/deepseek_v4/sft_deepseek_v4_flash_16k_A3.sh - 数据集:./tests/assets/tau_historical_sft/demo_train_00000_of_00001.parquet - 结果:修改前后 loss 和 grad_norm 完全一致 text step loss(before) loss(current) grad_norm(before) grad_norm(current) 1 12.21151 12.21151 0.5795 0.5795 2 12.17868 12.17868 0.5803 0.5803 3 12.18796 12.18796 0.6376 0.6376 4 12.19076 12.19076 0.5418 0.5418 5 12.18073 12.18073 0.6494 0.6494 premerge-accuracy-check 结果: text Numerical Stability Report - PASS loss max_abs_diff: 0.000000e+00 grad_norm max_abs_diff: 0.000000e+00 GSM8K: - 使用 DSV4 SFT 小模型配置 - 确定性计算开启 - 修改前后 loss 对齐 ### 3. Qwen SFT 精度对齐 - Qwen 相关 SFT 精度已对齐。 - 当前 PR 仅调整 processor 注册和 Wordle 数据预处理归属。 - Qwen SFT config 的整体整改不包含在本 PR,后续单独提交。 请提供此Pull Request的预期功能,以方便检视。 ## 其他信息 - DeepSeek-V4 原有两个 SFT config 名称已删除;调用方需要改用 deepseek_v4_flash_4k_128die 加 CLI 覆盖。 - chat_processor 只接受完整 Python import path,不支持 tau_openai_tools、gsm8k_reasoning 等短名。 - Qwen SFT 的公开 config 名称保持不变;本 PR 只调整 processor 的归属和解析方式。 See merge request: cann/torchtitan-npu!427 | 1 天前 | |
[refactor] remove dsv4-sft config and migrate to CLI Co-authored-by: depeng1994<zhangdepeng2@huawei.com> Co-authored-by: zzyyjj012<yangzj012@qq.com> # message auto-generated for no-merge-commit merge: !427 merge sft-preprocess into master [refactor] remove dsv4-sft config and migrate to CLI Created-by: zzyyjj012 Commit-by: depeng1994;zzyyjj012 Merged-by: cann-robot Description: ## 描述 SFT 的样本解析属于数据集格式适配,不应散落在模型 config_registry.py 中。本 PR 将 GSM8K、TAU 和 Wordle 的 chat processor 收敛到 torchtitan_npu/hf_datasets/chat_processors.py,并补齐 ChatDataLoader 的 CLI 配置入口。DeepSeek-V4 SFT 因此可以复用 CPT config,通过 CLI 选择 dataloader、processor、dataset 和 encoder,不再维护专用 SFT registry config。 ### 主要修改 1. **公共 chat processor** - 提供 process_gsm8k_sample、process_tau_sample 和 process_wordle_sample。 - chat_processor 使用完整 Python import path,例如 torchtitan_npu.hf_datasets.chat_processors.process_tau_sample。 - import_chat_processor() 在 ChatDataLoader 初始化前解析 callable;不维护短名映射。 2. **ChatDataLoader CLI 配置** - TrainerConfig.dataloader 支持 HuggingFaceTextDataLoader.Config | ChatDataLoaderConfig,可通过 dataloader:chat_data_loader_config 选择 ChatDataLoader。 - ChatDataLoaderConfig 新增 chat_processor、dataset_split、data_files 和 dataset_config_name。 - load_dataset_kwargs 与 sample_processor 保留为 Python-only 配置并从 CLI 隐藏,避免重复入口。 - _prepare_upstream_loader_config() 使用浅拷贝生成上游配置,不修改 registry 持有的原配置。 3. **DeepSeek-V4 SFT launcher** - 删除 sft_deepseek_v4_flash_16k_128die_tau 和 sft_deepseek_v4_flash_1k_128die_gsm8k,统一复用 deepseek_v4_flash_4k_128die。 - examples/deepseek_v4/sft_deepseek_v4_flash_16k_A3.sh 将可覆盖的 Trainer 参数集中到 EXTRA_ARGS。 - "$@" 位于 dataloader/chat encoder 子命令之前;隔离线之后的子命令由 launcher 固定,不能通过 CLI 覆盖。 - 默认数据目录为 ./tests/assets/tau_historical_sft,DATA_FILES 可按实际数据文件显式指定。 4. **多机启动参数统一** - 单机和多机 launcher 对外统一使用 NGPU。 - scripts/run_train_multinodes.sh 内部使用 NPUS_PER_NODE=${NGPU},并传给 torchrun --nproc_per_node。 - 支持通过 NODE_IPS、MASTER_ADDR、MASTER_PORT、NNODES 和 NODE_RANK 配置多机环境。 5. **Qwen、文档和测试** - Qwen GSM8K/Wordle config 改用完整 processor import path,Wordle 解析逻辑移到公共数据处理模块。 - 更新 SFT recipe、quickstart 和 custom CP 文档。 - 增加 TAU demo parquet、processor/ChatDataLoader 单测和 SFT launcher 回归测试。 - 恢复 sft_deepseek_v4_flash_16k_A3.sh 的 executable bit。 CLI 示例: bash dataloader:chat_data_loader_config \ --dataloader.dataset_path ./tests/assets/tau_historical_sft \ --dataloader.chat_processor torchtitan_npu.hf_datasets.chat_processors.process_tau_sample \ --dataloader.data_files demo_train_00000_of_00001.parquet \ --dataloader.dataset_config_name default \ dataloader.chat_encoder:dsv4_encoder_config \ --dataloader.chat_encoder.encoding_module_path /path/to/encoding_dsv4.py ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [x] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 ### 1. 单元测试 bash pytest -q tests/unit_tests/models/test_config_registry.py -q 结果: text 23 passed, 14 warnings ### 2. DeepSeek-V4 SFT 精度对齐 使用小模型、确定性计算、关闭 checkpoint/profiling,对比修改前后 5 step loss / grad_norm。 TAU: - 入口脚本:examples/deepseek_v4/sft_deepseek_v4_flash_16k_A3.sh - 数据集:./tests/assets/tau_historical_sft/demo_train_00000_of_00001.parquet - 结果:修改前后 loss 和 grad_norm 完全一致 text step loss(before) loss(current) grad_norm(before) grad_norm(current) 1 12.21151 12.21151 0.5795 0.5795 2 12.17868 12.17868 0.5803 0.5803 3 12.18796 12.18796 0.6376 0.6376 4 12.19076 12.19076 0.5418 0.5418 5 12.18073 12.18073 0.6494 0.6494 premerge-accuracy-check 结果: text Numerical Stability Report - PASS loss max_abs_diff: 0.000000e+00 grad_norm max_abs_diff: 0.000000e+00 GSM8K: - 使用 DSV4 SFT 小模型配置 - 确定性计算开启 - 修改前后 loss 对齐 ### 3. Qwen SFT 精度对齐 - Qwen 相关 SFT 精度已对齐。 - 当前 PR 仅调整 processor 注册和 Wordle 数据预处理归属。 - Qwen SFT config 的整体整改不包含在本 PR,后续单独提交。 请提供此Pull Request的预期功能,以方便检视。 ## 其他信息 - DeepSeek-V4 原有两个 SFT config 名称已删除;调用方需要改用 deepseek_v4_flash_4k_128die 加 CLI 覆盖。 - chat_processor 只接受完整 Python import path,不支持 tau_openai_tools、gsm8k_reasoning 等短名。 - Qwen SFT 的公开 config 名称保持不变;本 PR 只调整 processor 的归属和解析方式。 See merge request: cann/torchtitan-npu!427 | 1 天前 | |
[fix] Prevent DSV4 P2P compile memory leak Co-authored-by: xuyujun<xuyujun5@hisilicon.com> # message auto-generated for no-merge-commit merge: !440 merge codex/fix-dsv4-compile-p2p-memory-leak into master [fix] Prevent DSV4 P2P compile memory leak Created-by: xuyujun Commit-by: xuyujun Merged-by: cann-robot Description: ## 描述 开启 compile 和 full activation checkpoint 时,DSV4 CP 的 P2P custom autograd 被 AOTAutograd 捕获后会持续保留 forward/recompute tensor,导致每步 active memory 增长并最终 OOM。 本 PR 将 _window_exchange 作为显式 eager graph boundary。DSV4 CP strategy 在挂载 P2P hook 时,为对应的 pre_attention 标记 graph-break 需求;compile 仅对带该标记的子模块使用 fullgraph=False,非 CP 模块保持 fullgraph=True。其余模型计算仍保持 compile,通信前后的算子仍可进入 compiled region 和 AutoFuse。新增测试覆盖标记注入及编译边界。 ## 类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [ ] 我已经更新了相应的文档(本次为内部 compile 生命周期修复,无用户接口变化) - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 - 相关单测:25 passed(覆盖 CP 标记注入及编译边界)。 - 16 卡 DSV4(43 layers/16 experts,EP8、CP2、FSDP、full AC、seq4096)20 步验证:所有 rank 的 active memory 在 step 5/10/15/20 均为 11.738208 GiB,无持续增长。整网的内存占用如下  - 修复后无 snapshot 性能约 350 TPS;profiling 确认通信单独出图,通信前后的 compiled region 仍产生 autofused_* kernel。  图中可以看到 Pre attention部分还是入图,有有正常AF编译算子 ## 其他信息 compile 下已有的 loss/grad_norm NaN 属于独立问题,不在本 PR 范围内。依赖商分日构建包和torchair商分分支修复 See merge request: cann/torchtitan-npu!440 | 1 天前 | |
[fix] Prevent DSV4 P2P compile memory leak Co-authored-by: xuyujun<xuyujun5@hisilicon.com> # message auto-generated for no-merge-commit merge: !440 merge codex/fix-dsv4-compile-p2p-memory-leak into master [fix] Prevent DSV4 P2P compile memory leak Created-by: xuyujun Commit-by: xuyujun Merged-by: cann-robot Description: ## 描述 开启 compile 和 full activation checkpoint 时,DSV4 CP 的 P2P custom autograd 被 AOTAutograd 捕获后会持续保留 forward/recompute tensor,导致每步 active memory 增长并最终 OOM。 本 PR 将 _window_exchange 作为显式 eager graph boundary。DSV4 CP strategy 在挂载 P2P hook 时,为对应的 pre_attention 标记 graph-break 需求;compile 仅对带该标记的子模块使用 fullgraph=False,非 CP 模块保持 fullgraph=True。其余模型计算仍保持 compile,通信前后的算子仍可进入 compiled region 和 AutoFuse。新增测试覆盖标记注入及编译边界。 ## 类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [ ] 我已经更新了相应的文档(本次为内部 compile 生命周期修复,无用户接口变化) - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 - 相关单测:25 passed(覆盖 CP 标记注入及编译边界)。 - 16 卡 DSV4(43 layers/16 experts,EP8、CP2、FSDP、full AC、seq4096)20 步验证:所有 rank 的 active memory 在 step 5/10/15/20 均为 11.738208 GiB,无持续增长。整网的内存占用如下  - 修复后无 snapshot 性能约 350 TPS;profiling 确认通信单独出图,通信前后的 compiled region 仍产生 autofused_* kernel。  图中可以看到 Pre attention部分还是入图,有有正常AF编译算子 ## 其他信息 compile 下已有的 loss/grad_norm NaN 属于独立问题,不在本 PR 范围内。依赖商分日构建包和torchair商分分支修复 See merge request: cann/torchtitan-npu!440 | 1 天前 | |
ci: update .clang-format, pre-commit config, and apply code formatting Co-authored-by: mystri<hanboyou@huawei.com> # message auto-generated for no-merge-commit merge: !345 merge ci/update-pre-commit-config into master ci: update .clang-format, pre-commit config, and apply code formatting Created-by: mystri Commit-by: mystri Merged-by: cann-robot Description: 本次 PR 更新了仓库的 CI/代码风格配置,主要包含: 1. 新增 .clang-format:从 cann/ge 仓拷贝,采用 Google 风格,120 列宽,2 空格缩进,用于统一 C++ 代码格式化。 2. 重构 .pre-commit-config.yaml:参照 cann/ops-nn 仓的最佳实践进行全面升级: - 基础检查 hooks 升级到 v4.6.0,新增 check-json、detect-private-key、check-yaml - 新增 clang-format(v18.1.8)用于 C++/CUDA 文件自动格式化 - 使用 ruff(ruff-check + ruff-format)替代原有的 flake8 + ufmt(black + usort),统一 Python 代码检查与格式化 - 新增 OAT 开源合规检查(scripts/oat_check.sh) - 保留 pyrefly 类型检查 - 新增 minimum_pre_commit_version: 4.0.0 及 CI 配置 3. 更新 pyproject.toml: - 添加 [tool.ruff]、[tool.ruff.lint]、[tool.ruff.format] 配置,沿用原有 flake8 规则映射 - 更新 [tool.codespell] 忽略词列表 - 移除 [tool.usort](已被 ruff 替代) 4. 代码自动修复:ruff --fix 自动修复 48+ 处代码风格问题,clang-format 格式化 4 个 C++ 文件。全部 14 个 pre-commit hooks 验证通过。 类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [x] 构建过程或辅助工具的变动 - [ ] 文档内容更新 Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [ ] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) 如何测试 在本地环境执行全量 pre-commit 检查,全部 14 个 hooks 通过: $ pre-commit run --all-files trim trailing whitespace.........................Passed fix end of files.................................Passed check yaml.......................................Passed check for added large files......................Passed check for merge conflicts........................Passed detect private key...............................Passed check json.......................................Passed don't commit to branch...........................Passed clang-format.....................................Passed ruff check.......................................Passed ruff format......................................Passed codespell........................................Passed OAT Compliance Check.............................Passed Pyrefly (type checking)..........................Passed 已验证: - C++ 文件(torchtitan_npu/ops/aclnn/ 下的 .h/.cpp)被 clang-format 正确格式化 - Python 文件(torchtitan_npu/、tests/、scripts/ 下共 130+ 文件)通过 ruff check 和 ruff format - JSON/YAML 配置文件格式验证通过 - OAT 开源合规检查无告警 其他信息 - .clang-format 来源:cann/ge/.clang-format - .pre-commit-config.yaml 参照:cann/ops-nn/.pre-commit-config.yaml - ruff 替代 flake8 + ufmt 后,原有 .flake8 配置文件保留未删除,如需清理可后续处理 - OAT.xml 中已添加 .clang-format 到文件过滤列表 See merge request: cann/torchtitan-npu!345 | 1 个月前 | |
[refactor] Adapted torchtitan's pre-commit workflow Co-authored-by: mystri<hanboyou@huawei.com> # message auto-generated for no-merge-commit merge: !63 merge add-static-check into master [refactor] Adapted torchtitan's pre-commit workflow Created-by: mystri Commit-by: mystri Merged-by: cann-robot Description: ## 描述 新增代码检查工具: 格式/import sort - ufmt codestyle - flake8 pre-commit 用于启动代码检查。 使用pre-commit run --all 以全量检查仓库内文件。 执行 pre-commit install 以安装 git hooks,自动在commit时对修改文件执行检察。 当前不影响代码开发,后续补充贡献流程时启用 ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [x] 重构(即不是新增功能,也不是修改bug的代码变动) - [x] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [ ] 我的代码遵循这个项目的代码风格 - [ ] 我已经自己测试过我的代码 - [ ] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 简要描述测试方案,并附上自验证记录。 ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!63 | 4 个月前 | |
[refactor] DeepSeek V4 Config 入口与脚本分离 Co-authored-by: depeng1994<zhangdepeng2@huawei.com> # message auto-generated for no-merge-commit merge: !398 merge model-register-refactor into master [refactor] DeepSeek V4 Config 入口与脚本分离 Created-by: depeng1994 Commit-by: depeng1994 Merged-by: cann-robot Description: ## 描述 按RFC计划,对Deepseek V4模型Config和入口脚本整改: - 完整模型默认加载权重,debug模型默认不加载权重 - 删除Muon优化器ConfigRegistry,移到脚本配置中 - 按RFC规范整改ConfigRegistry命名 ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [x] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [x] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 # DeepSeek V4 仅 Hugging Face 权重验证用例 日志根目录:/dev/shm/deepseek_v4_validation_20260704_100532_hf_only 约束:本轮只验证 Hugging Face safetensors 的导出和加载,不使用原生 DCP .metadata / distcp checkpoint 加载路径。 | ID | 验证项 | 运行方式 | 结果 | 摘要 | 日志 | |---|---|---|---|---|---| | V03 | config registry 实例化检查 | 导入并实例化 DeepSeek V4 configs | PASS/INFO | 现有 configs 均可实例化。debug_deepseek_v4_flash_single_node_muon 不是独立 config,Muon 脚本通过参数覆盖 optimizer。 | V03_config_instantiate.log | | V05 | 本地资产和数据检查 | tokenizer-only 资产、DSV4 encoder、GSM8K parquet | PASS | /data/models/deepseek_v4_tokenizer_only 存在;GSM8K 有 7473 行;encoder 文件存在。 | V05_assets_dataset_check.log | | V07d | 正式 HF seed 导出用例 | 8 卡,debug 脚本,1 step,--checkpoint.no-initial-load-in-hf --checkpoint.last-save-in-hf --checkpoint.last-save-model-only | PASS | 训练完成;导出顶层 model-00001-of-00001.safetensors 和 model.safetensors.index.json;header 扫描结果为 top-level bad_dtype=0,sharded bad_dtype=0。 | V07d_hf_export_seed.log, V07d_hf_safetensors_header_check.log | | V08 | Flash HF 加载并训练 | 使用 --checkpoint.initial-load-in-hf --checkpoint.initial-load-path 加载 V07d step-1,再跑 1 step | PASS | HF 加载耗时 50.42s;step 1 loss 为 14.36035;训练完成。 | V08_hf_load_flash.log | | V09 | Muon HF 加载并训练 | Muon debug 脚本加载 V07d HF checkpoint,并跑 1 step | PASS | SwapMuonOptimizer/DistributedMuon 生效;HF 加载耗时 33.79s;step 1 loss 为 14.36035;训练完成。 | V09_hf_load_muon.log | | V10 | GSM8K SFT HF 加载并训练 | 单机裁剪 GSM8K SFT config 加载 V07d HF checkpoint,使用 DSV4 encoder,并跑 1 step | PASS | GSM8K 样本处理和 DSV4 encoder 生效;HF 加载耗时 31.99s;step 1 loss 为 15.29908;训练完成。 | V10_hf_load_gsm8k_sft.log | ## 单机最简命令: 1. 默认 debug + Profiling sh NGPU=8 LOG_RANK=0 bash examples/deepseek_v4/debug_deepseek_v4_single_node.sh \ --profiling.enable-profiling 2. 首次导出 Hugging Face Checkpoint sh NGPU=8 LOG_RANK=0 bash examples/deepseek_v4/debug_deepseek_v4_single_node.sh \ --dump-folder ./export_ckpt \ --training.steps 1 \ --debug.seed=42 \ --debug.deterministic \ --checkpoint.enable \ --checkpoint.no_load_only \ --checkpoint.last_save_in_hf 3. 加载 Debug Hugging Face Checkpoint 训练 sh NGPU=8 LOG_RANK=0 bash examples/deepseek_v4/debug_deepseek_v4_single_node.sh \ --training.steps 1 \ --debug.seed=42 \ --debug.deterministic \ --checkpoint.enable \ --checkpoint.initial_load_path ./export_ckpt/checkpoint/step-1 \ --checkpoint.initial_load_in_hf ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!398 | 13 天前 | |
[feat] add Wordle SFT config and reproduction recipe for Qwen3-1.7B Co-authored-by: mystri<hanboyou@huawei.com> # message auto-generated for no-merge-commit merge: !321 merge feat/wordle-sft into master [feat] add Wordle SFT config and reproduction recipe for Qwen3-1.7B Created-by: mystri Commit-by: mystri Merged-by: cann-robot Description: ## 描述 基于 torchtitan_npu,在 Ascend NPU 上复现 prime-rl 的 Qwen3-1.7B Wordle SFT。 - 新增 sft_qwen3_1_7b_wordle 配置(含多轮 ChatDataset patch) - 新增 docs/recipe/sft.md 附录 A:Wordle SFT 完整复现指南 - 新增 docs/recipe/infer_server.py:43 行极简推理服务器(transformers + torch_npu) - 新增 Qwen3DenseStateDictAdapter:dense-only HF 导出,解决多片源模型 78 字节空 shard 问题 修复了两个关键问题,并更新 Wordle SFT 训练配置: ### 1. 多轮对话 Mask 修复 (multiturn_chat.py) **Bug**: 旧代码通过独立 tokenize 每个消息前缀来定位 assistant span 边界,但 BPE 在不同上下文下产生不一致的 token 序列,导致 assistant span 覆盖了相邻 user 消息的 token(user 反馈被错误 unmask,参与 loss)。 **Fix**: 改为 token-scan 方式 — 全文一次性 tokenize,然后扫描 <|im_start|>assistant\n token 序列定位边界。Mask 正确交替 MMMM-UUUU-MMM-UUUU-MMM,只有 assistant 回复内容 unmask。 **对比 prime-rl**: prime-rl 使用 build_incremental_token_mask,同样遇到 BPE 不一致问题,但策略是跳过整个样本。我们的方法 100% 保留训练数据。 ### 2. HF Safetensors 导出修复 (qwen3_hf_export.py) **Bug**: enable_weight_tying=True 时,to_hf 跳过 output.weight(与 tok_embeddings.weight 共享权重),但没有从 fqn_to_index_mapping 移除 lm_head.weight。consolidator 为缺失的 tensor 创建空文件(dtype: "", shape: []),导致 78-byte corrupt safetensors。 **Fix**: monkey-patch Qwen3StateDictAdapter.to_hf,转换后过滤 fqn_to_index_mapping。 **Root cause trace**: StateDictAdapter.__init__ → 读取 model.safetensors.index.json → lm_head.weight → file 2 → consolidator pre-creates file 2 slot → _FqnData() default empty → _write_metadata writes {"dtype":""} → corrupt. ### 3. Wordle SFT 训练配置更新 - local_batch_size=1→2, global_batch_size=64(gradient accumulation ×32,匹配 prime-rl 设置) - 移除 Qwen3DenseStateDictAdapter(修复 #2 后不再需要) - 更新 sft.md 训练日志和评测结果 ## 类型 - [x] 新功能 - [x] 文档内容更新 ## 改动文件 | 文件 | 说明 | |------|------| | docs/recipe/sft.md (更新) | 附录 A:Wordle SFT 完整指南(环境→训练→评测) | | docs/recipe/infer_server.py (新增) | 43 行推理服务器,替代 vllm | | docs/recipe/training_curves.png (新增) | 20 步训练曲线 | | torchtitan_npu/models/qwen3/config_registry.py (更新) | 新增 sft_qwen3_1_7b_wordle 配置 | | torchtitan_npu/models/qwen3/state_dict_adapter.py (新增) | Qwen3DenseStateDictAdapter + fqn filter | | torchtitan_npu/models/qwen3/__init__.py (更新) | model_registry 按 flavor 分派 adapter(MoE vs dense) | | torchtitan_npu/patches/torchtitan/multiturn_chat.py (新增) | 多轮 ChatDataset patch | ## 训练结果 (20 步) | 指标 | 值 | |------|-----| | loss | 3.38 → 0.10 | | format_reward | 1.000 (100%) | | avg reward | 0.44 | | correct_answer | 0% (需 RL 阶段) | | 吞吐 | 2,950 tokens/s | | 显存 | 27.1 GB (44%) | 评测结果见 sft.md 附录A: ### 评测结果对比 #### 基础模型(Qwen3-1.7B) | 指标 | 值 | 解读 | |------|-----|------| | format_reward | **0.200** | 未经过 SFT,几乎无法遵循 <guess>...</guess> 格式 | | avg reward | **0.04** | 仅来自极少量 format,没有有效的猜词行为 | | correct_answer | 0% | 基础模型不会玩 Wordle | | partial_answer | 0% | 无有效字母匹配 | | num_turns | 2.0 | 2 轮后即放弃(生成质量差,被环境判定无效) | | 每轮生成时间 | 25-58s | 输出冗长的 rambling text,推理极慢 | #### SFT 微调后 | 指标 | 值 | 解读 | |------|-----|------| | format_reward | **1.000** | 模型 100% 遵循 <guess>[word]</guess> 格式 — SFT 目标达成 | | avg reward | **0.36** | 主要来自 format (1.0×0.2) + partial (字母部分正确) | | correct_answer | 0% | 20 步 SFT 不足以学会策略性猜词 — 需要 RL 阶段 | | partial_answer | 0.16 | ~1 个字母 G/Y 正确,模型在试探但未收敛到正确策略 | | num_turns | 6.0 | 完整玩满 6 轮,稳定多轮对话 | | 每轮生成时间 | ~2s | 输出简洁,推理效率提升 20 倍以上 | > **总结**:仅 20 步 SFT 即让 Qwen3-1.7B 从完全不会玩 Wordle 变为 100% 遵循游戏格式、稳定完成 6 轮多轮对话,推理速度提升 20 倍以上。策略性猜词能力(correct_answer)仍需 RL 阶段训练。 ## Checklist - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 标题使用 feat 标签 ## 如何测试 bash # Unit tests pytest tests/unit_tests/patches/test_multiturn_chat.py -v # 16 passed pytest tests/ -x -q # 276 passed # Smoke test (requires NPU) pytest tests/smoke_tests/save_load/test_qwen3_save_load.py -v -m smoke # 1 passed # 环境安装 pip install -e . pip install prime transformers datasets # 下载 nltk 数据 python3 -c "import nltk; nltk.download('words'); nltk.download('averaged_perceptron_tagger')" # 训练 export HF_ENDPOINT=https://hf-mirror.com NGPU=1 MODULE=torchtitan_npu.models.qwen3 CONFIG=sft_qwen3_1_7b_wordle bash scripts/run_train.sh --checkpoint.last_save_in_hf # 评估 python3 docs/recipe/infer_server.py --model outputs/checkpoint_wordle_sft/step-20 --port 8000 & vf-eval wordle --provider openai --api-base-url http://localhost:8000/v1 --num-examples 5 --rollouts-per-example 1 --max-tokens 200 --temperature 0.6 --disable-tui See merge request: cann/torchtitan-npu!321 | 27 天前 | |
docs: auto-fix severe documentation issues under docs/ Co-authored-by: 1Fire4<wangdingyi2@huawei.com> # message auto-generated for no-merge-commit merge: !306 merge auto/doc-fix into master docs: auto-fix severe documentation issues under docs/ Created-by: hitwdy Commit-by: 1Fire4 Merged-by: cann-robot Description: ## 描述 本 PR 由 torchtitan-npu 文档每日体检自动生成,修复 2026-06-04 体检报告中 docs/ 下的 严重问题(共 14 条,仅文档改动,不含代码、README、.agents)。 ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [x] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 本次为纯文档改动;已触发 GitCode 流水线 compile 验证(见本 PR 的流水线结果)。每条修改均已对照仓库代码核对真实的符号 / 路径 / 默认值,未臆造。 ## 其他信息 由自动化文档修复链路(torchtitan-npu 文档每日体检)生成;本次范围仅 docs/,README 与 .agents/ 暂不修。 See merge request: cann/torchtitan-npu!306 | 1 个月前 | |
[fix] modify standard license©right sample Co-authored-by: depeng1994<zhangdepeng2@huawei.com> # message auto-generated for no-merge-commit merge: !13 merge license into master [fix] modify standard license©right sample Created-by: depeng1994 Commit-by: depeng1994 Merged-by: cann-robot Description: ## 描述 屏蔽BSD copyright告警 ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [x] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [ ] 我已经自己测试过我的代码 - [ ] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 简要描述测试方案,并附上自验证记录。 ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!13 | 5 个月前 | |
[ci] [refactor] Integrated lint and type checking to CI Co-authored-by: mystri<hanboyou@huawei.com> # message auto-generated for no-merge-commit merge: !72 merge add-static-check into master [ci] [refactor] Integrated lint and type checking to CI Created-by: mystri Commit-by: mystri Merged-by: cann-robot Description: ## 描述 参考torchtitan仓库增加基于的 pre-commit 静态检查,包括 - 格式检查 - 类型检查等 详细配置见.pre-commit-config.yaml和pyproject.toml 当前屏蔽了很多类型检查问题,待后续重构/更新时逐步修复。 ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [x] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 简要描述测试方案,并附上自验证记录。 ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!72 | 3 个月前 | |
ci: update .clang-format, pre-commit config, and apply code formatting Co-authored-by: mystri<hanboyou@huawei.com> # message auto-generated for no-merge-commit merge: !345 merge ci/update-pre-commit-config into master ci: update .clang-format, pre-commit config, and apply code formatting Created-by: mystri Commit-by: mystri Merged-by: cann-robot Description: 本次 PR 更新了仓库的 CI/代码风格配置,主要包含: 1. 新增 .clang-format:从 cann/ge 仓拷贝,采用 Google 风格,120 列宽,2 空格缩进,用于统一 C++ 代码格式化。 2. 重构 .pre-commit-config.yaml:参照 cann/ops-nn 仓的最佳实践进行全面升级: - 基础检查 hooks 升级到 v4.6.0,新增 check-json、detect-private-key、check-yaml - 新增 clang-format(v18.1.8)用于 C++/CUDA 文件自动格式化 - 使用 ruff(ruff-check + ruff-format)替代原有的 flake8 + ufmt(black + usort),统一 Python 代码检查与格式化 - 新增 OAT 开源合规检查(scripts/oat_check.sh) - 保留 pyrefly 类型检查 - 新增 minimum_pre_commit_version: 4.0.0 及 CI 配置 3. 更新 pyproject.toml: - 添加 [tool.ruff]、[tool.ruff.lint]、[tool.ruff.format] 配置,沿用原有 flake8 规则映射 - 更新 [tool.codespell] 忽略词列表 - 移除 [tool.usort](已被 ruff 替代) 4. 代码自动修复:ruff --fix 自动修复 48+ 处代码风格问题,clang-format 格式化 4 个 C++ 文件。全部 14 个 pre-commit hooks 验证通过。 类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [x] 构建过程或辅助工具的变动 - [ ] 文档内容更新 Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [ ] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) 如何测试 在本地环境执行全量 pre-commit 检查,全部 14 个 hooks 通过: $ pre-commit run --all-files trim trailing whitespace.........................Passed fix end of files.................................Passed check yaml.......................................Passed check for added large files......................Passed check for merge conflicts........................Passed detect private key...............................Passed check json.......................................Passed don't commit to branch...........................Passed clang-format.....................................Passed ruff check.......................................Passed ruff format......................................Passed codespell........................................Passed OAT Compliance Check.............................Passed Pyrefly (type checking)..........................Passed 已验证: - C++ 文件(torchtitan_npu/ops/aclnn/ 下的 .h/.cpp)被 clang-format 正确格式化 - Python 文件(torchtitan_npu/、tests/、scripts/ 下共 130+ 文件)通过 ruff check 和 ruff format - JSON/YAML 配置文件格式验证通过 - OAT 开源合规检查无告警 其他信息 - .clang-format 来源:cann/ge/.clang-format - .pre-commit-config.yaml 参照:cann/ops-nn/.pre-commit-config.yaml - ruff 替代 flake8 + ufmt 后,原有 .flake8 配置文件保留未删除,如需清理可后续处理 - OAT.xml 中已添加 .clang-format 到文件过滤列表 See merge request: cann/torchtitan-npu!345 | 1 个月前 | |
[docs] 修改docs/recipe/training_curves.png 图片文件存放路径及github.io渲染失败 Co-authored-by: liuyuanchen1<liuyuanchen1@huawei.com> # message auto-generated for no-merge-commit merge: !434 merge feature1 into master [docs] 修改docs/recipe/training_curves.png 图片文件存放路径及github.io渲染失败 Created-by: liuyuanchen1 Commit-by: liuyuanchen1 Merged-by: cann-robot Description: ## 描述 1、docs/recipe/training_curves.png 图片文件存放路径挪到文件夹 docs/assets 路径下 2、https://torchtitan-npu.github.io/torchtitan-npu/渲染错误 ## 类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如: feat, fix, refactor, docs, test) ## 如何测试 不涉及代码修改。 ## 其他信息 在这里可以添加任何与这个 Pull Request 相关的其他说明。 See merge request: cann/torchtitan-npu!434 | 3 天前 | |
[feat] default-enable NPU HF32 for matmul/conv/aclnn Co-authored-by: MissingPompeii<guohao120@huawei.com> # message auto-generated for no-merge-commit merge: !409 merge master_setHF32 into master [feat] default-enable NPU HF32 for matmul/conv/aclnn Created-by: MissingPompeii Commit-by: MissingPompeii Merged-by: cann-robot Description: ## 描述 为 Ascend NPU 默认开启 MatMul / Conv / Aclnn的 HF32 精度模式,并提供训练配置开关。 新增 --training.allow_hf32训练配置,默认保持开启(True),可关闭(False)。 ## 类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 开启/关闭allow_hf32的精度对比:  开启/关闭allow_hf32存储hf safetensors之dtype对比(自定义compare脚本):  allow_hf32开启场景下的断点续训:   See merge request: cann/torchtitan-npu!409 | 5 天前 | |
[feat] Support MXFP8 training with torchao Co-authored-by: zhuofanshen<shenzhuofan@huawei.com> # message auto-generated for no-merge-commit merge: !362 merge master_0617 into master [feat] Support MXFP8 training with torchao Created-by: zhuofanshen Commit-by: zhuofanshen Merged-by: cann-robot Description: ## 描述 结合当前torchtitan-npu master配套的torchtitan社区版本 (main ac13e536c84e7f6647b14fa9375c3c8a8a2b8578) 中mxfp8训练的实现逻辑,支持torchtitan-npu master在A5使用torchao (v0.17.0)进行mxfp8训练。 更新: 1. 支持使用torchao原生调用方式进行mxfp8训练,与torchtitan配置MXFP8Converter逻辑保持一致; 2. 修改torchao相关patch的路径名称; 3. 对convert机制进行重构,删除quant_converter、qunat_linear和quant_gmm; 4. 修改qunat相关的测试用例; 5. 更新low_precision_training.md和README.md; ## 实现逻辑 torchtitan-npu 启动 │ ▼ _apply_patches() ← torchtitan_npu/__init__.py │ ├── 导入 converters/ops → 注册 NPU 算子(含 aten::_grouped_mm → npu_grouped_matmul) ├── 导入 torchao patches → 替换 torchao 内部函数为 NPU 版本 │ ├── mx_capability_check.py → patch has_cuda_capability → has_mx_capability (Ascend950 检测) │ ├── mx_linear.py → patch _to_mxfp8_then_scaled_mm │ └── mxfp8_grouped_mm.py → patch _to_mxfp8_then_scaled_grouped_mm │ ▼ 训练启动 → MXFP8Converter.__init__ 被调用 │ ├── has_cuda_capability(10, 0) 被 has_mx_capability 替换 │ └── 检查 NPU 设备为 Ascend950 (device name "A5") └── 记录配置 │ ▼ MXFP8Converter.convert 被调用 │ ├── 调用 torchao.quantize_(model, config, filter_fn) │ │ │ ├── 对 Linear 层 → 包装为 MXFP8TrainingWeightWrapperTensor │ │ └── 前向时触发 _to_mxfp8_then_scaled_mm (已被 mx_linear.py patch) │ │ → NpuMXFP8MM (使用 npu_dynamic_mx_quant + npu_quant_matmul) │ │ │ └── 对 MoE grouped MM 层 → 包装为 MXFP8TrainingWeightWrapperTensor │ └── 前向时触发 _to_mxfp8_then_scaled_grouped_mm (已被 mxfp8_grouped_mm.py patch) │ → NpuMXFP8GroupedMM (使用 npu_dynamic_mx_quant + npu_grouped_matmul) │ └── 恢复模型协议 (inject_module_protocol) | Patch 文件 | 替换的目标 | 替换为 | 作用 | |-----------|-----------|--------|------| | mx_capability_check.py | torchtitan.tools.utils.has_cuda_capability | has_mx_capability | 将 CUDA SM100 检测替换为 Ascend950 设备检测 | | mx_linear.py | torchao.prototype.mx_formats.mx_linear._to_mxfp8_then_scaled_mm | NpuMXFP8MM | Linear 层使用 NPU 的 npu_quant_matmul | | mxfp8_grouped_mm.py | torchao.prototype.moe_training.mxfp8_grouped_mm._to_mxfp8_then_scaled_grouped_mm | NpuMXFP8GroupedMM | MoE grouped MM 使用 NPU 的 npu_grouped_matmul | ## 类型 - [ ] Bug 修复 - [x] 新功能 - [ ] 重构(即不是新增功能,也不是修改bug的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [ ] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 在启动命令中配置MODULE="torchtitan_npu.models.deepseek_v4" CONFIG="deepseek_v4_flash_single_server_16_experts_43_layers_mxfp8",进行ds-v4-flash单机使用torchao mxfp8训练验证。 ## 验证结果 1. 训练日志中显示使用了torchao对Linear和GMM分别进行了MXFP8的替换:   2. 采集的profile中也证明训练时成功应用了MXFP8的替换:   3. 使用torchao与torchtitan-npu原有的mxfp8比较,训练精度零误差:   4. 使用torchao与torchtitan-npu原有的mxfp8比较,训练端到端性能持平:  See merge request: cann/torchtitan-npu!362 | 19 天前 | |
[chore] pin transformers version to 4.57.6 Co-authored-by: weixin_69877254<1965710436@qq.com> # message auto-generated for no-merge-commit merge: !415 merge chore/pin-transformers-version into master [chore] pin transformers version to 4.57.6 Created-by: weixin_69877254 Commit-by: weixin_69877254 Merged-by: cann-robot Description: ## 描述 将 requirements_dev.txt 中的 transformers 依赖从无版本约束改为固定版本 transformers==4.57.6。 固定版本可避免 transformers 上游发版引入不兼容变更导致开发/测试环境(如 tokenizer 加载、model loading 路径相关单测)不稳定,确保 dev 依赖可复现。 ### 变更摘要 requirements_dev.txt: - 改前:transformers - 改后:transformers==4.57.6 ## 类型 - [ ] Bug 修复 - [ ] 新功能 - [ ] 重构(既不是新增功能,也不是修改bug的代码变动) - [x] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## Checklist: - [x] 我的代码遵循这个项目的代码风格 - [x] 我已经自己测试过我的代码 - [x] 我已经更新了相应的文档 - [x] 我已经在标题中正确使用了类型标签(例如:feat, fix, refactor, docs, test) ## 如何测试 未执行代码测试。本改动仅锁定开发依赖版本,不影响运行时代码逻辑: - 验证依赖可安装:pip install -r requirements_dev.txt - 确认版本固定生效:python -c "import transformers; print(transformers.__version__)"(期望输出 4.57.6) ## 其他信息 无。 See merge request: cann/torchtitan-npu!415 | 10 天前 |
简介
torchtitan-npu定位为torchtitan的昇腾(Ascend)后端扩展插件,通过即插即用的硬件亲和性优化,充分释放NPU算力,助力PyTorch native训练在昇腾平台无缝、高效、稳定地运行。
本插件基于社区 ModelConverter 拓展机制构建,已支持多维度训练优化,涵盖 NPU融合算子、图优化、图下沉、算子自动融合、显存管理、分布式并行以及调试维测能力等等。
社群
SIG 例会:sig-framework-adapter
最新消息
- [May. 2026]: 🚀 DeepSeek-V4-Pro 模型续训练支持:基于纯FSDP + 大EP极简切分,使能AutoFuse特性,达成训练入图。
- [May. 2026]: ⚠️ 配置系统重构:master 分支对齐 torchtitan main 的
config_registry.py/ConfigManager机制,模型训练使用--module和--config启动,不再通过--job.config_file加载 TOML。 - [Apr. 2026]: 🚀 DeepSeek-V4-Flash 续训练 0day 支持:基于纯FSDP + 大EP极简切分,使能AutoFuse特性,达成训练入图,开箱即优。
- [Apr. 2026]: 🚀 【重要特性支持】算子自动融合:基于AscendC AutoFuse的能力,支持torch.compile + Inductor后端的算子自动融合。
- [Apr. 2026]: 🚀 torchtitan‑npu 正式开源:在 NPU 上支持 4D 并行等 torchtitan 原生特性,并引入 Swap Optimizer 等 NPU 亲和优化。
Roadmap
当前季度的规划见 torchtitan-npu Roadmap。欢迎访问。
安装
源码安装:
git clone https://gitcode.com/cann/torchtitan-npu.git
cd torchtitan-npu
pip install -e .
详情参见 安装教程 。
快速上手
快速启动大语言模型的训练任务,参见 快速上手文档 。
特性支持概览
| 场景 | 特性名称 | 原生支持 | NPU支持 |
|---|---|---|---|
| 并行能力 | 4D 并行 (FSDP2/TP/CP/PP) | ✅ | ✅ |
| 专家并行 (EP/ETP) | ✅ | ✅ | |
| 自定义 CP (DeepSeek-V3.2 CP/SDPA Ulysses CP) | ❌ | ✅ | |
| torch.compile | torch.compile | ✅ | ✅ |
| 训练精度 | MxFP8 量化 | ✅ | ✅ (Ascend 950) |
| 训练调试与监控 | 分布式 Checkpoint | ✅ | ✅ |
| 调试工具 | ✅ | ✅ | |
| 性能优化 | Swap Optimizer | ❌ | ✅ |
| NPU 融合算子适配 | ❌ | ✅ | |
| 多模态模型 | VLM debug model | ✅ | ✅ |
项目结构
torchtitan-npu 充分利用了 torchtitan 提供的 ModelConverter 插件化机制。该机制介入模型定义之后、并行策略(如 TP/FSDP)应用之前,支持以非侵入式的方式,通过注册机制对特定模块进行替换或重写。基于此方案,我们实现了融合算子优化、量化支持以及优化器增强等功能。见以下项目结构:
torchtitan-npu/
├── torchtitan_npu/ # torchtitan_npu核心源代码
│ ├── config/ # NPU 扩展配置 dataclass
│ ├── converters/ # 基于torchtitan ModelConverter机制的补丁
│ ├── distributed/ # 自定义分布式代码
│ ├── models/ # 基于torchtitan-npu的模型 (如DeepSeek-V3.2)
│ ├── patches/ # 其他补丁
│ ├── tools/ # 工具补丁
│ ├── entry.py # 启动训练
│ ├── train.py # 训练主流程补丁
│ └── __init__.py # torchtitan-npu 插件修改注入点
├── docs/ # 文档
上下游软件栈架构图如下:

性能基准
2026.04
System: Atlas 800T A3
| Model | Number of NPUs | Precision | GBS | Local BS | Sequence Length | FSDP | TP | PP | CP | EP | Throughput (tokens/p/s) | MFU |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DeepSeek-V4-Flash | 64 | BF16 | 1024 | 1 | 4096 | 128 | 1 | 1 | 1 | 128 | 1056 | 27.67% |
| DeepSeek-V3.2-671B | 64 | BF16 | 128 | 1 | 32768 | 4 | 4 | 1 | 8 | 64 | 103 | / |
| DeepSeek-V3.2-671B | 64 | BF16 | 512 | 1 | 4096 | 32 | 4 | 1 | 1 | 64 | 146 | / |
| DeepSeek-V3-671B | 64 | BF16 | 1024 | 1 | 4096 | 32 | 4 | 1 | 1 | 128 | 546 | / |
| DeepSeek-V3-671B + compile(AutoFuse) | 64 | BF16 | 1024 | 1 | 4096 | 32 | 4 | 1 | 1 | 128 | 576 | / |
注:以上MoE模型的性能数据均开启负载均衡配置
moe_force_load_balance=true。
免责声明
致 torchtitan‑npu 使用者
- torchtitan‑npu 提供的所有内容仅供您用于非商业目的。
- 对于 torchtitan‑npu 测试用例以及示例文件中所涉及的各模型和数据集,平台仅用于功能测试,华为不提供任何模型权重和数据集。如您使用这些数据进行训练,请您特别注意应遵守对应模型和数据集的 License,如您因使用这些模型和数据集而产生侵权纠纷,华为不承担任何责任。
- 如您在使用 torchtitan‑npu 过程中,发现任何问题(包括但不限于功能问题、合规问题),请在 GitCode 提交 issue,我们将及时审视并解决。
torchtitan‑npu 功能依赖的 PyTorch 等第三方开源软件,均由第三方社区提供和维护,因第三方开源软件导致的问题的修复依赖相关社区的贡献和反馈。您应理解,torchtitan‑npu 仓库不保证对第三方开源软件本身的问题进行修复,也不保证会测试、纠正所有第三方开源软件的漏洞和错误。
License 声明
- torchtitan‑npu 产品的使用许可证,具体请参见 LICENSE。
- torchtitan‑npu 工具 docs 目录下的文档适用相应许可证,具体请参见根目录下的 LICENSE 文件。
🤝联系我们
本项目功能和文档正在持续更新和完善中,欢迎您关注最新版本。
- 问题反馈:通过GitCode【Issues】提交问题。
- 社区互动:通过GitCode【讨论】参与交流。
- 经验分享:通过GitCode【Wiki】分享经验总结。
- 加入交流群:通过扫描下方微信二维码添加torchtitan‑npu小助手微信,加入微信群与我们进一步交流。
