"Stable Diffusion" を "Google Colaboratory" で実行する

オープンソースで公開されて話題の “Stable Diffusion” を “Google Colaboratory” 上で実行するまでの流れを本資料にまとめます。

 

 

 

1. はじめに

オープンソースで公開されて話題の “Stable Diffusion” を “Google Colaboratory” 上で実行するまでの流れを本資料にまとめます。

 

Stable Diffusion とは

"Stable Diffusion" は、任意のテキスト入力に対して写真のようなリアルな画像を出力する text-to-image のモデルです。ソースコードは Github (CompVis/stable-diffusion: A latent text-to-image diffusion model (github.com)) で公開されています。

 

"stable diffusion" ホームページ画面

 

今回は、主に自然言語処理を対象にした大規模なオープンソースコミュニティーである “Hugging Face” より訓練済みモデルをダウンロードしてこれを使用することで行います。

 

“Stable Diffusion“ による作図例

図: "Stable Diffusion" による作図例(私自身で Google Colaboratory を使って作成)
文例: "The train came out of the long tunnel into the snow country"

 

Google Colaboratory とは

Google Colaboratory(グーグル・コラボレイトリー)とは、Googleが機械学習の教育及び研究用に提供しているインストール不要かつ、すぐにPythonや機械学習・深層学習の環境を整えることが出来る無料のサービスです。

 

表: "Google Colaboratory" 無料版と有料版の比較
項目 無料版 Colab Pro Colab Pro+
料金 無料 1,072円 / 月 5,243円 / 月
GPU 自動割当 高性能 GPU が割当てられる 高性能 GPU が割当てられる
メモリ 通常使用には問題ない 大量データ用 大量データ用
使用時間 最長12時間 最長24時間 最長24時間
バックグラウンド実行 × ×

 


 

2. Hugging Face アカウント登録

 

まず https://huggingface.co/ へアクセスして [Sign Up] (アカウント作成)します。

図: Hugging Face ホームページ画面

図: Hugging Face ホームページ画面

「Sign Up」を完了すると下図のような画面を表示しました。

図: Hugging Face ホームページ画面

図: Hugging Face ホームページ画面

 

登録したメールアドレスへ [Hugging Face] から確認メールが届くので、メール本文に記載のリンクをクリックして確認を完了します。

登録を終えたら「Settings > Access Tokens > New token」をクリックして自分のアクセストークンを発行し、記録しておきます。

図: “Access Tokens“ 画面

図: "Access Tokens" 画面

”Role” は ”read” を選択しましたがこれで大丈夫でした。

図: “Create a new access token” 画面

図: “Create a new access token” 画面

”Generate a token” ボタンをクリックすると、下図のような画面を表示します。

図: Access Tokens 取得画面

図: Access Tokens 取得画面

上図の [Show] をクリックして赤枠部分に表示するトークンを、後で使うので、保存しておきます。

 

続いて、"CompVis/stable-diffusion-v1-4 · Hugging Face" 内の「Access Repository」をクリックすることで権限を取得しておきます。この操作でモデルの作者にメールアドレスとユーザー名が共有されますのでご注意ください。

 

「I have read the license and agree with its terms」

 

注意

モデルの使用にあたっては CreativeML OpenRAIL License へ準拠する必要があります。

意図的に違法または有害な出力やコンテンツを作成・共有することの禁止や再配布のルールなどについて同意する必要があります。  

 


 

3. Google Colaboratory で実行(Stable Diffusion 1.4)

Stable Diffusion を使うための事前準備を完了したので、Google Colab 上に実行環境を構築していきます。

 

Google アカウント作成

最初に、Google アカウントを持っていない人は Google アカウントを作成します。

既に Google アカウントを持っている場合、ここを無視して次へ進みます。

Google アカウントの作成 - Google アカウント ヘルプ

図: Google アカウントの作成

図: Google アカウントの作成

 

 

Google Colaboratory を開く

次に、Googleアカウントでログインした状態で Google Colaboratory へアクセスします。

Google Colab

 

すると下図のような画面を表示します。

図: Colaboratory へようこそ

図: Colaboratory へようこそ

 

 

 

ノートブックを新規作成

「ファイル」⇨「ノートブックを新規作成」をクリックします。

 

ノートブックを新規作成

 

作成したノートブックにいろいろな処理をこれから記載していきます。

 

 

"GPU を使用する" に設定

実行環境でGPUを使用するために「編集」⇨「ノートブックの設定」からGPUを割り当てます。

 

ノートブック設定

 

GPU設定

 

GPU の設定を正しく行えたことを以下のコードで確認します。

!nvidia-smi -L

nvidia-smi -L

または -L 無しで !nvidia-smi を入力します。

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秒で出力してくれました。

sample1 sample2 sample3

 

NOTE

