SmolVLM - 小而强大的视觉语言模型
TLDR
本博客文章介绍了 SmolVLM,一个 2B VLM,在内存占用方面处于 SOTA。SmolVLM 体积小、速度快、内存效率高,并且完全开源。所有模型检查点、VLM 数据集、训练方案和工具均在 Apache 2.0 许可证下发布。

什么是SmolVLM?
今年多模态人工智能蓬勃发展,许多大型视觉语言模型相继发布。最初的趋势是扩大计算规模,随后通过使用大型模型生成合成数据来扩大数据多样性,最近的趋势则是缩小规模以提高这些模型的效率。小型开放模型允许在浏览器或边缘设备上进行本地部署,降低推理成本,并支持用户自定义。这些模型的一些著名示例包括 PaliGemma 3B、moondream2 和 Qwen2VL。
在本博客文章中,我们介绍了 SmolVLM,这是一个新的 2B 小型视觉语言模型家族,可以用于商业用途并部署到较小的本地设置中,其训练管道完全开放。
我们发布了三个模型:SmolVLM-Base,可用于下游微调;SmolVLM-Synthetic,合成数据上的微调变体;以及 SmolVLM Instruct,可直接用于交互式最终用户应用程序的微调指令变体。
本次发布附带了集成到 transformers 中的开源模型、基于 SmolVLM Instruct 构建的演示以及监督微调脚本。我们使用了之前用于 Idefics3 的数据集:the Cauldron 和 Docmatix,它们也完全开源。
目录
模型能力
架构

对于 SmolVLM,我们紧密遵循了 Idefics3 的架构,以至于我们在 transformers 中使用了相同的实现。然而,有一些关键区别:
- 我们将 Llama 3.1 8B 替换为 SmolLM2 1.7B 作为语言骨干网络。
- 我们通过使用像素混洗策略,将补丁视觉信息压缩了 9 倍,而 Idefics3 仅压缩了 4 倍,从而更积极地压缩了补丁视觉信息。
- 我们使用 384*384 的补丁,而不是 364x364,因为 384 可以被 3 整除,这对于我们的像素混洗策略至关重要。
- 为此,我们将视觉骨干网络更改为使用形状优化的 SigLIP,其补丁大小为 384x384 像素,内部补丁大小为 14x14。
性能
基准
我们提供了训练细节中提到的任务的基准。
模型 | MMMU(验证) | MathVista(测试迷你) | MMStar(验证) | DocVQA(测试) | TextVQA(验证) | 所需最小 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 |
NaN | 35.8 | 37.2 | 0.0 | 81.0 | 72.5 | NaN |
内存

SmolVLM 在现有视觉语言模型套件中提供了最佳的内存使用率。这使得它可以在设备上高效运行,例如笔记本电脑!您可以在上面看到每个模型运行推理时使用一个或两个输入图像的 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
将 SmolVLM 与 Transformers 配合使用
您可以使用 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,我们希望支持多张图像。为了解决这个问题,我们通过将 RoPE 基值从 10k 增加到 273k,将其扩展到 16k token,遵循“基于 RoPE 外推法的缩放定律”中的指导。我们对长上下文和短上下文数据集的混合进行了微调。对于长上下文数据集,我们使用了 Dolma 的“书籍”子集(主要是 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 🚀 应用对齐技术。
我们提供了一个笔记本,用于在 VQAv2 数据集上进行微调,可以选择使用 LoRA、QLoRA 或完全微调。在笔记本中,您可以找到一些技巧,以节省更多内存并获得更大的批量大小,从而使 SmolVLM 适应消费级 GPU(如 L4)进行训练。在批量大小为 4、使用 QLoRA 的 8 位加载和梯度检查点的情况下,我们可以在 L4 中进行微调,它消耗大约 ~16 GB 的 VRAM。这使得您可以使用 Colab 微调您的 SmolVLM!您可以调整参数以在训练时长-内存权衡中找到一个不错的平衡点。
SmolVLM 还集成了 TRL,因此您可以通过 CLI 轻松应用直接偏好优化 (DPO)。首先运行 pip install trl accelerate peft
,然后运行以下命令在 RLAIF-V 数据集上进行微调:
accelerate launch \
--config_file examples/accelerate_configs/multi_gpu.yaml examples/scripts/dpo_vlm.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 相关的所有内容。