HuggingFace Diffusers 0.17 : リリースノート – 改良 LoRA, Kandinsky 2.1, Torch コンパイルスピードアップ, 等

HuggingFace Diffusers 0.17 : リリースノート – 改良 LoRA, Kandinsky 2.1, Torch コンパイルスピードアップ, 等 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/10/2023 (v0.17.0 – 06/09/2023)

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

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

 

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

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

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

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

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

 

 

HuggingFace Diffusers 0.17 : リリースノート – 改良 LoRA, Kandinsky 2.1, Torch コンパイルスピードアップ, 等

Kandinsky 2.1

Kandinsky 2.1 は幾つかの新しいアイデアを導入しながら DALL-E 2 と Latent Diffusion のベストプラクティスから継承しています。

 

インストール

pip install diffusers transformers accelerate

 

コードサンプル

from diffusers import DiffusionPipeline
import torch

pipe_prior = DiffusionPipeline.from_pretrained("kandinsky-community/kandinsky-2-1-prior", torch_dtype=torch.float16)
pipe_prior.to("cuda")

t2i_pipe = DiffusionPipeline.from_pretrained("kandinsky-community/kandinsky-2-1", torch_dtype=torch.float16)
t2i_pipe.to("cuda")

prompt = "A alien cheeseburger creature eating itself, claymation, cinematic, moody lighting"
negative_prompt = "low quality, bad quality"

generator = torch.Generator(device="cuda").manual_seed(12)
image_embeds, negative_image_embeds = pipe_prior(prompt, negative_prompt, guidance_scale=1.0, generator=generator).to_tuple()

image = t2i_pipe(prompt, negative_prompt=negative_prompt, image_embeds=image_embeds, negative_image_embeds=negative_image_embeds).images[0]
image.save("cheeseburger_monster.png")

Kandinsky パイプライン、そしてスピードとメモリ最適化の詳細について更に学習するためには、ドキュメント をご覧ください。

Thanks @ayushtues, for helping with the integration of Kandinsky 2.1!

 

UniDiffuser

UniDiffuser は、単一の統一的なアプローチを使用して異なる生成タスクを処理できるマルチモーダルな拡散過程を導入しています :

  • 条件なし画像とテキスト生成
  • 同時 (Joint) 画像-テキスト生成
  • テキスト-to-画像生成
  • 画像-to-テキスト生成
  • 画像バリエーション
  • テキストバリエーション

以下はテキスト-to-画像生成に対する UniDiffuser の使用方法の例です :

import torch
from diffusers import UniDiffuserPipeline

model_id_or_path = "thu-ml/unidiffuser-v1"
pipe = UniDiffuserPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16)
pipe.to("cuda")

# This mode can be inferred from the input provided to the `pipe`. 
pipe.set_text_to_image_mode()

prompt = "an elephant under the sea"
sample = pipe(prompt=prompt, num_inference_steps=20, guidance_scale=8.0).images[0]
sample.save("elephant.png")

Check out the UniDiffuser docs to know more.

UniDiffuser was added by @dg845 in this PR.

 

LoRA

私たちは A1111 形式の CivitAI LoRA チェックポイントを制限はありますがサポートすることを嬉しく思います。

まず、チェックポイントをダウンロードします。デモ目的で これ を使用します。

wget https://civitai.com/api/download/models/15603 -O light_and_shadow.safetensors

次に、DiffusionPipeline を初期化します :

import torch

from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler

pipeline = StableDiffusionPipeline.from_pretrained(
    "gsdf/Counterfeit-V2.5", torch_dtype=torch.float16, safety_checker=None
).to("cuda")
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(
    pipeline.scheduler.config, use_karras_sigmas=True
)

それから CivitAI からダウンロードしたチェックポイントをロードします :

pipeline.load_lora_weights(".", weight_name="light_and_shadow.safetensors")

(safetensors 形式でチェックポイントをロードしている場合、safetensors がインストールされていることを確認してください。)

