Model reference · open weights

TowerVision

LLMs utter-project Vision + text 2 builds Non-commercial 148 dl/mo

TowerVision is an open-weight language model from utter-project. TowerVision-9B (FP32) weighs 19.3 GB; the smallest configuration that runs it is 2× RTX 4060 Ti 16 GB.

  • TowerVision is an open-source multilingual vision-language model family developed by utter-project for image-text-to-text tasks such as captioning, visual understanding, and question answering.
  • The specific 2B variant contains 3.0B parameters, supports a context length of 8192 tokens, and is trained on 20 languages and dialects including English, German, and Hindi.
  • It is released under the cc-by-nc-sa-4.0 license.

Summary of the utter-project/TowerVision-2B model card, 2026-10-01. The estimate below is for another build of the family.

What it is

Released byutter-project
Released2025-08-11
Parameters3.0B
VRAM19.3 GB for the weights

What it runs on

Memory and cards for TowerVision-9B (FP32)

19.3 GBweights, file size
172 MBcache per 1K tokens
1.4 GBwindow cache per request
2.2 GBruntime overhead, at least
8,192 tokenscontext max
CardRequests at onceContext maxMemory
8K each
RTX 3060 12 GB … RTX 4060 Ti 16 GB
2 smaller cards
——
RTX 3090 24 GB—2K23.4 GB
RTX 4090 24 GB—2K23.4 GB
RTX 5090 32 GB3all 8K31.0 GB
L40S 48 GB7all 8K44.0 GB
A100 80 GB20all 8K78.2 GB
H100 80 GB18all 8K78.1 GB
RTX PRO 6000 Blackwell 96 GB23all 8K93.8 GB
DGX Spark (GB10) 128 GB unified28all 8K107 GB
H200 141 GB39all 8K138 GB
B200 180 GB52all 8K176 GB
2× RTX 4060 Ti 16 GB
tensor parallel
2all 8K15.4 GB a card
2× RTX 4090 24 GB
tensor parallel
8all 8K23.4 GB a card
2× RTX 3090 24 GB
tensor parallel
8all 8K23.4 GB a card
2× RTX 5090 32 GB
tensor parallel
13all 8K31.0 GB a card
2× L40S 48 GB
tensor parallel
22all 8K44.0 GB a card
Memory needed at each load
Requests at once8K tokens each
124.3 GB
535.6 GB
844.0 GB
1666.6 GB
32112 GB
64202 GB

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

Builds

Sizes, precisions & builds

BuildParamsPrecisionWeightsSmallest setup
TowerVision-2B ↗ 3.0BFP32 6.0 GBRTX 3060 12 GB
TowerVision-9B (above) ↗ 9.7BFP32 19.3 GB2× RTX 4060 Ti 16 GB

From the model card

What utter-project says about TowerVision

Read the model card

TowerVision is a family of open-source multilingual vision-language models with strong capabilities optimized for a variety of vision-language use cases, including image captioning, visual understanding, summarization, question answering, and more. TowerVision excels particularly in multimodal multilingual translation benchmarks and culturally-aware tasks, demonstrating exceptional performance across 20 languages and dialects.

This model card covers the TowerVision family, including the 2B and 9B parameter versions, both in their instruct-tuned (it) and pretrained (pt) variants, with the latter not undergoing instruction tuning.

  • Model Family: TowerVision (2B, 9B variants)
  • Context length: 8192 tokens
  • Languages: 20+ languages including European, Asian, and other language families

Available Models

ModelParametersHF Link
TowerVision-2B2B🤗 utter-project/TowerVision-2B
TowerVision-9B9B🤗 utter-project/TowerVision-9B

How to Use TowerVision

When using the model, make sure your prompt is formated correctly! Also, we recommend using bfloat16 rather than fp32/16

Quick Start with Transformers

from transformers import (
    LlavaNextProcessor,
    LlavaNextForConditionalGeneration
)
import requests
from PIL import Image

model_id = "utter-project/TowerVision-2B"  # or any other variant

def prepare_prompt(query):
    conversation = [
        {
            "role": "user",
            "content": f"\n{query}"
        }
    ]

    # Format message with the towervision chat template
    prompt = processor.apply_chat_template(
        conversation,
        tokenize=False,
        add_generation_prompt=True
    )

    return prompt

