Prhub

#26492 [diffusion] model: update to new model format

原始 PR 作者 nv-dmajchrowski 合并时间 2026-05-29 12:08 文件变更 4 提交数 5 评论 7 代码增减 +143 / -495

执行摘要

更新 Cosmos3 至新 diffusers 格式,使用外部 guardrails 包

PR #24994 添加了对一个尚未发布的 world model 的初始支持。最终 checkpoint 格式略有变化,本 PR 更新代码库以适配新版 checkpoint。此外,移除了自定义 guardrails 代码,改用包驱动的方式(用户需在运行模型前通过 pip 手动安装)。

建议开发者和维护者重点阅读 cosmos3_guardrails.py 的重写思路和配置文件的映射设计。本 PR 展示了将自实现功能迁移到专用外部包的典型模式,以及如何在演进中保持与 upstream checkpoint 的一致。对于部署人员,需注意新增的 pip 依赖。

讨论亮点

gemini-code-assist 指出了两个问题:

  • check_video_safety 中,当输入视频维度为 5(批处理)时,只处理了 video[0],忽略其余批次,导致正确性问题。作者已修复为循环处理所有批次。
  • _init_guardrails 中,遍历 runner.models 前应判断 runner 是否为 None 并检查 hasattr,避免潜在的 AttributeError。作者已添加防御性检查。
    两个问题均已解决并推送。

实现拆解

  1. 更新权重参数名映射:在 python/sglang/multimodal_gen/configs/models/dits/cosmos3video.py_build_cosmos3_param_names_mapping 中,移除所有源键的 model. 前缀;将 UND 路径的 q_proj/k_proj/v_proj 改为 to_q/to_k/to_v;GEN 路径的 q_proj_moe_gen 改名为 add_q_proj/add_k_proj/add_v_projo_proj_moe_gen 改为 to_add_outq/k_norm_moe_gen 改为 norm_added_q/ktime_embedder.mlp.0/2 直接改为直通 linear_1/2(因新版 checkpoint 已使用 linear_* 命名)。
  2. 重命名潜变量投影层:在 python/sglang/multimodal_gen/runtime/models/dits/cosmos3video.py 中,将 vae2llm 改为 proj_inllm2vae 改为 proj_out,并同步更新 forward 中的引用与 _cast_direct 中的类型转换循环。
  3. 用外部 guardrails 包替换自实现python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/cosmos3_guardrails.py 从 ~400 行重写为 ~60 行,删除 SafetyClassifier_pixelate_face_download_checkpoint_build_text_guardrail 等函数,新增 _init_guardrails(惰性加载 CosmosSafetyChecker 并支持 offload_to_cpu),以及 check_text_safetycheck_video_safety 两个外部调用接口;Cosmos3TextGuardrailStageforward 改为调用 check_text_safety;并修复批处理视频检查的 bug。
  4. 更新测试python/sglang/multimodal_gen/test/unit/test_cosmos3.py 中的 test_model_norm_dropped 改为 test_norm_dropped(去掉 model. 前缀),增加 test_audio_proj_in_droppedtest_action_proj_in_dropped;GEN/UND 路径的 Q/K/V 测试键名同步改为新格式,并新增 test_gen_norm_added_q/k
  5. 标记未支持的模态:在参数映射中添加 r"^audio_.*$": ""r"^action_.*$": "",避免加载时产生警告。
文件 模块 状态 重要度
python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/cosmos3_guardrails.py 安全检查 modified 9.05
python/sglang/multimodal_gen/configs/models/dits/cosmos3video.py 模型配置 modified 7.14
python/sglang/multimodal_gen/test/unit/test_cosmos3.py 单元测试 modified 6.26
python/sglang/multimodal_gen/runtime/models/dits/cosmos3video.py 模型运行时 modified 6.1

关键符号

_build_cosmos3_param_names_mapping _init_guardrails check_text_safety check_video_safety Cosmos3Video.__init__ Cosmos3Video.forward Cosmos3TextGuardrailStage.forward

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

评论区精华

check_video_safety 批处理 bug 正确性

gemini-code-assist 指出当 video.ndim == 5 时,代码错误地只处理 video[0],忽略批次中其余视频,导致正确性问题。

结论:作者已修复,改为循环处理所有批次并堆叠输出。 · 已解决

_init_guardrails 防御性检查 正确性

gemini-code-assist 建议在遍历 runner.models 前检查 runner 是否为 None 且具有 models 属性,防止外部包 API 变更导致 AttributeError。

结论:作者已添加 if runner is not None and hasattr(runner, "models") 的防御性判断。 · 已解决

风险与影响

  • 外部依赖风险:用户必须手动安装 cosmos-guardrail==0.3.1,若遗漏则运行时抛出 ImportError;该包可能随着 API 更新而破坏兼容性。
  • 权重映射兼容性:旧版本 checkpoint 因前缀和键名变化无法直接加载,需要重新转换权重或使用迁移脚本。
  • 批处理安全性修复有效性:虽然作者已修改批处理逻辑,但测试未覆盖多视频场景,可能仍有边界条件未覆盖。
  • 模态预留:audio/action 权重被显式跳过,若后续需要支持,需在映射中添加对应条目并更新模型结构。
  • 用户:用户需要额外执行 pip install cosmos-guardrail==0.3.1;如果使用旧 checkpoint 或自定义加载流程,需调整权重键名。
  • 系统:安全检查不再由 SGLang 内部维护,而是委托给外部包,减轻了维护负担,但也引入了对第三方包的依赖。
  • 团队:Cosmos3 相关代码量显著减少(-495 行),架构更清晰;但需要关注外部包的更新和兼容性。
外部依赖 cosmos_guardrail 权重映射破坏旧 checkpoint 兼容性 批处理 bug 修复需验证 音频 / 动作模态未支持

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论