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 相關的所有內容。