3. 多模态基础

在开始使用 vLLM 部署多模态模型之前,我们必须先建立对多模态数据表示与模型架构的基本认知。vLLM 之所以能够高效服务诸如 LLaVA、Qwen-VL、InternVL 等模型,是因为这些模型在架构上遵循了统一的“编码器-投影器-大语言模型”范式。本章将深入剖析文本、图像、音频、视频四种核心模态在深度学习中的数字化表示方法,并拆解多模态大模型(LMM)的通用架构组件,为后续章节中配置 vLLM 的 --limit-mm-per-prompt 参数、处理多图对话以及调试视觉编码器报错打下坚实的理论基础。

多模态大模型(LMM)通用架构与数据表示 多模态输入 文本 序列 [CLS] Hello [SEP] 图像 Patch 序列 (16x16x3) x 196 音频 Mel 频谱 (128, 3000) 模态编码器 文本嵌入层 ViT / CLIP 视觉编码器 CNN / Whisper 编码器 投影器 MLP / Q-Former 维度对齐 (D -> H) 大语言模型 Transformer Decoder 自回归生成 多模态理解 指令跟随 文本响应输出 关键设计原则: 1. 各模态独立编码,保留原始特征(文本语义、图像空间、音频时序) 2. 投影器将不同模态映射到 LLM 的语义空间(维度对齐) 3. LLM 作为“大脑”统一处理多模态信息,实现跨模态理解与生成 vLLM 支持 LLaVA / Qwen-VL InternVL / MiniCPM-V 多图 / 视频输入

上图展示了当前主流多模态大模型(LMM)的通用架构范式。无论是开源的 LLaVA 还是商业闭源模型,其核心逻辑均遵循“模态编码 → 特征投影 → 语言模型推理”的流水线。下面我们将逐一拆解各模态的表示方法及架构组件。

3.1 文本模态的表示:从 到 Embedding

文本是语言模型的原生模态,其表示方法经历了从离散符号到稠密向量的演变。在深度学习时代,文本的表示分为三个层级:Tokenization(分词)、 Embedding(词嵌入)和Positional Encoding(位置编码)。

3.1.1 核心原理:文本的离散化与向量化

文本无法直接被神经网络处理,必须转化为数值向量。当前主流方法使用 BPE(Byte Pair Encoding) 或 SentencePiece 算法将文本切分为子词单元(Subword )。例如,单词 "unbelievable" 可能被切分为 ["un", "belie", "vable"]。每个 在词表中拥有唯一的整数 ID,随后通过查表(Embedding Lookup)映射为一个高维向量(如 4096 维)。

在 LLaVA 等模型中,文本嵌入层与 LLM 的隐藏层维度保持一致(如 hidden_size=4096),以便后续与图像特征直接拼接。位置编码则采用 RoPE(Rotary Position Embedding)或 ALiBi,用于注入 的顺序信息。

关键点:文本表示的核心是“离散符号 → 稠密向量”的映射。在 vLLM 中,文本 化由 HuggingFace Tokenizer 完成,其输出 input_ids 和 attention_mask 直接作为 LLM 的输入。

3.1.2 操作流程:文本预处理管线

  1. 原始文本清洗:去除 HTML 标签、特殊符号,统一大小写(视模型而定)。
  2. Tokenization:使用模型配套的 Tokenizer 将文本切分为 序列。
  3. ID 映射:将 转换为词表中的整数 ID。
  4. Padding 与 Truncation:将序列填充或截断至固定长度(如 2048)。
  5. Embedding 查询:通过嵌入矩阵将 ID 映射为向量序列。

3.1.3 案例拆解:LLaVA 中的文本处理

在 LLaVA-1.5 中,用户指令 "Describe this image in detail." 会被 Tokenizer 处理为约 8 个 ,每个 对应一个 4096 维的向量。这些向量与图像特征拼接后,共同输入 LLM。值得注意的是,LLaVA 在文本前添加了特殊的 <im_start> 和 <im_end> 标记,用于区分图像与文本的边界。

3.1.4 常见误区与总结

