HuggingFace Diffusers 0.13 : リリースノート – 制御可能な生成 : Pix2Pix0, Attend & Excite, SEGA, SAG, …

HuggingFace Diffusers 0.13 : リリースノート – 制御可能な生成 : Pix2Pix0, Attend & Excite, SEGA, SAG, … (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/31/2023 (v0.13.0 – 02/20/2023)

* 本ページは、HuggingFace Diffusers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace Diffusers 0.13 : リリースノート – 制御可能な生成 : Pix2Pix0, Attend & Excite, SEGA, SAG, …

🎯 生成の制御

拡散ネットワークの極め細かい制御について多くの最近のワークがあります!

Diffusers は以下をサポートするようになりました :

  1. Instruct Pix2Pix
  2. Pix2Pix 0, 詳細は docs
  3. Attend and excite, 詳細は docs
  4. Semantic guidance, 詳細は docs
  5. Self-attention guidance, 詳細は docs
  6. Depth2image
  7. MultiDiffusion panorama, 詳細は docs

個々の手法の詳細については、画像生成の制御 に関するドキュメントと個々のパイプライン docs をご覧ください。

 

🆙 潜在的アップスケーラー

潜在的アップスケーラーは Stable Diffusion のために明確に設計された拡散モデルです。Stable Diffusion から生成された潜在的表現を取りそれを標準的な VAE でデコードする前にアップスケーラーに渡します。あるいは任意の画像を取り、それを潜在的空間にエンコードし、アップスケーラーを使用して、そしてそれをデコードすることができます。それは非常に柔軟で任意の SD チェックポイントで動作できます。

オリジナル出力画像

2x upscaled 出力画像

The model was developed by Katherine Crowson in collaboration with Stability AI

from diffusers import StableDiffusionLatentUpscalePipeline, StableDiffusionPipeline
import torch

pipeline = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16)
pipeline.to("cuda")

upscaler = StableDiffusionLatentUpscalePipeline.from_pretrained("stabilityai/sd-x2-latent-upscaler", torch_dtype=torch.float16)
upscaler.to("cuda")

prompt = "a photo of an astronaut high resolution, unreal engine, ultra realistic"
generator = torch.manual_seed(33)

# we stay in latent space! Let's make sure that Stable Diffusion returns the image
# in latent space
low_res_latents = pipeline(prompt, generator=generator, output_type="latent").images

upscaled_image = upscaler(
    prompt=prompt,
    image=low_res_latents,
    num_inference_steps=20,
    guidance_scale=0,
    generator=generator,
).images[0]

# Let's save the upscaled image under "upscaled_astronaut.png"
upscaled_image.save("astronaut_1024.png")

# as a comparison: Let's also save the low-res image
with torch.no_grad():
    image = pipeline.decode_latents(low_res_latents)
image = pipeline.numpy_to_pil(image)[0]

image.save("astronaut_512.png")

 

⚡ 最適化

新機能とパイプライン数の増加に加えて、diffusers はパフォーマンスについても多くケアしています。このリリースでは、簡単に有効にできる多くの最適化をもたらしています。

 

xFormers

xFormers により実装されたように、メモリ効率的アテンションは diffusers で暫くの間利用可能になっていました。問題は xFormers のインストールが複雑で、公式 pip wheels がなかった (or それらが古い) ためにソースからインストールするという手段を取る必要があったことです。

xFormers 0.0.16 からすべてのリリースで公式 pip wheels が公開されるようになりましたので、xFormers のインストールと使用はこれら 2 つのステップのように単純になりました :

  • 端末で pip install xformer します。
  • パイプライン内に opt-in するためにコードで pipe.enable_xformers_memory_efficient_attention()

これらのアクションはメモリ節約を劇的にアンロックして、通常は推論も高速化します!

詳細は ドキュメント をご覧ください。

 

Torch 2.0

メモリ効率的アテンションといえば、Accelerated PyTorch 2.0 Transformers がそれの組み込みネイティブサポートとして装備されました!PyTorch 2.0 がリリースされ、もはや xFormers を、またそれを利用するためのサードパーティのパッケージをインストールする必要はありません。diffusers では既にそのための準備をしていてそのままで動作します。従って、PyTorch 2.0 beta の最新 “nightlies” を使用しているならば、あなたは準備ができています – diffusers はデフォルトで Accelerated PyTorch 2.0 Transformers を使用しています。

