RFC: Qwen3-VL多模态模型适配支持
元数据
| 项目 | 内容 |
|---|---|
| 状态 | 已批准 |
| 作者 | weixin_43368449 |
| 创建日期 | 2025-12-25 |
| 相关链接 | 适配qwen3-vl基础模型 |
1. 概述
本提案旨在解决项目中对Qwen3-VL多模态大语言模型的支持问题,使其能够在tensor_cast框架下正确加载和运行。
2. 详细设计
保持现有架构不变:继续使用现有的逻辑,为适配多模态模型增加不同的适配逻辑。
- 为确保职责单一,我们设计了一个独立的
VLModelWrapper类来实现多模态模型的前向传播逻辑。 - 推理脚本中增加对图像输入的支持。
- 对vision、text部分的处理逻辑进行适配和修改,包括但不限于注意力机制、旋转位置编码等。
2.1 实现方案
2.1.1 推理脚本增强
在推理脚本中,我们增加了对图像输入的支持:
- 添加了
generate_image_inputs函数用于生成图像相关的输入张量 - 增加了命令行参数支持:
--image-batch-size、--image-height、--image-width - 实现了图像尺寸调整功能,确保符合模型要求
2.1.2 新增VLModelWrapper类
为了支持Qwen3-VL这样的视觉语言模型,我们新增了VLModelWrapper类,专门处理多模态模型的前向传播逻辑。该类继承自ModelWrapperBase,能够处理图像输入、文本输入及其融合。
关键特性包括:
- 支持pixel_values、image_grid_thw等图像相关输入参数
- 处理视觉层的注意力机制初始化
- 适配视觉-语言特征融合过程
- 提供统一的多模态前向传播接口
2.1.3 处理逻辑适配
视觉注意力机制适配
在flash_attention_forward函数中,我们增加了对视觉注意力的判断逻辑。通过检查attention_by_layers参数是否存在来区分是视觉注意力还是文本注意力。对于视觉注意力,我们采用不同的索引机制和处理逻辑,包括:
- 针对视觉特征的特殊注意力计算方式
- 适配视觉token与文本token之间的交互
旋转位置编码适配
在CachingRotaryEmb类中,我们通过判断position_ids的维度,如果为vl,则将其转为text_position_ids来统一处理
2.2 替代方案
2.3 方案分析
选择当前方案的原因:
-
架构清晰性:通过新增VLModelWrapper类,保持了现有架构的清晰性,遵循单一职责原则,避免了对现有代码的大规模修改。
-
可维护性:多模态模型的特殊逻辑被封装在独立的类中,便于后续维护和扩展。
-
兼容性:不影响现有的大语言模型处理流程,保证了向后兼容性。
3. 实施计划
已完成功能开发
- 完成qwen3-vl在单卡下的prefill、decode的仿真功能
后续优化
- 多卡并行时vision部分的并行方式
- prefill阶段compile的支持
- moe的支持以及并行方式
- 增加对qwen2.5-vl的支持
- 增加对视频输入的支持