误区:认为文本 Embedding 是静态的。实际上,LLM 中的 Embedding 矩阵在训练过程中会不断更新,以适应多模态对齐任务。此外,不同模型的 Tokenizer 词表大小差异巨大(如 LLaMA 为 32000,Qwen 为 151936),在切换模型时必须使用配套的 Tokenizer。

3.2 图像模态的表示:Patch Embedding 与视觉编码器

图像是视觉语言模型(VLM)的核心输入。与文本不同,图像是连续像素值构成的矩阵,无法直接映射为离散 。当前主流方案借鉴 ViT(Vision Transformer)的思想,将图像切分为 Patch 序列,再通过视觉编码器提取特征。

3.2.1 核心原理:从像素到 Patch 序列

以 CLIP ViT-L/14 为例,输入图像被 Resize 至 336×336 像素,然后切分为 14×14 的 Patch,共得到 24×24=576 个 Patch。每个 Patch 展平后通过线性投影(Patch Embedding)映射为 1024 维向量。随后,这些 Patch 向量与位置编码相加,输入 Transformer 编码器进行特征提取。最终输出的 [CLS] 或全部 Patch 特征作为图像的全局表示。

在 LLaVA 中,视觉编码器输出的特征图(如 576×1024)会经过一个投影层(MLP),将维度从 1024 映射到 LLM 的隐藏层维度(如 4096),以便与文本 Embedding 拼接。

模型 视觉编码器 输入分辨率 Patch 大小 输出特征维度
LLaVA-1.5 CLIP ViT-L/14 336×336 14×14 576×1024
Qwen-VL OpenCLIP ViT-bigG 448×448 14×14 1024×1664
InternVL InternViT-6B 448×448 14×14 1024×4096

3.2.2 操作流程:图像预处理与特征提取

  1. 图像解码:使用 PIL 或 OpenCV 读取图像,转换为 RGB 格式。
  2. Resize 与 CenterCrop:将图像缩放至模型要求的输入尺寸(如 336×336)。
  3. 归一化:像素值除以 255,并按 ImageNet 均值和标准差进行标准化。
  4. Patch 切分:将图像切分为固定大小的 Patch,并展平。
  5. 线性投影:通过可学习的矩阵将 Patch 映射为向量。
  6. Transformer 编码:多层自注意力机制提取全局特征。

3.2.3 案例拆解:多图输入的处理策略

在 vLLM 中,当用户输入多张图像时,每张图像独立经过视觉编码器提取特征,然后按顺序拼接。例如,Qwen-VL 支持最多 128 张图像输入,每张图像生成 256 个视觉 。这些 与文本 拼接后,共同输入 LLM。vLLM 通过 --limit-mm-per-prompt 参数控制每张图像生成的 数量上限,以避免显存溢出。

经验提醒:图像分辨率越高,生成的 Patch 数量越多,视觉 数量也越多。在 vLLM 中,这直接影响 KV Cache 的显存占用。建议根据实际需求调整输入分辨率,或使用 --image--limit 参数限制 数量。

3.2.4 常见误区与总结

误区:认为所有视觉编码器都输出固定数量的 。实际上,不同模型对图像的处理策略差异很大:有的输出全部 Patch 特征(如 LLaVA),有的只输出 [CLS] (如 CLIP),还有的通过 Q-Former 压缩 数量(如 BLIP-2)。在部署时必须查阅模型卡文档,确认视觉 的数量和维度。

3.3 音频与视频模态的表示:时序特征与帧序列

音频和视频模态在表示上比图像更复杂,因为它们包含时间维度。当前多模态模型对音频和视频的处理通常采用“先编码、后融合”的策略。

3.3.1 核心原理:音频的频谱表示与视频的帧采样

音频的常见表示是 Mel 频谱图(Mel Spectrogram)。原始音频波形(如 16kHz 采样率)经过短时傅里叶变换(STFT),转换为时间-频率域的二维矩阵。例如,一段 10 秒的音频,经过 25ms 窗长、10ms 步长处理后,可得到 1000 帧 × 128 Mel 频带的频谱图。该频谱图可视为“单通道图像”,通过 CNN 或 Transformer 编码器提取特征。

