Prhub

#39291 feat: Add LoRA support for Gemma4ForConditionalGeneration

原始 PR 作者 allgather 合并时间 2026-04-18 00:39 文件变更 1 提交数 15 评论 16 代码增减 +10 / -2

执行摘要

为 Gemma4ForConditionalGeneration 添加 LoRA 支持

根据 Issue #39246,用户请求为 Gemma4 多模态模型添加 LoRA 支持。此 PR 实现了最小化可行方案,允许加载 LoRA 适配器并正确映射到语言骨干模块。

该 PR 设计简洁,改动集中,适合作为 vLLM 中为多模态模型添加 LoRA 的参考案例。建议阅读 get_mm_mapping 的实现,理解条件性暴露前缀的设计。同时应尽快补充 Gemma4 专用 LoRA 测试以验证适配器加载。

讨论亮点

审查者 jeejeelee 要求移除无关代码(如 MoE 子串映射),作者遵从并移除。jeejeelee 明确当前仅应支持语言模型 LoRA,塔模块需未来实现。Nik-Reddy 指出缺少 Gemma4 专用 LoRA 测试,作者因资源限制未能提供,但计划后续补充。gemini-code-assist 曾建议将硬编码的 token 数定义为常量,但该部分已从 PR 中移除。

实现拆解

步骤:

  1. 导入 SupportsLoRA 接口:在 vllm/model_executor/models/gemma4_mm.py 的 from .interfaces import 中添加 SupportsLoRA。
  2. 将 SupportsLoRA 加入类基类:在 Gemma4ForConditionalGeneration 的父类列表中加入 SupportsLoRA,标记该类支持 LoRA。
  3. 修改 get_mm_mapping 方法:将硬编码的 connector 和 tower_model 列表改为条件性构建,当 self.audio_tower is not None 时才包含音频相关前缀,确保无音频变体不暴露多余前缀。
    根据 review 移除了最初包含的 MoE 子串映射改动和 token 计数调整,保持变更集中化。
文件 模块 状态 重要度
vllm/model_executor/models/gemma4_mm.py 模型定义 modified 6.18

关键符号

get_mm_mapping

关键源码片段

vllm/model_executor/models/gemma4_mm.py core-logic

唯一修改文件,添加 LoRA 支持所需的最小变更集:SupportsLoRA 接口和条件性 get_mm_mapping 方法。

# 导入部分:.
from .interfaces import (
    MultiModalEmbeddings,
    SupportsEagle3,
    SupportsLoRA, # 新增:支持 LoRA 标志
    SupportsMultiModal,
    SupportsPP,
)
​
# 类定义:将 SupportsLoRA 加入基类列表
class Gemma4ForConditionalGeneration(
    nn.Module,
    SupportsMultiModal,
    SupportsPP,
    SupportsLoRA, # 新增:标记该类支持 LoRA
    SupportsEagle3,
):
    # ... 其他属性和方法不变 ...
​
    def get_mm_mapping(self) -> MultiModelKeys:
        """Get the module prefix mapping for multimodal models."""
        # 根据音频塔存在情况动态构建 connector 和 tower_model 前缀列表
        connectors = ['embed_vision']
        tower_models = ['vision_tower']
        if self.audio_tower is not None:
            connectors.append('embed_audio')
            tower_models.append('audio_tower')
        return MultiModelKeys.from_string_field(
            language_model='language_model',
            connector=connectors,
            tower_model=tower_models,
        )

评论区精华

移除无关代码,仅保留 LoRA 必要变更 设计

jeejeelee 在 review 中指出 MoE 层子串映射等改动与 LoRA 支持无关,应移除。作者随后将其移除。

结论:无关代码被移除,PR 保持最小化变更集合。 · 已解决

缺乏 Gemma4 专用 LoRA 测试 测试

审查者 Nik-Reddy 和 jeejeelee 都指出需要在 Gemma4 模型上运行 LoRA 测试以验证适配器加载。作者因无法获得计算资源而未能提供。

结论:当前无专用测试,依赖其他模型测试覆盖,请求后续添加。 · unresolved

LoRA 支持范围限制:仅语言骨干 设计

jeejeelee 明确指出当前仅应支持语言模型 LoRA,塔模块需未来实现。作者同意并移除了 get_num_mm_encoder_tokens 等方法。

结论:明确当前 PR 仅支持语言骨干 LoRA,多模态塔模块 LoRA 待后续。 · 已解决

风险与影响

  1. 缺少对 Gemma4 真实 LoRA 适配器的测试验证,可能存在加载或推理异常的风险。
  2. 改动范围小,仅影响 Gemma4ForConditionalGeneration 类,但条件性前缀逻辑需确保与权重加载路径一致。
  3. 用户可能误以为塔模块也支持 LoRA,需在文档中明确当前限制。

用户现在可以为 Gemma4 模型使用 LoRA 适配器(仅语言骨干),为多模态 LoRA 功能迈出第一步。对系统无性能或安全影响。团队后续可以此为基础扩展塔模块支持。

缺少 Gemma4 专用 LoRA 测试 仅支持语言骨干 LoRA

关联 Issue

#39246 [Feature]: Add LoRA support for Gemma4ForConditionalGeneration / Gemma 4 models

完整报告

参与讨论