OmniLMM-12B 完整技术指南:EVA02-5B × Zephyr-7B-β 多模态对齐架构与推理实战(MiniCPM-V 系列早期旗舰)
【免费下载链接】MiniCPM-VA Pocket-Sized MLLM for Ultra-Efficient Image and Video Understanding on Your Phone项目地址: https://gitcode.com/GitHub_Trending/mi/MiniCPM-V
本文依据仓库归档文档 docs/omnilmm.md 编写。OmniLMM-12B 是 MiniCPM-V 项目早期(2024-05-19 归档)发布的 11.6B 参数多模态大语言模型(LMM),它开创性地将多模态 RLHF 对齐引入开源模型,并示范了"视觉描述 + 纯文本 LLM"的实时多模态交互范式。读完本文,你将掌握 OmniLMM-12B 的模型架构(视觉塔、Perceiver Resampler、Mistral 语言主干)、其可信行为对齐原理、评测表现,以及基于仓库 chat.py 的完整本地推理调用方法,并能结合仓库源码读懂图像特征注入 LLM 的底层实现。
一、模型定位与背景
OmniLMM-12B 发布于本项目早期阶段,属于 MiniCPM-V 系列中的初代多模态方案,文档明确标注"归档时间:2024-05-19",并推荐后续开发者优先使用项目后续发布的模型(见 README_zh.md)以获得更高效的推理与更强的性能。
从仓库源码 omnilmm/model/omnilmm.py 可以确认其模型结构:
- 视觉编码器:
eva02_enormous_patch14_clip_224.laion2b_plus(EVA02-5B,5B 级视觉塔,patch 14,输入 224),通过timm.create_model创建,并取倒数第二层输出作为视觉特征(vision_tower.blocks[-1] = Identity()); - 语言主干:Zephyr-7B-β,代码中以
MistralForCausalLM/MistralModel为基类(OmniLMMConfig(MistralConfig)、OmniLMMModel(MistralModel)、OmniLMMForCausalLM(MistralForCausalLM)); - 连接器:Perceiver Resampler,将视觉塔输出的高分辨率 patch 特征压缩为固定数量的可学习 query 表示,再注入语言模型;
- 训练方式:以课程学习(curriculum fashion)方式在多模态数据上训练。
# omnilmm/model/omnilmm.py 中 create_vision_module 的核心逻辑(节选) vision_tower = timm.create_model('eva02_enormous_patch14_clip_224.laion2b_plus', pretrained=False, num_classes=0, dynamic_img_size=True, dynamic_img_pad=True) # 使用倒数第二层输出 vision_tower.blocks[-1] = Identity() resampler = Resampler( grid_size=int(math.sqrt(config.num_query)), # 可学习 query 的网格边长 embed_dim=embed_dim, # 与 LLM hidden_size 对齐 num_heads=embed_dim // 128, kv_dim=vision_tower.embed_dim, # 视觉特征维度 )二、三大核心特性
2.1 性能领先:同规模模型中的第一梯队
OmniLMM-12B 在 MME、MMBench、SEED-Bench 等多个基准上取得同规模领先性能,模型掌握了较为丰富的多模态世界知识。评测详情(含 MME、MMBench、MMMU、MMHal-Bench、Object HalBench、SeedBench、LLaVA Bench W、MathVista 等)如下表(数据来自 docs/omnilmm.md,† 表示闭源模型):
| Model | Size | MME | MMB dev (en) | MMMU val | MMHal-Bench | Object HalBench | SeedBench-I | MathVista | LLaVA Bench |
|---|---|---|---|---|---|---|---|---|---|
| GPT-4V† | - | 1771.5 | 75.1 | 56.8 | 3.53 / 70.8 | 86.4 / 92.7 | 71.6 | 47.8 | 93.1 |
| Qwen-VL-Plus† | - | 2183.4 | 66.2 | 45.2 | - | - | 65.7 | 36.0 | 73.7 |
| Yi-VL 6B | 6.7B | 1915.1 | 68.6 | 40.3 | - | - | 67.5 | 28.8 | 51.9 |
| Qwen-VL-Chat | 9.6B | 1860.0 | 60.6 | 35.9 | 2.93 / 59.4 | 56.2 / 80.0 | 64.8 | 33.8 | 67.7 |
| CogVLM-Chat | 17.4B | 1736.6 | 63.7 | 32.1 | 2.68 / 52.1 | 73.6 / 87.4 | 68.8 | 34.7 | 73.9 |
| LLaVA 1.5 | 13.6B | 1808.4 | 68.2 | 36.4 | 2.71 / 51.0 | 53.7 / 77.4 | 68.1 | 26.4 | 64.6 |
| OmniLMM-12B | 11.6B | 1935.8 | 71.6 | 40.7 | 3.45 / 68.8 | 90.3 / 95.5 | 71.1 | 34.9 | 72.0 |
从表中可以看到,OmniLMM-12B 以 11.6B 参数量在 MMBench(71.6)、MMMU(40.7)、SeedBench-I(71.1)等综合理解基准上处于同规模开源模型领先位置;在 Object HalBench 上达到 90.3 / 95.5,甚至超过 GPT-4V 的 86.4 / 92.7,充分体现了多模态 RLHF 对齐带来的幻觉抑制能力。
2.2 行为可信:首个通过多模态 RLHF 对齐的 SOTA 开源模型
多模态大模型的"幻觉"(hallucination)问题广受关注——模型经常自信地描述图片中并不存在的物体。OmniLMM-12B 是第一个通过多模态 RLHF 对齐的综合能力优秀的开源多模态大模型,借助 RLHF-V(CVPR'24)系列技术实现可信行为:
- 在幻觉评测基准MMHal-Bench上达到开源模型最佳水平(3.45 / 68.8);
- 在Object HalBench(物体级幻觉评测)上优于 GPT-4V(90.3 / 95.5 vs 86.4 / 92.7)。
这意味着模型生成的文本能更好地与图像中的真实事实对齐,减少对不存在物体的虚假描述。
2.3 实时多模态交互:复现 Gemini 演示中的趣味场景
团队将 OmniLMM-12B 与 GPT-3.5(纯文本模型)组合成实时多模态交互助手:
- 助手接收来自摄像头的视频流,OmniLMM-12B 将视频帧转换为对应的图像描述文本;
- 文本描述连同用户指令一起输入 ChatGPT-3.5 生成响应;
- 借助工具处理语音输入输出;
- 演示视频为未经编辑的原始录制,能够复现 Gemini 演示视频中的一些趣味例子(如对实时画面的提问与应答)。
该方案的关键在于:OmniLMM-12B 只负责"看图说话",把非结构化的视觉流压缩成结构化文本,再交给纯文本 LLM 完成指令理解与回复生成,从而以较低成本实现实时多轮交互。
三、安装与环境准备
仓库 docs/omnilmm.md 给出了标准安装步骤,克隆本仓库后按以下流程配置:
# 1. 克隆仓库并进入目录 git clone https://github.com/OpenBMB/MiniCPM-V.git cd MiniCPM-V # 2. 创建 conda 环境(Python 3.10) conda create -n MiniCPMV python=3.10 -y conda activate MiniCPMV # 3. 安装依赖 pip install -r requirements.txt本仓库根目录下的 requirements.txt 即对应安装文件;OmniLMM 相关的模型定义、训练工具与对话模板分别位于 omnilmm/model/、omnilmm/train/、omnilmm/conversation.py 中。
四、模型下载(Model Zoo)
OmniLMM-12B 为当前系列中性能最强的版本,权重可通过以下渠道获取(下载后即为本地推理的model_path):
| 模型 | 简介 | 下载渠道 |
|---|---|---|
| OmniLMM-12B | 性能最强的版本 | HuggingFace(openbmb/OmniLMM-12B)、ModelScope(OpenBMB/OmniLMM-12B) |
五、推理实战:基于 chat.py 的调用流程
仓库根目录的 chat.py 提供了可直接运行的推理入口,并内置了 OmniLMM-12B 与其他 MiniCPM-V 系列模型的统一封装(MiniCPMVChat会根据model_path是否包含'12B'自动路由到OmniLMM12B)。
5.1 模型初始化
OmniLMM12B.__init__调用的init_omni_lmm(model_path)完成以下关键步骤:
# chat.py 中的 init_omni_lmm(节选) torch.backends.cuda.matmul.allow_tf32 = True disable_torch_init() # 禁用冗余的 torch 默认初始化以加速模型创建 tokenizer = AutoTokenizer.from_pretrained(model_name, model_max_length=2048) model = OmniLMMForCausalLM.from_pretrained( model_name, tune_clip=True, torch_dtype=torch.bfloat16 ).to(device='cuda', dtype=torch.bfloat16) image_processor = build_transform( is_train=False, input_size=model.model.config.image_size, std_mode='OPENAI_CLIP')值得注意的实现细节:
- 视觉塔可训练:
tune_clip=True,即加载后视觉编码器参与后续微调(从 omnilmm/model/omnilmm.py 的initialize_vision_modules可以看到,tune_clip=False时视觉塔会被包在 list 中以配合 FSDP 分片); - 图像预处理:使用 OpenAI CLIP 的均值/方差(
OPENAI_CLIP_MEAN/STD)做归一化,推理时先 Resize 到input_size × input_size再归一化,实现见 omnilmm/model/utils.py 的build_transform; - 特殊 token 注入:tokenizer 需添加
<im_patch>、<im_start>、<im_end>三个视觉占位 token,并通过vision_config记录其 token id(对应 chat.py); - 低显存多卡方案:
init_omni_lmm中保留了一段注释掉的代码,可用init_empty_weights+load_checkpoint_and_dispatch将模型按device_map="auto"分布到多张 GPU(例如 2×NVIDIA 3090 24G),no_split_module_classes需包含Eva、MistralDecoderLayer、ModuleList、Resampler。
5.2 图像特征如何注入 LLM
理解 OmniLMM-12B 的推理链路,需要看 omnilmm/model/omnilmm.py 的get_vision_embedding与forward:
get_vision_embedding将pixel_values送入 EVA02 视觉塔的forward_features,去掉前缀 token(cls token)后交给Resampler;Resampler(见 omnilmm/model/resampler.py)是一个带2D sincos 位置编码、由grid_size²个可学习 query 驱动的单层交叉注意力网络,将视觉 patch 特征压缩为固定数量(num_query)的向量,输出形状为(grid_size**2, embed_dim);- 在
forward中,<image>占位符被展开为<im_start> + <im_patch> * num_query + <im_end>(见 chat.py 的expand_question_into_multimodal),随后new_input_embeds将 Resampler 输出的视觉特征插入到im_start/im_endtoken 之间的嵌入序列里,与文本嵌入拼接后送入 Mistral 主干自回归生成。
# omnilmm/model/resampler.py 中 Resampler 的核心结构 self.query = nn.Parameter(torch.zeros(self.num_queries, embed_dim)) # 可学习 query trunc_normal_(self.query, std=.02) self.kv_proj = nn.Linear(kv_dim, embed_dim, bias=False) if kv_dim != embed_dim else nn.Identity() self.attn = nn.MultiheadAttention(embed_dim, num_heads)5.3 生成参数与单轮/多轮对话
OmniLMM12B.decode通过generate_vllm完成生成,仓库默认采样参数如下(可在 chat.py 中查看并按需调整):
temperature=0.6, max_new_tokens=1024, do_sample=True, repetition_penalty=1.1, top_k=30, top_p=0.9chat.py末尾的__main__演示了完整的调用方式(含多轮对话):
model_path = 'openbmb/OmniLMM-12B' chat_model = MiniCPMVChat(model_path) im_64 = img2base64('./assets/worldmap_ck.jpg') # 第一轮 msgs = [{"role": "user", "content": "What is interesting about this image?"}] input = {"image": im_64, "question": json.dumps(msgs, ensure_ascii=True)} answer = chat_model.chat(input) # 第二轮:把上一轮回答追加到消息历史中,实现多轮上下文 msgs.append({"role": "assistant", "content": answer}) msgs.append({"role": "user", "content": "Where is China in the image"}) input = {"image": im_64, "question": json.dumps(msgs, ensure_ascii=True)} answer = chat_model.chat(input)六、训练配套:数据集与训练工具
仓库 omnilmm/ 目录下还保留了该模型相关的训练配套:
- omnilmm/train/train_utils.py:训练数据预处理工具,推理侧的
wrap_question_for_omni_lmm也复用了其中的omni_preprocess(对话格式化为模型输入、labels 置为 -100 以跳过生成阶段损失); - omnilmm/conversation.py:对话模板管理,定义了
conv_v1、conv_v1_2、conv_vicuna_v1_1、conv_llava_v1等模板,用于系统提示词与角色分隔符的组织; - omnilmm/model/utils.py:包含图像变换
build_transform、RandomAugment数据增强(训练时若设置环境变量TRAIN_DO_AUG=True则启用 RandAugment)、以及分布式all_gather等工具函数; - finetune/:项目通用的微调目录(如 finetune/finetune.py),配合 docs/llamafactory_train_and_infer.md、docs/swift_train_and_infer.md 可用于后续版本的指令微调。
七、注意事项与适用前提
- 归档状态:OmniLMM-12B 属于项目早期版本,文档与代码以当前仓库归档内容为准;追求更高效率与性能建议使用后续发布的模型(见 README_zh.md);
- 硬件要求:11.6B 参数量的 bfloat16 推理对显存有较高要求,单卡显存不足时可参考 5.1 节注释中的多卡
load_checkpoint_and_dispatch方案,或参考 docs/inference_on_multiple_gpus.md 了解多 GPU 推理的一般做法; - 闭源对比项:评测表中的 GPT-4V、Qwen-VL-Plus 为闭源模型,结果仅作参照,具体评测口径以 docs/omnilmm.md 归档数据为准;
- 实时交互依赖外部 LLM:5.3 描述的"实时多模态交互助手"需要结合 GPT-3.5 等纯文本模型使用,OmniLMM-12B 在其中承担视频帧→文本描述的视觉理解角色。
八、总结
OmniLMM-12B 是 MiniCPM-V 项目早期里程碑式的一代模型:它以EVA02-5B 视觉塔 + Perceiver Resampler + Zephyr-7B-β的三段式架构确立了项目后续"视觉编码器 + resampler + LLM"的基本范式,以**多模态 RLHF(RLHF-V)**首次在开源侧解决幻觉对齐问题,并以"视觉描述 + 文本 LLM"的轻量级组合探索了实时多模态交互的可行路径。通过本仓库的 chat.py 与 omnilmm/ 源码,开发者可以完整复现其推理链路,并以此为参照理解 MiniCPM-V 系列后续模型的演进脉络。
【免费下载链接】MiniCPM-VA Pocket-Sized MLLM for Ultra-Efficient Image and Video Understanding on Your Phone项目地址: https://gitcode.com/GitHub_Trending/mi/MiniCPM-V
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考