ちぇちぇの記憶

それは希薄で短命である

Stable Diffusion環境構築(pip、windows11、wsl、GeForce)

結局なにが必要なのか分かりにくい

どこの記事もごちゃごちゃと必要のないものもたくさんインストールしていてよくわからないので、画像を生成するためだけのシンプルな構成を紹介します。

環境

構築

wsl上のコマンドです。

# ※1 のところはインストールに時間がかかるのでのんびり待ってください
# GPUの状態が出ることを確認。出ない場合はドライバのインストールができていない
$ nvidia-smi

# CUDAを計算で利用可能にする
$ sudo apt install nvidia-cuda-toolkit # ※1
$ nvcc -V 
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Thu_Nov_18_09:45:30_PST_2021
Cuda compilation tools, release 11.5, V11.5.119
Build cuda_11.5.r11.5/compiler.30672275_0

# Python
$ mkdir application && cd application # 'application'は任意の名前
$ python3 -m venv .venv
$ source .venv/bin/activate
# Python実行時はコンソールに (.venv) と表示されていることを確認
(.venv) $ python -m pip install --upgrade pip
(.venv) $ pip install torch torchvision # ※1

# 閑話(TrueになればGPUで計算できているらしい)
(.venv) $ python
>>> import torch
>>> torch.cuda.is_available()
True

# 続き(stable-diffusion関連のパッケージを取得する)
(.venv) $ pip install diffusers transformers accelerate

# 学習済みモデルをダウンロードする(数GBあるので時間かかります)
$ sudo apt-get install git-lfs
$ mkdir models && cd models
$ git clone https://huggingface.co/Linaqruf/anything-v3.0  # ※1

次のPythonコード(txt2img.py)をプロジェクトルートに置いて実行する。

from PIL.Image import Image
from torch import autocast
from diffusers import StableDiffusionPipeline

def main():
    model = "./models/anything-v3.0"
    prompt = "girl, cat ear"

    # メモリ消費量や実行速度の調整についてはこの記事を参照
    # https://huggingface.co/docs/diffusers/optimization/fp16

    # StableDiffusionPipeline.from_pretrained のパラメータはここを参照してください
    # https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipeline_utils.py#L287
    # 参照されない残りのパラメータは StableDiffusionPipeline のコンストラクタに渡されます
    # https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion.py#L72
    pipe = StableDiffusionPipeline.from_pretrained(model).to("cuda")
    # safety checkerを外す場合はStable Diffusionのライセンスを必ず確認してください
    # pipe = StableDiffusionPipeline.from_pretrained(model, safety_checker=None, requires_safety_checker=None).to("cuda")
    with autocast("cuda"):
        result = pipe(prompt)
        
        for image in result.images:
            image: Image # typehint 特に意味はない行です。
            image.save("output.png")

if __name__ == "__main__":
    main()
(.venv)$ python txt2img.py
100%|████████████████████████████████████████████████████| 50/50 [00:11<00:00,  4.51it/s]

output.pngという名前で画像が出力されます。

girl, cat ear

以上