3、多模态基础:理解文本、图像、音频、视频等模态的表示方法及多模态模型的基本架构
在开始使用 vLLM 部署多模态模型之前,我们必须先建立对多模态数据表示与模型架构的基本认知。vLLM 之所以能够高效服务诸如 LLaVA、Qwen-VL、InternVL 等模型,是因为这些模型在架构上遵循了统一的“编码器-投影器-大语言模型”范式。本章将深入剖析文本、图像、音频、视频四种核心模态在深度学习中的数字化表示方法,并拆解多模态大模型(LMM)的通用架构组件,为后续章节中配置 vLLM 的 --limit-mm-per-prompt 参数、处理多图对话以及调试视觉编码器报错打下坚实的理论基础。
上图展示了当前主流多模态大模型(LMM)的通用架构范式。无论是开源的 LLaVA 还是商业闭源模型,其核心逻辑均遵循“模态编码 → 特征投影 → 语言模型推理”的流水线。下面我们将逐一拆解各模态的表示方法及架构组件。
3.1 文本模态的表示:从 Token 到 Embedding
文本是语言模型的原生模态,其表示方法经历了从离散符号到稠密向量的演变。在深度学习时代,文本的表示分为三个层级:Tokenization(分词)、Token Embedding(词嵌入)和Positional Encoding(位置编码)。
3.1.1 核心原理:文本的离散化与向量化
文本无法直接被神经网络处理,必须转化为数值向量。当前主流方法使用 BPE(Byte Pair Encoding) 或 SentencePiece 算法将文本切分为子词单元(Subword Token)。例如,单词 "unbelievable" 可能被切分为 ["un", "belie", "vable"]。每个 Token 在词表中拥有唯一的整数 ID,随后通过查表(Embedding Lookup)映射为一个高维向量(如 4096 维)。
在 LLaVA 等模型中,文本嵌入层与 LLM 的隐藏层维度保持一致(如 hidden_size=4096),以便后续与图像特征直接拼接。位置编码则采用 RoPE(Rotary Position Embedding)或 ALiBi,用于注入 Token 的顺序信息。
input_ids 和 attention_mask 直接作为 LLM 的输入。
3.1.2 操作流程:文本预处理管线
- 原始文本清洗:去除 HTML 标签、特殊符号,统一大小写(视模型而定)。
- Tokenization:使用模型配套的 Tokenizer 将文本切分为 Token 序列。
- ID 映射:将 Token 转换为词表中的整数 ID。
- Padding 与 Truncation:将序列填充或截断至固定长度(如 2048)。
- Embedding 查询:通过嵌入矩阵将 ID 映射为向量序列。
3.1.3 案例拆解:LLaVA 中的文本处理
在 LLaVA-1.5 中,用户指令 "Describe this image in detail." 会被 Tokenizer 处理为约 8 个 Token,每个 Token 对应一个 4096 维的向量。这些向量与图像特征拼接后,共同输入 LLM。值得注意的是,LLaVA 在文本前添加了特殊的 <im_start> 和 <im_end> 标记,用于区分图像与文本的边界。
3.1.4 常见误区与总结
3.2 图像模态的表示:Patch Embedding 与视觉编码器
图像是视觉语言模型(VLM)的核心输入。与文本不同,图像是连续像素值构成的矩阵,无法直接映射为离散 Token。当前主流方案借鉴 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] Token 或全部 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 操作流程:图像预处理与特征提取
- 图像解码:使用 PIL 或 OpenCV 读取图像,转换为 RGB 格式。
- Resize 与 CenterCrop:将图像缩放至模型要求的输入尺寸(如 336×336)。
- 归一化:像素值除以 255,并按 ImageNet 均值和标准差进行标准化。
- Patch 切分:将图像切分为固定大小的 Patch,并展平。
- 线性投影:通过可学习的矩阵将 Patch 映射为向量。
- Transformer 编码:多层自注意力机制提取全局特征。
3.2.3 案例拆解:多图输入的处理策略
在 vLLM 中,当用户输入多张图像时,每张图像独立经过视觉编码器提取特征,然后按顺序拼接。例如,Qwen-VL 支持最多 128 张图像输入,每张图像生成 256 个视觉 Token。这些 Token 与文本 Token 拼接后,共同输入 LLM。vLLM 通过 --limit-mm-per-prompt 参数控制每张图像生成的 Token 数量上限,以避免显存溢出。
--image-token-limit 参数限制 Token 数量。
3.2.4 常见误区与总结
[CLS] Token(如 CLIP),还有的通过 Q-Former 压缩 Token 数量(如 BLIP-2)。在部署时必须查阅模型卡文档,确认视觉 Token 的数量和维度。
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 的 OpenAI 兼容接口中,可以通过 image_url 列表传入多帧图像,模型会按顺序处理。这种方式虽然无法捕捉时序信息,但足以应对简单的视频理解任务。
3.3.4 常见误区与总结
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 判断方法:如何快速识别模型架构
在部署模型前,可通过以下步骤快速判断其架构类型:
- 查看模型卡中的
config.json,确认是否存在vision_config和projector_config字段。 - 检查模型权重文件中是否包含
vision_model、multi_modal_projector等前缀。 - 运行模型前向传播,打印各模块输出的形状,确认特征维度是否匹配。
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 常见误区与总结
ValueError。务必查阅模型文档确认支持的模态类型。
1. 模态表示:文本用 Token Embedding,图像用 Patch Embedding,音频用 Mel 频谱,视频用帧序列。
2. 架构范式:编码器负责特征提取,投影器负责维度对齐,LLM 负责统一推理。
3. vLLM 实践:vLLM 封装了多模态模型的预处理和推理流程,但用户仍需理解各模态的 Token 数量与显存占用关系,以便合理配置
--limit-mm-per-prompt 参数。