M1 MacBook ProでStable Diffusionを動かす

画像生成AIのStable Diffusionがオープンソース化され、8月22日に公開されました。商用の使用も許可されていることから多くの注目を集めているようです。
一つの時代の始まりであると評論している人もいるようで、AIムーブメントのパワフルさとスピード感を感じているところです。

北九州でも、九州工業大学の学生さんがLINEのチャットボット経由でStable Diffusionを使えるサービスを開発したということで、こちらも注目されていますね。

M1 MacBook Proで動かしたい

そんなStable Diffusionですが、我がM1 MacBook Pro 14インチ(M1 Max 24コア)でも動かしたいと思いまして、先週いろいろやってみました。M1 Macだと一筋縄でいかないところがあり、少し苦労したのですが、動かすことができました。
なかなかブログに書く時間がなかったのですが、ようやっと時間が取れたので、まとめておこうと思います。

参考にさせていただいたのは、こちらのZennの投稿です。

基本、こちらの投稿で良いのですが、環境の違いもありまったく同じというわけではありませんでした。(私はPython環境をASDFで作っていたりします。)

動作環境

  • MacBook Pro 14インチ
    • M1 Max 10コアCPU/24コアGPU/16コアNeural Engine
    • メモリ32GB
  • arm64環境(archをx86_64に切り替えたりはしていない環境)
  • ASDF
  • miniforge3-4.10.3-10
  • Python 3.9.13

Stable Diffusionの環境構築

Stable Diffusionのダウンロードは公式のリポジトリからではなく、M1 Mac用にカスタムしている方のリポジトリから行います。
apple-sillicon-mps-supportブランチをチェックアウトします。

git clone https://github.com/magnusviri/stable-diffusion.git
cd stable-diffusion
git checkout apple-silicon-mps-support

参考にしたサイトにrustの導入について書いてあったので、Homebrewを使って入れておきます。

実はいろいろと試行錯誤しているのですが、onnxのインストールにハマるので、こちらを参考にcmakeとprotobufをインストールしました。

brew install rust cmake protobuf

grpcioの導入にもハマりました。こちらを参考に、環境変数の設定を行います。

export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1

Stable Diffusionに必要な諸々のパッケージは、environment-mac.yamlにまとまっているので、それを使ってconda仮想環境上にインストールします。
ldmという名前の仮想環境ができるので、インストールが終わったら有効化します。

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

学習モデルのダウンロード

Stable Diffusionの学習モデル(学習済みのWeightファイル)は、Huggigfaceからダウンロードできます。事前にHuggigfaceのユーザー登録と、プロジェクトへの参加が必要になります。

models/ldm配下に学習モデルのリポジトリをクローンし、ディレクトリ名の変更と、sd-v1-4.ckptをmodel.ckptとしてシンボリックリンクを作成します。(この後のスクリプトがmodel.ckptというファイル名を指定しているようです。)

cd models/ldm
git clone https://huggingface.co/CompVis/stable-diffusion-v-1-4-original
mv stable-diffusion-v-1-4-original stable-diffusion-v1
cd stable-diffusion-v1
ln -s sd-v1-4.ckpt model.ckpt

画像を生成してみる

最初にクローンしたstable-diffusionのルートディレクトリに戻って、txt2imgを起動すると、パラメータで指定したテキストに沿った画像を生成してくれます。

python scripts/txt2img.py --prompt "coffee cup on wood table" --plms

txt2img.pyには、いくつかのパラメータがあります。例えば、生成する画像の幅と高さは、--W--Hで指定できます。デフォルトはどちらも512pxになっているようです。(ただ、画像サイズを大きくすると、その分だけメモリも使うようでメモリ不足のエラーで落ちるということもあるようです。)

めったに熱くならないMacBook Proなのですが、パームレストのあたりがほんのり熱くなります。結構な性能を食うようです。ただ、ファンが煩くなるというほどではないようです。

5分ほど待つと、outputs/txt2img-samplesディレクトリにグリッド画像が生成されます。完璧。

また、outputs/txt2img-samples/samplesディレクトリに、グリッド画像を構成していた6枚の画像がそれぞれ生成されています。

このクオリティで画像が出てくると、素材集のサイトとか要らないかも・・・と思ってしまいますね。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。