视频的表示更为复杂,通常采用 帧采样 + 图像编码 的方式。例如,Video-LLaVA 从视频中均匀采样 8 帧,每帧独立通过视觉编码器提取特征,然后按时间顺序拼接。部分模型(如 Qwen-VL-Max)还引入了 3D 卷积或时序注意力机制,以捕捉帧间运动信息。

3.3.2 操作流程:音频与视频的预处理

  • 音频:重采样 → 预加重 → STFT → Mel 滤波 → 对数压缩 → 归一化。
  • 视频:抽帧(均匀采样或关键帧提取)→ 图像预处理(Resize、归一化)→ 逐帧编码 → 时序拼接。

3.3.3 案例拆解:vLLM 中的视频推理

vLLM 目前对视频的支持有限,但已支持多帧图像输入。例如,将视频按 1fps 抽帧后,将每帧作为独立图像输入模型。在 vLLM 的 兼容接口中,可以通过 image_url 列表传入多帧图像,模型会按顺序处理。这种方式虽然无法捕捉时序信息,但足以应对简单的视频理解任务。

3.3.4 常见误区与总结

误区:将音频和视频直接输入 LLM。实际上,所有多模态模型都需要先将音频/视频转换为视觉或序列特征,再通过投影器映射到 LLM 空间。vLLM 目前对音频输入的支持尚不完善,建议使用专用音频模型(如 Whisper)进行预处理。

3.4 多模态模型的基本架构:编码器-投影器-LLM

理解了各模态的表示方法后,我们来看多模态模型如何将这些异构特征统一起来。几乎所有主流 LMM 都采用 编码器-投影器-LLM 的三段式架构。

3.4.1 核心原理:各组件职责与交互

  • 模态编码器:负责将原始输入(文本、图像、音频)转换为特征向量序列。文本使用嵌入层,图像使用 ViT,音频使用 CNN 或 Transformer。
  • 投影器:负责将不同模态的特征映射到 LLM 的语义空间。常见实现包括:MLP 投影(LLaVA)、Q-Former(BLIP-2)、Cross-Attention(Flamingo)。投影器的核心目标是解决维度不匹配和语义对齐问题。
  • LLM:作为“大脑”,接收拼接后的多模态特征序列,进行自回归生成。LLM 的参数通常保持冻结(或 LoRA 微调),以保留其强大的语言理解和推理能力。

3.4.2 判断方法:如何快速识别模型架构

在部署模型前,可通过以下步骤快速判断其架构类型:

  1. 查看模型卡中的 config.json,确认是否存在 vision_config 和 projector_config 字段。
  2. 检查模型权重文件中是否包含 vision_model、multi_modal_projector 等前缀。
  3. 运行模型前向传播,打印各模块输出的形状,确认特征维度是否匹配。

3.4.3 案例拆解:LLaVA-1.5 的架构参数

组件 具体实现 输出维度 参数量
视觉编码器 CLIP ViT-L/14 576×1024 304M
投影器 2 层 MLP(GELU) 576×4096 8M
LLM Vicuna-7B 序列×4096 6.7B

在 vLLM 中,这些组件被封装为统一的 LLM 类。当调用 llm.generate() 时,vLLM 会自动处理图像预处理、特征提取和拼接,用户无需关心底层细节。

3.4.4 常见误区与总结

误区:认为所有多模态模型都支持任意模态组合。实际上,大多数模型仅支持“图像+文本”或“视频+文本”,对音频的支持有限。在 vLLM 中,如果传入不支持的模态,会抛出 ValueError。务必查阅模型文档确认支持的模态类型。
总结复盘:本章的核心知识点可归纳为三点:
1. 模态表示:文本用 Embedding,图像用 Patch Embedding,音频用 Mel 频谱,视频用帧序列。
2. 架构范式:编码器负责特征提取,投影器负责维度对齐,LLM 负责统一推理。
3. vLLM 实践:vLLM 封装了多模态模型的预处理和推理流程,但用户仍需理解各模态的 数量与显存占用关系,以便合理配置 --limit-mm-per-prompt 参数。