もう百万回言われてますよ!
ColabもDockerもcondaも使わず、ローカルで動くstable diffusionをpipとvenvで環境構築したいめんどくさい人向けのめんどくさい手順書。
Prerequisites
- Nvidiaグラボ搭載のWindowsマシンにPython 3とpipとgitとcudatoolkit (11.6) が入っている。
- hugging faceから
stable-diffusion-v-1-4-original
をダウンロードしてある- Git LFSがないと
git clone
した時に.ckptファイルがダウンロードされないかもしれない
- Git LFSがないと
stable diffusionのセットアップ
ファイルを置きたい場所に移動してから以下のコマンドを実行する。同じ場所にstable-diffusion-v-1-4-original
もあることが前提。
git clone git@github.com:CompVis/stable-diffusion python -m venv ldm .\ldm\Scripts\activate pip install wheel pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu116 pip install numpy albumentations diffusers opencv-python pudb invisible-watermark imageio imageio-ffmpeg pytorch-lightning omegaconf test-tube streamlit einops torch-fidelity transformers torchmetrics kornia pip install -e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers pip install -e git+https://github.com/openai/CLIP.git@main#egg=clip pip install -e ./stable-diffusion/ mkdir -p ./stable-diffusion/models/ldm/stable-diffusion-v1
torchはオプションなしでpipから入れるとCUDAなしのビルドがインストールされてしまうので注意。
シンボリックリンクを作る
管理者権限で実行しないとリンクを作成できないので注意する。
cd ./stable-diffusion/models/ldm/stable-diffusion-v1/ cmd /c "mklink" .\model.ckpt ..\..\..\..\stable-diffusion-v-1-4-original\sd-v1-4.ckpt
8GBのVRAMで動かす
節約のために涙ぐましい努力をします。
txt2img.py
を編集してモデル精度を下げる。
まずは以下の行を見つける。
model = load_model_from_config(config, f"{opt.ckpt}")
その次の行に以下を追加。インデント(行頭の空白数)を揃えないとエラーになるので注意(以下の変更でも同様)。
model = model.to(torch.float16)
img2img.py
を編集してモデル精度を下げる
img2img.py
ではモデルだけでなく画像についてもfloat16に変換しないといけない。
最初に画像から。
まずは以下の行を見つける。
image = torch.from_numpy(image)
上の行を以下のように書き換える。
image = torch.from_numpy(image).to(torch.float16)
続いてモデル。これはtxt2img.py
と同様。
まずは以下の行を見つける。
model = load_model_from_config(config, f"{opt.ckpt}")
その次の行に以下を追加。
model = model.to(torch.float16)
画像出力を試す
ldm
環境をactivateし、stable-diffusionのフォルダにcd
した後で以下を実行する。
python scripts/txt2img.py --prompt "a photograph of an astronaut riding a horse" --plms --n_samples 2
txt2img.py
、img2img.py
共に、--n_samples 2
を追加しないとVRAM不足で動かない。
加えて、img2img.py
は512x512の画像を入力とする必要がある。
安全機構を外す
注意:自分の足を撃たないように。
まずは以下の行を見つける。
x_checked_image, has_nsfw_concept = safety_checker(images=x_image, clip_input=safety_checker_input.pixel_values)
上の行を以下のように書き換える。
x_checked_image, has_nsfw_concept = x_image, [False for x in enumerate(x_image)]