Prhub

#42972 [Model] Use `AutoWeightsLoader` for Voyage

原始 PR 作者 yufufi 合并时间 2026-05-22 13:28 文件变更 1 提交数 8 评论 7 代码增减 +27 / -90

执行摘要

Voyage 模型改用 AutoWeightsLoader

遵循 issue #15697 的要求,将 Voyage 模型迁移至 AutoWeightsLoader 以实现复合模型加载。原来手动融合 QKV 和 MLP 权重的逻辑容易出错且难以维护,标准化为 AutoWeightsLoader 后可以减少模型实现中的重复代码。

值得精读,展示了如何将手动融合逻辑迁移到 AutoWeightsLoader。其他模型维护者可参考此模式,理解 packed_modules_mapping 和组合子模块的用法。

讨论亮点
  • Gemini-code-assist 指出缺少 packed_modules_mapping 属性,会导致 AutoWeightsLoader 无法融合权重,引发 ValueError。作者随后添加了该映射,问题已解决。
  • noooop 提到主分支测试失败,等待修复后合并。最终 PR 在主线恢复后合并。

实现拆解

  1. 结构调整:将 VoyageQwen3BidirectionalEmbedModel 从继承 Qwen3Model 改为组合 nn.Module,并添加 self.model 作为 Qwen3Model 子模块。这样避免了继承复杂性,并允许 AutoWeightsLoader 递归遍历子模块。
  2. 移除手动融合:删除 _fuse_qkv_proj、_fuse_gate_up_proj 方法及相关的 WeightsMapper 和正则表达式。这些融合操作由 AutoWeightsLoader 和 packed_modules_mapping 自动完成。
  3. 添加 packed_modules_mapping:在类上定义 packed_modules_mapping,映射 qkv_proj -> ['q_proj', 'k_proj', 'v_proj'] 和 gate_up_proj -> ['gate_proj', 'up_proj'],指导 AutoWeightsLoader 如何从 checkpoint 中查找并融合权重。
  4. 重写 load_weights:使用 AutoWeightsLoader(self) 并调用其 load_weights(weights),不再需要手动处理前缀和融合。
  5. 适配新结构:更新 __init__、forward 和添加 embed_input_ids 方法,委托给 self.model,保持接口一致。
文件 模块 状态 重要度
vllm/model_executor/models/voyage.py 模型层 modified 8.8

关键符号

VoyageQwen3BidirectionalEmbedModel.__init__ VoyageQwen3BidirectionalEmbedModel.forward VoyageQwen3BidirectionalEmbedModel.load_weights VoyageQwen3BidirectionalEmbedModel.embed_input_ids VoyageQwen3BidirectionalEmbedModel._fuse_qkv_proj (removed) VoyageQwen3BidirectionalEmbedModel._fuse_gate_up_proj (removed)

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

评论区精华

缺少 packed_modules_mapping 属性 正确性

Gemini-code-assist 机器人指出缺少 packed_modules_mapping 属性,会导致 AutoWeightsLoader 无法融合权重,建议添加映射。

结论:作者添加了 packed_modules_mapping,包含 qkv_proj 和 gate_up_proj 的映射。 · 已解决

主分支 CI 失败 other

noooop 指出主分支测试失败,等待修复后合并。

结论:最终主线恢复后合并该 PR。 · 已解决

风险与影响

主要风险在于 AutoWeightsLoader 对 Voyage checkpoint 键的解析是否正确。Checkpoint 前缀 'model.' 通过 maybe_prefix(prefix, 'model') 处理,但若 packed_modules_mapping 键名与 Qwen3Model 内部 fused 层名不一致,将导致权重加载异常。另外,组合结构下子模块路径变化可能影响权重键匹配,但经由 load_weights 的自动遍历应无问题。

影响范围局限于 VoyageQwen3BidirectionalEmbedModel 一个模型。用户需重新加载权重,但语义应保持一致。此 PR 作为 AutoWeightsLoader 推广的示例,有助于后续迁移其他模型。无性能回退,因为 AutoWeightsLoader 内部仍调用相同的 weight_loader。

AutoWeightsLoader 依赖 packed_modules_mapping 组合结构可能改变权重路径 主分支 CI 不稳定影响验证

关联 Issue

#15697 [Feature]: Composite model loading using `AutoWeightsLoader` for all models

完整报告

参与讨论