Hugging Face 发布开源 2B 视觉语言模型 SmolVLM
SmolVLM - small yet mighty Vision Language Model
Hugging Face 发布 2B 视觉语言模型 SmolVLM,包含 SmolVLM-Base、SmolVLM-Synthetic 和 SmolVLM Instruct 三个版本,模型权重、数据集和训练流程均以 Apache 2.0 许可完全开源。
官方给出与 Qwen2-VL 等同规模模型的显存和吞吐对比数据,并附完整训练与微调细节,便于评估端侧部署可行性。
TLDR
这篇博客文章介绍了 SmolVLM,一个 2B 参数的视觉语言模型,在其内存占用方面达到了 SOTA。SmolVLM 小巧、快速、内存高效,并且完全开源。所有模型检查点、VLM 数据集、训练配方和工具均在 Apache 2.0 许可下发布。

什么是 SmolVLM?
今年见证了多模态 AI 的蓬勃发展,许多大型视觉语言模型相继发布。趋势最初是扩大计算规模,随后通过使用大型模型生成合成数据来扩大数据多样性,而最近则转向缩小模型规模以提高效率。小型开源模型允许在浏览器或边缘设备上进行本地部署,降低推理成本,并支持用户自定义。这些模型的一些显著例子包括 PaliGemma 3B、moondream2 和 Qwen2VL。
在这篇博客文章中,我们介绍了 SmolVLM,这是一个全新的 2B 小型视觉语言模型系列,可用于商业用途并部署到较小的本地环境,且拥有完全开放的训练流程。
我们发布了三个模型:SmolVLM-Base,可用于下游微调;SmolVLM-Synthetic,基于合成数据微调的变体;以及 SmolVLM Instruct,经过指令微调的变体,可直接用于交互式终端用户应用。
此次发布包括集成到 transformers 中的开源模型、基于 SmolVLM Instruct 构建的演示,以及一个监督微调脚本。我们使用了之前用于 Idefics3 的数据集:the Cauldron 和 Docmatix,这些数据集也是完全开源的。
目录
模型能力
| 输入图像 | 输入提示 | 回答 |
|---|---|---|
![]() |
我计划参观这座寺庙,给我一些旅行建议。 |
The Grand Palace is the most famous landmark in Bangkok and it's worth visiting for its stunning architecture and history. Here are some of our favorite things about the palace:
主建筑: 位于建筑群中心的主建筑,其每一寸结构都覆盖着带有传统泰式图案的复杂瓷砖工艺。这些图案包括龙、神话生物、花卉和几何形状。屋顶线条设计精巧,多层瓷砖上点缀着金色装饰。 塔楼与尖顶: 大皇宫内有几座塔楼,包括展示泰国文化和遗产展品的 Phra Nakhon Si Ayutthaya 国家博物馆塔。另一座著名的塔楼是 Wat Yai Chai Mongkol 塔,在那里你可以看到描绘佛教神话场景的精美壁画。 建筑风格: 该建筑风格融合了东南亚常见的印度教和高棉风格元素。你会注意到佛塔(圆顶结构)、莲花雕刻以及这些地区宗教建筑典型的华丽细节等影响。 游客体验: 在探索大皇宫时,由于当局采取的安全措施,游客应了解某些规定。这些规定包括在某些区域内禁止拍照,或在室外使用闪光灯。此外,在旅游旺季可能会有排队情况,因此如果您计划来此旅行,请相应规划。 参观大皇宫的旅行提示:
遵循这些指南,您的旅行无疑将增强您对泰国丰富历史画卷的理解和个人享受! |
![]() |
根据此图,严重干旱发生在哪里? | 严重干旱正在东部和南部非洲发生。 |
![]() |
到期日和发票日期是什么? | 到期日是26/02/2019,发票日期是11/02/2019。 |
架构

对于SmolVLM,我们严格遵循Idefics3的架构,以至于我们在transformers中使用了相同的实现。然而,有几个关键区别:
- 我们将Llama 3.1 8B替换为SmolLM2 1.7B作为语言主干。
- 我们通过使用像素洗牌策略将信息减少9倍,更积极地压缩补丁视觉信息,而idefics3是4倍。
- 我们使用384*384的补丁,而不是364x364,因为384能被3整除,这对于我们的像素洗牌策略正常工作所必需。
- 为此,我们将视觉主干更改为使用形状优化的SigLIP,补丁为384x384像素,内部补丁为14x14。
性能
基准测试
我们展示了在训练细节中提到的任务的基准测试。
| 模型 | MMMU (val) | MathVista (testmini) | MMStar (val) | DocVQA (test) | TextVQA (val) | 所需最小GPU内存 (GB) |
|---|---|---|---|---|---|---|
| SmolVLM | 38.8 | 44.6 | 42.1 | 81.6 | 72.7 | 5.02 |
| Qwen2-VL 2B | 41.1 | 47.8 | 47.5 | 90.1 | 79.7 | 13.70 |
| InternVL2 2B | 34.3 | 46.3 | 49.8 | 86.9 | 73.4 | 10.52 |
| PaliGemma 3B 448px | 34.9 | 28.7 | 48.3 | 32.2 | 56.0 | 6.72 |
| moondream2 | 32.4 | 24.3 | 40.3 | 70.5 | 65.2 | 3.87 |
| MiniCPM-V-2 | 38.2 | 39.8 | 39.1 | 71.9 | 74.1 | 7.88 |
| MM1.5 1B | 35.8 | 37.2 | 0.0 | 81.0 | 72.5 | NaN |
内存

