pipeline_tag: 任意到任意
license: apache-2.0
library_name: transformers
我们推出Emu3,这是一套全新的最先进的多模态模型,仅通过**下一个标记预测**训练而成!通过将图像、文本和视频标记化为离散空间,我们在多模态序列的混合上从头开始训练一个单一的Transformer模型。
Emu3在生成和感知方面均表现出色
Emu3在生成和感知任务中均优于多个成熟的任务专用模型,超越了SDXL、LLaVA-1.6和OpenSora-1.2等旗舰开源模型,同时无需依赖扩散或组合架构。
亮点
- Emu3能够通过简单地预测下一个视觉标记,根据文本输入生成高质量图像。该模型天然支持灵活的分辨率和风格。
- Emu3展现出强大的视觉语言理解能力,能够观察物理世界并提供连贯的文本响应。值得注意的是,这一能力无需依赖CLIP或预训练的大型语言模型即可实现。
- Emu3通过预测视频序列中的下一个标记来简单地生成视频,这与Sora中的视频扩散模型不同。在有上下文视频的情况下,Emu3还能自然地扩展视频并预测接下来会发生什么。
模型信息
Emu3-Stage1模型是Emu3预训练过程第一阶段的预训练权重。Emu3的预训练过程分为两个阶段。在第一阶段,不使用视频数据,训练从零开始,文本和图像数据的上下文长度为5120。该模型支持图像描述,并能生成512x512分辨率的图像。您可以使用我们的训练脚本进行进一步的指令微调,以支持更多图像生成和感知任务。
快速开始
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-Stage1_MODEL)
from processing_emu3 import Emu3Processor
EMU_HUB = "BAAI/Emu3-Stage1"
VQ_HUB = "BAAI/Emu3-VisionTokenizer"
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, chat_template="{image_prompt}{text_prompt}")
POSITIVE_PROMPT = "杰作,胶片颗粒感,最佳质量。"
NEGATIVE_PROMPT = "低分辨率,解剖结构错误,手部错误,文本,错误,缺失手指,额外手指,手指较少,裁剪,最差质量,低质量,普通质量,JPEG伪影,签名,水印,用户名,模糊。"
classifier_free_guidance = 3.0
prompt = "一幅年轻女孩的肖像。"
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)
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,
),
])
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")
text = "图像描绘了 "
image = Image.open("assets/demo.png")
inputs = processor(
text=text,
image=image,
mode='U',
padding="longest",
return_tensors="pt",
)
GENERATION_CONFIG = GenerationConfig(
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
max_new_tokens=1024,
)
outputs = model.generate(
inputs.input_ids.to("cuda:0"),
GENERATION_CONFIG,
attention_mask=inputs.attention_mask.to("cuda:0"),
)
outputs = outputs[:, inputs.input_ids.shape[-1]:]
answers = processor.batch_decode(outputs, skip_special_tokens=True)
for ans in answers:
print(ans)