Model reference · open weights

Molmo2-O

LLMs allenai Vision + text 1 build Open weights 48k dl/mo

Molmo2-O is an open-weight language model from allenai. Molmo2-O-7B (FP32) weighs 15.5 GB; the smallest configuration that runs it is 2× RTX 3060 12 GB.

  • Molmo2-O-7B is an open vision-language model developed by the Allen Institute for AI that supports image, video, and multi-image understanding and grounding.
  • The model has 7.8B parameters, is based on Olmo3-7B-Instruct with a SigLIP 2 vision backbone, and operates in English under the Apache 2.0 license.
  • It is designed for tasks such as video question answering, pointing, and tracking, with the card noting it outperforms other open weight models in its class on short videos, counting, and captioning.

Summary of the allenai/Molmo2-O-7B model card, 2026-10-01

What it is

Released byallenai
Released2025-12-14
Parameters7.8B
VRAM15.5 GB for the weights

What it runs on

Memory and cards for Molmo2-O-7B (FP32)

15.5 GBweights, file size
524 MBcache per 1K tokens
689 MBruntime overhead, at least
65,536 tokenscontext max
CardRequests at onceContext maxMemory
8K each32K each
RTX 3060 12 GB … RTX 4060 Ti 16 GB
2 smaller cards
———
RTX 3090 24 GB1—13K23.4 GB
RTX 4090 24 GB1—13K23.4 GB
RTX 5090 32 GB3—27K31.0 GB
L40S 48 GB6151K44.0 GB
A100 80 GB143all 64K78.2 GB
H100 80 GB133all 64K78.1 GB
RTX PRO 6000 Blackwell 96 GB174all 64K93.8 GB
DGX Spark (GB10) 128 GB unified205all 64K107 GB
H200 141 GB276all 64K138 GB
B200 180 GB369all 64K176 GB
2× RTX 3060 12 GB
tensor parallel
1—11K11.6 GB a card
2× RTX 4060 Ti 16 GB
tensor parallel
3—25K15.4 GB a card
2× RTX 5090 32 GB
tensor parallel
102all 64K31.0 GB a card
2× L40S 48 GB
tensor parallel
164all 64K44.0 GB a card
4× RTX 4090 24 GB
tensor parallel
174all 64K23.4 GB a card
4× RTX 3090 24 GB
tensor parallel
174all 64K23.4 GB a card
Memory needed at each load
Requests at once8K tokens each32K tokens each
120.5 GB33.4 GB
537.7 GB102 GB
850.6 GB154 GB
1684.9 GB291 GB
32154 GB566 GB
64291 GB1116 GB

One card, with vLLM's small-card settings.

From the model card

What allenai says about Molmo2-O

Read the model card

Molmo2 is a family of open vision-language models developed by the Allen Institute for AI (Ai2) that support image, video and multi-image understanding and grounding. Molmo2 models are trained on publicly available third party datasets as referenced in our technical report and Molmo2 data, a collection of datasets with highly-curated image-text and video-text pairs. It has state-of-the-art performance among multimodal models with a similar size. You can find all models in the Molmo2 family here.

Learn more about the Molmo2 family in our announcement blog post.

Molmo2-O-7B is based on Olmo3-7B-Instruct and uses SigLIP 2 as vision backbone. It outperforms others in the class of open weight and data models on short videos, counting, and captioning, and is competitive on long-videos.

Ai2 is commited to open science. The Molmo2 datasets are available here. All other artifacts used in creating Molmo2 (training code, evaluations, intermediate checkpoints) will be made available at a later date, furthering our commitment to open-source AI development and reproducibility.

Quick links:

Quick Start

Setup Conda Environment

conda create --name transformers4571 python=3.11
conda activate transformers4571
pip install transformers==4.57.1
pip install torch pillow einops torchvision accelerate decord2 molmo_utils

General Video QA

from transformers import AutoProcessor, AutoModelForImageTextToText
import torch

model_id="allenai/Molmo2-O-7B"

