見出し画像

HuggingFace Diffusers v0.7.0の新機能

「Diffusers v0.7.0」の新機能についてまとめました。

・Diffusers v0.7.0

前回

1. Diffusers v0.7.0 のリリースノート

情報元となる「Diffusers 0.7.0」のリリースノートは、以下で参照できます。

2. Dance Diffusion によるランダムオーディオ生成

ランダムオーディオを生成するモデル「Dance Diffusion」が提供開始されました。

from diffusers import DiffusionPipeline
import scipy

model_id = "harmonai/maestro-150k"
pipeline = DiffusionPipeline.from_pretrained(model_id)
pipeline = pipeline.to("cuda")

audio = pipeline(audio_length_in_s=4.0).audios[0]

# ローカルに保存
scipy.io.wavfile.write("maestro_test.wav", pipe.unet.sample_rate, audio.transpose())

3. Accelerateが必須に

モデルの読み込み時間を改善するために、Accelerateが必須になりました。以下のコマンドで一緒にインストールできます。

!pip install --upgrade diffusers[torch]

4. Accelerateによる高速化

Accelerateのおかげで、パイプラインの読み込みが高速になりました。

モデルが作成されると、PyTorch はデフォルトでその重みを初期化します。これにはかなりの時間がかかります。 low_cpu_mem_usage (デフォルトで有効) を使用することで、初期化は実行されません。オプションで、device_map="auto" を使用して、事前学習済みの重みが最初に送信される最適なデバイスを自動的に選択することもできます。

読み込み時間は CUDAで半分以下になり、Apple M1で12 秒から4秒に短縮されました。読み込み中のCPU 使用率も大幅に削減されます。

5. Euler Schedulers による高速化

「Euler schedulers」が提供開始されました。「Euler schedulers」は高速で、多くの場合、20~30 ステップで非常に優れた出力を生成します。
論文「Elucidating the Design Space of Diffusion-Based Generative Models」に基づいています。

from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler

euler_scheduler = EulerDiscreteScheduler.from_config("runwayml/stable-diffusion-v1-5", subfolder="scheduler")
pipeline = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5", scheduler=euler_scheduler, revision="fp16", torch_dtype=torch.float16
)
pipeline.to("cuda")

prompt = "a photo of an astronaut riding a horse on mars"
image = pipeline(prompt, num_inference_steps=25).images[0]
from diffusers import StableDiffusionPipeline, EulerAncestralDiscreteScheduler

euler_ancestral_scheduler = EulerAncestralDiscreteScheduler.from_config("runwayml/stable-diffusion-v1-5", subfolder="scheduler")
pipeline = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5", scheduler=euler_scheduler, revision="fp16", torch_dtype=torch.float16
)
pipeline.to("cuda")

prompt = "a photo of an astronaut riding a horse on mars"
image = pipeline(prompt, num_inference_steps=25).images[0]

6. memory_effective_attention による高速化

memory_effective_attention によって最大2倍の高速推論ができるようになりました。

【 要件】
・PyTorch > 1.12
・Cuda
・xformers

from diffusers import StableDiffusionPipeline
import torch

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

pipe.enable_xformers_memory_efficient_attention()

with torch.inference_mode():
    sample = pipe("a small cat")

# optional: You can disable it via
# pipe.disable_xformers_memory_efficient_attention()

7. Apple Silicon の高速化

PyTorch 1.13 でのmpsサポートの改善により、Apple Siliconでの画像生成の速度が大幅に改善されました。

【 要件】
・Apple Silicon (M1/M2) 搭載した Mac
・macOS 12.6 以降 (13.0 以降推奨)
・Python の arm64版
・pip または condaからインストールした PyTorch 1.13.0

高速な画像生成を実現するには、メモリ管理が重要です。Apple Siliconでは常にアテンションスライスを使用することをお勧めします。これにより、メモリの負荷が大幅に軽減され、ページングやスワップが防止されます。これは、Unified RAMが64GB未満のマシンでは特に重要です。

from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipe = pipe.to("mps")

# RAMが64GB未満の場合に推奨
pipe.enable_attention_slicing()

prompt = "a photo of an astronaut riding a horse on mars"

# 初めての"warmup"パス
_ = pipe(prompt, num_inference_steps=1)

image = pipe(prompt).images[0]
image.save("astronaut.png")

8. RePaint

「RePaint」では、ノイズ除去スケジュールに再起動を追加することで、事前学習済みの DDPM モデルを自由形式の修復用に再利用できます。 Andreas 論文「RePaint: Inpainting using Denoising Diffusion Probabilistic Models」に基づいています。

from diffusers import RePaintPipeline, RePaintScheduler

# 事前学習済みDDPMモデルに基づいて RePaintSchedulerとパイプラインの読み込み
scheduler = RePaintScheduler.from_config("google/ddpm-ema-celebahq-256")
pipe = RePaintPipeline.from_pretrained("google/ddpm-ema-celebahq-256", scheduler=scheduler)
pipe = pipe.to("cuda")

generator = torch.Generator(device="cuda").manual_seed(0)
output = pipe(
    original_image=original_image,
    mask_image=mask_image,
    num_inference_steps=250,
    eta=0.0,
    jump_length=10,
    jump_n_sample=10,
    generator=generator,
)
inpainted_image = output.images[0]

9. コミュニティパイプラインの追加

9-1. Long Prompt Weighting Stable Diffusion

77トークンの長さ制限なしでプロンプトを入力できるパイプラインです。単語の重みを () で増やしたり、[] で減らしたりすることができます。Stable Diffusionパイプラインの主なユースケースを単一クラスで使用することもできます。
コード例については、こちらを参照してください。

9-2. Speech to Image

事前学習済みの OpenAI whisper-small と Stable Diffusion を使用して、音声から画像を生成できます。
コード例については、こちらを参照してください。

9-3. Wildcard Stable Diffusion

__wildcard__で示す「ワイルドカード」をプロンプトに追加できる最小実装で、辞書または .txt ファイルで指定するランダムサンプリングされた値のプレースホルダーとして使用できます。
コード例については、こちらを参照してください。

9-4. Composable Stable Diffusion

論理演算子を使用して合成生成を行うことができます。
コード例については、こちらを参照してください。

9-5. Imagic Stable Diffusion

Stable Diffusion を使用した画像編集を行うことができます。
コード例については、こちらを参照してください。

9-6. Seed Resizing

元の画像の内容を維持しながら、より大きな画像を生成できます。
コード例については、こちらを参照してください。

次回



この記事が気に入ったらサポートをしてみませんか?