Appearance
多模态处理 — 概念
多模态输入处理流水线
输入类型
图像输入
python
# 图像输入格式
{
"prompt": "描述这张图片",
"multi_modal_data": {
"image": PILImage or URL or base64,
}
}处理流程:
- 图像解码和预处理(resize、normalize)
- Vision Encoder 提取特征
- 投影层映射到语言模型的 embedding 空间
- 替换文本中的
<image>占位符
音频输入
处理流程:
- 音频解码和特征提取(mel spectrogram)
- Audio Encoder(通常是 Whisper 编码器)提取特征
- 投影层映射到 embedding 空间
视频输入
处理流程:
- 视频解码,均匀采样帧
- 每帧通过 Vision Encoder
- 时序聚合( 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/V | Flamingo |
| 交错融合 | 文本和图像 token 交错排列 | InternVL |
多模态模型性能优化
批处理挑战
多模态输入导致 token 数量差异很大:
- 纯文本请求:~100 tokens
- 多图请求:~2000+ tokens(每张图可能几百个 token)
优化策略:
- 动态批处理:根据总 token 数(文本 + 多模态)调整 batch size
- 编码器预算管理:限制编码器计算的并发量
- 异步编码:编码器计算与 decode 并行
相关概念
- KV Cache — 多模态 token 的 KV 缓存管理
- Continuous Batching — 多模态请求的调度
- Prefix Caching — 编码器输出的缓存复用