Ovis
通过 Visual Tokenizer 实现视觉与文本的结构化嵌入对齐,让多模态大模型真正读懂图像
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
通过 Visual Tokenizer 实现视觉与文本的结构化嵌入对齐,让多模态大模型真正读懂图像
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一个场景:你给 AI 发了一张复杂的工程图纸和一份需求文档,希望它综合理解两者给出优化建议——但大多数多模态模型只能"看图说话",无法真正将视觉信息与语言语义深度融合。Ovis 的出现,就是为了解决这个根本性问题。
传统的多模态大模型(如 LLaVA 系列)通常采用"投影层"(Projection Layer)方式:将视觉编码器的输出通过一个线性层或MLP直接映射到语言模型的输入空间。这种方法简单直接,但存在根本性缺陷——视觉特征和文本token的概率分布天然不同,强行拼接会导致视觉信息在语言模型的 attention 机制中被稀释或误解。
Ovis 由阿里巴巴达摩院旗下的 AIDC-AI 团队提出,核心创新在于结构化嵌入对齐(Structural Embedding Alignment)。项目从2024年6月发布v1.0起持续迭代,2025年8月发布 Ovis2.5,已在 GitHub 获得 1453 颗星、83 个 fork。
图1:Ovis2.5 整体架构,核心是 Visual Tokenizer 与 LLM 的深度融合
Ovis 的核心创新在于引入了一个专门的 Visual Tokenizer 模块(ovis/model/modeling_ovis.py 中 VisualTokenizer 类)。这个设计背后的逻辑非常精妙:
传统方法的问题:视觉编码器(如 SigLIP、CLIP)输出的视觉token分布与语言模型的词表概率分布存在显著差异。直接用线性投影映射,等于让两种"语言"的词汇表强行对齐,效果自然不佳。
Ovis 的解决思路:让视觉token经过两步处理:
head 层,将视觉特征映射为对 LLM 词表中每个 token 的概率分布(softmax over vocabulary),而非直接输出特征向量def forward(self, pixel_values, grid_thws) -> torch.Tensor:
features = self._encode(pixel_values, grid_thws) # ViT 提取特征
logits = self.head(features) # Linear 映射到词表维度
tokens = torch.softmax(logits, dim=-1, dtype=torch.float32) # 概率化
return tokens # 形状: [#Token, VocabSize],与文本token同分布
这个设计使得视觉token的概率分布与文本token完全对齐,语言模型可以更自然地"理解"视觉信息。
VTE(Visual Text Embedding)对齐层:模型还包含一个 VisualEmbedding 层(VTE),将概率化的视觉token嵌入到与文本共享的 embedding 空间中。这是 Ovis 名字中 "Open VISion" 的技术内涵——用统一的概率空间实现视觉与文本的结构化对齐。
从源码结构来看,Ovis 采用高度模块化的设计:
| 模块 | 文件 | 功能 |
|---|---|---|
Ovis 主类 | modeling_ovis.py | 核心模型,整合 LLM + ViT + VTE |
VisualTokenizer | modeling_ovis.py | 视觉token概率化处理 |
VisualEmbedding | modeling_ovis.py | 视觉-文本嵌入对齐 |
SigLIP2 ViT | vit/modeling_siglip2_navit.py | 视觉编码器 |
ConversationFormatter | conversation_formatter.py | 多轮对话格式处理 |
模型支持热插拔不同 LLM:Ovis2.5-9B 基于 Qwen3-8B,Ovis2.5-2B 基于 Qwen3-1.7B。这种设计让开发者可以根据硬件条件选择不同规模的模型。
原生分辨率感知:Ovis2.5 引入了原生分辨率(Native Resolution)处理能力。smart_resize 方法实现了自适应的图像缩放策略:
min_pixels=1048576(约1024x1024)max_pixels=3211264(约1792x1792)反思推理(Thinking Mode):Ovis2.5 支持类似 o1 的"思考模式",通过 enable_thinking 参数开启。模型在给出最终答案前会先生成中间推理步骤,这对 STEM 推理、复杂图表分析等任务提升显著。
图2:Ovis2.5 在推理任务上的表现
Ovis 提供了多种推理方式,覆盖从快速测试到生产部署的完整场景:
方式一:Transformers 推理(最简)
提供 infer_basic_demo.py 和 infer_think_demo.py 两个脚本,支持单图、多图、视频和纯文本输入。
方式二:Gradio Web UI(推荐体验)
python ovis/serve/web_ui.py --model-path AIDC-AI/Ovis2.5-9B --port 8001
启动后即可通过浏览器与模型对话,支持图片上传、多图对话、视频理解。
方式三:vLLM 高性能推理(生产级)
vllm serve AIDC-AI/Ovis2.5-9B --trust-remote-code --port 8000
通过 OpenAI API 兼容接口调用,支持并发推理、Prefix Caching 等优化。
Ovis 的训练代码(ovis/train/train.py)基于 DeepSpeed ZeRO-3 实现分布式训练,支持超大模型在多卡环境下的高效微调。训练流程:
id、image 路径和 conversations 对话| 层级 | 技术选型 |
|---|---|
| 视觉编码器 | SigLIP2 (so400m-patch16-512) |
| LLM 底座 | Qwen3 系列 |
| 训练框架 | DeepSpeed 0.15.4 |
| 推理优化 | vLLM 0.10.2 |
| 对话界面 | Gradio |
| 分布式 | Accelerate + DeepSpeed ZeRO |
Ovis 的结构化嵌入对齐思路,为多模态模型的设计提供了一条新路径。从 v1.0 到 v2.5 的快速迭代可以看出:
如果你在研究视觉-语言融合、多模态推理、或需要在自己的数据集上微调 MLLM,Ovis 是一个值得关注的技术方案。其开源代码结构清晰、模块化程度高,适合作为多模态学习的参考实现。