私たちのテストでは、組み込み PyTorch 2.0 実装が通常は xFormers ほどには高速で、時にさらに速いです。パフォーマンスは貴方が使用しているカード、そしてコードを float16 or float32 で実行しているかに依存しますので、詳細は ドキュメント を確認してください。

 

粗い CPU オフロード

私たちが一緒に思慮深いソフトウェア設計の会話を楽しんでいるコミュニティメンバー @keturn は、enable_sequential_cpu_offload により逐次的な cpu オフローディングを有効にすると多くのメモリを節約しますが推論を遙かに遅くするという事実に注意を喚起しました。

この理由は、enable_sequential_cpu_offload() はメモリのために最適化されていて、モデルに含まれるすべてのサブモジュールに対して再帰的に動作し、それらが必要なときには GPU に移し、別のサブモジュールが実行される必要があるときは CPU に戻されるためです。これらの cpu-to-gpu-to-cpu 転送は stable diffusion ノイズ除去ループの間に数百回発生します、というのは UNet は複数回実行されて幾つかの PyTorch モジュールから構成されるためです。

diffusers のこのリリースではより粗い (coarser) enable_model_cpu_offload パイプライン API を導入します、これは (モジュールではなく) モデル全体を GPU にコピーし、別のモデルが実行される必要があるまでそれらはそこに留まる (stay) ことを確実にします。その結果 :

  • enable_sequential_cpu_offload よりも少ないメモリ節約、しかし :
  • パイプラインがどのようなタイプのオフローディングもしないで使用されるときと殆ど同じくらいに高速な推論。

 

Pix2Pix Zero

CycleGAN の頃は画像で馬をシマウマに変化させる一方でコンテンツの残りは殆どそのままであったことを覚えていますか?Well, that day has arrived but in the context of Diffusion.Pix2Pix Zero はユーザが特定の画像 (それがリアルであっても生成されたものであっても) を編集し、ソースコンセプト (例えば馬) を対象としてそれをターゲットコンセプト (例えばシマウマ) と置き換えることを可能にします。

入力画像

編集された画像

Pix2Pix Zero は Zero-shot Image-to-Image Translation で提案されました。StableDiffusionPix2PixZeroPipeline は以下を可能にします :

  • 入力プロンプトから生成された画像の編集
  • 入力画像を提供してそれを編集する

後者については、入力画像から inverted ノイズを最初に取得するために新たに導入された DDIMInverseScheduler を使用し、続く生成過程でもそれを使用します。

両方のユースケースで “edit directions” のアイデアを活用します、生成をソースコンセプトからターゲットコンセプトに向けて徐々に誘導するために使用されます。詳細は、公式ドキュメント を確認することを勧めます。

 

Attend and excite

Attend-and-Excite: Attention-Based Semantic Guidance for Text-to-Image Diffusion Models. Attend-and-Excite, これは入力テキストプロンプトをより忠実に描写する画像を生成するため、画像合成過程の間に交差アテンション値を変化させるように生成モデルを誘導します。それは入力テキストプロンプトに関して意味的により忠実である画像を作成することを可能にします。Thanks to community contributor @evinpinar for leading the charge to add this pipeline!

  • Attend and excite 2 by @evinpinar @yiyixuxu #2369

 

意味的ガイダンス

拡散モデルのための意味的ガイダンスは SEGA: Instructing Diffusion using Semantic Dimensions で紹介され、画像生成に対する強力な意味的制御を提供します。テキストプロンプトへの小さな変更は通常は全く異なる出力画像という結果になります。けれども、SEGA では、画像への様々な変更は簡単に直感的に制御できて元の画像構成に忠実であり続けることが可能になります。Thanks to the lead author of SEFA, Manuel (@manuelbrack), who added the pipeline in #2223.

Here is a simple demo:

import torch
from diffusers import SemanticStableDiffusionPipeline

pipe = SemanticStableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16)
pipe = pipe.to("cuda")

out = pipe(
    prompt="a photo of the face of a woman",
    num_images_per_prompt=1,
    guidance_scale=7,
    editing_prompt=[
        "smiling, smile",  # Concepts to apply
        "glasses, wearing glasses",
        "curls, wavy hair, curly hair",
        "beard, full beard, mustache",
    ],
    reverse_editing_direction=[False, False, False, False],  # Direction of guidance i.e. increase all concepts
    edit_warmup_steps=[10, 10, 10, 10],  # Warmup period for each concept
    edit_guidance_scale=[4, 5, 5, 5.4],  # Guidance scale for each concept
    edit_threshold=[
        0.99,
        0.975,
        0.925,
        0.96,
    ],  # Threshold for each concept. Threshold equals the percentile of the latent space that will be discarded. I.e. threshold=0.99 uses 1% of the latent dimensions
    edit_momentum_scale=0.3,  # Momentum scale that will be added to the latent guidance
    edit_mom_beta=0.6,  # Momentum beta
    edit_weights=[1, 1, 1, 1, 1],  # Weights of the individual concepts against each other
)

 

