With the landscape quickly changing, this article is fast becoming outdated!
If you face issues with the tutorial below I recommend you checkout the latest advice here.
Stable Diffusion is a latent text-to-image diffusion model that was recently made open source.
For Linux users with dedicated NVDIA GPUs the instructions for setup and usage are relatively straight forward. However for MacOS users you can't use the project "out of the box". Not to worry! There are some steps to getting it working nevertheless!
Environment Setup
To begin you need Python, Conda, and a few other libraries set up:
# Install Python, Cmake, Git, and Protobuf
brew install python \
cmake \
git \
protobuf
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install Conda:
## Either use this for older "pre-M1" Macs:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
bash Miniconda3-latest-MacOSX-x86_64.sh
## Or use this for older M1 Macs:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh
bash Miniconda3-latest-MacOSX-arm64.sh
You may need to restart your terminal at this point for the changes for the new libraries to be picked up.
Clone this fork of the project and checkout the apple patch branch:
git clone https://github.com/magnusviri/stable-diffusion
cd stable-diffusion
git checkout apple-silicon-mps-support
At this point you will need to make sure you're using Python 3, check out this article for different ways to make Python 3 the default version on your Mac.
Set up the Conda environment:
conda env create -f environment-mac.yaml
conda activate ldm
And finally set the following environment variable:
export PYTORCH_ENABLE_MPS_FALLBACK=1
Code Changes
Our environment is now set up, but we have a few tweaks that we need to allow the code to gracefully fallback to using the CPU (if required!).
Append .contiguous()
at ldm/models/diffusion/plms.py#L27 resulting in:
- attr = attr.to(torch.float32).to(torch.device(self.device_available))
+ attr = attr.to(torch.float32).to(torch.device(self.device_available)).contiguous()
Similarly append a new line x = x.contiguous()
after ldm/modules/attention.py#L211 so it looks something like:
def _forward(self, x, context=None):
+ x = x.contiguous()
x = self.attn1(self.norm1(x)) + x
Download Stable Diffusion Weights
Let's install our diffusion weights
curl "https://www.googleapis.com/storage/v1/b/aai-blog-files/o/sd-v1-4.ckpt?alt=media" > sd-v1-4.ckpt
Create Images 🚀
You should now be ready to generate images on your MacOS device using Stable Diffusion! 🎉 🎉
python scripts/txt2img.py --prompt "a drawing of web developers" --plms --ckpt sd-v1-4.ckpt --skip_grid --n_samples 1
Tricks and hacks gleamed from https://github.com/CompVis/stable-diffusion/issues/25 - credit to all the folks in that thread for figuring out how to get things working!
Oldest comments (41)
Thanks for the detailed instructions! Unfortunately, I'm getting stuck at environment creation where pip is failing with the message below. Any thoughts on how to get over this hurdle? Thanks again!
(Note: It appears to be an issue with onnx. I tried a
pip install onnx
and it went through every version unsucessfully.)im having the same issue, any clue?
I’ll give my own instructions another go and see if can reproduce…
What version of python/pip are you using? IIRC you need to use python 3
Updates:
cmake
, adding some env setup steps for this now! You need to install thisbrew install cmake
I’ll check again installing cmake
Question: why are you using /Miniconda3-latest-MacOSX-x86_64.sh instead of /Miniconda3-latest-MacOSX-arm64.sh ?
Miniconda3-latest-MacOSX-x86_64.sh
is for "pre-M1" macs, e.g. I use a MacBook Air 2017 which uses an Intel chip.Miniconda3-latest-MacOSX-arm64.sh
is for Apple M1 😄I was confused because you use apple-silicon-mps-support branch and I thought you had a M1 cpu. Anyway now it's working for me, thanks
Hi Craig,
thanks for this tutorial.
This step doesn't work for me :
i get this error :
Can you try with quotes around the URL? E.g.
thx for this tutorial
but I got error on my MacBook pro (intel):
The only time I got a segfault was when I set KMP_DUPLICATE_LIB_OK ... I posted a couple other solutions above (recommend the "delete the conflicting library" one over the "rebuild with nomkl" but whichever you feel more comfortable with ^_^ )
FWIW [2022-08-29] —
on an intel mac
1)
ldm/modules/attention.py#L211 already had the patch
2)
ran into issues with:
I wound up redoing the environment to include nomkl and it seems to have worked, if ... so ... SO ... slow [4 minutes!] . But I'll take functional over not (thanks!) ... helps me prep for doing this on a real machine, and I can kick things off overnight. ;)
Alternately, with the info that libiomp5.dylib and libomp.dylib were likely conflicts:
seems to have worked, ignoring the nomkl path.
The KMP_DUPLICATE_LIB_OK solution only led to segfaults.
The LD_PRELOAD did nothing, possibly because I was targeting the wrong one, but possibly because the names were actually different?
Hi Craig,
I'm stuck at the point of installing Conda. I get the message: 'zsh: command not found: wget'. It seems wget is a Linux command, but I'm on a iMac (Monterey). Any help is much appreciated!
Sjoerd
you can install wget with brew, or switch to using curl to get the file also
curl -O URLHERE
Thanks! ATM I'm not able to try it, but also further investigation revealed that probably the path to the zsh shell is not valid. So I will check that also asap.
It turned out I indeed had to install 'wget' with brew. It does now recognise the command. So no problems with the shell path. Thanks so much!
Thank you a lot! I don't have much experience coding but I managed to followed this true with some added troubleshooting because I couldn't understand quite all of it. But for now it worked!
I only have one question;
you say: Similarly append a new line x = x.contiguous() after ldm/modules/attention.py#L211
but when I went in the code to append this, it was already there without my intervention or anything. Can I just ignore this step or am I missing something?
It does work without the gpu/cpu thing so thanks again.
Anyway I could buy you a coffee?
Jeremy
I expect the codebase just moved forwards and "fixed" this part :)
Do you have to install the Stable Diffusion Weights every time you use it?
just each time you install stable diffusion :) it'll wind up downloading a bunch of checkpoints/whatnot the first time you run, but won't need to do that either on subsequent runs.
Thanks for the instructions, but I found some problems while trying to make this to work.
Many modules looks missing on my MacOS (with M1), that I think I managed to install, but now I'm stucked.
The error I get is:
Any idea on how to solve it? I tried to install libpng but things don't change.
Thanks again :)
I am getting a weird error when I try and run the python script.
I have an apple Macbook Pro M1 with 64GB of ram.
Just a note that the line
git checkout apple-silicon-mps-support
should be changed togit checkout apple-mps-support
I'm magnusviri. The instructions should now be modified like so.
git checkout github.com/lstein/stable-diffusion
No need to checkout anything.