会社支給の高スペックMacでStable Diffusionをローカル構築して生成AIで遊んでみた

こんにちは。
技術本部でシニアシステムエンジニアをしている大野です。

触ったきっかけ

半年ほど前に、QRコードの生成に関する話題が盛り上がっていましたが、その時はStable Diffusionを動かすための十分なスペックを持ったPCが手元になく、残念ながら試すことができませんでした。
しかし、最近になってふと気づいたのですが、普段あまり気にしていなかった会社から支給されたMacのスペックを見たところ、M2 Maxチップに64GBのメモリを搭載しており、予想以上に高性能であることがわかりました。

Stable DiffusionのMacでの実行はあまり推奨されていないようですが、これだけのスペックがあれば問題なく動作するだろうと考え、試してみることにしました。
また、Promptから生成される画像とQRCodeの方法はいくつか見つかるのですが、実画像とQRCodeを合わせるのを見たことがなかったので、試してみることにしました。

PCスペック

Stable Diffusion 環境構築

最初のステップとして、Stable Diffusionの環境構築に取り組むことにしました。
必要なツールとライブラリを揃えることから始めます。

WebUI環境構築

便利なことにWeb化した方がいるので、とても感謝しつつ構築してきましょう。
stable-diffusion-webuiリポジトリのWikiを参照してInstallします。
M2のため、Apple Siliconでのインストール方法を見ました。
コマンドを実行していけば問題なく構築できると思います。
PythonをInstallするので上書き等気をつけてください。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install cmake protobuf rust python@3.10 git wget
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
cd stable-diffusion-webui
./webui.sh

まあまあ時間がかかるので待ちましょう。
webui.shの起動が終わったら
http://localhost:7860/
にアクセスすると下の画像の画面が開くと思います。
ブラウザが開いたらWebUIのInstallは完了です。

初期画面

ControlNet環境構築

Stable Diffusionの機能を拡張するのにControlNetというものがあります。
今回はこのControlNetを使用するのでダウンロードと設定をしていきましょう。

インストール

下の画像の画面でURLに
https://github.com/Mikubill/sd-webui-controlnet.git
を入力してInstallボタンを押しましょう。

InstallURL

完了

完了するとInstallボタンの下に画像のようなメッセージが表示されます。

Install完了

適用

適用するためにInstalledタブに移動して「Apply and restart UI」を実行して再起動しましょう。

適用

txt2imgのタブに移動して下の方にControlNetのプルダウンが表示されていれば成功です。
Installが成功したのに表示されていない時はwebui.shを再起動してみましょう。

ControlNetタブ

設定変更

ControlNetに設定できる数はDefaultの3のままでも良いのですが、たくさん設定できた方が楽しいので、ControlNetSettingのMulti-ControlNet: ControlNet unit numberを10まで上げて「Apply settings」を押して反映しましょう。
色々文字が出ますが気にしなくて大丈夫です。

ControlNet設定

moduleダウンロード

ここのサイトの拡張子safetensorsを全てダウンロードしておきましょう。

もう一つ、今回はTileを使いたいので、ここのサイトからcontrol_v11f1e_sd15_tile.pthをダウンロードしましょう。拡張子がpthなので注意してください。

ダウンロードが完了したらファイルを
stable-diffusion-webui-docker/models/ControlNet
に移動します。

Moduleディレクトリ

webui.shを再起動してControlNetのModelに表示されたら使用できます。

ControlNetタブ2

画像生成

ここまでで環境構築が終わり、画像生成を開始できるようになります。
今回は実画像とQRCodeを合成した画像の生成を行いたいと思います。

事前準備としてメイン画像とQRCodeの画像を用意してください。
またQRCodeは最高品質で作成してください。

img2img

メインとなる画像をimg2imgに設定します。
この時Promptには高解像度になるような設定をしておくと良いです。

  • Prompt: 4k, ultra detailed, masterpiece
  • Negative: lowres, blurry, low quality
  • Sampling method: DPM++ 2S a Karras
  • Sampling steps: 60
  • CFG Scale: 10
  • Denoising strength: 0.50 - 0.90


ControlNet(画像部分)

img2imgに設定した画像をCannyとReferenceに同じ画像を設定します。

Canny

Cannyの設定で実画像のエッジを抽出し、同じ構図の画像を生成してくれるようにします。

  • ControlWeight: 1.6 - 2.0
  • Canny Low Threshold: 150

canny

Reference

Referenceの設定で画像を参考に新しい画像を生成してくれるようになります。

  • ControlWeight: 1.8 - 2.0
  • Preprocessor: reference_adain+attn

refarence

ControlNet(QRCode)

QRCodeの画像をTileに設定します。

Tile

正直Tileはよくわかってないです。名前的にQRCodeにあいそうだなと思って使ってみました。

  • ControlWeight: 1.6 - 2.0
  • Starting Control Step: 0.0 - 0.2
  • Ending Control Step: 0.8 - 1.0
  • Down Sampling Rate: 0.0 - 5.0

tile

生成&パラメータチューニング

Generateボタンを押すと画像が生成されると思います。
ここからは根気です。
チェックボックスをつけたり外したり。
あらゆるパラメータを上げたり下げたりしていきいます。
ただ弊社支給のM2MacBookPro(Memory64GB)だと1枚2,3分ぐらいで生成できるのでバンバン生成できます。
ありがたいですね。
また、ある程度ピクセル数は大きい方がQRが綺麗に出ます。

保存先

outputsに生成方法と日付ごとに保存されていきます。
良い感じの画像ができたら別なところに保存しておきましょう。

生成した画像

生成した画像

生成に終わりはありません。
どこで妥協するかだと思います。
今回はブログを書くまでだったので、ある意味良かったです。

下の画像は生成した中で一番まともだったものです。
オフィスの形に沿ってQRCodeの黒を配置してくれました。

合成結果

振り返り

ということで支給PCでStable Diffusionはサクサク動いてくれました。
正直こんなに快適に動作するとは思いませんでした。

やってみて大変だったこと

ControlNetにCannyとRefarenceを設定すると、ほぼ元画像と同じになるのを見つけるまでは絶望的な画像しか生成されず、Promptから画像生成して妥協しようかと悩みました。
あとは生成する画像は、とにかく思い通りにならなかったです。
なんか良くなったなと思えば悪くなり、パラメータを元に戻しても同じクオリティの画像がでなかったり。
80点ぐらいの画像はすぐに生成できたのですが、そこからの微調整が地獄でした。

学び

根気よく諦めないことが大事、という忘れていたことを思い出させてくれました。
長くエンジニアをやっていると、経験と直感でこうやったらうまくいくだろうという論理的思考が付くと思うのですが、それがほとんど通用しないので面白かったです。

今後

どちらかというと本業はLLMの方が近いのでLLaMAなども動かしてみたいですね。