Pixel Reconstruction Tuning
Collection
Blog: https://haoquanzhang.github.io/pixelbench/
PRT checkpoints and comparison baselines for Molmo2 and Qwen3-VL. โข 14 items โข Updated
How to use haoquan03/PixelBench-Qwen3-VL-8B-PRT with Transformers:
# Use a pipeline as a high-level helper
from transformers import pipeline
pipe = pipeline("image-text-to-text", model="haoquan03/PixelBench-Qwen3-VL-8B-PRT")
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"},
{"type": "text", "text": "What animal is on the candy?"}
]
},
]
pipe(text=messages) # pip install -U transformers accelerate
# Load model directly
from transformers import AutoProcessor, AutoModelForMultimodalLM
processor = AutoProcessor.from_pretrained("haoquan03/PixelBench-Qwen3-VL-8B-PRT")
model = AutoModelForMultimodalLM.from_pretrained("haoquan03/PixelBench-Qwen3-VL-8B-PRT", device_map="auto")
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"},
{"type": "text", "text": "What animal is on the candy?"}
]
},
]
inputs = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt",
).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=256)
print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:]))How to use haoquan03/PixelBench-Qwen3-VL-8B-PRT with vLLM:
# Install vLLM from pip:
pip install vllm
# Start the vLLM server:
vllm serve "haoquan03/PixelBench-Qwen3-VL-8B-PRT"
# Call the server using curl (OpenAI-compatible API):
curl -X POST "http://localhost:8000/v1/chat/completions" \
-H "Content-Type: application/json" \
--data '{
"model": "haoquan03/PixelBench-Qwen3-VL-8B-PRT",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Describe this image in one sentence."
},
{
"type": "image_url",
"image_url": {
"url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg"
}
}
]
}
]
}'docker model run hf.co/haoquan03/PixelBench-Qwen3-VL-8B-PRT
How to use haoquan03/PixelBench-Qwen3-VL-8B-PRT with SGLang:
# Install SGLang from pip:
pip install sglang
# Start the SGLang server:
python3 -m sglang.launch_server \
--model-path "haoquan03/PixelBench-Qwen3-VL-8B-PRT" \
--host 0.0.0.0 \
--port 30000
# Call the server using curl (OpenAI-compatible API):
curl -X POST "http://localhost:30000/v1/chat/completions" \
-H "Content-Type: application/json" \
--data '{
"model": "haoquan03/PixelBench-Qwen3-VL-8B-PRT",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Describe this image in one sentence."
},
{
"type": "image_url",
"image_url": {
"url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg"
}
}
]
}
]
}'docker run --gpus all \
--shm-size 32g \
-p 30000:30000 \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HF_TOKEN=<secret>" \
--ipc=host \
lmsysorg/sglang:latest \
python3 -m sglang.launch_server \
--model-path "haoquan03/PixelBench-Qwen3-VL-8B-PRT" \
--host 0.0.0.0 \
--port 30000
# Call the server using curl (OpenAI-compatible API):
curl -X POST "http://localhost:30000/v1/chat/completions" \
-H "Content-Type: application/json" \
--data '{
"model": "haoquan03/PixelBench-Qwen3-VL-8B-PRT",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Describe this image in one sentence."
},
{
"type": "image_url",
"image_url": {
"url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg"
}
}
]
}
]
}'How to use haoquan03/PixelBench-Qwen3-VL-8B-PRT with Docker Model Runner:
docker model run hf.co/haoquan03/PixelBench-Qwen3-VL-8B-PRT
Qwen3-VL-8B PRT, used in the paper's Qwen additive comparison. Fine-tuned from Qwen/Qwen3-VL-8B-Instruct on FineVision instructions and mixed 16ร16, 32ร32, and 64ร64 Pixel reconstruction targets. All model parameters were trained.
Part of Can LLMs Understand and Generate Images Pixel by Pixel? Project ยท Code and evaluation
Install a CUDA-compatible PyTorch build, then:
pip install transformers==5.12.1 accelerate pillow torchvision
import torch
from PIL import Image
from transformers import AutoModelForImageTextToText, AutoProcessor
model_id = "haoquan03/PixelBench-Qwen3-VL-8B-PRT"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(
model_id, dtype="auto", device_map="auto", attn_implementation="sdpa"
).eval()
messages = [{"role": "user", "content": [
{"type": "image", "image": Image.open("image.jpg").convert("RGB")},
{"type": "text", "text": "Describe this image."},
]}]
inputs = processor.apply_chat_template(
messages, tokenize=True, add_generation_prompt=True,
return_dict=True, return_tensors="pt",
).to(model.device)
with torch.inference_mode(), torch.autocast("cuda", dtype=torch.bfloat16):
output = model.generate(**inputs, max_new_tokens=256, do_sample=False, use_cache=True)
print(processor.decode(output[0, inputs.input_ids.shape[1]:], skip_special_tokens=True))
Training settings and the evaluation protocol are available in the code repository.
@article{zhang2026pixelbench,
title={Can {LLMs} Understand and Generate Images Pixel by Pixel?},
author={Haoquan Zhang and Feiyang Liu and Juanxi Tian and Wanhua Li and Haodong Duan and Weiyang Liu},
journal={arXiv preprint arXiv:TBA},
year={2026},
url={https://haoquanzhang.github.io/pixelbench/}
}