MiniCPM-V系列是面壁智能推出的小参数量的开源多模态大模型,没有超过9B的版本。主打小而强。
官方目前只放出了MiniCPM-Llama3-V 2.5的paper,2.0只有技术博客而且主要是效果展示。
目前一共出了以下几代:MiniCPM-V、MiniCPM-V 2.0、MiniCPM-Llama3-V 2.5、MiniCPM-V 2.6。
项目地址:https://github.com/OpenBMB/MiniCPM-V
paper:https://arxiv.org/abs/2408.01800
title:《MiniCPM-V: A GPT-4V Level MLLM on Your Phone》
MiniCPM-V 2.0
技术博客:https://www.openbmb.cn/community/blogs/blogpage?id=bc30f4ab8f134206be72910a1e596922
没有啥干货。这个版本主要是结合其他工作,训了一个能处理高分辨率的中文多模态大模型。
- 将不同分辨率图像划分固定大小的448*448的patch,得到数量不一的块,再对总的图像特征进行采样(LLaVA-UHD)
- 通过图文特征对齐+中英文特征对齐,在中文图文数据较少的情况下训练一个中文多模态模型( VisCPM)。
MiniCPM-Llama3-V 2.5
这版有论文了,详细写。
这一版在 OpenCompass 评估中优于强大的 GPT-4V-1106、Gemini Pro 和 Claude 3。
能力
- 支持最高1.8M像素的高分辨率图像输入(例如1344*1344),支持任意长宽比图像
- 强大的OCR,OCRBench 上优于 GPT-4V、Gemini Pro 和 Qwen-VL-Max,支持table-to-markdown
- 可信,基于RLAIF-V技术做了对齐,减少幻觉,更符合人类喜好
- 多语言,基于VisCPM技术,支持30多种语言
- 系统地集成了一套端侧部署优化技术
模型架构
基本架构
三部分:visual encoder, 压缩层, LLM
visual encoder:SigLIP SoViT-400m/14
压缩层:单层交叉注意力
LLM:每一代都不同
Adaptive Visual Encoding
关键在与尊重输入的原始纵横比并保留足够的视觉细节(高分辨率),并且来自图像编码的视觉标记的数量应该适中,以在端设备上负担得起。
Image Partition 图像分割
- 计算输入图片能分割成多少个slice
WI和HI是输入图像分辨率,Wv和Hv是ViT的输入大小。 - 计算可能的slice的行列数组合m和n
- 计算每种行列数组合的得分,选择分数最高的。好的分割应该使slice的宽高比尽量接近ViT预训练时的输入大小(这里应该是448*448)
当N是素数时,只能得到1*N和N*1两种组合。为了避免这种情况,又引入了
来引入更多种可能的 m*n 组合。
实践中设置N < 10。最高支持1.8 million pixels。
Slice Encoding 切片编码
虽然图像分割可以保证切片与ViT预训练设置之间的良好匹配,但每个切片的大小并不精确等于(Wv, Hv)。所以首先要按比例调整每个切片的大小,使所得区域大小与ViT输入大小Wv × Hv相匹配。减少patch数量与vit预训练时的差距。
随后,我们对ViT的位置嵌入进行2D插值,以适应切片的比例。具体做法是将原本1D的位置编码先展开为2D,通过二维插值技术将P2调整至与每个slice相匹配的大小。位置编码的处理可以参考:https://blog.csdn.net/qq_44475666/article/details/141462624 。
除了上述对图像进行分割并处理的方法外,还会将原始图像作为一个额外的slice resize后加入到输入数据中。这样做是为了提供关于整个图像的整体信息,有助于模型在处理局部细节的同时也能理解图像的整体结构和上下文。也是这种高分辨率处理的常见操作了。
Token Compression 图像token压缩
这里的做法和Qwen-VL相同。
在视觉编码之后,每个slice被编码为1,024个tokens。这太多了。为了压缩Visual tokens,作者引入了一个单层的交叉注意力层,用一组可训练的query emb(64 queries for MiniCPM V1&2 and 96 tokens for MiniCPM-Llama3-V 2.5 )和每个slice的tokens的K,V做交叉注意力。最终压缩后的token数量取决于query emb的长度。
此外这层还会再加一次2D位置编码,而且这里的位置编码不可学习。
代码里这一步也叫attn pool。
Spatial Schema
为了表示每个slice相对于整个图像的位置,还引入了一个两个特殊的标记 < slice> 和<\slice>包装每个slice的tokens,然后使用一个特殊的标记“\n”将不同的行的slice的tokens分开。做法来自
训练
分三个阶段,分别是pre-training,SFT和RLAIF-V。
预训练
预训练又分为三个阶段:
Stage1
这一阶段的作用是warm up压缩层。
先随机初始化压缩层模型参数,再冻结其他模块进行训练。
Visual Encoder的分辨率设置为224*224。
数据上使用了200M的Image Captioning数据。来自随机选择自表格,并清洗掉了删除相关性差的图像-文本对和格式不良的文本数据,确保数据质量。
Stage2
第二阶段的作用是扩展预训练的视觉编码器的输入分辨率。
这阶段视觉编码器可训练,其他模块冻结。
数据上,为了扩展预训练的分辨率,从表中的Image Captioning数据中额外选择了200M数据。
Stage3
扩展视觉编码器的主输入分辨率后,最后使用自适应视觉编码策略训练视觉模块,该策略可以进一步适应任何宽高比的高分辨率输入。
这阶段压缩层和视觉编码器都进行了适应语言模型嵌入空间的训练。LLM保持冻结状态,以避免相对低质量的预训练数据破坏LLM能力。
Caption Rewriting.
来源于网络的图像-文本对可能存在标题数据的质量问题,包括内容不流畅、语法错误和重复的单词。为了解决这个问题,引入了一个用于低质量caption重写的辅助模型。
重写模型将原始caption作为输入,并要求将其转换为问答对。问答对的答案被作为更新的标题。
在实践中,先利用GPT-4对少量种子样本进行标注,然后将其用于微调一个LLM以完成重写任务。
Data Packing
来自不同数据源的样本通常具有不同的长度。批间样本长度的大差异将导致内存使用效率低下和内存不足(OOM)错误风险。
将多个样本打包成固定长度的单个序列。通过截断序列中的最后一个样本,确保了序列长度的一致性,促进更一致的内存消耗和计算效率。
同时,修改了位置ids和注意掩码,以避免不同样本之间的干扰。在实验中,数据打包策略在预训练阶段可以带来2~3倍的加速。
Multilingual Generalization 多语言
传统的解决方案包括广泛的多模态数据收集和清理,以及针对目标语言的训练。不过,最近来自VisCPM的研究结果表明,通过强大的支持多语言的LLM,MLLM可以有效地跨语言推广。很大程度上减轻了在数据集较少的语言对多模态数据的严重依赖。
在实践中,只在英语和中文多模态数据上预训练模型,然后执行轻量级但高质量的多语言监督微调以与目标语言保持一致。尽管它很简单,但MiniCPM-Llama3-V 2.5与更大的mllm相比,可以在30多种语言中实现良好的性能。
SFT
在从预训练中学习基础能力后,我们对高质量的视觉问答数据集进行监督微调(SFT)
可训练模块:所有模型参数。
数据主要来自人类标注和GPT-4标注的高质量数据集。
最近的研究表明(Minicpm、Gemini-1.5),接近训练结束的数据在塑造模型的能力和响应风格方面起着更重要的作用。
作者将SFT数据分为两部分。第一部分的重点是增强模型的基本识别能力,而第二部分的重点是增强模型生成详细响应和遵循人类指令的能力。
具体来说,part-1数据由响应长度相对较短的传统QA和caption数据集组成,这有助于增强模型的基本识别能力。
相比之下,part-2部分包含具有复杂交互的长响应的数据集,无论是在文本还是多模态上下文中。
在SFT中,这两个部分数据被连接起来并依次输入到模型中。
在MiniCPM-Llama3-V 2.5中,作者额外引入了来自Cauldron数据集的2M数据用于多模态知识增强,以及90K覆盖36种语言的多语言数据用于增强多语言对话能力。
RLAIF-V 对齐
MLLM通常容易出现幻觉问题,产生不符合输入图像的响应。为了解决幻觉问题,作者采用RLAIF-V,关键在于从开源模型中获得可扩展的高质量反馈,用于直接偏好优化(DPO)。
Response Generation
第一步是使用策略模型生成给定指令的多个响应。具体来说,给定一个等待对齐的模型 M,我们使用高温采样解码从 M 中采样 10 个响应Y = {y1, y2, · · · , yn}(sampling decoding with high temperatures)。
有几个好处:(1)反馈收集和学习可以更好地关注可信度,因为避免了来自多个 MLLM 的不同文本样式。(2) 反馈学习更有效,因为偏好直接收集在策略模型的分布上。
Feedback Collection
从开源mllm收集高质量的反馈可能具有挑战性,因为与专有模型相比,它们的功能通常较弱。为了解决这个问题,RLAIF-V使用了分而治之的策略来进行响应评分。
-
响应拆分:
每个响应y_i首先被拆分成多个原子声明 Ci = {c1, c2, · · · , cm}。这些原子声明是构成完整响应的基本单元,通常是比较简单的陈述句。使用 Llama-3 8B 模型来执行这一拆分任务。 -
声明验证:
将每个原子声明c_j 转换为一个是非题(yes/no 问题),例如 “Is it true that [c_j]?”。
使用开源 MLLM 来评估每个是非题的正确性。具体来说:
对于 MiniCPM-V 2.0,使用 OmniLMM 12B 模型来评分。
对于 MiniCPM-Llama3-V 2.5,使用 LLaVA-NeXT-Yi 34B 模型来评分。 -
评分计算:
计算每个响应 y_i的最终得分s_i。得分定义为:−n_{rej},其中n_{rej}是无效原子声明的数量。
无效原子声明是指那些被评估为错误或不确定的声明。
Direct Preference Optimization
Direct Preference Optimization (DPO) 是一种用于训练模型以优化偏好(preference)的方法。通过这种方法,模型可以学习用户对不同输出的偏好,从而生成更符合用户期望的结果。以下是 DPO 方法的具体步骤和实现细节:
- 高质量 AI 反馈的收集:
在进行偏好学习之前,首先需要收集高质量的 AI 反馈。这一步骤已经在前面提到过,通过分而治之的策略已经得到了每个响应的评分。 - 构建偏好数据集
(1)从每个响应集合Y中抽取中随机抽取响应对。假设我们有 n个响应,从中随机选择两个响应组成一个对。
(2)根据每个响应的相对评分来确定哪个响应更优。分数更高的记为yw,分数低的记为yl。这样,每个随机抽取的响应对都可以转化为一个偏好对(yw, yl)。
(3)继续重复上述过程,直到构建出足够大的偏好数据集。在实践中,作者构建一个包含 6,000 个偏好对的数据集,这些偏好对来自 3,000 张独特的图像。 - 使用 DPO 算法进行训练
偏好对训练:
DPO 算法需要在偏好对上进行训练。每个偏好对表示模型更倾向于生成yw。
在训练过程中,模型会尝试最大化生成yw的概率同时最小化生成yl的概率。
损失函数:
DPO 算法通常使用一种对比损失函数(contrastive loss)来优化模型。这种损失函数鼓励模型生成高评分的响应,同时避免生成低评分的响应:
端侧部署
端侧设备(主要是手机)的限制主要来自内存、CPU、GPU的限制。
Quantization量化
为了在端侧设备(如智能手机和计算机)上部署多语言大模型(MLLMs),研究者采用了量化技术来降低内存消耗,并在不同的框架上进行了实证研究。
量化是一种广泛使用的降低内存消耗的技术。其主要思想是通过使用统一的缩放因子将多个权重压缩到一个更窄的范围内,然后进行离散化处理。这一过程可以用数学公式表示为:
通过量化,可以显著减少模型的内存占用。例如,对于 MiniCPM-Llama3-V 2.5 模型,其 fp16 版本通常需要 16~17GB 的内存。
对于 MiniCPM-Llama3-V 2.5 模型,研究者选择了 GGML 框架中的 Q4_K_M 模式进行 4-bit量化。这种量化策略将模型的内存需求从 16~17GB 降低到约 5GB,这在移动设备上是非常友好的。
Deployment Framework 部署框架
研究者调查了多种框架,以找到最适合端侧设备的解决方案。这些框架包括但不限于:
CPU框架:如 llama.cpp、ONNX Runtime 等。
GPU框架:如 TensorRT、CUDA 等。
NPU框架:如 NNAPI、Huawei HiAI 等
研究者优先考虑了CPU框架。在众多CPU框架中,选择了 llama.cpp 框架。
实验在小米14 Pro(搭载高通Snapdragon 8 Gen 3芯片)上进行。
结合4位量化(Q4_K_M模式)和 llama.cpp 框架,对模型进行了优化。
结果:
文本编码延迟:模型的文本编码延迟为64.2秒。
文本解码速度:模型的文本解码速度为1.3个token/秒。
还是太慢。
以下尝试了三种高阶优化:分别针对内存、编译和设置
Memory Usage Optimization 内存优化
实验结果显示,在没有特定优化的情况下,图像处理可能会成为移动设备上推理速度的瓶颈,主要是由于移动设备有限的内存资源。为了应对这一问题,研究者探索了多种内存使用优化策略。
在移动设备上进行图像处理和推理时,内存资源非常有限。传统的做法是同时加载视觉变换器(ViT)和大型语言模型(LLM)到内存中,这会导致内存占用过高,进而引发频繁的页面交换(paging),即内存中的数据频繁地在内存和磁盘之间交换,严重影响程序的运行效率。
为了解决上述问题,研究者采用了顺序加载的方法,而不是同时加载 ViT 和 LLM 到内存中。具体步骤如下:
- 视觉编码阶段:首先加载 ViT 模型,对输入的图像进行视觉编码。在完成视觉编码后,释放 ViT 模型占用的内存。
- 文本和视觉令牌编码阶段:接着加载 LLM 模型,对视觉和文本令牌进行编码。在完成编码后,释放 LLM 模型占用的内存。
结果:
图像处理时间:优化前,图像处理时间为 45.2 秒;优化后,图像处理时间减少到 31.5 秒。
Compilation Optimization
通过直接在目标设备上编译模型,可以显著改善编码延迟和解码吞吐量。
指令集架构的一致性:
直接在目标设备上编译模型可以确保编译器生成的代码与目标设备的指令集架构(ISA)高度一致。这种一致性可以充分利用目标设备的硬件特性,提高代码的执行效率。
例如,现代CPU和GPU通常支持特定的SIMD(单指令多数据)指令,这些指令可以并行处理多个数据点,从而加速计算。
优化编译器的选择:
使用针对目标设备优化的编译器可以生成更高效的机器码。这些编译器通常会进行一系列优化,如循环展开、函数内联、内存访问优化等,以提高代码的运行效率。
编码延迟:
编码延迟从64.2秒显著减少到17.0秒,减少了约73.5%。这一显著的减少表明,直接在目标设备上编译模型可以极大地提高编码阶段的效率。
解码吞吐量:
解码速度从1.3个token/秒提升到3.2个token/秒,提升了约146.2%。这表明编译优化不仅减少了延迟,还显著提高了模型的解码能力。
Configuration Optimization 配置优化
在端侧设备上部署多语言大模型(MLLMs)时,单一默认配置可能无法适应不同设备的多样性和特性。为了最大化推理速度,研究者开发了一种自动参数搜索算法,动态确定最适合各个设备的配置(例如,不同CPU核心上的计算分配)。通过这种配置优化,可以显著提高模型的性能。
- 自动参数搜索算法
动态配置:自动参数搜索算法能够根据设备的具体硬件特性,动态调整模型运行时的参数配置。这包括但不限于计算任务在不同CPU核心上的分配。
优化目标:算法的目标是最大化推理速度,同时保持模型的准确性和稳定性。 - 具体优化参数
计算分配:优化算法会尝试不同的计算任务分配方案,例如将某些计算任务分配给性能更强的CPU核心,而将其他任务分配给性能较弱的核心。
缓存管理:优化算法还会考虑缓存的使用情况,确保频繁访问的数据能够快速读取。
并行处理:通过合理分配并行任务,充分利用多核CPU的并行处理能力。
优化前后的性能对比
优化前:
解码吞吐量:3.2个token/秒
优化后:
解码吞吐量:8.2个token/秒,超过了典型的人类阅读速度(通常约为4-5个token/秒)
NPU加速
除了针对CPU的优化技术外,利用其他类型的芯片(如GPU和NPU)也是提高模型在端侧设备上性能的一个有前景的方向。尽管GPU在理论上具有潜力,但实验发现当前移动设备上的GPU框架尚未优化到足以超越CPU性能的程度。因此,研究者转向了神经处理单元(NPU)来解决这一问题。
- 视觉编码加速:
替换后端框架:为了利用NPU加速视觉编码,研究者将视觉变换器(ViT)的后端框架从原来的框架替换为QNN(Quantized Neural Network)框架。QNN框架专门设计用于在NPU上高效运行量化模型。 - 保留原有框架:对于语言模型部分,仍然使用 llama.cpp 框架,以保持其在CPU上的高效运行。
实验结果:
视觉编码时间:在配备高通NPU的移动设备上,这一优化显著减少了视觉编码时间。具体来说,视觉编码时间从3.7秒减少到1.3秒,如图所示。
MiniCPM-V 2.6
最新最强的一代。与 MiniCPM-Llama3-V 2.5 相比,它的性能有了显著提升,并引入了用于多图像和视频理解的新功能。
还没有论文和技术博客,等出了再更吧。