そして次に推論を実行するときです :

prompt = "masterpiece, best quality, 1girl, at dusk"
negative_prompt = ("(low quality, worst quality:1.4), (bad anatomy), (inaccurate limb:1.2), "
                   "bad composition, inaccurate eyes, extra digit, fewer digits, (extra arms:1.2), large breasts")

images = pipeline(prompt=prompt, 
    negative_prompt=negative_prompt, 
    width=512, 
    height=768, 
    num_inference_steps=15, 
    num_images_per_prompt=4,
    generator=torch.manual_seed(0)
).images

Below is a comparison between the LoRA and the non-LoRA results:

Check out the docs to learn more.

Thanks to @takuma104 for contributing this feature via this PR.

 

Torch 2.0 コンパイル・スピード

0.13.0 でアテンションを効率的に計算するために Torch 2.0 サポートを導入しました。それ以来、モデルが torch.compile() でコンパイルできるように、モデルの “graph breaks” の数を減らすことを確実にするために多くの改良を行なってきました。その結果、殆どのポピュラーなパイプラインの推論スピードを大幅に改善できたことを報告することを嬉しく思います。詳細は このドキュメント を確認してください。

Thanks to @Chillee for helping us with this. Thanks to @patrickvonplaten for fixing the problems stemming from “graph breaks” in this PR.

 

VAE 前処理

Vae 画像プロセッサのクラスを追加しました、これはパイプラインが画像入力を準備したり、出力を後処理するための統一的な API を提供します。それは、リサイズ, 正規化, そして PIL 画像, PyTorch と Numpy 配列間の変換をサポートします。

これにより、すべての Stable diffusion パイプラインは PIL 画像に加えて Pytorch テンソルと Numpy 配列の形式で画像入力を受け取り、そしてこれら 3 つの形式で出力を生成できるようになります。それはまた latents (潜在的表現) を受け取り、返すこともできます。つまり、あるパイプラインから生成された latents を受け取り、latent 空間を離れることなく、それらを入力として別のものに渡すこともできるようになります。複数のパイプラインで作業している場合、PIL 画像に変換することなくそれらの間で PyTorch テンソル渡すことができます。

API について更に学習する場合、ここ のドキュメントを確認してください。

 

ControlNet Img2Img & インペインティング

ControlNet は最も使用される拡散モデルの一つで、コミュニティからの強い要請により controlnet img2img と controlnet inpaint パイプラインを追加しました。これは任意の controlnet チェックポイントを image-2-image 設定とインペイントの両方のために使用することを可能にします。

👉 Inpaint : こちら の controlnet inpaint モード参照。
👉 Image-to-Image : 任意の controlnet チェックポイントは画像-to-画像変換用に使用できます、例えば :

from diffusers import StableDiffusionControlNetImg2ImgPipeline, ControlNetModel, UniPCMultistepScheduler
from diffusers.utils import load_image
import numpy as np
import torch

import cv2
from PIL import Image

# download an image
image = load_image(
    "https://hf.co/datasets/huggingface/documentation-images/resolve/main/diffusers/input_image_vermeer.png"
)
np_image = np.array(image)

# get canny image
np_image = cv2.Canny(np_image, 100, 200)
np_image = np_image[:, :, None]
np_image = np.concatenate([np_image, np_image, np_image], axis=2)
canny_image = Image.fromarray(np_image)

# load control net and stable diffusion v1-5
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
pipe = StableDiffusionControlNetImg2ImgPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16
)

# speed up diffusion process with faster scheduler and memory optimization
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()

# generate image
generator = torch.manual_seed(0)
image = pipe(
    "futuristic-looking woman",
    num_inference_steps=20,
    generator=generator,
    image=image,
    control_image=canny_image,
).images[0]

 

Diffedit ゼロショット・インペインティング・パイプライン

(訳注: 原文 参照)

 

以上