いまさらながら画像生成AI Stable Diffusionを試す

いまさらながら画像生成AI Stable Diffusionを試す

この記事は、mofmof Advent Calendar 20227日目の記事です。

タイトルの通り、今更ですが、Stable Diffusionを試してみたいと思います。

※実際に試したのは、2022年10月中旬ごろなので、Stable Diffusion v1.4を使います。記事執筆時点ではv2.0がリリースされていますが、そちらは未確認です。

Stable Diffusionとは

昨今流行っているAIを使った画像生成の仕組みの1つです。

Stable Diffusionは、2022年8月頃にオープンソース化されました。

これによって(頑張れば)ローカルマシンで動かせるようになりました。

Stable Diffusionを使っているサービスがいくつも出来ていたりします。

最初はNovelAIに同梱されているNovelAI Diffusionを使おうと思っていましたが、こちらの利用は費用が必要だったので、Stable Diffusionにしました。

NovelAI Diffusionとの違い

AI学習に使用したデータセットが異なります。

NovelAIはDanbooruという海外のイラスト投稿サイトのデータを使って学習しています。

一方でStable Diffusionは様々なサイトの情報をベースに学習しているようです。

NovelAIのほうが良さそうなイラストが出力できそうなので興味はありますが、仕方ありません。

実際に試す

ということで、Stable Diffusion試します。

以下、当時作業したメモをベースに手順を書いていきます。

  1. セットアップ
  2. 実際に生成してみる

この2ステップでまとめます。

セットアップ

今回はM1MaxMBPで試します。

Windowsの場合やIntel Macの場合はこの方法では動かない可能性があります。M2 Macは同じ方法で動くかもしれません。(未確認)

M1でもスペックが低いものだとメモリが足りなかったりで生成できない場合もあるみたいです。

  1. MacOS 12.3以上に上げる
  2. 依存するプログラムをインストール、設定
  3. ソースリポジトリからソースをDL
  4. モデルデータをDL

MacOS 12.3以上に上げる

MacOS 12.3以上でサポートされたMPS(Metal Performance Shaders)を使用するので、12.3以上へアップデートする必要があります。

アップデートせずに実行すると以下のようなエラーが出ます。

RuntimeError: The MPS backend is supported on MacOS 12.3+.Current OS version can be queried using `sw_vers`

依存するプログラムをインストール

$ brew update
$ brew install anaconda miniconda rust

python、virtualenvを直接インストールしたりする方法でもいけるとは思いますが、今回はかんたんな方法にしました。

ソースリポジトリからソースをDL

$ git clone -b apple-silicon-mps-support https://github.com/bfirsh/stable-diffusion.git
$ cd stable-diffusion

本家にはまだApple Siliconの対応が入っていないのでフォークされた別のリポジトリを使います。

設定

$ conda init fish # シェルにFishを使っています。適宜変更してください。
$ conda env create -f environment-mac.yaml
$ conda activate ldm
$ mkdir -p models/ldm/stable-diffusion-v1/

モデルデータをDL

モデルをHugging Faceからダウンロードします。

規約に同意する必要があるので確認の上、ダウンロードしてください。

ダウンロードしたら、先程作ったディレクトリにckptファイルを移動させます。

以上で、準備完了です。

生成してみる

準備が出来たので早速、生成してみます。

生成に使ったプロンプトはサンプルに書いてあるものです。

$ python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms --ckpt models/ldm/stable-diffusion-v1/sd-v1-4.ckpt
a photograph of an astronaut riding a horse

馬に乗った宇宙飛行士の写真が出力されました。

ちなみに毎回結果が異なります。

a photograph of an astronaut riding a horse

馬乗ってないんですけど?みたいな画像が出たり

a photograph of an astronaut riding a horse

カラーになったりもします。

今はシンプルなプロンプトですが、これを頑張ることでより自分が求めている画像が出るようになります。

巷では「呪文」とか言われてますね。

例えば同じ馬に乗った宇宙飛行士でも、以下の呪文次第では以下のような画像も出力できます。

a photograph of an astronaut riding a white horse in the desert

白い馬、砂漠を追加しています。

さいごに

ということで、M1MaxMBPをお持ちなら同じ方法で試せると思うので、年末年始に遊んでみてはいかがでしょうか?

それでは、良い画像生成ライフを!

トラブルシューティング

"The operator [name] is not current implemented for the MPS device."

以下のようなエラーが出た場合は、PYTORCH_ENABLE_MPS_FALLBACK=1を付けて実行すればとりあえずは出力されるようになると思います。

NotImplementedError: The operator 'aten::index.Tensor' is not current implemented for the MPS device. If you want this op to be added in priority during the prototype phase of this feature, please comment on https://github.com/pytorch/pytorch/issues/77764. As a temporary fix, you can set the environment variable `PYTORCH_ENABLE_MPS_FALLBACK=1` to use the CPU as a fallback for this op. WARNING: this will be slower than running natively on MPS.

No module named 'cv2'

以下のようなエラーが出た場合は

Traceback (most recent call last):
  File "/Users/owner/Projects/deg84/stable-diffusion/scripts/txt2img.py", line 2, in <module>
    import cv2
ModuleNotFoundError: No module named 'cv2'
$ conda activate ldm

を実行してから生成してみてください。