SmolVLM 在 transformers 中现有的视觉语言模型套件中提供了最佳的内存使用效率。这使得它能够在设备端高效运行,例如笔记本电脑!你可以在上方看到每个模型的 GPU 内存使用量(以 GB 为单位),测试中使用一张或两张输入图像进行推理,并在所有测试中使用相同的图像和文本提示。SmolVLM 在图像编码方面的效率内置于模型中。SmolVLM 将每个 384x384 的图像块编码为 81 个 token。这使得 SmolVLM 将我们的测试提示和单张图像编码为 1.2k 个 token,而 Qwen2-VL 则使用 16k 个 token。这也解释了为什么 Qwen 和 InternVL 在两张图像时内存消耗增加如此之多。相比之下,SmolVLM 和 PaliGemma 的增加则要温和得多,它们使用了类似的方法。
吞吐量

SmolVLM 极小的内存占用也意味着它需要远少的计算量来预填充模型和生成。与 Qwen2-VL 相比,预填充吞吐量快 3.3 到 4.5 倍,生成吞吐量快 7.5 到 16 倍。
视频
鉴于 SmolVLM 的长上下文以及调整模型内部帧缩放的可能性,我们探索了它作为基础视频分析任务的可访问选项的适用性,特别是在计算资源有限的情况下。
在我们对 SmolVLM 视频理解能力的评估中,我们实现了一个简单的视频处理流水线代码,从每个视频中提取最多 50 个均匀采样的帧,同时避免内部帧缩放。 这种简单的方法在 CinePile 基准测试上产生了令人惊讶的竞争力结果,得分为 27.14%,这一表现将模型定位在 InternVL2 (2B) 和 Video LlaVa (7B) 之间。
定量结果与我们的定性测试一致,以 FineVideo 数据集中的一个例子来看:
Question: what is shown in the close-up?
Assistant: In the close-up, there are bottles of Heinz tomato ketchup,
honey, soy sauce, and garlic on a kitchen counter.
Question: describe what is happening in the video.
Assistant: The video shows a man cooking in a kitchen.
He is wearing a black shirt and a black apron.
He is standing in front of a counter and is holding a bottle of Heinz tomato ketchup,
a bottle of honey, soy sauce, and a bowl of minced garlic
虽然在第二个问题中,我们看到了一些时间理解上的局限性(厨师一个接一个地指向一种食材,而不是同时指向/拿着所有食材),但 SmolVLM 展示了出色的场景理解和物体识别能力。
VLMEvalKit 集成
我们将 SmolVLM 与 VLMEvalKit 集成,以便于在其他基准测试上进行简单评估。
通过运行以下命令,你可以评估 SmolVLM 或你微调过的 SmolVLM 模型。
python run.py --data <benchmarks> --model SmolVLM --work-dir <output_directory>
例如,要在 MMMU 开发验证集和 MathVista mini 上评估,并将结果存储在一个名为 smol 的文件夹中。
python run.py --data MMMU_DEV_VAL MathVista_MINI --model SmolVLM --work-dir smol
使用 Transformers 运行 SmolVLM
你可以使用 transformers 中的 Auto 类轻松加载 SmolVLM。在底层,模型和处理器映射到与 Idefics3 相同的实现。
from transformers import AutoProcessor, AutoModelForVision2Seq
import torch
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
processor = AutoProcessor.from_pretrained("HuggingFaceTB/SmolVLM-Instruct")
model = AutoModelForVision2Seq.from_pretrained("HuggingFaceTB/SmolVLM-Instruct",
torch_dtype=torch.bfloat16,
_attn_implementation="flash_attention_2" if DEVICE == "cuda" else "eager").to(DEVICE)
图像和文本可以任意交错,你可以传入多张图像。以下是如何使用聊天模板并将格式化输入传递给处理器。
from PIL import Image
from transformers.image_utils import load_image
# Load images
image1 = load_image("https://huggingface.co/spaces/HuggingFaceTB/SmolVLM/resolve/main/example_images/rococo.jpg")
image2 = load_image("https://huggingface.co/spaces/HuggingFaceTB/SmolVLM/resolve/main/example_images/rococo_1.jpg")
# Create input messages
messages = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "image"},
{"type": "text", "text": "Can you describe the two images?"}
]
},
]
# Prepare inputs
prompt = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(text=prompt, images=[image1, image2], return_tensors="pt")
inputs = inputs.to(DEVICE)
使用预处理后的输入开始生成,并解码生成的输出。
# Generate outputs
generated_ids = model.generate(**inputs, max_new_tokens=500)
generated_texts = processor.batch_decode(
generated_ids,
skip_special_tokens=True,
)
print(generated_texts[0])
训练细节
数据集
首先,我们必须训练 SmolLM2 来扩展其上下文,但我们将在下一小节中讨论这一点。一旦我们有了长上下文的 SmolLM2,我们就使用与 Idefics3 相同的数据来训练 SmolVLM。主要是,我们使用了 The Cauldron 和 Docmatix。我们使用的完整数据集列表可以在这里查阅。

