Model reference · open weights
Emu3-Gen is an open-weight language model from BAAI. Emu3-Gen (FP32) weighs 17.0 GB; the smallest configuration that runs it is 2× RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the BAAI/Emu3-Gen model card, 2026-10-01
What it is
| Released by | BAAI |
|---|---|
| Released | 2024-09-25 |
| Parameters | 8.5B |
| VRAM | 17.0 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 | 5 | all 9K | 23.4 GB |
| RTX 4090 24 GB | 5 | all 9K | 23.4 GB |
| RTX 5090 32 GB | 12 | all 9K | 31.0 GB |
| L40S 48 GB | 24 | all 9K | 44.0 GB |
| A100 80 GB | 56 | all 9K | 78.2 GB |
| H100 80 GB | 51 | all 9K | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | 66 | all 9K | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | 78 | all 9K | 107 GB |
| H200 141 GB | 107 | all 9K | 138 GB |
| B200 180 GB | 142 | all 9K | 176 GB |
| 2× RTX 3060 12 GB tensor parallel | 4 | all 9K | 11.6 GB a card |
| 2× RTX 4060 Ti 16 GB tensor parallel | 11 | all 9K | 15.4 GB a card |
| 2× RTX 4090 24 GB tensor parallel | 26 | all 9K | 23.4 GB a card |
| 2× RTX 3090 24 GB tensor parallel | 26 | all 9K | 23.4 GB a card |
| Requests at once | 8K tokens each |
|---|---|
| 1 | 18.9 GB |
| 5 | 23.2 GB |
| 8 | 26.4 GB |
| 16 | 35.0 GB |
| 32 | 52.1 GB |
| 64 | 86.5 GB |
One card, with vLLM's small-card settings.
From the model card
| Project Page | Paper | 🤗HF Models | github | Demo |
We introduce Emu3, a new suite of state-of-the-art multimodal models trained solely with next-token prediction! By tokenizing images, text, and videos into a discrete space, we train a single transformer from scratch on a mixture of multimodal sequences.
Emu3 outperforms several well-established task-specific models in both generation and perception tasks, surpassing flagship open models such as SDXL, LLaVA-1.6 and OpenSora-1.2, while eliminating the need for diffusion or compositional architectures.
from PIL import Image
from transformers import AutoTokenizer, AutoModel, AutoImageProcessor, AutoModelForCausalLM
from transformers.generation.configuration_utils import GenerationConfig
from transformers.generation import LogitsProcessorList, PrefixConstrainedLogitsProcessor, UnbatchedClassifierFreeGuidanceLogitsProcessor
import torch
import sys
sys.path.append(PATH_TO_BAAI_Emu3-Gen_MODEL)
from processing_emu3 import Emu3Processor
# model path
EMU_HUB = "BAAI/Emu3-Gen"
VQ_HUB = "BAAI/Emu3-VisionTokenizer"
# prepare model and processor
model = AutoModelForCausalLM.from_pretrained(
EMU_HUB,
device_map="cuda:0",
torch_dtype=torch.bfloat16,
attn_implementation="flash_attention_2",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained(EMU_HUB, trust_remote_code=True, padding_side="left")
image_processor = AutoImageProcessor.from_pretrained(VQ_HUB, trust_remote_code=True)
image_tokenizer = AutoModel.from_pretrained(VQ_HUB, device_map="cuda:0", trust_remote_code=True).eval()
processor = Emu3Processor(image_processor, image_tokenizer, tokenizer)
# prepare input
POSITIVE_PROMPT = " masterpiece, film grained, best quality."
NEGATIVE_PROMPT = "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry."
classifier_free_guidance = 3.0
prompt = "a portrait of young girl."
prompt += POSITIVE_PROMPT
kwargs = dict(
mode='G',
ratio="1:1",
image_area=model.config.image_area,
return_tensors="pt",
padding="longest",
)
pos_inputs = processor(text=prompt, **kwargs)
neg_inputs = processor(text=NEGATIVE_PROMPT, **kwargs)
# prepare hyper parameters
GENERATION_CONFIG = GenerationConfig(
use_cache=True,
eos_token_id=model.config.eos_token_id,
pad_token_id=model.config.pad_token_id,
max_new_tokens=40960,
do_sample=True,
top_k=2048,
)
h = pos_inputs.image_size[:, 0]
w = pos_inputs.image_size[:, 1]
constrained_fn = processor.build_prefix_constrained_fn(h, w)
logits_processor = LogitsProcessorList([
UnbatchedClassifierFreeGuidanceLogitsProcessor(
classifier_free_guidance,
model,
unconditional_ids=neg_inputs.input_ids.to("cuda:0"),
),
PrefixConstrainedLogitsProcessor(
constrained_fn ,
num_beams=1,
),
])
# generate
outputs = model.generate(
pos_inputs.input_ids.to("cuda:0"),
GENERATION_CONFIG,
logits_processor=logits_processor,
attention_mask=pos_inputs.attention_mask.to("cuda:0"),
)
mm_list = processor.decode(outputs[0])
for idx, im in enumerate(mm_list):
if not isinstance(im, Image.Image):
continue
im.save(f"result_{idx}.png")
Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.