自己アテンション・ガイダンス

SAG は Improving Sample Quality of Diffusion Models Using Self-Attention Guidance で紹介されました。SAG は拡散モデルからすべての反復で中間アテンションマップを抽出することにより動作し、部分的にぼかされた入力を取得するマスキングとぼかしのために特定のアテンションスコアを超えるトークンを選択します。それから、拡散モデルへぼかされた入力と元の入力を供給することにより取得された、予測されたノイズ出力の間の相違が測定され、そしてこれが更にガイダンスとして利用されます。With this guidance, the authors observe apparent improvements in a wide range of diffusion models.

import torch
from diffusers import StableDiffusionSAGPipeline
from accelerate.utils import set_seed

pipe = StableDiffusionSAGPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16)
pipe = pipe.to("cuda")

seed = 8978
prompt = "."
guidance_scale = 7.5
num_images_per_prompt = 1

sag_scale = 1.0

set_seed(seed)
images = pipe(
    prompt, num_images_per_prompt=num_images_per_prompt, guidance_scale=guidance_scale, sag_scale=sag_scale
).images
images[0].save("example.png")

SAG was contributed by @SusungHong (lead author of SAG) in #2193.

 

MultiDiffusion パノラマ

MultiDiffusion: Fusing Diffusion Paths for Controlled Image Generation で提案され、それは複数の拡散生成過程をパラメータや制約の共有セットと一緒に結びつけた最適化タスクに基づく新しい生成過程, “MultiDiffusion” を提示しています。

import torch
from diffusers import StableDiffusionPanoramaPipeline, DDIMScheduler

model_ckpt = "stabilityai/stable-diffusion-2-base"
scheduler = DDIMScheduler.from_pretrained(model_ckpt, subfolder="scheduler")
pipe = StableDiffusionPanoramaPipeline.from_pretrained(model_ckpt, scheduler=scheduler, torch_dtype=torch.float16)

pipe = pipe.to("cuda")

prompt = "a photo of the dolomites"
image = pipe(prompt).images[0]
image.save("dolomites.png")

The pipeline was contributed by @omerbt (lead author of MultiDiffusion Panorama) and @sayakpaul in #2393.

 

倫理的 (Ethical) ガイドライン

生成技術がもたらすチャレンジについての様々な意見や視点に対して Diffusers は無関係ではいられません。Thanks to @giadilli, we have drafted our first Diffusers’ Ethical Guidelines with which we hope to initiate a fruitful conversation with the community.

 

Keras 統合

多くの実践者は KerasCV によリリースされた Stable Diffusion モデルの再調整が容易であることを見い出すでしょう。同時に、diffusers は推論、配備と最適化のための多くのオプションを提供しています。
私たちは diffusers で KerasCV Stable Diffusion チェックポイントを簡単にインポートして使用することを可能にしました、新しいガイド でその過程の詳細を読んでください。

 

🕒 UniPC スケジューラ

UniPC is a new fast scheduler in diffusion town! UniPC は訓練フリーなフレームワークで、拡散モデルの高速なサンプリングのために設計されました、これは corrector (UniC) と予測器 (UniP) から構成され、統一された分析形式を共有して任意の順序をサポートします。オリジナルのコードベースは ここ で見つかります。Thanks to @wl-zhao for the great work and integrating UniPC into the diffusers!

 

🏃 訓練: 一貫性のある EMA サポート

0.13.0 の一部として訓練の EMA サポートを改良しました。training_utils の一般的な EMAModel を追加しました、これはすべてのスクリプトで使用できます。EMAModel は分散訓練、EMA モデルを訓練時に簡単に評価するための新しい手法、そして diffusers の他のモデルに類似した、EMA モデルをセーブしてロードする一貫した手法をサポートするために改良されました。

 

🐶 Ruff & black

We have replaced flake8 with ruff (much faster), and updated our version of black. These tools are now in sync with the ones used in transformers, so the contributing experience is now more consistent for people using both codebases 🙂

 

以上