Diffusers documentation
Lumina-T2X
Lumina-T2X
Alpha-VLLM, OpenGVLab, Shanghai AI Laboratory의 Lumina-Next : Next-DiT로 Lumina-T2X를 더 강력하고 빠르게
해당 논문의 초록은 다음과 같습니다:
Lumina-T2X는 텍스트 지시 조건에 따라 노이즈를 이미지와 비디오 등 다양한 모달리티로 변환하는 통합 프레임워크를 확립하는, Flow 기반의 대규모 Diffusion Transformer(Flag-DiT)의 초기 계열입니다. 유망한 기능에도 불구하고 Lumina-T2X는 여전히 학습 불안정성, 느린 추론, 외삽 아티팩트 등의 과제에 직면해 있습니다. 본 논문에서는 Lumina-T2X의 개선 버전인 Lumina-Next를 제시하며, 학습 및 추론 효율성을 높여 더 강력한 생성 성능을 보여줍니다. 우리는 Flag-DiT 아키텍처에 대한 포괄적인 분석으로 시작하여 여러 비최적 구성 요소를 식별하고, 3D RoPE와 샌드위치 정규화를 갖춘 Next-DiT 아키텍처를 도입하여 이를 해결합니다. 더 나은 해상도 외삽을 위해, 3D RoPE를 적용한 텍스트-이미지 생성에 적용되는 다양한 컨텍스트 외삽 방법을 면밀히 비교하고, Diffusion Transformer에 맞춤 설계된 주파수 및 시간 인지 스케일링 RoPE(Frequency- and Time-Aware Scaled RoPE)를 제안합니다. 또한, Flow ODE 풀이에 필요한 샘플링 단계 수를 줄이기 위해 시그모이드 시간 이산화 스케줄을 도입하고, 네트워크 평가 속도를 높이기 위해 중복된 시각 토큰을 병합하는 Context Drop 방법을 제안하여 전체 샘플링 속도를 효과적으로 향상시킵니다. 이러한 개선 사항 덕분에 Lumina-Next는 기본 텍스트-이미지 생성의 품질과 효율성을 향상시킬 뿐만 아니라, 디코더 기반 LLM을 텍스트 인코더로 사용하여 제로샷 방식으로 우수한 해상도 외삽 능력과 다국어 생성을 입증합니다. Lumina-Next가 범용 생성 프레임워크임을 추가로 검증하기 위해, 시각 인식, 멀티뷰, 오디오, 음악, 포인트 클라우드 생성 등 다양한 작업에 이를 적용하여 해당 도메인 전반에서 강력한 성능을 보여줍니다. 모든 코드와 모델 가중치를 https://github.com/Alpha-VLLM/Lumina-T2X에 공개함으로써, 범용 모델링이 가능한 차세대 생성형 AI의 개발을 촉진하는 것을 목표로 합니다.
주요 특징: Lumina-Next는 Next-DiT 아키텍처, 3D RoPE, 주파수 및 시간 인식 RoPE 등 다양한 개선을 도입하여 텍스트-이미지 생성, 다국어 생성, 멀티태스크 성능을 크게 향상시킨 차세대 Diffusion Transformer입니다.
Lumina-Next에는 다음 구성 요소가 있습니다:
- Steps의 수를 줄이고 속도를 높여 샘플링 효율을 개선합니다.
- Next-DiT를 transformer backbone으로 사용하며, Sandwichnorm 3D RoPE와 Grouped-Query Attention을 적용합니다.
- 주파수 및 시간 인식 스케일링 RoPE를 사용합니다.
Alpha-VLLM, OpenGVLab, Shanghai AI Laboratory의 Lumina-T2X: Flow-based Large Diffusion Transformers를 통해 텍스트를 임의의 모달리티, 해상도, 길이로 변환
해당 논문의 초록은 다음과 같습니다:
Sora는 임의의 해상도, 종횡비, 길이로 사진처럼 사실적인 이미지와 비디오를 생성하기 위해 Diffusion Transformer의 스케일링 잠재력을 보여주었지만, 여전히 충분한 구현 세부 사항이 부족합니다. 이 기술 보고서는 텍스트 지시어에 조건부인 노이즈를 이미지, 비디오, 멀티뷰 3D 객체, 오디오 클립으로 변환하도록 설계된 통합 프레임워크로, zero-initialized attention을 갖춘 Flow-based Large Diffusion Transformers(Flag-DiT) 시리즈인 Lumina-T2X를 소개합니다. 잠재 공간-시간 공간을 토큰화하고 [nextline] 및 [nextframe] 토큰과 같은 학습 가능한 플레이스홀더를 포함함으로써, Lumina-T2X는 다양한 공간-시간 해상도에서 서로 다른 모달리티의 표현을 원활하게 통합합니다. 이러한 통합 접근 방식은 단일 프레임워크 내에서 서로 다른 모달리티에 대한 학습을 가능하게 하고, 추론 시 임의의 해상도, 종횡비, 길이로 멀티모달 데이터를 유연하게 생성할 수 있게 합니다. RoPE, RMSNorm, flow matching과 같은 고급 기술은 Flag-DiT의 안정성, 유연성, 확장성을 향상시켜 Lumina-T2X 모델이 70억 개 매개변수까지 확장되고 컨텍스트 윈도우가 128K 토큰까지 연장되도록 합니다. 이는 특히 Lumina-T2I 모델로 초고화질 이미지를 생성하고 Lumina-T2V 모델로 긴 720p 비디오를 생성하는 데 매우 유리합니다. 주목할 점은, 50억 개 매개변수의 Flag-DiT로 구동되는 Lumina-T2I가 6억 개 매개변수의 단순한 DiT 대비 학습 계산 비용의 35%만 필요하다는 것입니다. 우리의 추가적인 종합 분석은 Lumina-T2X의 해상도 외삽, 고해상도 편집, 일관된 3D 뷰 생성, 매끄러운 전환을 가진 비디오 합성 능력의 예비적 잠재력을 강조합니다. Lumina-T2X의 오픈소스 공개가 생성형 AI 커뮤니티의 창의성, 투명성, 다양성을 한층 더 촉진할 것으로 기대합니다.
원본 코드베이스는 Alpha-VLLM에서, 사용 가능한 모든 체크포인트는 Alpha-VLLM Lumina Family에서 찾을 수 있습니다.
주요 특징: Lumina-T2X는 모든 모달리티, 해상도, 길이를 지원합니다.
Lumina-T2X에는 다음 구성 요소가 있습니다:
- Flow-based Large Diffusion Transformer를 백본으로 사용합니다
- …
이 파이프라인은 PommesPeter가 기여했습니다. 원본 코드베이스는 여기에서 찾을 수 있습니다. 원본 가중치는 hf.co/Alpha-VLLM에서 찾을 수 있습니다.
Scheduler의 가이드를 확인하여 스케줄러의 속도와 품질 사이의 트레이드오프를 탐색하는 방법을 배우고, 파이프라인 간 구성 요소 재사용 섹션을 확인하여 동일한 구성 요소를 여러 파이프라인에 효율적으로 로드하는 방법을 배워보세요.
추론(텍스트-이미지)
torch.compile를 사용하여 추론 지연 시간을 줄입니다.
먼저, 파이프라인을 로드합니다:
from diffusers import LuminaPipeline
import torch
pipeline = LuminaPipeline.from_pretrained(
"Alpha-VLLM/Lumina-Next-SFT-diffusers", dtype=torch.bfloat16
).to("cuda") # or "mps", "xpu", "cpu"그런 다음 파이프라인의 transformer 및 vae 구성 요소의 메모리 레이아웃을 torch.channels-last로 변경합니다:
pipeline.transformer.to(memory_format=torch.channels_last) pipeline.vae.to(memory_format=torch.channels_last)
마지막으로, 컴포넌트를 컴파일하고 추론을 실행합니다:
pipeline.transformer = torch.compile(pipeline.transformer, mode="max-autotune", fullgraph=True)
pipeline.vae.decode = torch.compile(pipeline.vae.decode, mode="max-autotune", fullgraph=True)
image = pipeline(prompt="Upper body of a young woman in a Victorian-era outfit with brass goggles and leather straps. Background shows an industrial revolution cityscape with smoky skies and tall, metal structures").images[0]양자화
Quantization은 모델 가중치를 더 낮은 정밀도의 데이터 타입으로 저장하여 매우 큰 모델의 메모리 요구 사항을 줄이는 데 도움이 됩니다. 그러나 quantization은 비디오 모델에 따라 비디오 품질에 다양한 영향을 미칠 수 있습니다.
지원되는 양자화 백엔드와 사용 사례에 맞는 양자화 백엔드 선택에 대해 자세히 알아보려면 Quantization 개요를 참조하세요. 아래 예제는 bitsandbytes를 사용하여 추론을 위해 양자화된 LuminaPipeline을 로드하는 방법을 보여줍니다.
import torch
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig, Transformer2DModel, LuminaPipeline
from transformers import BitsAndBytesConfig as BitsAndBytesConfig, T5EncoderModel
quant_config = BitsAndBytesConfig(load_in_8bit=True)
text_encoder_8bit = T5EncoderModel.from_pretrained(
"Alpha-VLLM/Lumina-Next-SFT-diffusers",
subfolder="text_encoder",
quantization_config=quant_config,
dtype=torch.float16,
)
quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True)
transformer_8bit = Transformer2DModel.from_pretrained(
"Alpha-VLLM/Lumina-Next-SFT-diffusers",
subfolder="transformer",
quantization_config=quant_config,
dtype=torch.float16,
)
pipeline = LuminaPipeline.from_pretrained(
"Alpha-VLLM/Lumina-Next-SFT-diffusers",
text_encoder=text_encoder_8bit,
transformer=transformer_8bit,
dtype=torch.float16,
device_map="balanced",
)
prompt = "a tiny astronaut hatching from an egg on the moon"
image = pipeline(prompt).images[0]
image.save("lumina.png")LuminaPipeline
클래스 diffusers.LuminaPipeline
< source >( transformer: LuminaNextDiT2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLtext_encoder: GemmaPreTrainedModeltokenizer: GemmaTokenizer )
매개변수
- vae (AutoencoderKL) — 이미지를 잠재 표현으로 인코딩하고 디코딩하는 Variational Auto-Encoder (VAE) 모델.
- text_encoder (
GemmaPreTrainedModel) — 동결된 Gemma 텍스트 인코더입니다. - tokenizer (
GemmaTokenizer또는GemmaTokenizerFast) — Gemma 토크나이저. - transformer (Transformer2DModel) —
텍스트 조건부
Transformer2DModel로 인코딩된 이미지 잠재 변수의 노이즈를 제거합니다. - scheduler (SchedulerMixin) —
transformer와 함께 사용되어 인코딩된 이미지 latents의 노이즈를 제거하는 스케줄러.
Lumina-T2I를 사용한 텍스트-이미지 생성을 위한 Pipeline
이 모델은 DiffusionPipeline에서 상속됩니다. 라이브러리가 모든 파이프라인에 대해 구현하는 일반적 메서드(다운로드 또는 저장, 특정 디바이스에서 실행 등)에 대해서는 상위 클래스 문서를 확인하세요.
__call__
< source >( prompt: str | list[str] = Nonewidth: int | None = Noneheight: int | None = Nonenum_inference_steps: int = 30guidance_scale: float = 4.0negative_prompt: str | list[str] = Nonesigmas: list = Nonenum_images_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Trueclean_caption: bool = Truemax_sequence_length: int = 256scaling_watershed: float | None = 1.0proportional_attn: bool | None = Truecallback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list = ['latents'] ) → ImagePipelineOutput or tuple
매개변수
- prompt (
str또는list[str], 선택 사항) — 이미지 생성을 안내할 프롬프트입니다. 정의되지 않은 경우prompt_embeds를 대신 전달해야 합니다. - negative_prompt (
str또는list[str], 선택 사항) — 이미지 생성을 안내하지 않을 프롬프트입니다. 정의되지 않은 경우negative_prompt_embeds를 대신 전달해야 합니다. 가이던스를 사용하지 않을 때 무시됩니다(즉,guidance_scale이1보다 작으면 무시됩니다). - num_inference_steps (
int, 선택 사항, 기본값 30) — 디노이징 단계의 수입니다. 디노이징 단계가 많을수록 일반적으로 더 높은 품질의 이미지를 생성하지만, 추론 속도가 느려집니다. - sigmas (
list[float], 선택 사항) —set_timesteps메서드에sigmas인수를 지원하는 스케줄러의 노이즈 제거 과정에 사용할 커스텀 시그마입니다. 정의되지 않은 경우,num_inference_steps가 전달될 때의 기본 동작이 사용됩니다. - guidance_scale (
float, 선택 사항, 기본값 4.0) — Classifier-Free Diffusion Guidance에서 정의한 가이던스 스케일입니다.guidance_scale은 Imagen Paper의 방정식 2의w로 정의됩니다.guidance_scale > 1로 설정하면 가이던스 스케일이 활성화됩니다. 가이던스 스케일이 높을수록prompt텍스트와 밀접하게 연결된 이미지를 생성하도록 유도하지만, 일반적으로 이미지 품질이 낮아지는 대가를 치릅니다. - num_images_per_prompt (
int, 선택 사항, 기본값 1) — 프롬프트당 생성할 이미지의 수입니다. - height (
int, 선택 사항, 기본값 self.unet.config.sample_size) — 생성된 이미지의 픽셀 단위 높이입니다. - width (
int, 선택 사항, 기본값 self.unet.config.sample_size) — 생성된 이미지의 픽셀 단위 너비입니다. - generator (
torch.Generator또는list[torch.Generator], 선택 사항) — 생성을 결정적으로 만들기 위한 torch generator 하나 또는 목록 - latents (
torch.Tensor, 선택 사항) — 이미지 생성의 입력으로 사용할 가우시안 분포에서 샘플링된 사전 생성된 노이즈 latents입니다. 동일한 생성을 다른 프롬프트로 조정하는 데 사용할 수 있습니다. 제공되지 않으면, 제공된 랜덤generator를 사용하여 샘플링하여 latents 텐서가 생성됩니다. - prompt_embeds (
torch.Tensor, 선택) — 미리 생성된 텍스트 임베딩입니다. 텍스트 입력을 쉽게 조정하는 데 사용할 수 있으며, 예를 들어 프롬프트 가중치 설정에 활용할 수 있습니다. 제공되지 않으면prompt입력 인자로부터 텍스트 임베딩이 생성됩니다. - prompt_attention_mask (
torch.Tensor, 선택 사항) — 텍스트 임베딩을 위한 사전 생성된 어텐션 마스크입니다. - negative_prompt_embeds (
torch.Tensor, 선택 사항) — 미리 생성된 부정 텍스트 임베딩입니다. Lumina-T2I의 경우 이 negative prompt는 ""여야 합니다. 제공되지 않으면negative_prompt입력 인수에서 negative_prompt_embeds가 생성됩니다. - negative_prompt_attention_mask (
torch.Tensor, 선택 사항) — 음성 텍스트 임베딩에 사용할 사전 생성된 어텐션 마스크입니다. - output_type (
str, 선택 사항, 기본값"pil") — 이미지 생성의 출력 형식입니다. PIL:PIL.Image.Image또는np.array중 하나를 선택합니다. - return_dict (
bool, 선택 사항, 기본값True) —~pipelines.stable_diffusion.IFPipelineOutput을 반환할지, 아니면 일반 튜플을 반환할지를 결정합니다. - clean_caption (
bool, 선택 사항, 기본값True) — 임베딩을 생성하기 전에 캡션을 정리할지 여부입니다.beautifulsoup4와ftfy가 설치되어 있어야 합니다. 의존성이 설치되지 않은 경우, 임베딩은 원본 프롬프트에서 생성됩니다. - max_sequence_length (
int, 기본값 120) —prompt에 사용할 최대 시퀀스 길이입니다. - scaling_watershed (
float, 선택 사항, 기본값 1.0) — Lumina가 표준 어텐션과 확장 컨텍스트 어텐션 사이를 전환하는 데 사용하는 해상도 스케일링 임계값입니다. - proportional_attn (
bool, 선택 사항, 기본값 True) — 고해상도 생성 시 attention을 비례적으로 스케일링할지 여부. - callback_on_step_end (
Callable, 선택 사항) — 추론 중 각 디노이징 단계의 끝에서 호출되는 함수입니다. 이 함수는 다음 인수를 받아 호출됩니다:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargs에는callback_on_step_end_tensor_inputs로 지정된 모든 텐서 목록이 포함됩니다. - callback_on_step_end_tensor_inputs (
list, 선택 사항) —callback_on_step_end함수의 텐서 입력 목록입니다. 목록에 지정된 텐서는callback_kwargs인수로 전달됩니다. 파이프라인 클래스의._callback_tensor_inputs속성에 나열된 변수만 포함할 수 있습니다.
반환값
ImagePipelineOutput 또는 tuple
return_dict가 True인 경우 ImagePipelineOutput가 반환되고, 그렇지 않으면 첫 번째 요소가 생성된 이미지의 목록인 tuple이 반환됩니다.
생성을 위해 파이프라인을 호출할 때 호출되는 함수.
예:
>>> import torch
>>> from diffusers import LuminaPipeline
>>> pipe = LuminaPipeline.from_pretrained("Alpha-VLLM/Lumina-Next-SFT-diffusers", torch_dtype=torch.bfloat16)
>>> # Enable memory optimizations.
>>> pipe.enable_model_cpu_offload()
>>> prompt = "Upper body of a young woman in a Victorian-era outfit with brass goggles and leather straps. Background shows an industrial revolution cityscape with smoky skies and tall, metal structures"
>>> image = pipe(prompt).images[0]encode_prompt
< source >( prompt: str | list[str]do_classifier_free_guidance: bool = Truenegative_prompt: str | list[str] = Nonenum_images_per_prompt: int = 1device: typing.Optional[torch.device] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Noneclean_caption: bool = False**kwargs )
매개변수
- prompt (
str또는list[str], 선택 사항) — 인코딩할 프롬프트 - negative_prompt (
str또는list[str], 선택 사항) — 이미지 생성을 유도하지 않을 프롬프트입니다. 정의되지 않은 경우 대신negative_prompt_embeds를 전달해야 합니다. 가이던스를 사용하지 않는 경우 무시됩니다(즉,guidance_scale이1보다 작은 경우 무시됨). Lumina-T2I의 경우 ""여야 합니다. - do_classifier_free_guidance (
bool, 선택 사항, 기본값True) — classifier free guidance를 사용할지 여부 - num_images_per_prompt (
int, 선택 사항, 기본값 1) — 프롬프트당 생성할 이미지 수 - device — (
torch.device, 선택 사항): 결과 임베딩을 배치할 torch device - prompt_embeds (
torch.Tensor, 선택) — 미리 생성된 텍스트 임베딩입니다. 텍스트 입력을 쉽게 조정하는 데 사용할 수 있으며, 예를 들어 프롬프트 가중치 설정에 활용할 수 있습니다. 제공되지 않으면prompt입력 인자로부터 텍스트 임베딩이 생성됩니다. - negative_prompt_embeds (
torch.Tensor, 선택 사항) — 미리 생성된 부정 텍스트 임베딩입니다. Lumina-T2I의 경우, "" 문자열의 임베딩이어야 합니다. - clean_caption (
bool, 기본값False) —True인 경우, 인코딩 전에 제공된 캡션을 전처리하고 정리합니다. - max_sequence_length (
int, 기본값 256) — 프롬프트에 사용할 최대 시퀀스 길이입니다.
프롬프트를 텍스트 인코더의 히든 상태로 인코딩합니다.