🚀 Emu3:僅需下一令牌預測
我們推出了 Emu3,這是一套全新的、僅通過 下一令牌預測 進行訓練的最先進多模態模型!通過將圖像、文本和視頻標記化到離散空間,我們在多模態序列的混合數據上從頭開始訓練單個Transformer模型。
Emu3在生成和感知方面均表現出色
Emu3 在生成和感知任務中均優於多個成熟的特定任務模型,超越瞭如SDXL、LLaVA - 1.6和OpenSora - 1.2等旗艦開源模型,同時無需擴散或組合架構。
🚀 快速開始
模型信息
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 = " 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)
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 = "The image depicts "
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)
✨ 主要特性
- Emu3 能夠通過簡單地預測下一個視覺令牌,根據文本輸入生成高質量圖像。該模型自然支持靈活的分辨率和風格。
- Emu3 展現出強大的視覺 - 語言理解能力,能夠感知現實世界並提供連貫的文本響應。值得注意的是,這種能力的實現不依賴於CLIP和預訓練的大語言模型。
- Emu3 只需通過預測視頻序列中的下一個令牌,就能自然地生成視頻,這與Sora中的視頻擴散模型不同。在有視頻上下文的情況下,Emu3還能自然地擴展視頻並預測接下來會發生的事情。
📄 許可證
本項目採用Apache - 2.0許可證。
項目鏈接
對比圖展示