Stable Diffusionを試した(Mac intel製プロセッサ)

毎朝 NewsPicks を読んでいるのですが、NewsPicks の記事のいくつかは Midjourney でアイキャッチ画像を生成していることを知り、気になったので週末に調べていました。

有名な画像生成 AI はいくつかあり、その中でも Stable Diffusion は手元の PC でも起動できるので使ってみました。導入方法と個人的に気になった点の調査内容をメモします。

Stable Diffusion の導入

  1. stable-diffusion: 本家 SD
  2. stable-diffusion-webui: ブラウザから利用できる本家 SD のフォーク
  3. MochiDiffusion: M1/M2 の Mac 用

1 が Stable Diffusion を開発した Stability-AI 社が管理しているリポジトリ。2 は Stable Diffusion をブラウザで利用できるようにした Web アプリケーション版のリポジトリ。

1 はプロンプトの入力や画像サイズ・モデルの指定をコマンドラインで行うので、シェルスクリプトで自動化したり、拡張機能を自分で作りたい開発者向けという印象。

今回は手軽に試したかったため、2 の WebUI の方を利用しました。

3 は、MochiDiffusion という M1/M2 系の Mac でも GPU を利用して画像生成できるアプリです。M1/M2 系の Mac の場合は MochiDiffusion を利用すると良さそうです(参考 URL)。

導入手順

Windows, Linux, MacOS の導入手順が README.md に記載されています。

stable-diffusion-webui#Installation and Running

README には Apple Silicon と言及されていますが、Intel プロセッサでも大丈夫でした。

python のバージョンは 3.10 以上が推奨されているため、すでに python をインストールしている場合でも要確認。pyenv などでバージョン管理すると良いです。

上記の導入手順は PC に直接インストールして起動する方法が書かれていますが、docker でも動作しました。しかし非常に高いスペックを要求されるので、ホスト側で動かすのが良さそう。

トラブルシュート

半精度浮動小数点数に関するエラー

手元の PC(2019 年製の Mac, Intel プロセッサ)で画像の生成を実行すると、下記のエラーが発生しました。

RuntimeError: “LayerNormKernelImpl” not implemented for ‘Half’

グラフィックカードが half floats(半精度浮動小数点数)の計算に対応していないため発生するエラーとのこと。

画像生成に単精度で演算を行うためのオプション(--precision full --no-half)をつけると解決します。

./webui.sh --precision full --no-half

↓ 以下、 半精度浮動小数点数と画像生成の制度について

半精度は 16 bit のこと、浮動小数点数はfloating point numbersまたはfloatsと呼ばれています。

  • 半精度浮動小数点数
    • 16 bit, floats
  • 単精度浮動小数点数
    • 32 bit, floats
  • 倍精度浮動小数点数
    • 64 bit, floats
    • 単に double と呼ばれることもある

bit 数が高いほどより細かく正確な演算ができるので、画像生成の完成度に影響しそうですが、AI の画像生成において 32bit 以上の精度は必要ない(完成度に影響しない)ことが分かったため、デフォルトで半精度浮動小数点数の演算を行うようにプログラムされているようです(参考 URL)。

PyTorch に関するエラー

下記のようなエラーが発生しました。

Torch is not able to use GPU; add –skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check

PyTorch が GPU を使用することができなくて発生したエラー。暫定対策として、--skip-torch-cuda-testをコマンドライン引数に指定すると起動できるかも。しかしこのオプションは GPU の代わりに CPU を使うことになるため、生成速度が遅くなります。

根本的な原因はなんらかの理由で GPU を検出することができなかったことなので、それを解決するのが理想ですが、特殊なケース(GPU のドライバを更新したら治ったとか)以外は GPU を増設 or 取り替えるしかなさそうです。理由は Stable Diffusion で使われている cuda の仕様によるもで、cuda が NVIDIA の GPU 上での動作を想定しているためです。

CUDA is an NVIDIA-proprietary software for parallel processing of machine learning/deeplearning models that is meant to run on NVIDIA GPUs, and is a dependency for StableDiffision running on GPUs. If you have an AMD GPU, when you start up webui it will test for CUDA and fail, preventing you from running stablediffusion. The workaround adding –skip-torch-cuda-test skips the test, so the cuda startup test will skip and stablediffusion will still run. Because you still can’t run CUDA on your AMD GPU, it will default to using the CPU for processing which will take much longer than parallel processing on a GPU would take.

参考 URL

デフォルトのコマンドライン引数を設定する

起動時に指定するコマンドライン引数をデフォルトで設定できます。

webui-user.shCOMMANDLINE_ARGSという環境変数があり、そこにオプションを設定します。

export COMMANDLINE_ARGS="--precision full --no-half --skip-torch-cuda-test --use-cpu all --upcast-sampling"

Stable Diffusion で画像生成してみた結果

A wolf with grey hair is running powerful on rainy grassland. A wolf with grey hair is running powerful on rainy grassland. かっこいい!と思ったら足の数、、

A woman with blond hair typing a laptop keyboard with a serious expression is sitting at a table in a classical cafe. A woman with blond hair typing a laptop keyboard with a serious expression is sitting at a table in a classical cafe. なぜカメラ目線になるのか、、こっち見んな。でも可愛い。

An old man with glasses standing in outer space is gently staring at the distance. The old man is dressed a brown trench coat and a hat. The old man’s hands are in his trench coat pockets. There is the earth in the old man’s background. An old man with glasses standing in outer space is gently staring at the distance. The old man is dressed a brown trench coat and a hat. The old man’s hands are in his trench coat pockets. There is the earth in the old man’s background. ちょっとコートがおかしくなってるけどまぁ、、

モラルの話

Midjourney や DALL・E(ダリ)は利用環境が制限されていますが、Stable Diffusion は手軽に手元の環境で動かすことができます。加えて、オープンソースで公開されたことで、それをもとに様々な画像生成 AI モデルが作成され、インターネット上で共有されています。

今回 Stable Diffusion を試したのも上記の理由からだったのですが、生成されたモデルの中にはインターネット上の画像を権利者に無許諾で収集したものもあり、モラルハザードが発生する事態になっていることを知りました。

倫理的な側面から、イラストレーターの権利を尊重する方向に整備されていくと思いますが、画像生成 AI のエコシステムが今後どのように変わっていくか、気になります。

まとめ

ボタンぽち〜でクォリティの高い画像ができあがるのには感動しました。また、調査の過程で半精度浮動小数点数など、コンピューターサイエンスの概念もでてきて、少し勉強になりました。

イラストレーターがキャリアパスについて不安を感じる理由も理解できます。Web エンジニアも他人事ではないので、今後どのように自分のスキルを磨いていけばいいのか、改めて考えないとなと感じました。