【Stable Diffusion】M1のMacローカルで動かしてみた

Stable Diffusionを使って
ローカルで画像生成してみた

OpenAIのDALL・E 2よりもStableDiffusionで作られる画像の方が好み。
まだ触ったことない人はぜひとも使ってみるとよろし。

AIを最近使ってみて思うのはprompt(指示・命令)が命ってことです。
ここを意識せずに○○作って!といってもAIは行間を読んでくれるわけでもなく適当な画像が返ってきます。

髪型はこうで、どういった服を着ていて、どういう色で背景には何があって、という感じで自分の頭の中でも具体的にイメージしてそれをpromptでAIに伝えるという工程が必要になるわけです。
promptは日本語でもいけるけど出どころが英語圏ともあってやはり英語で指示を出す方が高度な画像が生成されやすいように感じます。
とはいっても英語が苦手な方も多くいるので
https://lp.ai-copywriter.jp/
こういったpromptを生成してくれるサービスなんかも出てきてます。

ノーコード、ローコードと言われて久しいわけですが、ほんとコードを書かなくてもクリエイティブな物が作れる世の中になってきましたね。
シンギュラリティも2045年という予測から再来年にくるのではという予測に変わってます。
技術の進化とは恐ろしいものです。

さてさて、前置きが長くなってしまいましたが、今回は巷で有名な画像生成AIのStable DiffusionをM1 Macのローカルで環境構築してみた備忘録になります。

同じ環境下で試してみたい方は是非参考にされてみてください。

ローカル環境

まずは私の環境のご紹介

MacBook Pro (13-inch, M1, 2020)
チップ Apple M1
メモリ 16GB

いまさらの復習とはなりますがAppleのM1はIntel製CPUに変わるmacOS向けの新しいSoCですね。
Intel製CPUではない、というのがポイントです。

