mindspore-ai / mindspore-ai/hyper-parallel

PR658 Qwen3.5/Qwen3-VL-MoE 训练链路与并行修复说明

Open
#227 0 comments 0 reactions 0 assignees View on GitHub

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 的真实训练能力,覆盖以下完整链路:

  1. 从 checkpoint config.json 构建实际模型几何,并完成 HF state-dict 导入/导出和 TP rank-local load transform。
  2. 实现 Qwen3.5 full attention、GatedDeltaNet、packed MoE experts、router/aux loss、Qwen3-VL vision tower、3-D mRoPE、DeepStack 和可选 MTP。
  3. 通过 ModelSpec 把模型构造、并行化、pipeline split 和 checkpoint transform 接入 Trainer。
  4. 增加统一 data.type registry,支持 dummy、VL dummy、HF/JSON、preset tensor 和 Megatron .bin/.idx/blend。
  5. 支持已验证的 DDP/HSDP/FSDP、TP、CP、EP、PP/VPP 及其组合,并对尚不能保证同步域或因果语义的组合提前报错。
  6. 修复组合并行触发的 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_groupsync_shared_parameters_gradget_last_stage_sensexecute_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_contributionAddDistributedOpSubDistributedOp 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 SubSubExt 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_tensorColwiseParallelRowwiseParallelPrepareModuleOutput/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_datasetDATASET_REGISTRY 和内置 dataset 导出 原数据构建散落在 Trainer;新增统一公开入口并通过导入各 builder 完成内置格式注册。
A hyper_parallel/data/registry.py DatasetRegistry.register/get/namesbuild_dataset 原 Trainer 用 if/else 硬编码格式,扩展困难且未知类型报错不清晰;改为 name→builder registry,拒绝重复注册并列出可用类型。
A hyper_parallel/data/dummy.py DummyDatasetbuild_dummy 需要不依赖外部语料且在 1 卡/N 卡使用同一逻辑样本的 LM 输入;每个样本按 train.seed + index 确定性生成,容量覆盖全部训练 steps。
A hyper_parallel/data/hf.py TokenizedDataset_load_raw_maybe_truncatebuild_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 DummyVLDatasetbuild_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_blendbuild_megatron YAML 需要同时表达单 .bin/.idx prefix 和加权多源语料;统一 suffix、seed、pad/EOD/mmap 配置,并生成足够训练样本。
A hyper_parallel/data/megatron/blendable_dataset.py _build_blend_indicesBlendableDataset 用 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、_IndexReaderIndexedDataset/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_configregister_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_keyload_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.forwardStageModule 通用 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_vlregister_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、ForCausalLMStageModule 通用 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_5MoeMTPmtp_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_vlregister_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_keyload_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 DataConfigAcceleratorConfigMixedPrecisionConfigOptimizerConfig 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_aliasbuild_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 成一维 dpfully_shard 无法区分外层 dp_replicate all-reduce 与内层 dp_shard reduce-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/tp sensitivity。
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<=15NLOC<=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 下 dense PP2+FSDP2VPP2+FSDP2 最大误差均为 0.00147199,dense PP2+TP2+FSDP20.00203276(step 2),VL PP2+FSDP2/1F1B0.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-MoE PP+EP 当前明确 fail-fast。
  • VL PP 的通过声明限定为 param_dtype=bfloat16reduce/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

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.