オープンソースで公開されて話題の “Stable Diffusion” を “Google Colaboratory” 上で実行するまでの流れを本資料にまとめます。
オープンソースで公開されて話題の “Stable Diffusion” を “Google Colaboratory” 上で実行するまでの流れを本資料にまとめます。
"Stable Diffusion" は、任意のテキスト入力に対して写真のようなリアルな画像を出力する text-to-image のモデルです。ソースコードは Github (CompVis/stable-diffusion: A latent text-to-image diffusion model (github.com)) で公開されています。
今回は、主に自然言語処理を対象にした大規模なオープンソースコミュニティーである “Hugging Face” より訓練済みモデルをダウンロードしてこれを使用することで行います。
図: "Stable Diffusion" による作図例(私自身で Google Colaboratory
を使って作成)
文例: "The train came out of the long tunnel into the snow country"
Google Colaboratory(グーグル・コラボレイトリー)とは、Googleが機械学習の教育及び研究用に提供しているインストール不要かつ、すぐにPythonや機械学習・深層学習の環境を整えることが出来る無料のサービスです。
項目 | 無料版 | Colab Pro | Colab Pro+ |
---|---|---|---|
料金 | 無料 | 1,072円 / 月 | 5,243円 / 月 |
GPU | 自動割当 | 高性能 GPU が割当てられる | 高性能 GPU が割当てられる |
メモリ | 通常使用には問題ない | 大量データ用 | 大量データ用 |
使用時間 | 最長12時間 | 最長24時間 | 最長24時間 |
バックグラウンド実行 | × | × | ○ |
まず https://huggingface.co/ へアクセスして [Sign Up] (アカウント作成)します。
図: Hugging Face ホームページ画面
「Sign Up」を完了すると下図のような画面を表示しました。
図: Hugging Face ホームページ画面
登録したメールアドレスへ [Hugging Face] から確認メールが届くので、メール本文に記載のリンクをクリックして確認を完了します。
登録を終えたら「Settings > Access Tokens > New token」をクリックして自分のアクセストークンを発行し、記録しておきます。
図: "Access Tokens" 画面
”Role” は ”read” を選択しましたがこれで大丈夫でした。
図: “Create a new access token” 画面
”Generate a token” ボタンをクリックすると、下図のような画面を表示します。
図: Access Tokens 取得画面
上図の [Show] をクリックして赤枠部分に表示するトークンを、後で使うので、保存しておきます。
続いて、"CompVis/stable-diffusion-v1-4 · Hugging Face" 内の「Access Repository」をクリックすることで権限を取得しておきます。この操作でモデルの作者にメールアドレスとユーザー名が共有されますのでご注意ください。
注意
モデルの使用にあたっては CreativeML OpenRAIL License へ準拠する必要があります。
意図的に違法または有害な出力やコンテンツを作成・共有することの禁止や再配布のルールなどについて同意する必要があります。
Stable Diffusion を使うための事前準備を完了したので、Google Colab 上に実行環境を構築していきます。
最初に、Google アカウントを持っていない人は Google アカウントを作成します。
既に Google アカウントを持っている場合、ここを無視して次へ進みます。
Google アカウントの作成 - Google アカウント ヘルプ
図: Google アカウントの作成
次に、Googleアカウントでログインした状態で Google Colaboratory へアクセスします。
すると下図のような画面を表示します。
図: Colaboratory へようこそ
「ファイル」⇨「ノートブックを新規作成」をクリックします。
作成したノートブックにいろいろな処理をこれから記載していきます。
実行環境でGPUを使用するために「編集」⇨「ノートブックの設定」からGPUを割り当てます。
GPU の設定を正しく行えたことを以下のコードで確認します。
!nvidia-smi -L
または -L 無しで !nvidia-smi を入力します。
本ページ記載時の場合、GPU0 として “Tesla T4“ を使えるみたいです。
RAMは15GBという大きなサイズのGPUみたいです。これを無料で使用できるのはすごい!
下記コマンドで、Stable Diffusion および必要なパッケージをインストールします。
!pip install --upgrade diffusers==0.8.0 transformers==4.* scipy==1.* ftfy==6.* !pip install accelerate
注意
2022/11 中は下記コマンドで動作していましたが、2022/12以降は上記へ変更しないとエラーになるようになりました。
!pip install --upgrade diffusers==0.2.4 transformers==4.* scipy==1.* ftfy==6.*
See: CompVis/stable-diffusion-v1-4 · why bug : getattr(): attribute name must be string? (huggingface.co)
今後もこんなことが発生しそうなので素直にメモを残します。
Stable Diffusionのモデルのダウンロードやパイプラインの構築を行います。
あらかじめ発行した “Hugging Face” のアクセストークンを YOUR_TOKEN に設定し、以下のコードを実行します。
from diffusers import StableDiffusionPipeline YOUR_TOKEN = "your-access-token" model_id = "CompVis/stable-diffusion-v1-4" #@param {type:"string"} pipe = StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=YOUR_TOKEN) pipe.to("cuda")
NOTE
ここの処理で学習済みデータ(約5GB)のダウンロードも行っています。
結構時間がかかりますので気長にお待ちください。(私の場合で約2~3分かかりました)
NOTE
model_id を 他のモデル変えることで、ファインチューニングされた違うモデルを適用できるみたいです。
model_id = "CompVis/stable-diffusion-v1-4"
model_id = "Linaqruf/anything-v3.0"
model_id = "hakurei/waifu-diffusion"
画像を生成します。生成したい画像の内容を text に記述し、以下のコードを実行します。
下記例では "The train came out of the long tunnel into the snow country" を設定してます。
from IPython.display import display_png, Image from torch import autocast text = "The train came out of the long tunnel into the snow country" num = 3 for i in range(num): #image = pipe(text)["sample"][0] # old diffusers format (0.2.4). image = pipe(text).images[0] file_name = "{}_{}.png".format(text,i) image.save(file_name) display_png(Image(file_name))
以下、上記 text を実行した結果の例です。それぞれの作図に約30秒で出力してくれました。
NOTE
display_png 関数を実行することで、notebook 上に画像を表示してくれます。
図: display_png 関数を notebook で実行した様子
生成した画像をGoogleドライブに保存してみます。
まずはGoogleドライブをマウントするために以下のコードを実行します。
from google.colab import drive drive.mount("/content/drive")
これを実行すると下図のような画面を表示するので、[Google ドライブに接続]をクリックします。
図: Google ドライブをマウント
画像を生成します。
パラメータを設定して以下のコードを実行します。
import datetime import os from torch import autocast #@title Parameters prompt = "The train came out of the long tunnel into the snow country" #@param {type:"string"} number_of_images = 3 #@param {type:"slider", min:1, max:100, step:1} drive_directory = "/content/drive/MyDrive/output" #@param {type:"string"} # 画像の保存先となるディレクトリがなければ作成する。 os.makedirs(drive_directory, exist_ok=True) # 画像のファイル名が被らないようにするための文字列を用意する。 yyyymmddhhmmss = datetime.datetime.now().strftime("%Y%m%d%H%M%S") # 指定した回数、画像生成&保存を繰り返す。 for i in range(number_of_images): with autocast("cuda"): #image = pipe(text)["sample"][0] # old diffusers format (0.2.4). image = pipe(text).images[0] file_path = os.path.join(drive_directory, f"image-{yyyymmddhhmmss}-{i:03}.png") image.save(file_path) display_png(Image(file_path))
画面右側の部分で GUI 上で設定変更できるようになりました。
図: GUI にパラメータ表示
この python プログラムを実行することで、Google ドライブへ画像を出力できました。
図: Google ドライブへ出力
以下、文言と Stable Diffusion が作成した図のペア、の例を紹介します。
すべて私自身で文章と図を作成してみた結果です。
(日)ロングソードを持った鎧の騎士が森の中で岩に座っている写真
text = "a photo of a knight armed with a long sword, sitting on a rock, in a forest"
(日)五匹のかわいい猫が庭で遊んでいる
text = "Five cute cats, play in the garden"
(日)春はあけぼの、ようよう白く成りゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる
text = "In the dawn of spring, the mountains are turning white, and the purple clouds are trailing thinly with a little light."
(日)国際宇宙ステーションが見える宇宙空間で遊ぶ美しい女性
text = "Beautiful woman playing in outer space with a view of the International Space Station"
(日)ノートルダム寺院、ムンク風
text = "Notre Dame, Munch style"
英 “Stability AI” は、画像生成AI「Stable Diffusion」の最新版となる「Stable Diffusion 2.0」を 2022年11月24日に公開しました。従来版となる「Stable Diffusion V1」から、新たな機能が複数追加されています。
テキストから画像を生成する際に使われる学習モデルは、Stability AI のサポートのもとで LAION が開発した新たなテキストエンコーダ「OpenCLIP」を使用して学習させたものになりました。出力解像度は 512×512 ピクセルに加え、768×768 ピクセルも標準で生成できるようになりました。
さらに超解像アップスケールに対応したモデルも同梱しています。テキストから画像生成する方法と組み合わせることで、2,048×2,048 ピクセルやそれ以上の解像度の画像生成が可能になったようです。
NOTE
本書記載時点で CompVis が v2.0 へ未対応だったため、Stability AI/stable-diffusion-2 を使用した手順を記載しています。
ComVis が v2.0 へ対応したらもっと簡単に model_id を変更するだけで遊べるかもしれません
“Stable Diffusion 1.4“ の使い方などを調べていたら、ちょうどそのタイミングで 2.0 リリースがあって「これは一緒に調べねば」と思って追加してみました。
必要なGPUメモリが増加していますが、2.0の方が綺麗な印象です。
次に、Googleアカウントでログインした状態で Google Colaboratory へアクセスします。
すると下図のような画面を表示します。
図: Colaboratory へようこそ
次に、Googleアカウントでログインした状態で Google Colaboratory へアクセスします。
すると下図のような画面を表示します。
図: Colaboratory へようこそ
「ファイル」⇨「ノートブックを新規作成」をクリックします。
作成したノートブックにいろいろな処理をこれから記載していきます。
実行環境でGPUを使用するために「編集」⇨「ノートブックの設定」からGPUを割り当てます。
GPU の設定を正しく行えたことを以下のコードで確認します。
!nvidia-smi -L
または -L 無しで !nvidia-smi を入力します。
重要
T4 または P100 であることを確認します。
下記コマンドで、Stable Diffusion および必要なパッケージをインストールします。
!pip install diffusers[torch]==0.9 transformers !pip install --upgrade --pre triton
NOTE
下記「xformers インストール」を行う必要がある という記事があったのですが、本書記載時点で私がテストした範疇ではこれを行う必要ありませんでした。
念のため参考情報として残しますが、多分不要です。
A100などで使うには、xformersを自分でビルドするか、fast-stable-diffusion などで提供されてるビルド済みwheelを使う必要があります。
ここでは下記コマンドによりビルド済み wheel を使用します。
# xformersのインストール (T4 / P100用) # !pip install -q https://github.com/metrolobo/xformers_wheels/releases/download/1d31a3ac_various_6/xformers-0.0.14.dev0-cp37-cp37m-linux_x86_64.whl !pip install xformers # Colabo の環境が先日は cp37 だったのが、今日は cp38 になっており、 # コメントアウトした行のスクリプトはエラーになってしまいました。
Stable Diffusionのモデルのダウンロードやパイプラインの構築を行います。
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler import torch # パイプラインの準備 model_id = "stabilityai/stable-diffusion-2" pipe = StableDiffusionPipeline.from_pretrained( model_id, scheduler=EulerDiscreteScheduler.from_pretrained( model_id, subfolder="scheduler" ), torch_dtype=torch.float16, revision="fp16" ).to("cuda") pipe.enable_attention_slicing()
画像を生成します。
生成したい画像の内容を text
に記述し、以下のコードを実行します。
下記例では "a photo of an astronaut riding a horse on mars" を設定してます。
# 推論の実行 text = "a photo of an astronaut riding a horse on mars" image = pipe(text, height=768, width=768).images[0] # 保存と表示 image.save("output.png") image
(日)宇宙飛行士が馬に乗っているプロの写真
text = "a professional photograph of an astronaut riding a horse"
(日)五匹のかわいい猫が庭で遊んでいる
text = "Five cute cats, play in the garden"
(日)カウボーイハットを被ったライオン
text = "a lion wearing a cowboy hat"
(日)ノートルダム寺院、モネ風
text = "Notre Dame, Monet style"
(日)ダースベーダーが森の中をバイクに乗って走る写真
text = "Photo of Darth Vader riding a motorcycle through the woods"
(日)エッフェル塔を眺めながらのピカチュウ ファイン ダイニング
text = "a pikachu fine dining with a view to the Eiffel Tower"
text = "a mecha robot in a favela in expressionist style"
(日)春はあけぼの、ようよう白く成りゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる。
text = "In the dawn of spring, the mountains are turning white, and the purple clouds are trailing thinly with a little light."
Stable Diffusion でファインチューニングされたモデルを一部紹介します。
Waif Diffusion はキャラクターイラストに特化したモデルです。
https://huggingface.co/hakurei/waifu-diffusion
v1.4 のスクリプトをベースに model_id を変更するだけで動作しました。
from diffusers import StableDiffusionPipeline YOUR_TOKEN = "your-access-token" #model_id = "CompVis/stable-diffusion-v1-4" model_id = "hakurei/waifu-diffusion" pipe = StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=YOUR_TOKEN) pipe.to("cuda")
text = "1girl"
text = "1girl, aqua eyes, baseball cap, blonde hair, closed mouth, earrings, green background, hat, hoop earrings, jewelry, looking at viewer, shirt, short hair, simple background, solo, upper body, yellow shirt"
Waifu diffusion と同じくキャラクターイラストに特化したモデルです。描写がきれいで高品質、NovelAI や Waifu diffusion で崩れやすかったパーツも崩れにくくなっている、と言われています。
https://huggingface.co/spaces/akhaliq/anything-v3.0
v1.4 のスクリプトをベースに model_id を変更するだけで動作しました。
from diffusers import StableDiffusionPipeline YOUR_TOKEN = "your-access-token" #model_id = "CompVis/stable-diffusion-v1-4" model_id = "Linaqruf/anything-v3.0" pipe = StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=YOUR_TOKEN) pipe.to("cuda")
text = "a girl"
text = "1girl, aqua eyes, baseball cap, blonde hair, closed mouth, earrings, green background, hat, hoop earrings, jewelry, looking at viewer, shirt, short hair, simple background, solo, upper body, yellow shirt"
本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。
Stable Diffusion 1.4
Stable Diffusion 2.0
他 - waifu-diffusion, Anything V3.0
2022-12-10 | - | "xformers インストール" へ情報追記 |
2022-12-09 | - | "Stable Diffusion 2.0" の記事を追加 |
- | "waifu-diffusion", "Anything V3.0" の記事を追加 | |
2022-12-03 | - | なぜか12月になってからスクリプト実行すると"なぜか"エラーになるようになったので、スクリプトを修正 |
- | パッケージダウンロードのスクリプトに "!pip install accelerate" を追加 | |
2022-11-26 | - | 新規作成 |