Prhub

#27379 [diffusion] model: support Ideogram4 NVFP4

原始 PR 作者 mickqian 合并时间 2026-06-06 11:14 文件变更 24 提交数 11 评论 3 代码增减 +1342 / -59

执行摘要

新增 Ideogram4 NVFP4 原生支持

SGLang需要原生支持Comfy-Org/Ideogram-4 NVFP4混合精度检查点,以便用户可以直接加载和运行该扩散模型,无需外部转换步骤。

建议阅读此PR以了解如何在SGLang中集成新的扩散模型和量化方案。重点关注bitsandbytes适配器的设计、Comfy布局推断逻辑以及量化线性层的工厂模式。对于review中提出的两个正确性问题,建议在后续迭代中修复。

讨论亮点

评论1(正确性):在model_specific_stages/ideogram.py第343行,gemini-code-assist[bot]指出如果batch.preset显式为Nonegetattr返回None会导致ValueError。建议使用getattr(batch, "preset", "V4_DEFAULT_20") or "V4_DEFAULT_20"回退。合并前未明确修复。
评论2(正确性):在rotary_embedding/mrope.py第132行,评论指出qwen3_apply_rotary_pos_embposition_ids形状检查不完善:当形状为[3, B, 3]时,由于最后维度长度为3会误触发permute。建议先检查第一维是否为3。同样未被证实已修复。

实现拆解

  1. 新增量化配置与适配器:在bitsandbytes.py中定义BitsAndBytesConfig类和版本检查函数,在transformer_load_utils.py中添加_BitsAndBytes4BitAdapter,确保在bitsandbytes量化时禁用不兼容的CPU卸载和FSDP推理模式。
  2. 改造DiT模型线性层:在ideogram.py中引入Ideogram4QuantizedLinear(继承自ReplicatedLinear),修改_linear工厂函数,根据quant_config参数选择使用原有权重FP8线性或新增的量化线性,同时为所有子模块传递前缀以支持权重挂载。
  3. 新增NVFP4流水线:在pipelines/ideogram.py中创建Ideogram4Nvfp4Pipeline子类,实现自动解析NVFP4检查点路径:优先使用server_args.transformer_weights_path覆盖,否则从模型目录下载条件/无条件权重文件,并从基础FP8模型加载其余配置。
  4. 增强量化工具:在quantization_utils.py中增加safetensors元数据读取函数_read_safetensors_tensor_metadata和NVFP4张量族识别函数_is_nvfp4_tensor_family,用于推断Comfy检查点的量化布局(swizzled scales等)。
  5. 文本编码器量化加载:在encoders/ideogram.py中增加_load_bitsandbytes_4bit_weights方法,当检测到ideogram_bnb_4bit_weight_only配置时,将文本编码器的线性层替换为bitsandbytes 4-bit版本,并加载对应的量化状态。
  6. 测试与验证:添加单元测试覆盖路径解析、量化配置推断,以及B200集成测试验证端到端生成一致性。
文件 模块 状态 重要度
python/sglang/multimodal_gen/runtime/layers/quantization/bitsandbytes.py 量化配置 added 8.89
python/sglang/multimodal_gen/runtime/models/dits/ideogram.py DiT 模型 modified 8.82
python/sglang/multimodal_gen/runtime/pipelines/ideogram.py 流水线 modified 8.33
python/sglang/multimodal_gen/runtime/loader/transformer_load_utils.py 加载器 modified 7.5
python/sglang/multimodal_gen/runtime/utils/quantization_utils.py 量化工具 modified 7.46

关键符号

_require_bitsandbytes BitsAndBytesConfig.__init__ _linear Ideogram4QuantizedLinear.forward resolve_ideogram4_nvfp4_model _BitsAndBytes4BitAdapter.prepare _build_nvfp4_config_from_safetensors_files _load_bitsandbytes_4bit_weights

关键源码片段

python/sglang/multimodal_gen/runtime/layers/quantization/bitsandbytes.py dependency-wiring

新增 BitsAndBytes4Bit 量化配置,定义加载逻辑与版本检查,是 NVFP4 量化支持的核心。