上下文扩展

SmolLM2 的预训练上下文窗口对于 VLM 来说是不够的。图像会被编码成许多 token,而我们希望支持多张图像。为了解决这个问题,我们按照 “Scaling Laws of RoPE-based Extrapolation” 中的指导,将 RoPE 基值从 10k 提高到 273k,从而将其扩展到 16k token。我们在长上下文和短上下文数据集的混合数据上对模型进行了微调。 对于长上下文数据集,我们使用了 Dolma 的“books”子集(主要是 Project Gutenberg)以及来自 The Stack 的 8k+ token 的代码文档,二者各占最终混合数据的 20%。对于短上下文数据集,我们精简了原始的 SmolLM2 预训练混合数据,使其包含 20% FineWeb-Edu、20% DCLM 以及 20% 来自我们的数学数据集(即将发布)。数学数据集被上采样,以缓解在上下文扩展过程中观察到的 GSM8k 性能下降。 所有实验均使用 EasyContext 仓库 实现。
检查点选择
在我们的训练运行中,我们每 25 个优化步骤保存一次检查点,这使我们能够评估并有可能恢复模型在训练不同阶段的状态。这种做法对于确定最佳模型版本至关重要,因为训练更久并不总能保证更好的性能。 我们在多个视觉语言基准上评估了性能,每个基准都根据其重要性进行加权。核心基准包括以下内容:
- 通用多模态理解(MMMU 和 MMStar),这是最全面的基准。
- 文档和基于文本的视觉问答(DocVQA 和 TextVQA)
- 数学推理(MathVista)
- 图表理解(AI2D)
为了选择最佳检查点,我们通过为这些基准分配不同的人工权重,将它们组合成一个单一指标,以反映它们在评估模型能力时的相对重要性。我们使用这个单一指标来选择最佳检查点。总体而言,随着训练增加,模型在大多数基准上往往表现很好,但它们在 DocVQA 上的相对性能会显著下降。
微调
你可以使用 transformers 微调 SmolVLM,并使用 TRL 🚀 应用对齐技术
我们提供了一个 notebook,用于在 VQAv2 数据集上对其进行微调,可选使用 LoRA、QLoRA 或全量微调。在 notebook 中,你可以找到一些技巧,以进一步节省内存并使用更大的 batch size,从而将 SmolVLM 放入 L4 等消费级 GPU 中进行训练。使用 batch size 为 4、QLoRA 的 8-bit 加载以及梯度检查点,我们可以在 L4 上进行微调,并且它消耗大约 ~16 GB 的显存。这使得使用 Colab 微调你的 SmolVLM 成为可能!你可以调整参数,以在训练时长与内存的权衡中获得一个不错的点。
SmolVLM 还集成了 TRL,因此你可以通过 CLI 轻松应用直接偏好优化(DPO)。先运行 pip install trl accelerate peft,然后运行以下命令,在 RLAIF-V 数据集上进行微调:
accelerate launch \
--config_file examples/accelerate_configs/multi_gpu.yaml examples/dpo_reduce_hallucinations/dpo_reduce_hallucinations.py \
--dataset_name HuggingFaceH4/rlaif-v_formatted \
--model_name_or_path HuggingFaceTB/SmolVLM-Instruct \
--per_device_train_batch_size 8 \
--gradient_accumulation_steps 32 \
--dataset_num_proc 32 \
--output_dir dpo_smolvlm_rlaif-v \
--bf16 --torch_dtype bfloat16 \
--use_peft --lora_target_modules=all-linear
生成的 LoRA 适配器权重为 SmolVLM-Instruct-DPO。关于基于视觉的 LLM 偏好调优的详细教程可在此处找到:dpo_vlm。
引用信息
你可以按以下方式引用我们:
@article{marafioti2025smolvlm,
title={SmolVLM: Redefining small and efficient multimodal models},
author={Andrés Marafioti and Orr Zohar and Miquel Farré and Merve Noyan and Elie Bakouch and Pedro Cuenca and Cyril Zakka and Loubna Ben Allal and Anton Lozhkov and Nouamane Tazi and Vaibhav Srivastav and Joshua Lochner and Hugo Larcher and Mathieu Morlon and Lewis Tunstall and Leandro von Werra and Thomas Wolf},
journal={arXiv preprint arXiv:2504.05299},
year={2025}
}
总结
我们推出了 SmolVLM,一个完全开放、小巧而强大的 VLM,专为社区打造!我们还提供了工具,供社区使用和定制。我们期待看到你们用 SmolVLM 创造出什么。
如果你想了解更多关于 SmolVLM 的一切,以下是一些资源。
- 使用这个演示开始体验 SmolVLM。
- 通过这个 notebook 学习如何在 VQAv2 上微调 SmolVLM
- 了解更多关于视觉语言模型的信息
来源:Hugging Face:Blog(RSS) · huggingface.co


