基于 TorchTitan-NPU 的 Qwen3-30B-A3B SFT 训练实践样例【免费下载链接】cann-recipes-train本项目针对LLM与多模态模型训练业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-train概述本样例基于 torchtitan-npu 框架对Qwen3-30B-A3B模型进行医学领域监督微调SFT并通过医学问答 Keyword Recall 指标验证训练收益。样例使用 Medical R1 医学问答数据集训练阶段采用 MoE 并行配置完成单机多卡全参微调评测阶段使用 vLLM vLLM-Ascend对原始模型和 SFT 模型进行同口径对比。本文档重点覆盖环境准备、源码准备、数据与权重准备、训练配置、训练启动、实验结果。使用的产品型号项目规格产品型号Atlas A3 系列推荐卡数16 卡CP2, EP8, TP2CANN 版本9.0.0Python3.11训练框架torchtitan-npu推理框架vLLM vLLM-Ascend文件说明文件说明README.md中文训练与评测说明本文档README_EN.md英文说明config_registry_medical.pytorchtitan-npu Qwen3-30B-A3B 医学 SFT 配置run_medical_sft.sh训练启动脚本复制到 torchtitan-npu 目录后执行prepare_medical_r1_dataset.pyMedical R1 数据集切分工具figures/training_loss.png训练 Loss 下降曲线环境准备1. 启动容器可直接使用昇腾官方公开镜像。镜像中已包含本样例所需的 CANN 软件栈与 Python 环境。以下为单机 16 卡容器启动示例# 获取Docker镜像 docker pull quay.io/ascend/cann:9.0.0-beta.1-a3-ubuntu22.04-py3.11 # 构建Docker容器 docker run -itd \ --device/dev/davinci0 --device/dev/davinci1 \ --device/dev/davinci2 --device/dev/davinci3 \ --device/dev/davinci4 --device/dev/davinci5 \ --device/dev/davinci6 --device/dev/davinci7 \ --device/dev/davinci_manager --device/dev/devmm_svm \ --device/dev/hisi_hdc \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v ${HOST_WORKSPACE}:${HOST_WORKSPACE} \ -w ${HOST_WORKSPACE} \ --nethost \ --shm-size128g \ --privileged \ --name qwen3_30b_medical_sft \ quay.io/ascend/cann:9.0.0-beta.1-a3-ubuntu22.04-py3.11 \ /bin/bash # 进入容器 docker exec -it qwen3_30b_medical_sft bash进入容器后初始化 CANN 环境。不同部署方式下 CANN 路径可能不同请根据实际环境调整# Docker 镜像默认路径 source /usr/local/Ascend/ascend-toolkit/set_env.sh # 若为 conda 安装路径可能为以 CANN 9.0.0 为例 source /home/developer/Ascend/cann-9.0.0/set_env.sh source /home/developer/Ascend/nnal/atb/set_env.sh2. 安装 torchtitan-npugit clone https://link.gitcode.com/i/dfce234f719a6f828995f79bfe0c1b21.git cd torchtitan-npu pip install -r requirements.txt pip install -e .数据集准备从 ModelScope 手动下载数据文件放到 torchtitan-npu 的 assets 目录下cd /path/to/torchtitan-npu mkdir -p assets # 手动从 https://modelscope.cn/datasets/krisfu/delicate_medical_r1_data/files # 下载 r1_data_example.jsonl 到 assets/ 目录 ls assets/r1_data_example.jsonl然后使用本 recipe 提供的切分脚本生成训练集和测试集python /path/to/recipe/prepare_medical_r1_dataset.py \ --input ./assets/r1_data_example.jsonl \ --output ./assets/medical_r1切分结果数据集样本数用途train.jsonl约 2,166SFT 训练test.jsonl约 241Keyword Recall 评测模型权重准备从 ModelScope 下载Qwen3-30B-A3B权重约 60 GB并在 torchtitan-npu 源码目录下创建软链接pip install modelscope mkdir -p /data/models/Qwen3-30B-A3B modelscope download \ --model Qwen/Qwen3-30B-A3B \ --local_dir /data/models/Qwen3-30B-A3B cd /path/to/torchtitan-npu mkdir -p assets/hf ln -sf /data/models/Qwen3-30B-A3B assets/hf/Qwen3-30B-A3B训练配置注册训练配置将本 recipe 目录下的config_registry_medical.py复制到 torchtitan-npu 源码中cp /path/to/recipe/config_registry_medical.py \ /path/to/torchtitan-npu/torchtitan_npu/models/qwen3/config_registry_medical.py然后在torchtitan_npu/models/qwen3/config_registry.py末尾添加from torchtitan_npu.models.qwen3.config_registry_medical import ( sft_qwen3_30ba3b_medical, sft_qwen3_30ba3b_medical_tnd, )并行策略单机 16 卡 MoE 并行CP2, EP8, TP2参数值说明NGPU16总卡数context_parallel_degree2上下文并行tensor_parallel_degree2张量并行expert_parallel_degree8128 个专家按 EP 维切分pipeline_parallel_degree1不启用 PPdata_parallel_shard_degree-1FSDP 分片自动推导超参数配置项推荐值说明steps156训练步数5 epoch约 31 步/epochlr2e-5学习率warmup_steps5预热步数local_batch_size1单卡 batch sizeseq_len4096训练序列长度activation_checkpointselective选择性重计算TRAIN_DATA切分后的训练集训练数据路径在脚本中通过TRAIN_DATA环境变量指定MODEL_DIRassets/hf/Qwen3-30B-A3BHF 权重路径Attention 选择本样例默认使用TNDNPUVarlenAttentionCANN FA v3进行训练。BSNDSDPA配置仅作为代码参考保留因上游未对 ChatDataLoader BSND 做完整适配实际操作中仅 TND 可用。配置函数Attention 类型说明sft_qwen3_30ba3b_medicalBSNDSDPA仅作为参考sft_qwen3_30ba3b_medical_tndTNDNPUVarlenAttention推荐验证可用启动训练将本 recipe 的启动脚本复制到 torchtitan-npu 目录后执行cp /path/to/recipe/run_medical_sft.sh /path/to/torchtitan-npu/ cd /path/to/torchtitan-npu bash run_medical_sft.sh脚本会使用环境变量NGPU16和CONFIGsft_qwen3_30ba3b_medical_tnd启动训练TND 版本。日志输出示例EP8 实测数据step: 1 loss: 1.45426 memory: 37.73GiB(61.58%) tps: 59 69.018s (编译) step: 2 loss: 1.39178 memory: 52.27GiB(85.31%) tps: 798 5.135s step: 3 loss: 1.26931 memory: 52.31GiB(85.37%) tps: 1215 3.370s step: 10 loss: 1.02183 memory: 52.44GiB(85.59%) tps: 993 4.126s step: 20 loss: 0.95751 memory: 52.44GiB(85.59%) tps: 1199 3.416s step: 31 loss: 0.70617 memory: 52.44GiB(85.59%) tps: 1345 3.046s ← epoch 1 结束 step: 32 loss: 0.67716 memory: 52.44GiB(85.59%) tps: 701 5.842s step: 50 loss: 0.58786 memory: 52.50GiB(85.69%) tps: 1010 4.056s step: 62 loss: 0.34057 memory: 52.56GiB(85.79%) tps: 1177 3.479s ← epoch 2 结束 step: 63 loss: 0.33076 memory: 52.56GiB(85.79%) tps: 803 5.102s step: 90 loss: 0.19230 memory: 52.56GiB(85.79%) tps: 733 5.590s step: 93 loss: 0.16940 memory: 52.56GiB(85.79%) tps: 1014 4.040s ← epoch 3 结束 step: 94 loss: 0.16507 memory: 52.56GiB(85.79%) tps: 1286 3.185s step: 120 loss: 0.08754 memory: 52.62GiB(85.88%) tps: 942 4.349s step: 124 loss: 0.08219 memory: 52.62GiB(85.88%) tps: 1257 3.260s ← epoch 4 结束 step: 125 loss: 0.08480 memory: 52.62GiB(85.88%) tps: 1274 3.215s step: 150 loss: 0.04411 memory: 52.62GiB(85.88%) tps: 918 4.462s step: 155 loss: 0.04376 memory: 52.62GiB(85.88%) tps: 1199 3.416s step: 156 loss: 0.04450 memory: 52.62GiB(85.88%) tps: 1244 3.292s ← 结束epoch 5模型导出训练配置中启用last_save_in_hfTrue后最终 checkpoint 会导出为 HuggingFace 格式。将原始模型配置与 SFT 权重整理到同一目录即可用于推理mkdir -p /data/models/Qwen3-30B-A3B-SFT cp /data/models/Qwen3-30B-A3B/*.json /data/models/Qwen3-30B-A3B-SFT/ cp /data/models/Qwen3-30B-A3B/tokenizer* /data/models/Qwen3-30B-A3B-SFT/ cp checkpoint_medical/step-156/*.safetensors* /data/models/Qwen3-30B-A3B-SFT/实验结果评测说明本实验使用基于 jieba 分词 POS 词性过滤的关键词提取方法从参考答案和模型回答中提取关键词计算以下指标Recall召回率 命中的参考答案关键词数 / 参考答案关键词总数衡量参考答案的关键信息被模型覆盖了多少Precision精确率 命中的参考答案关键词数 / 模型输出的关键词总数衡量模型输出的关键词中有多少是有效的F1 Recall 和 Precision 的调和平均Keyword Recall 对比以下数据来自同口径评测241 条医学问答jieba POS 关键词提取展示预训练 Base 模型与医学 CPT 中间 checkpointstep 156效果最优的对比。模型RecallPrecisionF1BaseQwen3-30B-A3B53.83%25.16%33.30%SFTepoch 562.45%28.06%37.82%提升8.62pp2.90pp4.52ppSFT 后在三个指标上均有提升模型不仅记住了更多关键信息而且输出更准确精炼。输出格式对比指标BaseSFT平均输出长度1,061 字符831 字符-21.7%格式错乱样本数/think重复199/2419/241典型样本意识由哪两部分组成项目Base 模型SFT回答/think 意识的组成...觉醒状态...意识内容...Markdown 列表 3 个冗余/think意识由两部分组成意识内容和意识的开头系统...对话式段落Recall52.4%95.2%长度392 字符287 字符训练过程指标指标实测值稳定单步耗时约 3.2-3.5s稳定显存占用约 52.6 GiB/卡85.9%Loss 起点step 11.45Loss 终点step 1560.045总耗时156 步约 8-9 分钟常见问题1. 训练开始 loss 异常高若 loss 起点明显高于预期如 12 左右检查是否正确加载 HF 预训练权重。重新训练前删除 checkpoint 目录rm -rf checkpoint_medical2. NPU 显存不足检查是否有残留进程占用 NPU 显存确保设置了PYTORCH_NPU_ALLOC_CONFexpandable_segments:True。必要时在 entry.py 入口处添加torch.npu.set_per_process_memory_fraction(1.0)。3. HCCL 通信超时多卡训练可能出现 HCCL watchdog timeout。若偶发出现通常重启训练可恢复若频繁出现需检查 HCCL 网络配置和节点间通信。【免费下载链接】cann-recipes-train本项目针对LLM与多模态模型训练业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-train创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考