# load the processor
processor = AutoProcessor.from_pretrained(
    model_id,
    trust_remote_code=True,
    dtype="auto",
    device_map="auto"
)

# load the model
model = AutoModelForImageTextToText.from_pretrained(
     model_id,
     trust_remote_code=True,
     dtype="auto",
     device_map="auto"
)

# process the video and text
messages = [
    {
        "role": "user",
        "content": [
            dict(type="text", text="Which animal appears in the video?"),
            dict(type="video", video="https://storage.googleapis.com/oe-training-public/demo_videos/many_penguins.mp4"),
        ],
    }
]

inputs = processor.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_tensors="pt",
    return_dict=True,
)

inputs = {k: v.to(model.device) for k, v in inputs.items()}

# generate output
with torch.inference_mode():
    generated_ids = model.generate(**inputs, max_new_tokens=2048)

# only get generated tokens; decode them to text
generated_tokens = generated_ids[0, inputs['input_ids'].size(1):]
generated_text = processor.tokenizer.decode(generated_tokens, skip_special_tokens=True)

# print the generated text
print(generated_text)

Pointing Video QA

from transformers import AutoProcessor, AutoModelForImageTextToText
import torch
from molmo_utils import process_vision_info
import re

model_id="allenai/Molmo2-O-7B"

# load the processor
processor = AutoProcessor.from_pretrained(
    model_id,
    trust_remote_code=True,
    dtype="auto",
    device_map="auto"
)

# load the model
model = AutoModelForImageTextToText.from_pretrained(
    model_id,
    trust_remote_code=True,
    dtype="auto",
    device_map="auto"
)

COORD_REGEX = re.compile(rf"")
FRAME_REGEX = re.compile(rf"(?:^|\t|:|,|;)([0-9\.]+) ([0-9\. ]+)")
POINTS_REGEX = re.compile(r"([0-9]+) ([0-9]{3,4}) ([0-9]{3,4})")

def _points_from_num_str(text, image_w, image_h, extract_ids=False):
    all_points = []
    for points in POINTS_REGEX.finditer(text):
        ix, x, y = points.group(1), points.group(2), points.group(3)
        # our points format assume coordinates are scaled by 1000
        x, y = float(x)/1000*image_w, float(y)/1000*image_h
        if 0 <= x <= image_w and 0 <= y <= image_h:
            yield ix, x, y

def extract_video_points(text, image_w, image_h, extract_ids=False):
    """Extract video pointing coordinates as a flattened list of (t, x, y) triplets from model output text."""
    all_points = []
    for coord in COORD_REGEX.finditer(text):
        for point_grp in FRAME_REGEX.finditer(coord.group(1)):
            frame_id = float(point_grp.group(1))
            w, h = (image_w, image_h)
            for idx, x, y in _points_from_num_str(point_grp.group(2), w, h):
                if extract_ids:
                    all_points.append((frame_id, idx, x, y))
                else:
                    all_points.append((frame_id, x, y))
    return all_points

messages = [
    {
        "role": "user",
        "content": [
            dict(type="text", text="Point to the penguins."),
            dict(type="video", video="https://storage.googleapis.com/oe-training-public/demo_videos/many_penguins.mp4"),
        ],
    }
]

# process the video using `molmo_utils.process_vision_info`
_, videos, video_kwargs = process_vision_info(messages)
videos, video_metadatas = zip(*videos)
videos, video_metadatas = list(videos), list(video_metadatas)

# apply the chat template to the input messages
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)

# process the video and text
inputs = processor(
    videos=videos,
    video_metadata=video_metadatas,
    text=text,
    padding=True,
    return_tensors="pt",
    **video_kwargs,
)

inputs = {k: v.to(model.device) for k, v in inputs.items()}

# generate output
with torch.inference_mode():
    generated_ids = model.generate(**inputs, max_new_tokens=2048)

# only get generated tokens; decode them to text
generated_toke

Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.

© 2026 AxForge · EU-hosted AI infrastructure Pricing Docs Trust Privacy Terms