Prhub

#46108 [Model] ColQwen3.5: fix retrieval correctness (bias + bidirectional)

原始 PR 作者 athrael-soju 合并时间 2026-06-22 17:25 文件变更 7 提交数 3 评论 2 代码增减 +79 / -5

执行摘要

修复 ColQwen3.5 检索投影偏置与双向注意力问题

The in-tree ColQwen3_5 model deviates from the native colpali ColQwen3_5Processor inference pipeline in three silent ways, none caught by the current sanity-level tests. Measured cost: ~2.5 ndcg@10 on Vidore3.

值得精读,尤其是 config.py 的数据契约设计和注意力类型处理。对多模态检索模型维护者有参考价值。

讨论亮点

无实质性审查讨论,仅 mergify 自动化操作和作者请求 ready 标签。

实现拆解

步骤拆解:

  1. 修复投影偏置 (vllm/model_executor/models/colqwen3_5.py):将 custom_text_projbias=False 改为 bias=True 并零初始化,使训练好的偏置能被 load_weights 加载。既兼容无偏置 checkpoint,也正确加载有偏置的 checkpoint。
  2. 启用双向注意力 (config.py, qwen3_next.py, attention.py):新建 ColQwen3_5Config 继承 Qwen3.5 配置,设置 hf_config.is_causal=FalseQwen3NextAttention 根据 is_causal 选择 AttentionType.ENCODER_ONLY 并传入 attn 参数;Attention.get_kv_cache_specENCODER_ONLY 返回 None,避免混合模型中 runner 遍历时断言失败。
  3. 配套文档与测试:新增配置验证测试 test_colqwen3_5_config_enables_bidirectional_attention,更新示例脚本说明视觉 token 预算和 prompt 模板,更新模型文档。
文件 模块 状态 重要度
vllm/model_executor/models/config.py 模型配置 modified 7.01
vllm/model_executor/models/qwen3_next.py 注意力层 modified 6.32
vllm/model_executor/models/colqwen3_5.py 模型定义 modified 5.95
vllm/model_executor/layers/attention/attention.py 注意力后端 modified 5.92
tests/models/multimodal/pooling/test_colqwen3_5.py 测试 modified 5.47
examples/pooling/score/colqwen3_5_rerank_online.py 示例 modified 5.74
docs/models/pooling_models/token_embed.md 文档 modified 1.53

关键符号

ColQwen3_5Config.verify_and_update_model_config Qwen3NextAttention.__init__ Attention.get_kv_cache_spec test_colqwen3_5_config_enables_bidirectional_attention

关键源码片段

vllm/model_executor/models/config.py data-contract

引入了 ColQwen3_5Config,设置 is_causal=False,并更新 MODELS_CONFIG_MAP 映射,是双向注意力的配置基础。

# ColQwen3.5 使用双向注意力,继承 Qwen3.5 的 mamba 缓存处理
class ColQwen3_5Config(Qwen3_5ForConditionalGenerationConfig):
    """ColQwen3.5 (late-interaction retrieval) inherits Qwen3.5's mamba cache
    handling and additionally serves BIDIRECTIONAL attention: ColPali-style
    document/query encoding attends over the whole sequence, not causally. Set
    is_causal=False so Qwen3NextAttention builds its full_attention layers with
    AttentionType.ENCODER_ONLY (the linear_attention GatedDeltaNet layers are
    unaffected). Generation arches keep the parent (causal) and are untouched.
    """
​
    @staticmethod
    def verify_and_update_model_config(model_config: "ModelConfig") -> None:
        model_config.hf_config.is_causal = False# 在注册表中替换为新的配置类
MODELS_CONFIG_MAP["ColQwen3_5"] = ColQwen3_5Config # 原为 Qwen3_5ForConditionalGenerationConfig
vllm/model_executor/models/qwen3_next.py data-contract

修改 Qwen3NextAttention,根据 config.is_causal 选择 AttentionType.ENCODER_ONLY 而非默认 DECODER,实现双向注意力。

# 在 Qwen3NextAttention.__init__ 中,根据 config.is_causal 选择注意力类型
# 默认为因果注意力(DECODER),若 is_causal=False 则使用双向编码器注意力(ENCODER_ONLY)
attn_type = (
    AttentionType.DECODER
    if getattr(config, "is_causal", True)
    else AttentionType.ENCODER_ONLY
)
self.attn = Attention(
    self.num_heads,
    self.head_dim,
    self.scaling,
    num_kv_heads=self.num_kv_heads,
    cache_config=cache_config,
    quant_config=quant_config,
    prefix=f"{prefix}.attn",
    attn_type=attn_type, # 显式传入注意力类型,之前未传递,默认 DECODER
    # 其他参数(layer_idx, dual_chunk_attention_config 等)
)

评论区精华

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

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

风险与影响

  • 回归风险:生成模型不受影响(is_causal 未设置时默认 True,维持 DECODER 行为),仅 ColQwen3.5 触发新路径。
  • 兼容风险:偏置零初始化确保无偏置 checkpoint 工作正常;有偏置 checkpoint 正确加载。
  • 性能风险ENCODER_ONLY 注意力不维护 KV 缓存,可能节省内存,但需实际评估。
  • 测试风险:新增配置测试不包含 GPU 推理覆盖,不能保证所有后端兼容。
  • 用户影响:ColQwen3.5 用户检索正确性显著提升,无需修改代码。
  • 系统影响:无。
  • 团队影响:明确了后续 ColPali 风格模型实现的注意事项。
核心路径变更(注意力类型) 缺少 GPU 推理测试覆盖 兼容性(零初始化偏置)

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论