mindspore-ai / mindspore-ai/hyper-parallel
PR658 Qwen3.5/Qwen3-VL-MoE 训练链路与并行修复说明
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 53
- Forks
- 63
- Avg merge
- 23h 45m
- Merged PRs (30d)
- 63
Description
关联 PR:https://gitcode.com/mindspore/hyper-parallel/pull/658
1. 这个 PR 做了什么
PR #658 为 Qwen3.5 dense、Qwen3.5-MoE 和 Qwen3-VL-MoE 补齐统一 Trainer 的真实训练能力,覆盖以下完整链路:
- 从 checkpoint
config.json构建实际模型几何,并完成 HF state-dict 导入/导出和 TP rank-local load transform。 - 实现 Qwen3.5 full attention、GatedDeltaNet、packed MoE experts、router/aux loss、Qwen3-VL vision tower、3-D mRoPE、DeepStack 和可选 MTP。
- 通过
ModelSpec把模型构造、并行化、pipeline split 和 checkpoint transform 接入 Trainer。 - 增加统一
data.typeregistry,支持 dummy、VL dummy、HF/JSON、preset tensor 和 Megatron.bin/.idx/blend。 - 支持已验证的 DDP/HSDP/FSDP、TP、CP、EP、PP/VPP 及其组合,并对尚不能保证同步域或因果语义的组合提前报错。
- 修复组合并行触发的 PP 共享参数/梯度、嵌套 HSDP finalization、Partial Add/Sub 和 reduction dtype 公共语义。
PR 最终 squash 为一个业务提交。相对 PR 基线共修改 46 个生产文件;tests/、examples/、platform/ 和 trainer callbacks 无 diff,也不提交本机配置、日志或解析工具。
2. Core:8 个文件
| 状态 | 文件 | 主要代码入口 | 原问题、为什么修改及实际代码效果 |
|---|---|---|---|
| M | hyper_parallel/core/pipeline_parallel/scheduler.py |
PipelineScheduleRuntime._inject_local_fsdp_actions |
原逻辑只在 stage 根本身为 HSDPModule 时注入 unshard/reshard/reduce-grad action;实际 PP stage 根常是普通 Module、FSDP units 在子树中。改为遍历 stage 子树发现任意 HSDPModule,避免漏调度嵌套 FSDP 参数生命周期。 |
| M | hyper_parallel/core/pipeline_parallel/stage.py |
SharedParameterInfo、_sync_shared_parameters、_init_shared_parameter_group、sync_shared_parameters_grad、get_last_stage_sens、execute_reduce_grad |
meta to_empty 会替换 Parameter,旧 shared info 持有 stale object;改为 owner+name 动态取 live parameter,meta 阶段延后 broadcast。tied stages 覆盖完整 PP mesh 时复用 PP group,避免 PP+FSDP 重复 world new_group。共享端 requires_grad 来自同一 tied/frozen 配置:全组 frozen 时统一跳过;仍需梯度但本 rank 的 grad 为 None 时,以同 shape/dtype/device 零值参加 collective,避免另一端阻塞。FSDP boundary 的 reduced grad 是 DTensor,因此只归约匹配的 local shard,等待 async handle 后写回原 layout。get_last_stage_sens 保持通用 PP 的 unit sens,不读取 Trainer 私有状态;execute_reduce_grad 遍历、去重并完成普通 stage 根下全部 HSDP roots,避免最后一个 reduce-scatter 延迟到下一 step。 |
| M | hyper_parallel/core/shard/_op_dispatch.py |
_validate_inplace_partial_inputs、_restore_inplace_dtensor_result、bypass dispatch |
MindSpore in-place bypass 原来绕过 Partial 安全检查,Torch add_/sub_ 可能把 DTensor accumulator 返回成 local tensor。现在 mixed Partial signature 在 mutation 前 fail-fast,并始终为 Torch in-place 返回原 DTensor wrapper。 |
| M | hyper_parallel/core/shard/ops/parallel_elementwise.py |
_partial_signature、_contributes_to_partial_output、_zero_contribution、AddDistributedOp、SubDistributedOp |
Partial + Replicate 原实现只用“所有 Partial 轴首 rank”判断,二维不同 Partial 轴会丢 shard;Sub 复用 Add 语义时 Replicate - Partial 非首 rank 符号错误。改为逐输入、逐输出 Partial 轴决定贡献;非贡献值构造保留 autograd edge 的严格零,并避免 Inf*0=NaN;kwargs 先按 input/other 语义规范化;in-place 不同 Partial signature 明确拒绝;新增独立减法实现。 |
| M | hyper_parallel/core/shard/ops/yaml/element_wise_ops_with_shape.yaml |
Sub、SubExt registry |
MindSpore Sub/SubExt 仍指向 AddDistributedOp,无法执行正确减法局部贡献;改为 SubDistributedOp。 |
| M | hyper_parallel/core/shard/ops/yaml/torch_element_wise.yaml |
__rsub__ registry |
reverse-sub 没有独立减法 class;注册 SubDistributedOp,使 scalar - Partial 正确。 |
| M | hyper_parallel/core/shard/ops/yaml/torch_element_wise_with_shape.yaml |
sub registry |
Torch functional sub 原来走默认 elementwise class;改为 SubDistributedOp。 |
| M | hyper_parallel/core/tensor_parallel/style.py |
_src_data_rank_for_tensor、ColwiseParallel、RowwiseParallel、PrepareModuleOutput/InputOutput |
meta tensor 没有真实 storage,分片时不能从 source rank 广播,改为 meta 场景 src_data_rank=None。新增可选 reduce_dtype 以 FP32 完成 Partial reduction;最终修复其作用域,只在源 placements 含 Partial 且发生 reduction 时 cast,普通 Replicate -> Shard 保持原 dtype。 |
3. Data:11 个文件
| 状态 | 文件 | 主要代码入口 | 原问题、为什么修改及实际代码效果 |
|---|---|---|---|
| A | hyper_parallel/data/__init__.py |
build_dataset、DATASET_REGISTRY 和内置 dataset 导出 |
原数据构建散落在 Trainer;新增统一公开入口并通过导入各 builder 完成内置格式注册。 |
| A | hyper_parallel/data/registry.py |
DatasetRegistry.register/get/names、build_dataset |
原 Trainer 用 if/else 硬编码格式,扩展困难且未知类型报错不清晰;改为 name→builder registry,拒绝重复注册并列出可用类型。 |
| A | hyper_parallel/data/dummy.py |
DummyDataset、build_dummy |
需要不依赖外部语料且在 1 卡/N 卡使用同一逻辑样本的 LM 输入;每个样本按 train.seed + index 确定性生成,容量覆盖全部训练 steps。 |
| A | hyper_parallel/data/hf.py |
TokenizedDataset、_load_raw、_maybe_truncate、build_hf_datasets/build_json_file |
把 HF hub/Arrow、JSON 加载、tokenize、空样本过滤从 LLMTrainer 抽离;按训练所需总容量裁剪,避免 dataloader 提前耗尽。 |
| A | hyper_parallel/data/preset_pt.py |
PresetPtDataset、_expand_batch、_split_pixel_block、_slice_position_ids |
统一读取预先 tokenized 的 LM/VL tensor batch;正确展开 stacked/per-rank batch,保留 2-D/3-D position ids,并按 grid token 数切分 image/video pixel block。 |
| A | hyper_parallel/data/vl_dummy.py |
DummyVLDataset、build_vl_dummy |
需要满足 Qwen3-VL vision shape/token 契约的可复现 image/video 合成输入;由 vision config 推导 patch row width、merge 后 token 数和最小 seq length。 |
| A | hyper_parallel/data/megatron/__init__.py |
Indexed/GPT/Blendable 导出与 builder 注册 | 建立 Megatron 数据包稳定公开接口,并在 import 时注册 data.type=megatron。 |
| A | hyper_parallel/data/megatron/builder.py |
_parse_blend、_looks_like_blend、build_megatron |
YAML 需要同时表达单 .bin/.idx prefix 和加权多源语料;统一 suffix、seed、pad/EOD/mmap 配置,并生成足够训练样本。 |
| A | hyper_parallel/data/megatron/blendable_dataset.py |
_build_blend_indices、BlendableDataset |
用 deficit scheduler 预生成 source/local index,校验权重与空源并循环复用小语料;文档明确 seed 仅 API 兼容、索引驻内存、每个前缀的配比误差受一条样本舍入界约束。 |
| A | hyper_parallel/data/megatron/gpt_dataset.py |
document/sample/shuffle index、fingerprint/cache、GPTDataset |
新增跨 document 定长采样、shuffle、尾部 pad、EOD mask 和索引缓存;layout fingerprint 防止语料重建后复用陈旧索引,缓存目录使用真实 <prefix>_cache/ 规则。 |
| A | hyper_parallel/data/megatron/indexed_dataset.py |
suffix/dtype helper、_IndexReader、IndexedDataset/Builder |
新增 Megatron .bin/.idx wire-format 读写和越界/格式校验;大体积 .bin 使用 mmap/零拷贝,.idx 元数据一次读入 RAM,示例只使用通用占位路径。 |
4. Qwen3.5 dense:5 个文件
| 状态 | 文件 | 主要代码入口 | 原问题、为什么修改及实际代码效果 |
|---|---|---|---|
| M | hyper_parallel/models/qwen3_5/__init__.py |
_ckpt_config_kwargs、_resolve_overrides、_build_config、register_spec |
不同尺寸 checkpoint 原来会退回代码默认几何;现在从 config.json 合并 text/rope/tied-embedding 配置,层数缩减时同步处理 layer_types,并注册 TP load transform 和 PP splitter。 |
| M | hyper_parallel/models/qwen3_5/checkpoint.py |
_remap_simple_key、load_hf_qwen3_5_state_dict |
GatedDeltaNet fused QKV 是 Q/K/V block 排列,不能按普通输出维连续切;公共 loader 保留 fused tensor,真正的 blockwise rank-local 切分交给模型 TP load transform。 |
| M | hyper_parallel/models/qwen3_5/model.py |
Qwen3_5SdpaCore/Attention/GatedDeltaNet、mask/position helper、ForCausalLM.forward、StageModule |
通用 GQA/GatedDeltaNet 无法表达 fused QKV、depthwise causal conv、output gate、Q/K norm及 CP hook 边界;新增模型专用 attention/linear-attention、正确 mask/position、token-mean loss 和首/中/末 PP stage。 |
| M | hyper_parallel/models/qwen3_5/parallelize.py |
TP/CP plan、TP load transform、pipelining_qwen3_5、_apply_qwen3_5_pp_stage_tp、stage FSDP wrapper |
新增 full-attention/MLP/GatedDeltaNet TP、pure-Ulysses CP、GPipe/1F1B/VPP 和 tied embedding。HSDP 必须显式使用 ("dp_replicate","dp_shard") 二维 mesh;参数整除只看实际 shard 轴。HSDP+CP 无法同时表达两个同步域时提前报错;PP+replicated-DP 保留 plain stage 交给 Trainer。dense PP+TP 原先关闭 full-model grad hooks 后没有在 stage 重挂:plain stage 现在安装 replicated-param hook,FSDP stage 则在 materialize/load 后通过 lazy post-FSDP reducer 同步,二者互斥且 VPP 每个本地 stage 都覆盖。 |
| M | hyper_parallel/models/qwen3_5/state_dict.py |
Qwen3_5StateDictAdapter |
明确 fused QKV 保持同一 state schema;TP rank-local 变换由 ModelSpec transform 执行,避免单卡/TP 使用两套 checkpoint key。 |
5. Qwen3.5-MoE 与 Qwen3.5-MoE-VL:7 个文件
| 状态 | 文件 | 主要代码入口 | 原问题、为什么修改及实际代码效果 |
|---|---|---|---|
| M | hyper_parallel/models/qwen3_5_moe/__init__.py |
checkpoint config merge、_build/_build_vl、register_spec |
原逻辑固定 35B-A3B 默认值且没有 VL/MTP/PP/TP load transform;现在按 checkpoint 合并 text/vision/token 配置,规范 layer_types,增加 VL 分支和受控 MTP 开关,并注册模型入口。 |
| M | hyper_parallel/models/qwen3_5_moe/checkpoint.py |
VL/MTP key remap、packed expert collect/finalize、load_hf_qwen3_5_moe_vl_state_dict |
text-only loader 会丢 visual/MTP 参数;新增 VL namespace、text/vision depth 过滤、packed expert 重组和 MTP 参数映射。 |
| M | hyper_parallel/models/qwen3_5_moe/model.py |
grouped MM、router、packed experts、shared expert、aux loss、ForCausalLM、StageModule |
通用 MoE 不匹配 checkpoint packed layout和 expert-major grouped-MM;新增可反向 grouped matmul、softmax-then-top-k router、共享 expert gate、padding-aware aux loss、独立每层 RoPE,以及 text PP stage。 |
| A | hyper_parallel/models/qwen3_5_moe/model_vl.py |
VL config/model/conditional generation/stage | 原模型只有 text 路径,visual 参数会丢失;新增 vision+text composite、image/video feature split、placeholder 校验、masked scatter、3-D mRoPE 和 VL PP stage,并把运行时保证限制在实际实现范围内。 |
| A | hyper_parallel/models/qwen3_5_moe/mtp.py |
Qwen3_5MoeMTP、mtp_loss |
checkpoint 可包含 mtp.* 但原模型不消费;新增 next-2-token module,默认 mtp_loss_weight=0,显式启用才进入总 loss;未覆盖的 TP/CP/PP 组合 fail-fast。 |
| M | hyper_parallel/models/qwen3_5_moe/parallelize.py |
TP/CP/EP plan、_should_reduce、grad reducers、DP/HSDP/PP mesh resolver、visual FSDP、pipeline splitter |
新增 packed expert TP、blockwise GatedDeltaNet slicing、EP all-to-all、CP full-sequence round-trip、post-FSDP replicated reducers、PP/VPP。非 PP HSDP 使用显式二维 mesh,dp_shard=-1 从真实 mesh 解析,参数整除只看 shard 轴;HSDP+CP fail-fast;PP+HSDP 返回 plain stage由 Trainer 完整 DP reducer 同步。reducer 参数过滤复合谓词拆为 helper,保持短路顺序不变并消除复杂度越界。PP+EP 尚缺参数分类 stage reducer,现明确 fail-fast,避免可启动但 replicated 参数跨 EP 分叉。 |
| M | hyper_parallel/models/qwen3_5_moe/state_dict.py |
Qwen3_5MoeStateDictAdapter.load/save |
原 adapter 只识别 text-only;现在按 model_config.vl 分流 VL loader,传递 text/vision depth 与 MTP 开关,VL 导出保留目标 namespace和 packed layout。 |
6. Qwen3-VL-MoE、公共 Vision 与 ModelSpec:8 个文件
| 状态 | 文件 | 主要代码入口 | 原问题、为什么修改及实际代码效果 |
|---|---|---|---|
| M | hyper_parallel/models/qwen3_vl_moe/__init__.py |
config defaults/override、_build_vl、register_spec |
Trainer 不知道 VL-MoE 的 PP入口和 TP full→local weight transform;新增 pipeline/transform 注册,并按 text/vision/token 分层合并 checkpoint 配置。 |
| M | hyper_parallel/models/qwen3_vl_moe/checkpoint.py |
_remap_key、load_hf_qwen3_vl_moe_state_dict |
HF packed experts 使用 (E,H,2I)/(E,I,H),runtime 使用 (E,2I,H)/(E,H,I);加载时 transpose 到 runtime 布局,避免 grouped-MM 与 TP slicing 切错轴。 |
| M | hyper_parallel/models/qwen3_vl_moe/model.py |
grouped MM/RMSNorm/experts/attention/text model/VL model/stage | 原 vision 内嵌、experts 逐 expert、TP head reshape不成立、视频 mRoPE 时间轴不递增、DeepStack 无并行边界且没有 PP stage。迁移公共 vision,增加稳定 grouped-MM、local-head attention、每层独立 RoPE、正确 temporal position、visual/DeepStack identity 边界和 PP relay。 |
| M | hyper_parallel/models/qwen3_vl_moe/parallelize.py |
DP/HSDP resolver、visual FSDP、_validate_vl_tp_cp_heads、TP/CP/EP hooks、_build_qwen3_vl_moe_pp_schedule、pipeline splitter |
新增 text/vision 的 TP/CP/EP sequence round-trip、post-FSDP reducers、视觉塔分层 FSDP、PP/VPP。HSDP 显式二维 mesh,dp_shard=-1 从 mesh 解析,参数整除只看 shard 轴;PP+replicated-DP 保持 plain stage;HSDP+CP、PP+TP/EP、ragged VL PP 等当前不安全组合明确拒绝。最终把 TP+CP head 校验和 PP/VPP schedule 选择分别抽成 helper,异常文本、schedule 分支和参数对象均不变。 |
| M | hyper_parallel/models/qwen3_vl_moe/state_dict.py |
Qwen3VLMoeStateDictAdapter |
composite config 的 text 层数在 text_config,不能依赖隐式顶层代理;显式区分 text-only/full-VL config并维持正确 HF namespace。 |
| A | hyper_parallel/models/qwen3_vl_vision/__init__.py |
vision 公共导出 | vision 类原来内嵌在 VL-MoE,Qwen3.5-MoE-VL 复用会形成反向依赖;抽成独立公共 package。 |
| A | hyper_parallel/models/qwen3_vl_vision/model.py |
vision config/rotary/attention/decoder/patch embed/merger/output/model | 建立可复用 ViT:Conv3D patch、位置插值、2-D rotary、varlen attention、main/DeepStack merger。VisionOutput 注册 pytree,使 FSDP backward hook能发现内部 tensor并在 backward 前正确 unshard。 |
| M | hyper_parallel/models/spec/model_spec.py |
ModelSpec.tp_load_transform_fn |
Trainer 顺序是 meta-init→parallelize→load;TP 已把 packed expert 改成 local shape,完整 checkpoint 无法直接 load。增加可选 full weight→rank-local tensor transform 扩展点,未配置模型行为不变。 |
7. Trainer 与启动脚本:7 个文件
| 状态 | 文件 | 主要代码入口 | 原问题、为什么修改及实际代码效果 |
|---|---|---|---|
| M | hyper_parallel/trainer/base.py |
dataset/dataloader、parallelized/pipelined model、_validate_pp_runtime_options、_pp_normalize_grads、materialize/load、train step、PP loss/grad/clip |
原 Trainer 缺统一 data registry、模型级 PP/VPP、全局有效 token 分母和组合并行同步域。按 stage 实际是否含 HSDPModule 判断归约:普通 PP+DP 做 combined-DP average,真实 shard 才跨 DP 汇总 norm;PP+TP/EP 正数 clipping 在 placement-aware 前 fail-fast。PP token-mean 缩放不写入 core stage,而是在 schedule/FSDP/shared/TP/EP/DP 归约全部完成后,由 Trainer 对最终 plain/DTensor/main grad 统一乘 dp_size/(n_valid*tp_loss_repeats),再进入 clip/optimizer;TP divisor消除 last-stage local replicated loss 的重复 backward sensitivity。loss aggregation、effective batch、AC 和 HF export 校验抽为单独 helper,校验优先级与异常文本保持。 |
| M | hyper_parallel/trainer/config.py |
DataConfig、AcceleratorConfig、MixedPrecisionConfig、OptimizerConfig |
schema 原来不能表达 VL video/Megatron、PP microbatch/schedule/VPP/layer split、CPU offload和 deterministic foreach;扩展强类型 YAML surface并明确 BF16/FSDP dtype及 max_grad_norm<=0 语义。 |
| M | hyper_parallel/trainer/llm_trainer.py |
dataset builder、tokenizer/transform、collate | 原类内重复 HF/preset 构建且无法自然接入 Megatron;改用 registry,只保留 LM tokenizer/collate;collate补 cp*tp 整除 padding、mask/position ids和有效 token 数。 |
| M | hyper_parallel/trainer/parallel_dims.py |
_validate_* helpers、mesh specs、_register_data_flatten_aliases、_register_loss_flatten_alias、build_mesh |
增加 PP/VPP、模型 config 校验和 size-1 shard 轴承载 mixed precision。修复 dp_replicate>1, dp_shard=1 时 shard 轴被折叠:始终物化 size-1 dp_shard,形成外层 replicate all-reduce、内层 no-op shard 的显式二维 HSDP topology。degree/dispatcher/product/EP/PP/Ulysses 校验及 ep→fsdp→dp→loss alias 注册拆为职责单一 helper,保持校验顺序、异常文本、幂等判断和 alias 顺序。 |
| M | hyper_parallel/trainer/vl_trainer.py |
registry dataset、_vl_collate 和 grid/position helper |
原类内重复 dummy/preset 数据代码且 collate 不完整支持 video/mRoPE;数据创建下沉 registry,VLTrainer只负责 processor与多模态拼批。 |
| M | scripts/train_lm.py |
import 顺序和 root logger | platform 在 import 阶段解析;入口若未先设置 backend可能加载错误平台。任何 HyperParallel import 前 setdefault(HYPER_PARALLEL_PLATFORM=torch),同时尊重用户显式覆盖。 |
| M | scripts/train_vl.py |
import 顺序 | 与 LM 入口相同,在 HyperParallel import 前设置默认 Torch backend,避免 VL 启动的解析时机不一致。 |
8. 关键跨文件因果关系
8.1 HSDP mesh 与 Trainer 归约域
trainer/parallel_dims.py::build_mesh
-> models/*/parallelize.py::_resolve_*_dp/fsdp_mesh
-> _build_fsdp_kwargs (只按最后一个 shard 轴判断参数可除性)
-> trainer/base.py::_set_pp_stage_modules / _pp_average_plain_dp_grads
- 若把 HSDP flatten 成一维
dp,fully_shard无法区分外层dp_replicateall-reduce 与内层dp_shardreduce-scatter。 - 因此非 PP HSDP 必须使用有序二维 mesh;
dp_shard=-1必须从实际 mesh 解析。 - PP+replicated-DP 不能把 size-1 shard 轴误判成真实 FSDP;stage 保持普通参数,由 Trainer 在 combined DP group 同步。
- 现有 mesh 无法同时表达外层 HSDP replica sync 与 CP loss domain时明确 fail-fast,避免静默参数分叉。
8.2 PP + nested FSDP + tied parameters
core/pipeline_parallel/scheduler.py::_inject_local_fsdp_actions
-> stage.py::execute_reduce_grad
-> trainer/base.py::_build_pipelined_model
-> model-specific _fsdp_wrap_stage / pipeline_*_for_trainer
- scheduler 必须发现普通 stage 根下的 HSDP child units。
- stage 必须在 meta materialize 后重新取得 live tied parameter,并让所有 shared-group ranks进入相同 collective。
- 每个嵌套 HSDP runtime root都必须在本 optimizer step 完成 final drain。
- stage FSDP 关闭 forward 自动 reshard,参数生命周期交给 pipeline schedule,避免后续 micro-batch 读取已释放 storage。
- core PP 始终使用 unit backward sens;Trainer 在 FSDP/shared/TP/EP/DP 线性归约全部完成后统一执行
dp_size/(n_valid*tp_loss_repeats)梯度归一化,再 clip/step。直接使用 PP 不受 Trainer token-mean 策略影响;直接组合 TP 且把 replicated loss materialize 为 local tensor时,调用方需自行提供1/tpsensitivity。
8.3 Partial Add/Sub 与 dtype
shard ops YAML
-> SubDistributedOp / AddDistributedOp
-> OpDispatcher in-place safety + DTensor identity
-> PrepareModuleOutput reduction dtype
- YAML 确保 Add/Sub/reverse-Sub 进入各自的数学实现。
- elementwise op按每个输入相对输出 Partial 轴的 replicated状态决定本地贡献,保持正确符号和 autograd edge。
- dispatcher保证 in-place 不绕过 Partial 安全边界且不丢 DTensor wrapper。
reduce_dtype只作用于真实 Partial reduction,不把普通 reshard输出意外提升到 FP32。
8.4 VL checkpoint、vision 与 TP local load
checkpoint.py key/layout transform
-> state_dict.py config/namespace selection
-> ModelSpec.tp_load_transform_fn
-> 已 parallelize 的 rank-local parameter
这四处必须配套;只改其中一处会导致 expert 轴错误、层数读取错误或 full checkpoint tensor 与 TP local parameter shape 不匹配。公共 vision package、VL model 的 visual/DeepStack 边界和 parallelize hooks同样必须配套,才能在 TP/CP/PP 前后 gather、注入并恢复正确 layout。
8.5 复杂度治理为何需要配套修改多个文件
新增同步语义曾使若干函数越过代码检查门限。没有加入 suppression 或白名单,而是按职责边界做等价拆分:MoE reducer 参数谓词、VL TP+CP 约束、VL PP schedule、Trainer PP runtime options、ParallelDims 校验与 alias 注册。AST/行为矩阵确认条件、短路顺序、异常文本、schedule 分支和 alias 注册顺序不变;最终 production diff 按远端 Gate 同口径 CCN<20 复验零告警,本轮关键修复函数另按 CCN<=15、NLOC<=100 通过。
9. 验证摘要与边界
- BF16 20-step 单卡/并行:Qwen3.5 dense 12/12,最大误差
0.00203276;Qwen3.5-MoE 11/11,最大误差0.00417256;Qwen3-VL-MoE 14/14,最大误差0.00489401。最终 Trainer-owned scaling 下 densePP2+FSDP2与VPP2+FSDP2最大误差均为0.00147199,densePP2+TP2+FSDP2为0.00203276(step 2),VLPP2+FSDP2/1F1B为0.00242819(step 7)。 - 三模型单卡跨框架 20-step 最大误差均小于
4.9e-9。逐组合的卡数、step1/step20 loss、最大误差和启动步骤见 PR 描述。 - 目标 UT:251 passed,1 skipped,29 subtests passed;最终 squash 树再次复验 Trainer/PP UT 172 passed、1 skipped;Torch Partial 分布式验证 5/5 passed;这些测试文件未随 PR 提交。
- MindSpore runtime 不在本次通过声明中;当前机器因 MindSpore 2.8/CANN 9 运行时不兼容在执行前阻塞。
- 先前 Qwen3.5-MoE 2-layer PP2+FSDP2 的 1F1B/GPipe 最大误差为
0.00794458;最终 Trainer-owned scaling 后未纳入通过矩阵,也不作为本 PR 的数值保证。Qwen3.5-MoEPP+EP当前明确 fail-fast。 - VL PP 的通过声明限定为
param_dtype=bfloat16、reduce/output_dtype=float32;BF16 output 不纳入该 PP 行的通过矩阵。
schema_version: 1
source: gitcode
gitcode_repo: mindspore/hyper-parallel
gitcode_issue: 282
source_url: https://gitcode.com/mindspore/hyper-parallel/issues/282
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with PR #658 and the listed entry points in hyper_parallel/models/spec/model_spec.py, hyper_parallel/models/qwen3_5/, hyper_parallel/models/qwen3_5_moe/, and hyper_parallel/models/qwen3_vl_moe/. Review the trainer, data registry, parallelization, and checkpoint sections to understand the cross-cutting scope; done means the documented Qwen training paths and supported parallel combinations work as described.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data-engineering, distributed-systems, machine-learning
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 15/100