# we recommend using "bfloat16" as torch_dtype
kwargs = {
    "torch_dtype": "bfloat16",
    "device_map": "auto",
}
processor = LlavaNextProcessor.from_pretrained(model_id)
model = LlavaNextForConditionalGeneration.from_pretrained(model_id, **kwargs)

# img url
img_url = "https://cms.mistral.ai/assets/a10b924e-56b3-4359-bf6c-571107811c8f"
image = Image.open(requests.get(img_url, stream=True).raw)

# Multilingual prompts - TowerVision supports 20+ languages!
prompt = prepare_prompt("Is this person really big, or is this building just super small?")

# Prepare inputs
inputs = processor(
    text=prompt, images=image, return_tensors="pt"
).to(model.device)

# Generate response ids
gen_tokens = model.generate(**inputs, max_new_tokens=512)
# Decode response
print(processor.tokenizer.decode(gen_tokens[0][inputs.input_ids.shape[1]:], skip_special_tokens=True))

Batch Inference with Transformers

For processing multiple images and prompts simultaneously:

def prepare_prompts(queries):
    prompts = []
    for query in queries:
        conversation = [
            {
                "role": "user",
                "content": f"\n{query}"
            }
        ]

        # Format message with the towervision chat template
        prompt = processor.apply_chat_template(
            conversation,
            tokenize=False,
            add_generation_prompt=True
        )
        prompts.append(prompt)
    return prompts

# we recommend using "bfloat16" as torch_dtype
kwargs = {
    "torch_dtype": "bfloat16",
    "device_map": "auto",
}
processor = LlavaNextProcessor.from_pretrained(model_id)
model = LlavaNextForConditionalGeneration.from_pretrained(model_id, **kwargs)

# Sample images and queries for batch processing
img_urls = [
    "https://cms.mistral.ai/assets/a10b924e-56b3-4359-bf6c-571107811c8f",
    "https://cms.mistral.ai/assets/a10b924e-56b3-4359-bf6c-571107811c8f",
]

queries = [
    "Is this person really big, or is this building just super small?",
    "Where was this photo taken?"
]

# Load images
images = []
for url in img_urls[:batch_size]:
    image = Image.open(requests.get(url, stream=True).raw)
    images.append(image)

# Prepare prompts
prompts = prepare_prompts(queries[:batch_size])

# Prepare batch inputs
inputs = processor(
    text=prompts,
    images=images,
    return_tensors="pt",
    padding=True
).to(model.device)

# Generate response ids for batch
gen_tokens = model.generate(**inputs, max_new_tokens=512, do_sample=False)

# Decode responses
print(f"Batch processing {len(images)} images:")
print("-" * 50)

for i in range(len(images)):
    input_length = inputs.input_ids[i].shape[0]
    response = processor.tokenizer.decode(
        gen_tokens[i][input_length:],
        skip_special_tokens=True
    )
    print(f"Response: {response}")
    print("-" * 50)

Pipeline Usage

from transformers import pipeline
from PIL import Image
import requests

pipe = pipeline(
    model="utter-project/TowerVision-9B",
    task="image-text-to-text",
    device_map="auto",
    dtype="bfloat16"
)

def prepare_prompt(query):
    conversation = [
        {
            "role": "user",
            "content": f"\n{query}"
        }
    ]

    # Format message with the towervision chat template
    return pipe.processor.apply_chat_template(
        conversation,
        tokenize=False,
        add_generation_prompt=True
    )

img_url = "https://cms.mistral.ai/assets/a10b924e-56b3-4359-bf6c-571107811c8f"
image = Image.open(requests.get(img_url, stream=True).raw)
text = prepare_prompt("Is this person really big, or is this building just super small?")

outputs = pipe(text=text, images=image, max_new_tokens=300, return_full_text=False)
print(outputs)

Model Details

Input: Model accepts input text and images.

Output: Model generates text in multiple languages.

Model Architecture: TowerVision uses a multilingual language model based on Tower-Plus (2B and 9B parameters), paired with SigLIP2-patch14-384 vi

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