stable diffusionをローカルでcondaを使わずに動かす

もう百万回言われてますよ!

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ファイルがダウンロードされないかもしれない

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.pyimg2img.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)]

References