Skip to content

多模态处理 — 概念

多模态输入处理流水线

输入类型

图像输入

python
# 图像输入格式
{
    "prompt": "描述这张图片",
    "multi_modal_data": {
        "image": PILImage or URL or base64,
    }
}

处理流程:

  1. 图像解码和预处理(resize、normalize)
  2. Vision Encoder 提取特征
  3. 投影层映射到语言模型的 embedding 空间
  4. 替换文本中的 <image> 占位符

音频输入

处理流程:

  1. 音频解码和特征提取(mel spectrogram)
  2. Audio Encoder(通常是 Whisper 编码器)提取特征
  3. 投影层映射到 embedding 空间

视频输入

处理流程:

  1. 视频解码,均匀采样帧
  2. 每帧通过 Vision Encoder
  3. 时序聚合( pooling 或 temporal attention)

编码器缓存

多模态编码器的计算开销很大。vLLM 实现了编码器缓存:

  • EncoderCacheManager:管理编码器输出的缓存
  • 缓存键:输入内容的哈希值
  • 缓存淘汰:LRU 或引用计数策略

多模态注册表

每个模型声明支持的多模态类型:

python
# 简化示意
@ModelRegistry.register("LlavaForConditionalGeneration")
@SupportsMultiModal
class LlavaForConditionalGeneration:
    supported_modalities = ["image"]

    def get_multimodal_processor(self):
        return LlavaProcessor()

新模型:OpenVLA

Vision-Language-Action 模型,用于机器人操控任务:

  • 使用融合 DINOv2 + SigLIP 视觉骨干(通过 timm
  • PrismaticProjector 进行多模态桥接
  • 动作 token 预测输出

编码器 CUDA Graph

多模态编码器现在支持 CUDA Graph 加速:

  • SupportsEncoderCudaGraph 协议重构为 get_encoder_cudagraph_item_specs() 返回 EncoderItemSpec 对象
  • 支持 Step3VL 等模型的编码器 CUDA Graph 捕获
  • 新增 postprocess_encoder_output() 方法,默认行为为 scatter_output_slices

特征融合策略

多模态特征与文本 embedding 的融合方式:

策略描述适用模型
Token 替换图像 token 替换 <image> 占位符LLaVA
Prefix 拼接图像特征拼接到文本前面Qwen-VL
交叉注意力图像特征作为交叉注意力的 K/VFlamingo
交错融合文本和图像 token 交错排列InternVL

多模态模型性能优化

批处理挑战

多模态输入导致 token 数量差异很大:

  • 纯文本请求:~100 tokens
  • 多图请求:~2000+ tokens(每张图可能几百个 token)

优化策略:

  • 动态批处理:根据总 token 数(文本 + 多模态)调整 batch size
  • 编码器预算管理:限制编码器计算的并发量
  • 异步编码:编码器计算与 decode 并行

相关概念