Prhub

#35418 [Diffusion] Support MiniMax-H3 pruned safetensors checkpoints

原始 PR 作者 mickqian 合并时间 2026-08-20 19:34 文件变更 9 提交数 3 评论 0 代码增减 +672 / -41

执行摘要

支持 MiniMax-H3 pruned 与 Comfy FP8 safetensors 加载

用户难以直接加载 MiniMax-H3 官方发布的 pruned BF16 与 Comfy FP8 scaled checkpoint,缺少自动识别会导致加载时出现误导性的缺权重错误。本 PR 在 #35370 通用 GGUF 支持之上,用 checkpoint 自描述元数据驱动加载,避免重复实现 GGUF 加载器,同时按 Comfy full_precision_matrix_mult 标记保留数值语义并维持 FP8 显存收益。

值得精读。重点学习三处设计:

1) comfy_fp8.py 中 FP8 存储与全精度计算分离的逐层分派,平衡显存与数值语义;
2) minimax_h3_weights.py 在模型构建前完成全部校验,把误导性缺权重错误提前转化为明确格式错误;
3) transformer_load_utils.py 的 HF 文件引用解析,用正则与启发式判断处理三种输入形态。

讨论亮点

该 PR 没有 review 评论,作者在 PR body 中记录了关键验证细节:通过检查官方 Comfy FP8 元数据(200 个 per-layer 标记,其中 50 个 full-precision 层)确认分派逻辑;H100 端到端加载 20,958,205,608 字节的 Comfy FP8 checkpoint,实例化 19.61 GB pruned DiT,2 步 1344x768 请求产出 107 帧视频加立体声,48.43 秒完成,21,236 MB 峰值显存。多 GPU 端到端验证因共享宿主在 NCCL 初始化时杀掉额外 worker 进程而留给 CI,TP1/2/4 的 grouped-QKV 复制路径由单元测试覆盖。

实现拆解

  1. Checkpoint 自描述检测:新增 minimax_h3_weights.py,在模型构建前用 safe_open 扫描 safetensors,读取 adaln_t_table 形状识别 pruned BF16,读取 comfy_quant JSON 标记识别 Comfy FP8;对 FP8 权重做标记完整性校验,对 int8_tensorwise 或缺失 scale 的 checkpoint 提前抛出明确错误。
  2. 新增 Comfy FP8 量化配置comfy_fp8.py 定义 ComfyFp8ConfigComfyFullPrecisionFp8LinearMethod,按 full_precision_matrix_mult 标记逐层分派——普通层复用原生静态 FP8 线性路径,标记层用反量化权重做普通 GEMM,但权重仍以 FP8 驻留显存,避免永久展开为 BF16。
  3. 加载流程接入transformer_loader.pyMiniMaxH3DiTModel 分支中调用检查函数,把 checkpoint_quant_config 传入 resolve_transformer_quant_load_spec;Comfy FP8 拒绝 FSDP 推理,并用 comfy_quant_key_filter 过滤元数据键;同时把 adaln_curve_shape 回写到 dit_config
  4. 路径解析与配置冲突transformer_load_utils.py 新增 HF 文件引用解析(直接 URL 或 owner/repo/path/file.safetensors 引用)和 is_comfy_fp8 属性,resolve_transformer_quant_load_spec 新增 checkpoint_quant_config 参数,与显式 --quantization 冲突时报错。
  5. 测试与文档test_transformer_quant.py 增加 8 个单元测试覆盖检查、分派、数值与冲突场景;test_minimax_h3_dit_contract.py 扩展 FP8 grouped-QKV TP 复制覆盖;cookbook 与 quantization.mdx 文档同步更新。
文件 模块 状态 重要度
python/sglang/multimodal_gen/runtime/layers/quantization/comfy_fp8.py 量化层 added 8.9
python/sglang/multimodal_gen/runtime/loader/minimax_h3_weights.py 加载器 added 8.89
python/sglang/multimodal_gen/runtime/loader/transformer_load_utils.py 加载器 modified 7.16
python/sglang/multimodal_gen/runtime/loader/component_loaders/transformer_loader.py 加载器 modified 6.9
python/sglang/multimodal_gen/test/unit/test_transformer_quant.py 测试 modified 7.13
python/sglang/multimodal_gen/test/unit/test_minimax_h3_dit_contract.py 测试 modified 5.26
python/sglang/multimodal_gen/runtime/models/dits/minimax_h3.py 模型定义 modified 4.71
docs/cookbook/diffusion/MiniMax/MiniMax-H3.mdx 文档 modified 3.55
docs/docs/sglang-diffusion/quantization.mdx 文档 modified 3.31

关键符号

ComfyFullPrecisionFp8LinearMethod.apply ComfyFp8Config.get_quant_method inspect_minimax_h3_safetensors resolve_minimax_h3_checkpoint_quantization validate_minimax_h3_checkpoint_variant comfy_quant_key_filter TransformerQuantLoadSpec.is_comfy_fp8 resolve_transformer_safetensors_to_load resolve_transformer_quant_load_spec transformer_loader.load_customized

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. FP8 数值风险ComfyFullPrecisionFp8LinearMethod.apply 直接在 x.dtype 下反量化权重做 F.linear,未走量化感知路径,数值对齐依赖作者手工核对官方元数据和单次 H100 验证,缺少多卡与多 prompt 的回归矩阵。
  2. FSDP 兼容性限制:Comfy FP8 checkpoint 明确拒绝 FSDP 推理,若团队配置了 FSDP 加载会直接报错,可能影响既有部署脚本。
  3. 路径解析回归resolve_transformer_safetensors_to_load 的 HF 引用判定涉及 os.path.exists 与后缀判断,对不存在的相对路径且不含 ./~ 前缀的文件可能误判为 HF 引用,需关注本地路径的兼容性。
  4. 多 GPU 验证缺口:PR body 说明多 GPU 端到端验证留给 CI,TP 下的 FP8 数值一致性仍需 CI 结果确认。

对用户:可直接通过 --transformer-weights-path 传入本地文件、HF URL 或仓库内引用加载 MiniMax-H3 pruned BF16 与 Comfy FP8 scaled checkpoint,FL2VA 与 Ref2VA 均可使用,TP、Ulysses/Ring 序列并行与组件 offload 保持可用。对系统:加载流程新增 checkpoint 自描述元数据驱动模式,对后续其他模型的量化格式识别有参考价值;HF 文件引用解析对所有 diffusion transformer 加载路径生效。对团队:该 PR 补上了 MiniMax-H3 从 GGUF 到 pruned/FP8 的完整格式矩阵,配合后续短边校验放宽与 CI 一致性覆盖,形成较完整的模型支持闭环。

FP8 数值依赖手工验证 多 GPU 端到端留待 CI FSDP 兼容性限制 HF 引用解析可能误判本地路径

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论