Stable DiffusionをApple SiliconのmacOSにインストールしてみましたが、少しコツが必要でした。
インストール時期やApple Siliconの種類によっては若干変わるかもしれませんが、私がM1 Maxチップ搭載のMacBook Proで成功した手順をまとめてみました。
必要なパッケージをインストールする
こちらは公式に従ってインストールします。私の環境では最終的にPythonはここでインストールしたものではなく、Asdfで導入したものを使用しているので、3.10
系であればここでインストールしなくてもよいと思われます。
brew install cmake protobuf rust python@3.10 git wget
Stable Diffusion WebUIをダウンロードする
GithubのReleasesでもダウンロードできそうですが、macOSの場合はリポジトリをクローンする必要があります。
任意のディレクトリにリポジトリをcloneしてください。
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
追加データをダウンロードする
手順の中でここが一番面倒かもしれません。ここでは執筆時点最新のv2.1を使用します。
上記サイトからvae-ft-mse-840000-ema-pruned.ckpt
というファイルをダウンロードし 、stable-diffusion-webui/models/Stable-difusion
に保存してください。
保存後、ファイル名をv2-1_768-ema-pruned.vae.pt
に変更してください。
上記サイトからv2-1_768-ema-pruned.safetensors
というファイルをダウンロードし、stable-diffusion-webui/models/Stable-difusion
に保存してください。
ここを開いて、表示された内容をコピーし、stable-diffusion-webui/models/Stable-difusion
にv2-1_768-ema-pruned.yaml
というファイル名で保存してください。
Stable Diffusion WebUIを起動する
cd stable-diffusion-webui
./webui.sh
起動すると、以下のようなログが表示されます。URLが出ているので、ここにアクセスしてください。
Model loaded in 3.6s (load weights from disk: 0.3s, create model: 0.2s, apply weights to model: 1.8s, apply half(): 0.6s, load VAE: 0.1s, move model to device: 0.5s).
Running on local URL: http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.
Startup time: 11.2s (import torch: 2.1s, import gradio: 1.7s, import ldm: 0.4s, other imports: 2.9s, load scripts: 0.3s, load SD checkpoint: 3.6s, create ui: 0.2s).
ブラウザでアクセスすると、以下のような画面が表示されます。
設定変更を行う
同じようにApple Silicon Macにインストールしている方の記事で、この点に触れていない方も結構見かけるので、もしかすると環境依存かもしれませんが、私の環境ではv2.1でGenerateしようとすると以下のようなエラーが表示されました。
0%| | 0/20 [00:02<?, ?it/s]
Error completing request
Arguments: ('task(6gvckovujc9xon0)', 'sailing ship', '', [], 20, 0, False, False, 1, 1, 7, -1.0, -1.0, 0, 0, 0, False, 512, 512, False, 0.7, 2, 'Latent', 0, 0, 0, [], 0, False, False, 'positive', 'comma', 0, False, False, '', 1, '', 0, '', 0, '', True, False, False, False, 0) {}
Traceback (most recent call last):
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/call_queue.py", line 56, in f
res = list(func(*args, **kwargs))
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/call_queue.py", line 37, in f
res = func(*args, **kwargs)
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/txt2img.py", line 56, in txt2img
processed = process_images(p)
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/processing.py", line 503, in process_images
res = process_images_inner(p)
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/processing.py", line 653, in process_images_inner
samples_ddim = p.sample(conditioning=c, unconditional_conditioning=uc, seeds=seeds, subseeds=subseeds, subseed_strength=p.subseed_strength, prompts=prompts)
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/processing.py", line 869, in sample
samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning, image_conditioning=self.txt2img_image_conditioning(x))
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py", line 358, in sample
samples = self.launch_sampling(steps, lambda: self.func(self.model_wrap_cfg, x, extra_args={
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py", line 234, in launch_sampling
return func()
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py", line 358, in <lambda>
samples = self.launch_sampling(steps, lambda: self.func(self.model_wrap_cfg, x, extra_args={
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/venv/lib/python3.10/site-packages/torch/autograd/grad_mode.py", line 27, in decorate_context
return func(*args, **kwargs)
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/repositories/k-diffusion/k_diffusion/sampling.py", line 145, in sample_euler_ancestral
denoised = model(x, sigmas[i] * s_in, **extra_args)
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/venv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
return forward_call(*input, **kwargs)
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/sd_samplers_kdiffusion.py", line 152, in forward
devices.test_for_nans(x_out, "unet")
File "/Users/t0k0sh1/Workspace/stable-diffusion-webui/modules/devices.py", line 152, in test_for_nans
raise NansException(message)
modules.devices.NansException: A tensor with all NaNs was produced in Unet. This could be either because there's not enough precision to represent the picture, or because your video card does not support half type. Try setting the "Upcast cross attention layer to float32" option in Settings > Stable Diffusion or using the --no-half commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.
ちなみに、v1.4やv1.5ではこの事象は起きなかったので、v2.x系固有のエラーかもしれません。
これを解消するために、設定変更を行います。画面上部のタブからSettingsを選択し、
左のメニューからStable Diffusionを選択します。
バージョンにもよるかもしれませんが、一番下にUpcast cross attention layer to float32
というチェックボックスがあるので、ここにチェックをつけてください。
最後に設定を反映させるため、画面上部のApply settings
ボタンを押してください。
これでエラーが出ずに画像生成ができるようになります。