
自宅のパソコンにStable Diffusionを導入する方法
今月(2022年8月)22日に、Stable Diffusion(以下、SDと言います。)のオンラインサービスのDreamStudioが公開されましたが、2ポンドの無料枠を使い切ると、有料になってしまうので、オープンソースになっているSDを自宅のパソコンに導入することにしました。
NVIDIA製GPUを搭載したPCが自宅にあれば、ローカル環境でSDが使えるのですが、残念ながらGPUは持っていないので、Googleが提供しているPython実行環境のColaboratoryを利用して、AI関連コミュニティサイトのHugging Faceで公開されているSDのコードをインストールすることにしました。
SDの仕組みや使い方については、以下の公式サイトに詳しく書かれています。なお、Diffusersは、Hugging Faceの拡散モデル専用ライブラリーです。英文が苦手な人も、是非、ブラウザの翻訳機能などを利用して読んでみてください。
1.SDインストール前の準備
まず、SDをインストールする前の準備として、以下の作業を行います。
最初に、Hugging FaceのSD(v1-4)のページにアクセスしてライセンスを確認します。
次に表示されるHugging Faceのサイトにログインして、アクセストークンを取得します。
Colaboratoryのサイトにログインし、ノートブックを設定して、GPUを選択します。これで、SDを導入する準備が整いました。
なお、SDの自宅PCへの導入については、以下のサイトを参考にしました。操作の際の画面などは、そちらを参考にしてください。
2.ColaboratoryへのSDのインストール
次に、Colaboratoryのノートブックにコマンドを入力していきます。
〇 ノートブックにDiffusersをインストールします。
pip install diffusers==0.2.4 transformers scipy ftfy
〇 先ほど取得したアクセストークンを設定します。
YOUR_TOKEN="アクセストークンの文字列"
〇 SDのパイプラインを使用して、SDの実行に必要な全てのファイルをダウンロードします。
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=YOUR_TOKEN)
〇 最後に、GPUプラットフォームのCUDAを利用できるように設定して、SDを使う準備が完了です。
pipe.to("cuda")
3.SDでの画像生成
SDで画像を生成するには、以下の通りコマンド入力して実行します。
prompt = "生成したい画像の指示(呪文)"
image = pipe(prompt)["sample"][0]
image.save(f"ファイル名.png")
画像1枚生成するのに約30秒と、DreamStudioよりは時間がかかります。
生成した画像は、ノートブックの画面左側のフォルダ内の該当ファイルをダブルクリックすることにより見ることができます。
また、Colaboratoryのファイル保存は一時的なものなので、気に入った画像はダウンロードして、自分のPCに保存してください。
また、公式サイトを参考に、以下のコマンドを入力して、複数の画像を一度に生成する方法を試してみましたが、メモリーオーバーで上手くいきませんでした。
from PIL import Image
def image_grid(imgs, rows, cols):
assert len(imgs) == rows*cols
w, h = imgs[0].size
grid = Image.new('RGB', size=(cols*w, rows*h))
grid_w, grid_h = grid.size
for i, img in enumerate(imgs):
grid.paste(img, box=(i%cols*w, i//cols*h))
return grid
num_images = 3
prompt = ["生成したい画像の指示(呪文)"] * num_images
images = pipe(prompt)["sample"]
grid = image_grid(images, rows=1, cols=3)
grid.save(f"ファイル名.png")
上手くいけば、このようになるはずでした。

その後、「Colab での使用量上限に達したため、現在 GPU に接続できません。」と表示が出て、GPUに接続できなくなってしまいました。何枚も画像を生成したので、上限を超えて、一時制限が掛かってしまったようです。やはり、無料で沢山の画像を生成することは、まだ難しいようです。
※一時制限は1日で解除して、また利用できるようになりました。
Colab の使用量上限とは何ですか?
Colab では、状況によって変動する動的な使用制限を設け、無制限のリソース提供やリソースの保証を行わないことで、料金なしでのリソース提供を実現しています。つまり、全体の使用量の上限、アイドル タイムアウト時間、VM の最大存続期間、利用できる GPU タイプなどの要素は、時間とともに変更される可能性があります。Colab では、変更が頻繁に起きる可能性があることから、これらの上限を公開しません。
GPU と TPU は、Colab で長期間のコンピューティング処理を行うユーザーではなく、インタラクティブに使用しているユーザー、または直近のリソース使用量の少ないユーザーに優先的に割り当てられる場合があります。その結果、Colab を長期間のコンピューティング処理に使用するユーザーや直近のリソース使用量が多いユーザーは、使用量が上限に達して GPU と TPU へのアクセスが一時的に制限される可能性が高くなります。使用量上限がより高くかつ安定したサービスに関心をお持ちの場合は、Colab Pro と Colab Pro+ をおすすめします。高負荷のコンピューティング処理を必要とするユーザーには、独自のハードウェアで動作するローカル ランタイムまたは Colab GCP Marketplace VM で Colab の UI を使用することをおすすめします。
4.実際に生成した画像の例
サイバーパンク風の美女の画像を何枚か生成しましたので紹介します。





ちなみに、呪文は「a detailed oil painting of attractive and active young lady, beautiful and cute face, cyberpunk, dynamic by UnrealEngine5」です。
SDのAPIやパイプラインが改訂されたので、改訂版を作成しました(2022/9/11)。
また、Stable DiffusionやMidjourneyなどの画像生成AIの仕組みについて、以下のページで解説していますので、時間があれば、見ていってください。