Model reference · open weights
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.
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 by | utter-project |
|---|---|
| Released | 2025-08-11 |
| Parameters | 3.0B |
| VRAM | 19.3 GB for the weights |
What it runs on
| Card | Requests at once | Context max | Memory |
|---|---|---|---|
| 8K each | |||
| RTX 3060 12 GB … RTX 4060 Ti 16 GB 2 smaller cards | — | — | |
| RTX 3090 24 GB | — | 2K | 23.4 GB |
| RTX 4090 24 GB | — | 2K | 23.4 GB |
| RTX 5090 32 GB | 3 | all 8K | 31.0 GB |
| L40S 48 GB | 7 | all 8K | 44.0 GB |
| A100 80 GB | 20 | all 8K | 78.2 GB |
| H100 80 GB | 18 | all 8K | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | 23 | all 8K | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | 28 | all 8K | 107 GB |
| H200 141 GB | 39 | all 8K | 138 GB |
| B200 180 GB | 52 | all 8K | 176 GB |
| 2× RTX 4060 Ti 16 GB tensor parallel | 2 | all 8K | 15.4 GB a card |
| 2× RTX 4090 24 GB tensor parallel | 8 | all 8K | 23.4 GB a card |
| 2× RTX 3090 24 GB tensor parallel | 8 | all 8K | 23.4 GB a card |
| 2× RTX 5090 32 GB tensor parallel | 13 | all 8K | 31.0 GB a card |
| 2× L40S 48 GB tensor parallel | 22 | all 8K | 44.0 GB a card |
| Requests at once | 8K tokens each |
|---|---|
| 1 | 24.3 GB |
| 5 | 35.6 GB |
| 8 | 44.0 GB |
| 16 | 66.6 GB |
| 32 | 112 GB |
| 64 | 202 GB |
One card, with vLLM's small-card settings.
Builds
| Build | Params | Precision | Weights | Smallest setup |
|---|---|---|---|---|
| TowerVision-2B ↗ | 3.0B | FP32 | 6.0 GB | RTX 3060 12 GB |
| TowerVision-9B (above) ↗ | 9.7B | FP32 | 19.3 GB | 2× RTX 4060 Ti 16 GB |
From 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 | Parameters | HF Link |
|---|---|---|
| TowerVision-2B | 2B | 🤗 utter-project/TowerVision-2B |
| TowerVision-9B | 9B | 🤗 utter-project/TowerVision-9B |
When using the model, make sure your prompt is formated correctly! Also, we recommend using bfloat16 rather than fp32/16
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))
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)
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)
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.