2026/9/18 21:36:58

CANN 平台 Qwen3.6-27B 微调实战:基于 MindSpeed-MM 的全参 SFT 与 LoRA-SFT 完整指南

CANN 平台 Qwen3.6-27B 微调实战:基于 MindSpeed-MM 的全参 SFT 与 LoRA-SFT 完整指南 CANN 平台 Qwen3.6-27B 微调实战基于 MindSpeed-MM 的全参 SFT 与 LoRA-SFT 完整指南【免费下载链接】cann-recipes-train本项目针对LLM与多模态模型训练业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-train本文是 cann-recipes-train 仓库中 Qwen3.6-27B SFT 使用指南对应中文版的深度展开版。文章以该指南为核心骨架完整继承其全部操作步骤与命令并结合仓库内的补丁源码、三套 YAML 配置、数据生成工具与实践报告从怎么跑延伸到为什么这么设计帮助你在 Atlas A3 NPU16 die、CANN 9.0.0上完整复现 Qwen3.6-27B 的监督微调SFT流程。核心导读本文介绍如何在昇腾 CANN 平台上基于 MindSpeed-MMFSDP2 训练框架对 Qwen3.6-27B 执行监督微调覆盖三种典型方案——packing 全参 SFT64K 上下文打包训练、unpacking 全参 SFTper-sample loss与 LoRA SFT参数高效微调。读完本文你将掌握代码获取与补丁应用、CANN/Python 环境搭建、HF 权重到 DCP 格式转换、JSONL 数据生成与格式转换、三套配置文件的逐项参数含义、NPU 空闲调度式后台训练以及 DCP checkpoint 批量转回 Hugging Face 格式的完整闭环并理解仓库补丁在 epoch 训练调度、LoRA 初始化保存、checkpoint dtype 等底层能力上的工程化增强。一、方案背景与示例环境Qwen3.6-27B 是包含视觉编码器visual与语言模型language_model的多模态基础模型其语言模型部分包含混合线性注意力架构Full Attention Gated DeltaNet即 GDN。基于 MindSpeed-MM 训练时官方示例默认冻结视觉模块仅训练语言模型因此指南所称全参指语言模型部分的全参数训练。示例环境与版本信息项目值CANN9.0.0硬件Atlas A3 NPU16 die训练框架MindSpeed-MM固定 commitaaed711fd4750857f104e8d832766ed915ff9ef0 仓库补丁目标模型Qwen3.6-27BHugging Face 格式该方案的完整实践背景与评测结果见仓库内的实践报告该报告基于同一批训练代码面向 cann-bench 的 AscendC 算子生成任务报告了全参 SFT、LoRA-SFT 等阶段在 Level 1/Level 2 任务上的 PASS5、AVG5 指标可作为训练效果的上游参考。二、获取代码拉取 MindSpeed-MM 并应用仓库补丁仓库为 MindSpeed-MM 提供了针对 Qwen3.6-27B SFT 的完整适配补丁 mindspeed-mm.patch。在工作目录执行以下命令git clone https://gitcode.com/Ascend/MindSpeed-MM.git cd MindSpeed-MM git checkout aaed711fd4750857f104e8d832766ed915ff9ef0 git apply --check ../mindspeed-mm.patch git apply ../mindspeed-mm.patch要点说明后续所有命令均在MindSpeed-MM根目录执行若补丁文件不在上级目录请将../mindspeed-mm.patch替换为其实际路径git apply --check用于预检补丁能否干净应用建议先执行再正式应用该补丁基于基线 commit 生成共涉及 31 个文件13 个新增、18 个修改覆盖训练调度、LoRA、checkpoint、数据处理、启动脚本与测试等 8 大模块详见补丁说明与本文第六节。三、环境安装3.1 配置 CANN 环境请先按照昇腾软件安装指南完成驱动、固件以及 CANN Toolkit 的安装。本示例使用CANN 9.0.0。确认 CANN 环境变量已生效例如按实际安装路径执行source /usr/local/Ascend/cann/set_env.sh3.2 配置 Python 环境推荐使用 Conda 管理 Python 包conda create -n qw36-sft python3.11 -y conda activate qw36-sft bash scripts/install.sh --msid eb10b92 pip install transformers5.2.0 accelerate1.2.0 pip install triton-ascend3.2.1 \ --extra-index-url https://mirrors.huaweicloud.com/ascend/repos/pypi # 如果出现 ModuleNotFoundError: No module named pkg_resources请使用低版本的 setuptools pip install setuptools81.0.0版本配套经验来自补丁说明对启动脚本的补充setuptools需低于82.0.0triton-ascend与 CANN 版本强相关CANN 8.5.0 使用triton-ascend3.2.0CANN 9.0.0 使用triton-ascend3.2.1LoRA-SFT 在实践报告中的软件组合为 PyTorch 2.7.1、torch-npu 2.7.1、Transformers 5.2.0、PEFT 0.7.1、Triton-ascend 3.2.1可作参考。四、初始模型下载与 DCP 格式转换4.1 下载模型从 ModelScope 或 Hugging Face 下载 Qwen3.6-27BHugging Face 格式放置到以下目录目录名必须与配置文件保持一致MindSpeed-MM/ckpt/hf_path/Qwen3.6-27B/该目录应包含模型权重、配置文件与 tokenizer 相关文件例如config.json、*.safetensors、tokenizer.json等。4.2 转换为 DCP 格式示例配置启用了init_model_with_meta_devicemeta device 初始化因此训练前必须先将 Hugging Face 权重转换为 DCPDistributed Checkpoint格式bash cvt_ckpt_hf2dcp.sh脚本使用固定输入/输出路径如需修改请修改脚本本身输入ckpt/hf_path/Qwen3.6-27B 输出ckpt/dcp_path/Qwen3.6-27B转换完成后输出目录应包含release/与latest_checkpointed_iteration.txt。配置文件中的training.load应指向ckpt/dcp_path/Qwen3.6-27B不要直接指向release/子目录。从补丁源码看该脚本基于 MindSpeed-MM 的mm-convert Qwen35Converter hf_to_dcp命令实现见补丁中新增的cvt_ckpt_hf2dcp.sh与 Qwen3.6-27B 的模型结构含 GDN 混合注意力对应的转换器绑定。五、数据准备与转换5.1 下载原始数据数据集下载地址https://link.gitcode.com/i/a9a8ecefe9df55812d245c9a1981765d该讨论贴开放了部分训练数据与实践报告中第 8 章的开放数据实验对应。5.2 使用 data_generator 生成数据集使用仓库提供的 data_generator 生成数据集生成过程中会调用仓库提供的 prompt_generator 生成 promptpython path-to-data_generator/generate_data.py \ --source-root path-to-data \ --output-dir path-to-generated-data \ --filter-ops exp foreach_addcdiv_scalar foreach_norm gelu masked_scale mish sigmoid swi_glu \ apply_adam_w apply_rotary_pos_emb arg_max cross_entropy_loss cummin dynamic_quant gather gcd \ grid_sampler_3d group_norm maximum resize_bilinear rms_norm scatter softmax unsorted_segment_sum \ --clean从 generate_data.py 的源码结构看其工作机制为以每个算子的op/desc目录含cases.yaml、desc.md、golden.py、proto.yaml作为 prompt 输入以op/src或src_N目录中的op_kernel/*_kernel.cpp、*_launch.h、op_plugin/*_plugin.cpp、CMakeLists.txt作为标准答案构造任务描述 → 完整 AscendC 交付件的训练对prompt 类型为md-code-block-oneshot带 one-shot 示例默认示例为sqrt输出类型为md-code-block--filter-ops用于排除指定算子支持归一化算子名与数字副本匹配如op_2--clean会先清理inputs、outputs、jsonl、manifests、intermediate等自有输出目录--with-thinking可在答案前附上thinking.md中的思维链生成的 JSONL 文件为jsonl/md-code-block-oneshot.jsonl每条记录采用instruction/input/output格式instruction为空字符串input为 promptoutput为标准答案。5.3 JSONL 输入格式约定本项目的数据处理脚本接收 JSONL 文件每行必须是一个 JSON 对象支持以下任一格式{instruction: 任务描述, input: 任务内容, output: 答案}或{prompt: 任务内容, response: 答案}字段规则instruction/input/output格式要求包含input与output字段当instruction非空时会与input以换行拼接prompt/response格式要求两个字段同时存在使用仓库 data_generator 生成的数据集是上述第一种格式。5.4 放置 JSONL 文件在 MindSpeed-MM 根目录创建数据目录并放入训练数据mkdir -p data/jsonl data/json默认示例需要以下两个文件data/jsonl/ops-data.jsonl data/jsonl/sampled-data.jsonl文件名可以调整但需同步修改 YAML 配置中的data.dataset_param.basic_parameters.dataset。5.5 转换为训练 JSON执行批量转换bash cvt_data_format_jsonl2json.sh \ data/jsonl/*.jsonl \ data/json/*.json转换后的文件写入data/json/并被示例配置中的./data/json/*.json自动读取。脚本会逐行校验 JSON 语法、对象类型以及必需字段输入存在错误时直接报错请修正后重新执行。该脚本由补丁新增对应补丁说明第 4 点其内部逻辑可见补丁内嵌的 Python 实现值得注意支持单文件与 glob 批量两种模式批量模式下输入 glob 静态根目录下的层级结构会映射到输出根目录统一生成messagesuser/assistant 两轮对话结构并附带空的images列表供 Qwen3.6 的多模态数据管线直接消费instruction非空时与input用换行拼接为 user 内容prompt/response则直接映射为 user/assistant 内容仓库补丁还配套了单元测试tests/ut/test_cvt_data_format_jsonl2json.py覆盖两种格式的转换结果与缺失字段报错场景可作为脚本行为的权威参考。六、三套训练配置详解将仓库提供的三个配置文件放置到MindSpeed-MM/examples/qwen3_6目录下packing 全参 SFT 配置 examples/qwen3_6/qwen3_6_27B_config_packing64k_gbs2.yaml unpacking 全参 SFT 配置 examples/qwen3_6/qwen3_6_27B_config_gbs16.yaml unpacking LoRA SFT 配置 examples/qwen3_6/qwen3_6_27B_config_LoRA_gbs8.yaml训练前请确认配置中的以下路径与本地目录一致配置项含义data.dataset_param.preprocess_parameters.model_name_or_path原始 Hugging Face 模型目录data.dataset_param.basic_parameters.dataset转换后的 JSON 数据model.model_name_or_path原始 Hugging Face 模型目录training.load转换后的 DCP 目录training.save训练输出目录6.1 三套配置的共同基础对照仓库中的 packing 配置、unpacking 配置 与 LoRA 配置三套配置共享以下结构并行策略parallelparallel: fully_shard_parallel_size: auto # FSDP2 全分片并行自动推断 fsdp_plan: apply_modules: # 分片范围开启 prefetch 时勿随意改动顺序 - model.visual - model.visual.blocks.{*} - model.language_model - model.language_model.embed_tokens - model.language_model.layers.{*} - lm_head param_dtype: bf16 # 参数 BF16 reduce_dtype: fp32 # 梯度归约 FP32 ulysses_parallel_size: 8 # Ulysses 序列并行CP开启时需配合 flash_attention_2配置注释明确要求开启 ulysses-cp 时须将 model 的attn_implementation设置为flash_attention_2。数据相关datadata: dataset_param: dataset_type: huggingface attr: images: null messages: messages role_tag: role content_tag: content user_tag: user assistant_tag: assistant preprocess_parameters: model_name_or_path: HF_MODEL_LOAD_PATH ./ckpt/hf_path/Qwen3.6-27B # 替换为原始 hf 权重 use_fast_tokenizer: true split_special_tokens: false image_max_pixels: 262144 image_min_pixels: 1024 video_max_pixels: 16384 video_min_pixels: 0 video_fps: 2.0 video_maxlen: 64 basic_parameters: cutoff_len: 65536 # 上下文长度 64K template: qwen3_6_nothink # 无 thinking 模板 enable_thinking: false train_on_prompt: false mask_history: false dataset_dir: ./data dataset: DATASET_PATH - ./data/json/*.json # 转换后的 JSON 数据 cache_dir: ./cache_dir/ overwrite_cache: false preprocessing_batch_size: 1000 preprocessing_num_workers: 16 max_samples: null dataloader_param: pin_memory: true shuffle: true dataloader_mode: sampler drop_last: true sampler_type: BaseRandomBatchSampler # 项目自定义 sampler num_workers: 8 collate_param: model_name: qwen3vl ignore_pad_token_for_loss: true enable_preload: false模型与优化特性model/featuresmodel: model_id: qwen3_5 model_name_or_path: *HF_MODEL_LOAD_PATH trust_remote_code: true attn_implementation: flash_attention_2 freeze: - model.visual # 冻结视觉模块 gdn_implementation: triton # GDN 融合算子用 triton causal_conv1d_implementation: triton # 因果卷积实现LoRA 配置为 eager features: loss_cfg: loss_type: per_token_loss # packing 配置unpacking 配置为 per_sample_loss router_aux_loss_coef: 0.0 recompute: true # 激活重计算 recompute_plan: apply_modules: - model.visual.blocks.{*} - model.language_model.layers.{*} enable_chunk_loss: true # chunk loss降低激活峰值 chunkloss_plan: apply_module: lm_head chunk_size: 1024 enable_activation_offload: true # 激活 offload activation_offload_plan: apply_modules: - model.visual.blocks.{*} - model.language_model.layers.{*}训练配置training——三套配置的差异点配置项packing 全参unpacking 全参LoRAmicro_batch_size111gradient_accumulation_steps184global batch size推算2168lr1.0e-51.0e-51.0e-4LoRA 适配器用更高学习率lr_warmup_ratio0.10.10.05lr_decay_stylecosinecosinecosineweight_decay000train_epochs335clip_grad0.0不裁剪0.01.0save_interval1epoch 模式11loss_typeper_token_lossper_sample_lossdefaultcausal_conv1d_implementationtritoneagereager输出目录save./outputs/packing64k-gbs2./outputs/gbs16./outputs/LoRA-gbs8三套配置均包含以下公共训练项training: seed: 42 init_model_with_meta_device: true # meta 设备初始化需预转换 DCP 权重 optimizer: adamw adam_fused: true no_load_optim: true # 不加载优化器状态如需加载请删除 no_load_rng: true no_save_optim: true # 不保存优化器状态如需保存请删除 no_save_rng: true save_dtype: bf16 # checkpoint 保存为 BF16 use_deter_comp: false plugin: - mindspeed_mm/fsdp/models/qwen3_5 - mindspeed_mm/fsdp/data/datasets/huggingfaceno_load_optim/no_load_rng/no_save_optim/no_save_rng四个开关的含义从 Qwen3.6-27B release checkpoint 加载权重但不加载/不保存优化器与随机数状态实践报告中的初始状态约定与此一致。若需断点续训并恢复优化器状态须相应调整。6.2 packing 与 unpacking 的差异解读packing 全参配置qwen3_6_27B_config_packing64k_gbs2.yamlpacking: true将多个样本打包进 64K 上下文loss_type: per_token_loss并启用shuffle_before_packing: trueseed 42打包前全局打乱数据提升长序列打包质量。这是实践报告 4.4 节中训练效率更优的方案3 个 epoch 耗时约为 unpacking 的 2/3unpacking 全参配置qwen3_6_27B_config_gbs16.yamlpacking: false样本不打包loss_type: per_sample_lossglobal batch size 16LoRA 配置qwen3_6_27B_config_LoRA_gbs8.yamlpacking: falseglobal batch size 8训练 5 个 epoch。6.3 LoRA 配置详解LoRA 配置位于training.lora下完整配置如下来自仓库 LoRA 配置文件training: lora: enable: true rank: 256 alpha: 512 target_modules: # 标准注意力层 - model.language_model.layers.{*}.self_attn.q_proj - model.language_model.layers.{*}.self_attn.k_proj - model.language_model.layers.{*}.self_attn.v_proj - model.language_model.layers.{*}.self_attn.o_proj # MLP 层 - model.language_model.layers.{*}.mlp.gate_proj - model.language_model.layers.{*}.mlp.up_proj - model.language_model.layers.{*}.mlp.down_proj dropout: 0.05 init_lora_weights: true pretrained_lora_path: null参数说明结合补丁说明与补丁中lora_args.py的定义rank低秩矩阵的秩实践报告中对比过 64/128/256rank 256 综合表现最好alpha缩放系数LoRA 权重更新为W W (alpha/r)·B·A实践报告固定alpha/r 2target_modulesLoRA 注入范围——标准自注意力层的 q/k/v/o projection 与 MLP 的 gate/up/down projection不包含 GDNGated DeltaNet线性注意力层。实践报告第 5.4 节指出将 GDN 的in_proj_z、in_proj_b、in_proj_a纳入 target modules 后不同 rank 的模型均出现明显能力坍塌因此主实验不训练这些模块dropoutLoRA 层 dropout 比例init_lora_weights权重初始化方式True/False/gaussianmeta device 流程下其他字符串初始化方法会被拒绝pretrained_lora_path预训练 LoRA 权重路径可选支持.safetensors与.pt/.bin。七、启动训练7.1 启动全参 SFT启动后台训练默认使用 16 张 NPU# 使用 packing 配置 bash run_train_nohup.sh \ examples/qwen3_6/qwen3_6_27B_config_packing64k_gbs2.yaml # 使用 unpacking 配置 bash run_train_nohup.sh \ examples/qwen3_6/qwen3_6_27B_config_gbs16.yaml7.2 启动 LoRA SFTbash run_train_nohup.sh \ examples/qwen3_6/qwen3_6_27B_config_LoRA_gbs8.yaml7.3 启动脚本的工作机制run_train_nohup.sh与配套的scripts/wait_for_npu_idle.sh由补丁新增对应补丁说明第 6 点其工作流为参数校验接收配置文件与可选 NPU 数量默认 16校验 NPU 数量为正整数、ASCEND_RT_VISIBLE_DEVICES设备列表无重复且数量一致读取输出目录通过内嵌 Python 从 YAML 读取training.save据此推断 DCP→HF 后处理的目标目录${save}-hf等待 NPU 空闲wait_for_npu_idle.sh通过npu-smi info轮询物理 NPU 显存占用所有目标设备空闲后才启动训练。可用环境变量控制IDLE_MEMORY_THRESHOLD_MB默认 4000空闲判定阈值CHECK_INTERVAL_SECONDS默认 300轮询间隔QUERY_TIMEOUT_SECONDS默认 30单次npu-smi查询超时NPU_DEVICE_IDS/EXPECTED_NPU_COUNT指定设备与期望数量后台训练nohup启动examples/qwen3_6/finetune_qwen3_6_27B.sh在logs/下写入 PID 文件与 workflow 日志成功后处理训练成功结束后自动执行后处理——全参 SFT 执行 DCP→HF 转换LoRA SFT 执行 adapter 合并训练失败时不会执行后处理。8 卡训练示例来自补丁中run_qwen36_sft.sh的注释export ASCEND_RT_VISIBLE_DEVICES0,1,2,3,4,5,6,7 EXPECTED_NPU_COUNT8 bash run_train_nohup.sh path/to/config.yaml 8底层训练脚本finetune_qwen3_6_27B.sh的增强点补丁第 6 点NPUS_PER_NODE、MASTER_ADDR、MASTER_PORT均可通过环境变量配置并做合法性校验未设置MASTER_PORT时使用torchrun --standalone自动选择空闲端口设置后使用静态 rendezvous从命令行接收 YAML 配置路径不再写死配置文件日志文件名包含配置名使用pipefail检测训练失败并返回非零状态保留训练耗时与吞吐统计默认不再自动 source 固定路径的 CANN 环境脚本需按实际环境手动配置。八、Checkpoint 后处理8.1 批量转换 DCP 到 HF以 packing 全参 SFT 配置为例训练输出默认位于./outputs/packing64k-gbs2。训练流程正常结束时自动完成格式转换如需手动将所有 iteration 的 DCP checkpoint 转换为 Hugging Face 格式bash cvt_ckpt_dcp2hf_batch.sh \ ./outputs/packing64k-gbs2 \ ./outputs/packing64k-gbs2-hf \ examples/qwen3_6/qwen3_6_27B_config_packing64k_gbs2.yaml脚本行为遍历输入目录下的iter_*纯数字迭代号目录将每个结果写入带对应 iteration 后缀的输出目录如packing64k-gbs2-hf_iter_000010默认从ckpt/hf_path/Qwen3.6-27B读取 tokenizer 等文件——DCP→HF 转换后会自动从原始 HF 目录复制存在的 tokenizer 相关文件tokenizer.json、tokenizer_config.json、chat_template.jinja、vocab.json、merges.txt、special_tokens_map.json等并在复制成功后更新输出目录权限补丁中qwen3_5.py的_copy_origin_tokenizer_assets逻辑处理 DCPiter_*目录期间会保护并在退出时恢复latest_checkpointed_iteration.txt临时备份 trap 恢复发现lora_adapter_iteration_*.safetensors文件时从 YAML 读取基座模型路径、LoRA alpha 与 rank 并校验然后调用merge_lora_safetensors_to_base.py合并。8.2 转换单个 DCP checkpointbash cvt_ckpt_dcp2hf.sh \ ./outputs/packing64k-gbs2-iter_000010 \ ./outputs/packing64k-gbs2/iter_0000108.3 预览转换计划Dry Run如需预览批处理脚本将处理哪些 checkpoint 而不实际转换CHECKPOINT_POSTPROCESS_DRY_RUN1 bash cvt_ckpt_dcp2hf_batch.sh \ ./outputs/packing64k-gbs2 \ ./outputs/packing64k-gbs2-hf \ examples/qwen3_6/qwen3_6_27B_config_packing64k_gbs2.yaml8.4 LoRA 合并的补充控制针对 LoRA adapter 的合并批处理脚本还支持LORA_MERGE_DEVICEcpu|npu选择 CPU 或 NPU 上执行合并默认npu合并结果写入${dcp_dir}-merged-hf-iter-${iteration}目录合并前会校验 YAML 中model.model_name_or_path存在、training.lora.alpha与training.lora.rank均为正整数。九、补丁能力深度解读8 大功能模块mindspeed-mm.patch 与补丁说明将适配能力归纳为 8 大模块本节结合补丁源码逐项解读其设计意图帮助你理解示例配置背后框架层面的支撑。9.1 FSDP2 按 epoch 训练涉及mindspeed_mm/fsdp/train/epoch_schedule.py新增、trainer.py、train_engine.py、training_args.py等。核心逻辑epoch_schedule.py中三个纯函数get_epoch_micro_batches(dataloader)返回每个 epoch 的 micro-batch 数。普通 PyTorch DataLoader 直接取len()项目的BaseRandomBatchSampler暴露total_samples/last_batch_size/micro_batch_times_data_parallel_size三个记账属性按有效样本数排除不完整尾 batch÷ 全局 micro-batch 大小归一化计算resolve_epoch_schedule(...)把 epoch 配置换算为总 iteration 与精确保存 iteration。epoch 边界按ceil(epoch × micro_batches_per_epoch / gradient_accumulation_steps)向上取整到跨过边界的第一个 optimizer step避免因数据量或梯度累积不能整除而出现 checkpoint 漂移同时校验空数据集、非法 epoch、非法save_interval、每 epoch micro-batch 数小于梯度累积步数等异常checkpoint_is_due(...)epoch 模式按保存点集合判定iteration 模式保持iteration % save_interval 0的原语义。对用户的影响设置train_epochs时train_iters会被覆盖save_interval自动按epoch 数解读如配置中的save_interval: 1即每个 epoch 保存一次未设置train_epochs时保持按 optimizer step 的原有语义字段名是train_epochs不是train_epoches——框架会对拼写错误显式报错按 epoch 续训时应保持数据集长度、梯度累积步数与并行配置不变否则 checkpoint 的 iteration 与 dataloader epoch 位置无法对应FunASR 的 split-based dataloader 不支持通用train_epochs继续使用其专用的max_epochs与train_iters训练结束时避免重复保存刚刚在同一 iteration 保存过的 checkpointtrain_engine.py中的last_saved_iteration去重。9.2 LoRA 初始化和保存逻辑涉及mindspeed_mm/fsdp/utils/lora_utils.py、lora_args.py、trainer.py、train_engine.py。新增is_pure_lora_training()要求存在可训练参数且所有可训练参数名都属于 LoRA adapter才判定为纯 LoRA 训练新增initialize_lora_weights_after_materialization()解决 meta device 初始化后经to_empty()导致 LoRA 权重未真正初始化的问题。流程为先 materialize 参数 → 再初始化基座权重 → 最后按 PEFT 语义重新初始化 LoRA adapter即使后续加载基座 checkpoint也不会留下未初始化的 adapter 存储init_lora_weights支持True/False/gaussian三种方式其他依赖实权重的方法如pissa在该 meta 流程中会被拒绝配套单测tests/ut/test_lora_utils.py覆盖该拒绝路径新增training.lora.save_full_model默认false纯 LoRA 训练默认只保存lora_adapter_iteration_xxx.safetensorsadapter-only checkpoint如果存在解冻的非 LoRA 参数如lm_head仍自动保存完整模型 checkpoint防止这些权重丢失设置save_full_model: true时额外保存包含完整模型状态的 DCP默认 adapter-only 行为不变断点续训语义adapter-only checkpoint 可通过pretrained_lora_path加载但不会恢复优化器、学习率调度器与 RNG 状态严格断点续训需save_full_model: true保存时no_save_optim/no_save_rng为false恢复时no_load_optim/no_load_rng为falseload指向上次保存的完整 checkpoint。9.3 Checkpoint 保存 dtype涉及dcp_checkpointer.py、training_args.py、train_engine.py。新增training.save_dtype支持fp16/bf16/fp32未设置时保持原有保存 dtype保存模型 state dict 时递归转换浮点 tensor 的 dtype_cast_floating_tensors只影响完整模型 checkpoint 保存不改变训练过程中的参数 dtype也不改变 adapter-only 文件的保存逻辑FunASR 保存逻辑同步支持该参数。9.4 数据处理和 SFT packing涉及mindspeed_mm/fsdp/data/data_utils/func_utils/convert.py、qwen2vl_dataset.py、cvt_data_format_jsonl2json.sh。新增shuffle_before_packing默认关闭与shuffle_before_packing_seed默认 42在 Qwen2VL/Hugging Face 数据集路径下仅当stagesft、启用 packing、离线预处理且数据集非 streaming 时生效shuffle 顺序为数据对齐后、tokenize/packing 前启用该选项但前置条件冲突streaming 数据集或preprocess_on_flytrue时显式报错而不是执行近似 shuffle新增 JSONL→JSON 转换工具即 cvt_data_format_jsonl2json.sh 对应功能 配套脚本支持两种输入格式、单文件与 glob 批量、逐行校验并生成统一messages结构详见 5.5 节。9.5 Qwen3.5 checkpoint 转换涉及checkpoint/vlm_model/converters/qwen3_5.py、cvt_ckpt_dcp2hf.sh、cvt_ckpt_dcp2hf_batch.sh、cvt_ckpt_hf2dcp.sh。Qwen3.5 DCP→HF 后自动从原始 HF 目录复制 tokenizer 相关文件tokenizer.json、tokenizer_config.json、chat_template.jinja、vocab.json等并修正权限新增 HF→DCP、DCP→HF 快捷脚本与批量处理脚本详见第八节。9.6 训练启动和 NPU 调度脚本新增run_qwen36_sft.sh、run_train_nohup.sh、scripts/wait_for_npu_idle.sh实现 NPU 空闲等待、后台训练、失败检测与成功后处理联动详见 7.3 节。9.7 示例文档与测试配套examples/qwen3_6/README.md补充了 clone 地址、triton-ascend版本提示、train_iters/train_epochs/save_interval配置示例及train_epoches拼写提示.gitignore新增ckpt、outputs、data、logs、tmp等目录新增/修改单元测试覆盖train_epoches拼写校验、epoch schedule 换算与 checkpoint 边界tests/ut_fsdp/test_epoch_training.py、LoRA 纯训练判断与 meta 初始化tests/ut/test_lora_utils.py、tests/ut_fsdp/train/test_trainer_meta_lora.py、adapter-only/完整/混合保存分支tests/ut/test_train_engine_lora_save.py、JSONL 转换两种格式tests/ut/test_cvt_data_format_jsonl2json.py、SFT packing 前 shuffle 开关与前置条件tests/ut_fsdp/test_qwen2vl_dataset.py。十、训练效果参考与实践验证训练效果属于实践层面的验证结果详见仓库内实践报告以下数据均出自该报告标注其适用条件全参 SFTthinking 推理cann-bench Level 1 PASS5 从基模的 12.7 提升至67.3AVG5 从 4.1 提升至45.5Level 2 PASS5/AVG5 为 28.2/10.2LoRA-SFTrank 256epoch 4 checkpointLevel 1 thinking 模式 54.55/34.03no-thinking 模式 59.89/31.84资源对比全参 SFT 峰值显存约 46 GiB/卡、3 epochs 约 3.7 hLoRA-SFT 约 27 GiB/卡、5 epochs 约 4.5 h且可在 8 die 上完成训练packing vs unpackingper_token_loss packing 的训练效率显著更高3 个 epoch 耗时约为 unpacking 的 2/3两类 loss 在开启 thinking 推理时结果接近。实践报告还指出仅使用开放数据550 条进行 MindSpeed-MM 全参 SFTthinking 推理Level 1 达 51.4/24.8说明仓库公开的数据讨论贴已足以复现基本的 AscendC 交付格式与部分算子模式学习。评测存在抽样噪声较小分差不宜视为稳定优势。下图展示了 MindSpeed-MM 框架下 packingper_token_loss与 unpackingper_sample_loss两类全参 SFT 实验的训练曲线图片来自实践报告两组实验的 epoch 平均 training loss 均持续下降由于 loss 聚合方式不同per-token vs per-sample绝对数值不宜横向比较仅用于判断各自运行的纵向趋势。由于clip_grad0.0训练中出现的 grad norm 尖峰未被显式裁剪。十一、常见问题与注意事项ModuleNotFoundError: No module named pkg_resources安装低版本setuptools如setuptools81.0.0需低于 82.0.0triton-ascend版本不匹配CANN 8.5.0 用 3.2.0CANN 9.0.0 用 3.2.1安装命令需带--extra-index-url https://mirrors.huaweicloud.com/ascend/repos/pypitrain_epoches拼写错误字段名是train_epochs框架会显式报错拒绝training.load指向错误必须指向 DCP 根目录ckpt/dcp_path/Qwen3.6-27B含release/与latest_checkpointed_iteration.txt不要指向release/子目录shuffle_before_packing前置条件仅当stagesftpackingtrue 离线预处理 非 streaming 数据集时生效streaming 或preprocess_on_flytrue会显式报错流式/IterableDataset 不支持按 epoch 训练请继续使用train_itersLoRA meta 初始化限制init_lora_weights在 meta device 流程下仅支持True/False/gaussian严格断点续训adapter-only checkpoint 不携带优化器/RNG 状态需save_full_model: true并按要求调整no_save_*/no_load_*开关后处理仅在训练成功时执行run_train_nohup.sh通过pipefail检测训练失败失败时跳过 checkpoint 转换/LoRA 合并。小结本文以Qwen3.6-27B SFT 使用指南为骨架完整覆盖了从代码获取、环境搭建、权重转换、数据准备、三套配置训练到 checkpoint 后处理的全部实操步骤并结合mindspeed-mm.patch源码与补丁说明深入解读了 epoch 训练调度、LoRA 初始化与保存、checkpoint dtype、SFT packing 洗牌等底层机制最后以实践报告的评测结果作为训练效果的参考依据。仓库内还提供了数据生成工具、prompt 生成工具与三套可直接运行的 YAML 配置开发者可据此快速复现全参 SFT 与 LoRA-SFT 实验或在现有配置基础上调整数据、超参与并行策略开展进一步探索。【免费下载链接】cann-recipes-train本项目针对LLM与多模态模型训练业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-train创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考