# SPDX-License-Identifier: Apache-2.0
# bitsandbytes.py — BitsAndBytes 4-bit 量化配置与辅助函数from __future__ import annotations
import torch
from packaging import version
from sglang.multimodal_gen.runtime.layers.quantization.configs.base_config import (
    QuantizationConfig,
)def _require_bitsandbytes() -> None:
    """
    检查 bitsandbytes 版本 >= 0.46.1,若不满足则抛出 ImportError。
    确保后续量化加载操作有正确的运行时环境。
    """
    try:
        import bitsandbytes
        if version.parse(bitsandbytes.__version__) < version.parse("0.46.1"):
            raise ImportError(
                "bitsandbytes version is wrong. Please install bitsandbytes>=0.46.1."
            )
    except ImportError as err:
        raise ImportError(
            "Please install bitsandbytes>=0.46.1 via "
            "`pip install bitsandbytes>=0.46.1` to use bitsandbytes quantizer."
        ) from errclass BitsAndBytesConfig(QuantizationConfig):
    """
    预量化 bitsandbytes 4-bit 检查点配置。
    仅支持 load_in_4bit = True 且 quant_type = 'fp4',
    存储格式必须为 uint8。
    """
    def __init__(
        self,
        load_in_8bit: bool = False,
        load_in_4bit: bool = True,
        bnb_4bit_quant_type: str = "fp4",
        bnb_4bit_quant_storage: str = "uint8",
        bnb_4bit_compute_dtype: str = "float32",
        bnb_4bit_use_double_quant: bool = False,
        llm_int8_skip_modules: list[str] | None = None,
        llm_int8_threshold: float = 6.0,
    ) -> None:
        super().__init__()
        if load_in_8bit or not load_in_4bit:
            raise ValueError("SGLang diffusion only supports bitsandbytes 4-bit.")
        if bnb_4bit_quant_storage != "uint8":
            raise ValueError("Unsupported bnb_4bit_quant_storage.")
        self.load_in_4bit = load_in_4bit
        self.bnb_4bit_quant_type = bnb_4bit_quant_type
​
    @classmethod
    def get_name(cls) -> str:
        return "bitsandbytes"
python/sglang/multimodal_gen/runtime/models/dits/ideogram.py data-contract

改造 Ideogram4 DiT 模型,使线性层支持 NVFP4 量化,通过 _linear 工厂函数选择量化类型。

# ideogram.py — Ideogram4 DiT 模型,支持 NVFP4 量化线性层from sglang.multimodal_gen.runtime.layers.linear import ReplicatedLinear
from sglang.multimodal_gen.runtime.layers.quantization.configs.base_config import (
    QuantizationConfig,
)
from sglang.multimodal_gen.runtime.layers.quantization.weight_only_fp8 import (
    WeightOnlyFP8Linear,
)class Ideogram4QuantizedLinear(ReplicatedLinear):
    """包装 ReplicatedLinear,仅返回 output 而不返回 bias。"""
    def forward(self, x: torch.Tensor) -> torch.Tensor:
        # ReplicatedLinear.forward 返回 (output, bias) 元组,这里只取 output
        return super().forward(x)[0]def _linear(
    in_features: int,
    out_features: int,
    bias: bool = True,
    quant_config: QuantizationConfig | None = None,
    prefix: str = "",
) -> nn.Module:
    """
    工厂函数:根据 quant_config 决定创建 WeightOnlyFP8Linear
    还是 Ideogram4QuantizedLinear。
    prefix 用于后续权重加载时从参数字典定位对应的层。
    """
    if quant_config is None:
        return WeightOnlyFP8Linear(in_features, out_features, bias=bias)
    return Ideogram4QuantizedLinear(
        in_features,
        out_features,
        bias=bias,
        quant_config=quant_config,
        prefix=prefix,
    )

评论区精华

batch.preset 为 None 时的 fallback 缺陷 正确性

评论指出如果 batch.preset 显式设为 None,getattr 返回 None,导致后续检查抛出 ValueError。建议使用 getattr(batch, "preset", "V4_DEFAULT_20") or "V4_DEFAULT_20" 回退。

结论:作者未确认是否修复,PR 已合并但该问题可能仍存在。 · unresolved

position_ids 形状检查误触发导致错误 permute 正确性

在 qwen3_apply_rotary_pos_emb 中,如果 position_ids 形状为 [3, B, 3],由于最后维度检查 S==3 会误判,将其 permute 为 [3, 3, B]。建议先检查第一维是否为 3。

结论:建议未被采纳,PR 合并前未修复。 · unresolved

风险与影响

  1. 依赖风险:新增bitsandbytes>=0.46.1依赖,环境不满足时加载失败。
  2. 布局兼容性:Comfy检查点布局推断基于safetensors元数据键名和形状,若官方调整格式可能导致推断失效。
  3. 遗留缺陷:review中提出的两个边界问题(preset为None、position_ids形状)未经修复,可能在特定输入下触发错误。
  4. 文本编码器加载:bitsandbytes 4-bit权重加载路径可能遗漏某些量化状态,导致推理精度下降。

影响范围限于diffusion模块的Ideogram4模型,其他模型无影响。新增代码1.3k行,主要集中在量化配置和DiT模型改造。对B200 GPU有专门CI验证,无微基准性能退化预期。团队成员需要维护新的量化路径和适配器。

新依赖 bitsandbytes 版本要求 Comfy 布局推断脆弱 文本编码器量化可能遗漏权重 review 中未修复的 preset 边界

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论