Diffusers documentation
Lumina-T2X
Lumina-T2X
Alpha-VLLM、OpenGVLab、Shanghai AI Laboratory による Lumina-Next : Next-DiT で Lumina-T2X をより強力で高速に。
論文の抄録は以下の通りです:
Lumina-T2X は、テキスト指示を条件としてノイズを画像や動画などのさまざまなモダリティに変換するための統一フレームワークを確立した、Flow ベースの Large Diffusion Transformers (Flag-DiT) の初期のファミリーです。有望な能力を有するものの、Lumina-T2X には、トレーニングの不安定性、推論の遅さ、および外挿アーティファクトといった課題が残っています。本論文では、Lumina-T2X の改良版である Lumina-Next を提案し、トレーニングと推論の効率を向上させながら、より強力な生成性能を実現することを示します。まず、Flag-DiT アーキテクチャの包括的な分析を行い、いくつかの最適でないコンポーネントを特定しました。これらを解決するために、3D RoPE とサンドイッチ型正規化を備えた Next-DiT アーキテクチャを導入します。より良い解像度外挿を可能にするため、3D RoPE を用いたテキストから画像への生成に適用される異なるコンテキスト外挿手法を徹底的に比較し、拡散トランスフォーマー向けに設計された周波数および時間認識型スケーリング RoPE を提案します。さらに、Flow ODE の解法におけるサンプリングステップを削減するためのシグモイド時間離散化スケジュールと、冗長なビジュアルトークンをマージしてネットワーク評価を高速化する Context Drop 手法を導入し、全体のサンプリング速度を効果的に向上させます。これらの改良により、Lumina-Next は、基本的なテキストから画像への生成の品質と効率を向上させるだけでなく、デコーダーベースの LLM をテキストエンコーダーとして使用した多言語生成においても、ゼロショットで優れた解像度外挿能力を示します。Lumina-Next が多用途な生成フレームワークであることをさらに検証するため、視覚認識、マルチビュー、オーディオ、音楽、および点群生成といった多様なタスクに適用し、これらの領域で強力な性能を示しました。https://github.com/Alpha-VLLM/Lumina-T2X にすべてのコードとモデルの重みを公開することで、普遍的なモデリング能力を備えた次世代の生成 AI の開発を推進することを目的としています。
ハイライト: Lumina-Nextは次世代のDiffusion Transformerであり、Next-DiTアーキテクチャ、3D RoPE、周波数および時間認識型RoPEなどの改善を導入することで、テキストから画像への生成、多言語生成、マルチタスク性能を大幅に向上させます。
Lumina-Nextには、以下のコンポーネントが含まれています。
- ステップ数を減らし、より高速にすることで、サンプリング効率を向上させます。
- Next-DiTをtransformerのバックボーンとして使用し、Sandwichnorm 3D RoPEとGrouped-Query Attentionを備えています。
- 周波数と時間に対応したスケーリングされた RoPE を使用しています。
Alpha-VLLM、OpenGVLab、Shanghai AI Laboratory による Lumina-T2X: Transforming Text into Any Modality, Resolution, and Duration via Flow-based Large Diffusion Transformers
論文の抄録は以下の通りです:
Soraは、任意の解像度、アスペクト比、長さでフォトリアリスティックな画像や動画を生成するためのDiffusion Transformerのスケーリングの可能性を明らかにしました。しかし、まだ実装の詳細が十分に公開されていません。本技術レポートでは、テキスト指示を条件として、ノイズを画像、動画、マルチビュー3Dオブジェクト、音声クリップに変換するために設計された統一フレームワークとして、ゼロ初期化アテンションを備えたFlow-based Large Diffusion Transformers(Flag-DiT)のシリーズであるLumina-T2Xファミリーを紹介します。潜在空間の空間・時間次元をトークン化し、[nextline]や[nextframe]などの学習可能なプレースホルダーを取り入れることで、Lumina-T2Xは異なる空間・時間解像度における異なるモダリティの表現をシームレスに統一します。この統一アプローチにより、異なるモダリティを単一のフレームワーク内で学習することが可能になり、推論時に任意の解像度、アスペクト比、長さでマルチモーダルデータを柔軟に生成できます。RoPE、RMSNorm、フローマッチングといった高度な技術により、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をバックボーンとして使用しています
- 1つのバックボーンと対応するエンコーダー、デコーダーで、さまざまなモダリティをサポートします。
このパイプラインは PommesPeter によって提供されました。元のコードベースは こちら で確認できます。元の重みは hf.co/Alpha-VLLM 配下で確認できます。
スケジューラーのトレードオフ、すなわち速度と品質のバランスをどのように探求するかを学ぶには、ガイドを必ずご確認ください。また、同じコンポーネントを複数のパイプラインに効率的に読み込む方法については、パイプライン間でコンポーネントを再利用するセクションを参照してください。
推論(テキストから画像へ)
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
class diffusers.LuminaPipeline
< source >( transformer: LuminaNextDiT2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLtext_encoder: GemmaPreTrainedModeltokenizer: GemmaTokenizer )
パラメータ
- vae (AutoencoderKL) — 画像を潜在表現にエンコードし、潜在表現からデコードするための変分オートエンコーダ (VAE) モデル。
- text_encoder (
GemmaPreTrainedModel) — 凍結された Gemma テキストエンコーダーです。 - tokenizer(
GemmaTokenizerまたはGemmaTokenizerFast)— Gemma のトークナイザー。 - transformer (Transformer2DModel) —
テキスト条件付きの
Transformer2DModelで、エンコードされた画像の潜在変数(latents)のノイズ除去を行います。 - 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 ジェネレーター1つまたはリスト。 - latents (
torch.Tensor, 任意) — 画像生成の入力として使用する、ガウス分布からサンプリングされた事前生成されたノイズ付き潜在変数。異なるプロンプトで同じ生成を調整するために使用できます。指定されない場合、指定されたランダムgeneratorを使用してサンプリングを行い、潜在変数テンソルが生成されます。 - prompt_embeds (
torch.Tensor, 任意) — 事前に生成されたテキスト埋め込み。テキスト入力の調整、例えばプロンプトの重み付けなどを容易に行うために使用できます。指定されない場合、prompt入力引数からテキスト埋め込みが生成されます。 - prompt_attention_mask (
torch.Tensor, 任意) — テキスト埋め込み用の事前生成されたアテンションマスク。 - negative_prompt_embeds (
torch.Tensor, 任意) — 事前に生成されたネガティブテキストの埋め込み。Lumina-T2I では、このネガティブプロンプトは "" である必要があります。指定されない場合、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)— 高解像度生成のためにアテンションを比例してスケーリングするかどうかを指定します。 - 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 デバイス - prompt_embeds (
torch.Tensor, 任意) — 事前に生成されたテキスト埋め込み。テキスト入力の調整、例えばプロンプトの重み付けなどを容易に行うために使用できます。指定されない場合、prompt入力引数からテキスト埋め込みが生成されます。 - negative_prompt_embeds (
torch.Tensor, 任意) — 事前生成されたネガティブテキストの埋め込み。Lumina-T2I の場合は、"" 文字列の埋め込みである必要があります。 - clean_caption (
bool、デフォルトはFalse) —Trueの場合、エンコード前に提供されたキャプションを前処理してクリーニングします。 - max_sequence_length (
int、デフォルト値は 256) — プロンプトに使用する最大シーケンス長。
プロンプトをテキストエンコーダーの隠れ状態にエンコードします。