HuggingFace Diffusers 0.12 : パイプライン : 概要

HuggingFace Diffusers 0.12 : API : パイプライン – 概要 (翻訳/解説)

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

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

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

 

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

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

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

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

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

 

HuggingFace Diffusers 0.12 : API : パイプライン – 概要

パイプラインは最先端の拡散モデルを推論で実行する単純な方法を提供します。殆どの拡散システムは複数の独立的に訓練済みのモデルと高度にアダプテーション可能なスケジューラ・コンポーネントから構成されます – それらのすべては end-to-end な拡散システムが機能するために必要です。

例として、Stable Diffusion は 3 つの独立した訓練済みモデルを持ちます :

その目的で、私たちは統一された API のもとですべてオープンソース化された、最先端拡散システムを提供するために努力しています。より具体的には、以下のようなパイプラインを提供する努力をしています :

  1. 公式に公開された重みをロードし、対応する論文に従ってオリジナル実装と同じ出力を 1対1 で生成することができます (e.g. LDMTextToImagePipeline, これは High-Resolution Image Synthesis with Latent Diffusion Models の公式にリリースされた重みを使用します),

  2. 推論でモデルを実行する簡単なユーザインターフェイスを持ちます (パイプライン API セクション参照),

  3. 自明で、公式論文とともに読むことができるコードにより理解しやすい (パイプライン summary 参照),

  4. コミュニティにより容易に貢献できます (Contribution セクション参照)。

パイプラインは訓練機能を提供しない (そしてするべきでない) ことに注意してください。公式の訓練サンプルを探している場合には、examples を見てください。

 

🧨 Diffusers 要約

以下のテーブルは総ての公式にサポートされているパイプライン、対応する論文、そして (利用可能なら) それらを直接試すための colab ノートブックをまとめてあります。

Note: Pipelines are simple examples of how to play around with the diffusion systems as described in the corresponding papers.

けれども、それらの殆どは異なるスケジューラ・コンポーネントや異なるモデル・コンポーネントさえも使用するように適応させることができます。幾つかのパイプラインの例が以下の Examples で示されます。

 

パイプライン API

拡散モデルは複数の独立に訓練されたモデルや前からの他の既存のコンポーネントから構成されることが多いです。

各モデルは様々なタスクで独立に訓練され、スケジューラは簡単に切り替えて別のものと置き換えることができます。しかし、推論の間、私たちはすべてのコンポーネントを容易にロードしてそれらを推論で使用できることを望みます – 例えばあるコンポーネントが Transformers のような別のライブラリに由来する CLIP のテキストエンコーダであったとしても。そのため、すべてのパイプラインは以下の機能を提供しています :

  • from_pretrained メソッド は Hugging Face ハブ・レポジトリ id, e.g. runwayml/stable-diffusion-v1-5 か、ローカルディレクトリへのぱパス, e.g. ”./stable-diffusion” を受け取ります。どのモデルとコンポーネントがロードされるべきかを正しく取得するため、パイプラインにロードされるべきすべてのコンポーネントを定義する model_index.json ファイル, e.g. runwayml/stable-diffusion-v1-5/model_index.json を提供する必要があります。より具体的には、各モデル/コンポーネントについて形式 <name>: [“<library>”, “<class name>”] を定義する必要があります。<name> は &class name> のロードされるインスタンスに与えられる属性名で、これは “<library>” の名前のライブラリやパイプラインフォルダで見つかります。

  • save_pretrained はローカルパス, e.g. ./stable-diffusion を受け取り、その下にパイプラインのすべてのモデル/コンポーネントがセーブされます。各コンポーネント/モデルについてローカルパス内にフォルダが作成されます、これは与えられた属性名, e.g. ./stable_diffusion/unet に従って命名されます。更に、model_index.json ファイルがローカルパス, e.g. ./stable_diffusion/model_index.json のルートに作成され、その結果完全なパイプラインがローカルパスから再度インスタンス化できます。

  • to, これは文字列か torch.device を受け取り、タイプ torch.nn.Module であるすべてのモデルを渡されたデバイスに移動します。動作は PyTorch の to メソッド に完全に類似しています。

  • __call__ メソッド, 推論でパイプラインを使用します。__call__ はパイプラインの推論ロジックを定義して、理想的にはそのすべての局面を包含するべきです、前処理からテンソルを様々なモデルとスケジューラに forward し、そして後処理します。__call__ メソッドの API はパイプライン毎に非常に様々であり得ます。例えば、StableDiffusionPipeline のようなテキスト-to-画像パイプラインは画像を生成するために他のものの中でテキストプロンプトを受け取るはずです。他方、DDPMPipeline のような純粋な画像生成パイプラインはどのような入力を供給することもなしに実行できます。各パイプラインに対してどのような入力が適応できるかより良く理解するためには、それぞれのパイプラインを直接見るべきです。

Note : すべてのパイプラインは、__call__ メソッドを torch.no_grad デコレータで修飾することで PyTorch の autograd を無効にしています、パイプラインは訓練のために使用されるべきではないからです。forward パスの間に勾配をストアしたい場合には、貴方自身のパイプラインを書くことを勧めます、コミュニティ・サンプル もご覧ください。

 

Contribution

(訳注: 原文 参照)

 

Examples

Stable Diffusion によるテキスト-to-画像生成

# make sure you're logged in with `huggingface-cli login`
from diffusers import StableDiffusionPipeline, LMSDiscreteScheduler

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

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

image.save("astronaut_rides_horse.png")

 

Stable Diffusion による画像-to-画像 テキスト誘導生成

StableDiffusionImg2ImgPipeline は新しい画像の生成を条件付けるためにテキストプロンプトと初期画像を渡すことができます。

import requests
from PIL import Image
from io import BytesIO

from diffusers import StableDiffusionImg2ImgPipeline

# load the pipeline
device = "cuda"
pipe = StableDiffusionImg2ImgPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16).to(
    device
)

# let's download an initial image
url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg"

response = requests.get(url)
init_image = Image.open(BytesIO(response.content)).convert("RGB")
init_image = init_image.resize((768, 512))

prompt = "A fantasy landscape, trending on artstation"

images = pipe(prompt=prompt, image=init_image, strength=0.75, guidance_scale=7.5).images

images[0].save("fantasy_landscape.png")

You can also run this example on colab

 

シードと潜在的変数を再利用してプロンプトを調整する

結果を再生成するために貴方自身の潜在的変数を生成したり、好きな特定の結果上でプロンプトを調整することができます。この ノートブック はそれを行う方法をステップ毎に示します。それを Google Colab で実行することもできます。

 

Stable Diffusion を使用したインペインティング

StableDiffusionInpaintPipeline はマスクとテキストプロンプトを提供することで画像の特定の部分を編集することを可能にします。

import PIL
import requests
import torch
from io import BytesIO

from diffusers import StableDiffusionInpaintPipeline


def download_image(url):
    response = requests.get(url)
    return PIL.Image.open(BytesIO(response.content)).convert("RGB")


img_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png"
mask_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png"

init_image = download_image(img_url).resize((512, 512))
mask_image = download_image(mask_url).resize((512, 512))

pipe = StableDiffusionInpaintPipeline.from_pretrained(
    "runwayml/stable-diffusion-inpainting",
    torch_dtype=torch.float16,
)
pipe = pipe.to("cuda")

prompt = "Face of a yellow cat, high resolution, sitting on a park bench"
image = pipe(prompt=prompt, image=init_image, mask_image=mask_image).images[0]

You can also run this example on colab

 

以上