display_png 関数を実行することで、notebook 上に画像を表示してくれます。 

 

display_png 関数を notebook で実行した様子

図: display_png 関数を notebook で実行した様子

 

 

生成した画像をGoogleドライブに保存

生成した画像をGoogleドライブに保存してみます。

まずはGoogleドライブをマウントするために以下のコードを実行します。

 

from google.colab import drive
drive.mount("/content/drive")

 

これを実行すると下図のような画面を表示するので、[Google ドライブに接続]をクリックします。

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 にパラメータ表示

図: GUI にパラメータ表示

この python プログラムを実行することで、Google ドライブへ画像を出力できました。

 Google ドライブへ出力

図: Google ドライブへ出力

 

 

文言と作図例

以下、文言と Stable Diffusion が作成した図のペア、の例を紹介します。

すべて私自身で文章と図を作成してみた結果です。

 

(日)ロングソードを持った鎧の騎士が森の中で岩に座っている写真

text = "a photo of a knight armed with a long sword, sitting on a rock, in a forest"

"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"

"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."

"In the dawn of spring, the mountains are turning white, and the purple clouds are trailing thinly with a little light." "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"

"Beautiful woman playing in outer space with a view of the International Space Station" "Beautiful woman playing in outer space with a view of the International Space Station"

 

(日)ノートルダム寺院、ムンク風

text = "Notre Dame, Munch style"

"Notre Dame, Munch style"

 


 

4. Google Colaboratory で実行(Stable Diffusion 2.0)

 

英 “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 Colaboratory を開く

次に、Googleアカウントでログインした状態で Google Colaboratory へアクセスします。

Google Colab

 

すると下図のような画面を表示します。

図: Colaboratory へようこそ

図: Colaboratory へようこそ

 

 

Google Colaboratory を開く

次に、Googleアカウントでログインした状態で Google Colaboratory へアクセスします。

Google Colab

 

すると下図のような画面を表示します。

図: Colaboratory へようこそ

図: Colaboratory へようこそ

 

 

ノートブックを新規作成

「ファイル」⇨「ノートブックを新規作成」をクリックします。

 

ノートブックを新規作成

 

作成したノートブックにいろいろな処理をこれから記載していきます。

 

 

"GPU を使用する" に設定

実行環境でGPUを使用するために「編集」⇨「ノートブックの設定」からGPUを割り当てます。

 

ノートブック設定

 

GPU設定

 

GPU の設定を正しく行えたことを以下のコードで確認します。

!nvidia-smi -L

nvidia-smi -L

または -L 無しで !nvidia-smi を入力します。

nvidia-smi

 

重要

T4 または P100 であることを確認します。

 

 

パッケージ ダウンロード

下記コマンドで、Stable Diffusion および必要なパッケージをインストールします。

!pip install diffusers[torch]==0.9 transformers
!pip install --upgrade --pre triton

 

パッケージダウンロード

 

 

xformers インストール

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 になっており、
# コメントアウトした行のスクリプトはエラーになってしまいました。

 

xformers インストール

 

 

セットアップ

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

 

“a photo of an astronaut riding a horse on mars“

 

 

文言と作図例

(日)宇宙飛行士が馬に乗っているプロの写真

text = "a professional photograph of an astronaut riding a horse"

"a professional photograph of an astronaut riding a horse"

 

(日)五匹のかわいい猫が庭で遊んでいる

text = "Five cute cats, play in the garden"

"Five cute cats, play in the garden"

 

(日)カウボーイハットを被ったライオン

text = "a lion wearing a cowboy hat"

"a lion wearing a cowboy hat"

 

(日)ノートルダム寺院、モネ風

text = "Notre Dame, Monet style"

"Notre Dame, Monet style"

 

(日)ダースベーダーが森の中をバイクに乗って走る写真

text = "Photo of Darth Vader riding a motorcycle through the woods"

"Photo of Darth Vader riding a motorcycle through the woods"

 

(日)エッフェル塔を眺めながらのピカチュウ ファイン ダイニング

text = "a pikachu fine dining with a view to the Eiffel Tower"

"a pikachu fine dining with a view to the Eiffel Tower"

 

text = "a mecha robot in a favela in expressionist style"

"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."

"In the dawn of spring, the mountains are turning white, and the purple clouds are trailing thinly with a little light."

 

 


 

5. 他

Stable Diffusion でファインチューニングされたモデルを一部紹介します。

 

Waifu 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"

"1girl" sample 1 "1girl" sample 2

 

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"

sample 3 sample 4

 

 

Anything v3.0

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"

sample 1 sample 2

 

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"

 sample 3 sample 4

 

 


 

ライセンス

本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。

The MIT License (MIT)

Copyright © 2022 Kinoshita Hidetoshi

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

 


参考

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 - 新規作成

 

Programming Items トップページ

プライバシーポリシー