SoC(System on Chip読み:エスオーシー、ソック
システムや機器の動作に必要な機能を1つの半導体にまとめる方式

ちょっと前までStable Diffusionをローカルで環境構築するにはWindowsが良さげで高価でハイスペックなGPUボードが必要というのが通説でしたが、M1MacのGPUでもできるぜ?という記事が出たのでやってみたという背景です。
Run Stable Diffusion on your M1 Mac’s GPU

環境構築

「M1 Mac Stable Diffusion ローカル」というキーワードでググるといろいろと記事が出てきます。
一筋縄ではうまくいかなかったので、インストールしたライブラリやChatGPTに相談しながら解決した手順なども一緒に展開しておきます。

1. cmake と rust のインストール

$ brew install cmake
$ brew install rust

cmake
ソフトウェアのビルド、テスト、およびパッケージ化を目的として設計された、オープンソースのクロスプラットフォームのツールファミリです。

rust
2006年に開発がスタートしたオープンソースのプログラミング言語

2. Anaconda のインストール

$ pyenv install anaconda3-2022.05
$ pyenv global anaconda3-2022.05

homebrewと相性が悪いらしいのでpyenvでのインストールをオススメしてる記事がありました。
なんだけど、うまくcondaコマンドを認識してくれなかったので本家である公式からダウンロードしました。

https://www.anaconda.com/

インストール後、.bash_profileにconda用の環境変数がセットされていたので

$ source ~/.bash_profile

ですぐにシェルを適用したら

$ conda --version

が実行可能に(condaコマンド認識)してくれました。
※conda起動後、ターミナルのユーザ名より前に(base)がつくのはAnacondaの仮想環境にいることを示すらしい

ちなみに、自分のMacがデフォルトで起動させてるシェルを確認するのは

$ echo $SHELL

で調べられる。当然かもだけどメモ。

Anaconda
Pythonの実行環境で、データサイエンスに必要とされる各種ツールやライブラリを提供するプラットフォーム

3. gitからプログラムをクローンする

これはサンプル通り

$ git clone -b apple-silicon-mps-support https://github.com/bfirsh/stable-diffusion.git
$ cd stable-diffusion
$ mkdir -p models/ldm/stable-diffusion-v1/

これはcloneして対象ディレクトリに移動して必要なディレクトリ用意するだけなので躓くことはないです。
一応各コマンドオプションの補足を

git -bオプション

git -bは、Gitコマンドのオプションの1つで、新しいブランチを作成するために使用されます。-bオプションを使用すると、新しいブランチを作成して、そのブランチに切り替えることができます。具体的には、以下のように使用します。

git branch -b <branch-name>

このコマンドは、新しいブランチ<branch-name>を作成し、そのブランチに切り替えます。-bオプションを使用しない場合、新しいブランチが作成されても、現在のブランチにとどまります。

例えば、以下のように使用することができます。

git checkout -b my-new-branch

このコマンドは、my-new-branchという名前の新しいブランチを作成し、そのブランチに切り替えます。ブランチが正常に作成された場合、GitはSwitched to a new branch 'my-new-branch'というメッセージを表示します。

-bオプションは、作業中のブランチから新しい機能を開発する場合や、修正を行った後に修正内容を確認するために新しいブランチを作成する場合などに便利です。

mkdir -pオプション

mkdir -pは、LinuxやUnix系オペレーティングシステム上で、新しいディレクトリを作成するためのコマンドです。このコマンドは、必要に応じて親ディレクトリも自動的に作成します。

具体的には、以下のように使用します。

mkdir -p /path/to/new/directory

このコマンドは、/path/to/new/directoryという名前の新しいディレクトリを作成します。-pオプションを使用することで、/path/to/newという既存のディレクトリがなくても、必要に応じて自動的に作成されます。つまり、/path/toが存在しない場合でも、mkdir -p /path/to/new/directoryを実行することができます。

このオプションは、複数のディレクトリをまとめて作成する場合に便利です。例えば、以下のように使用することができます。

mkdir -p /path/to/new/directory1 /path/to/new/directory2

このコマンドは、/path/to/newという親ディレクトリを作成し、その中にdirectory1directory2という2つのディレクトリを作成します。

mkdir -pは、一度に多くのディレクトリを作成する必要がある場合や、自動化スクリプトなどで使用されることが多く、非常に便利なオプションの1つです。

4. モデルのダウンロード

以下のサイトから「v1-5-pruned.ckpt」をダウンロードします

https://huggingface.co/runwayml/stable-diffusion-v1-5#original-github-repository

ダウンロードしたファイルを3で作成したディレクトリ「models/ldm/stable-diffusion-v1/」に「model.ckpt」という名前で保存します。

models/ldm/stable-diffusion-v1/model.ckpt

5. 実行

さて、Anacondaで実行です。

$ conda env create -f environment-mac.yaml
$ conda activate ldm

Anacondaのアクティベートが完了したら

$ python scripts/txt2img.py

で画像が生成される!はず・・・

なんですが私の場合は以下のようなエラーが出ました。

This system does not meet the minimum requirements for use of the Intel(R) Math Kernel Library.

いろいろ右往左往して詰みかけていたのですが仮想環境をAnacondaからvirtualenvに変えたらうまくいきました。
ということで環境構築を以下のように仕切り直しです。

$ pip install virtualenv
$ virtualenv venv

続いてvirtualenvをアクティブにします。

$ source venv/bin/activate

※Stable Diffusionを実行するたびにこのコマンドを再実行する必要があるらしい

次に、Pythonパッケージの依存関係をインストールします。

$ pip install -r requirements.txt

さぁ、これで準備は整った!実行です。

$ python scripts/txt2img.py --prompt "a lone skyscraper landscape vista photography by Carr Clifton & Galen Rowell, 16K resolution, Landscape veduta photo by Dustin Lefevre & tdraw, 8k resolution, detailed landscape painting by Ivan Shishkin, DeviantArt, Flickr, rendered in Enscape, Miyazaki, Nausicaa Ghibli, Breath of The Wild, 4k detailed post processing, atmospheric, hyper realistic, 8k, epic composition, cinematic, artstation" --n_samples 1 --n_iter 1 --plms

エラー!!

ImportError: cannot import name 'SAFE_WEIGHTS_NAME' from 'transformers.utils' (/Users/ユーザ名/Documents/Project/AI/stable-diffusion/venv/lib/python3.10/site-packages/transformers/utils/__init__.py)

調べてみるとtransformers.utilsが悪さしてる(古い?)ようだったので海外サイトにいきついた結果

$ pip install diffusers==0.12.1

を実行すれば解消されました。

で、再度スクリプトを実行したところ無事に画像が生成されました!

画像はstable-diffusion > outputs > txt2img-samplesの中に格納されます。

こちら!

合格!
promptにできるだけ多くの単語で指示すればより高度に、より質が高く生成されます。

まとめ

技術も常識も日々進化していきますね。昨日の常識は今日は通用しない、そんなスピード感で世の中は変わってるように感じます。

今回メモとしてまとめた環境構築もgithubのコードや、それらをとりまくライブラリの依存関係でうまく動作しないこともあるかと思います。

すぐにググっても適切な情報にリーチできないときはChatGPTに相談してみるなどしてうまくAIで補完していくのも良いかもしれません。
すべてが正しい回答をくれるわけではないので、あくまで補完関係にとどめておくことが重要なんじゃないかと思う今日この頃です。

それではまた。良きAIライフを。