RFC: Qwen3-VL多模态模型适配支持

元数据

项目 内容
状态 已批准
作者 weixin_43368449
创建日期 2025-12-25
相关链接 适配qwen3-vl基础模型

1. 概述

本提案旨在解决项目中对Qwen3-VL多模态大语言模型的支持问题,使其能够在tensor_cast框架下正确加载和运行。

2. 详细设计

保持现有架构不变:继续使用现有的逻辑,为适配多模态模型增加不同的适配逻辑。

  • 为确保职责单一,我们设计了一个独立的VLModelWrapper类来实现多模态模型的前向传播逻辑。
  • 推理脚本中增加对图像输入的支持。
  • 对vision、text部分的处理逻辑进行适配和修改,包括但不限于注意力机制、旋转位置编码等。

2.1 实现方案

2.1.1 推理脚本增强

在推理脚本中,我们增加了对图像输入的支持:

  1. 添加了generate_image_inputs函数用于生成图像相关的输入张量
  2. 增加了命令行参数支持:--image-batch-size--image-height--image-width
  3. 实现了图像尺寸调整功能,确保符合模型要求

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 方案分析

选择当前方案的原因:

  1. 架构清晰性:通过新增VLModelWrapper类,保持了现有架构的清晰性,遵循单一职责原则,避免了对现有代码的大规模修改。

  2. 可维护性:多模态模型的特殊逻辑被封装在独立的类中,便于后续维护和扩展。

  3. 兼容性:不影响现有的大语言模型处理流程,保证了向后兼容性。

3. 实施计划

已完成功能开发

  • 完成qwen3-vl在单卡下的prefill、decode的仿真功能

后续优化

  • 多卡并行时vision部分的并行方式
  • prefill阶段compile的支持
  • moe的支持以及并行方式
  • 增加对qwen2.5-vl的支持
  • 增加对视频输入的支持