AI 画像

Stable diffusion web UIをVS Code+コンテナで起動する

いろんなものをインストールすると管理が面倒なので、コンテナの中で完結したいというモチベーション。

https://yuuyuublog.org/stablediffusion_local/
を少し参考にさせていただきました。

設定ファイル群

"name": "generative",
	"build": {
		// Sets the run context to one level up instead of the .devcontainer folder.
		"context": "..",
		// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
		"dockerfile": "../Dockerfile"
		},
	"settings":{
		"terminal.integrated.shell.linux": "/bin/bash",
		"python.pythonPath": "/usr/local/bin/python"
		},
	"extensions":[
		"ms-python.python"
	],
	//"runArgs":["--gpus","all","--shm-size","8gb"],
	"remoteUser": "dev-user",
}

#公式のdockerイメージをベースにする。
FROM nvidia/cuda:11.8.0-devel-ubuntu20.04 as base

#apt-get中にタイムゾーンの設定を聞かれる・・・
ENV EBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

SHELL ["/bin/bash", "-c"]
RUN apt update && apt upgrade -y
RUN apt-get update && apt-get install -y \
        python3 \
        python3-pip \
        bzip2 \
        git \
        sudo \
        wget \
        vim \
        zip \
        zlib1g-dev \
        curl \
        unzip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# For CUDA profiling, TensorFlow requires CUPTI.
ARG USERNAME=dev-user
ARG GROUPNAME=dev-user
ARG UID=1000
ARG GID=1000
ARG PASSWORD=dev-user

#追加したユーザでsudoを使えるようにする
RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID $USERNAME  && \
    adduser dev-user sudo && \
    echo $USERNAME:$PASSWORD | chpasswd && \
    echo "$USERNAME   ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

#rootのパスワードがわからないのでパスワードを変更
RUN echo "root:root" | chpasswd

RUN pip install --upgrade pip
RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

必要なファイルのダウンロード

https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.0.0-pre

からソースコードをダウンロードして、.devcontainerフォルダと同じ場所に解凍する。

VSCodeでDockerfileからコンテナビルド。

python3.8 => python3.10.6へアップグレード(ダメな手順)

python3.10.6じゃないとダメなようなので、アップグレードする。
※この手順はうまくいかなかったのでやらない。参考までに残しておく。

https://www.python.org/downloads/release/python-3106/

からソースをダウンロードして解凍。フォルダ移動の後に以下のコマンドを実行。

./configure
make
sudo make install

処理が成功するとsuccessflyとなる。

Looking in links: /tmp/tmpxi26yu7n
Processing /tmp/tmpxi26yu7n/setuptools-63.2.0-py3-none-any.whl
Processing /tmp/tmpxi26yu7n/pip-22.2.1-py3-none-any.whl
Installing collected packages: setuptools, pip
Successfully installed pip-22.2.1 setuptools-63.2.0

これだけだとアップグレードされないので、

alias python3='/usr/local/bin/python3.10'

でpython3コマンドをpython3.10へアタッチする。

web-user.shの編集

以下のブロックを編集。

# Install directory without trailing slash
install_dir="/workspaces/generative/"

# Commandline arguments for webui.py, for example: export COMMANDLINE_ARGS="--medvram --opt-split-attention"
export COMMANDLINE_ARGS="--skip-torch-cuda-test"

//(中略)

# install command for torch
export TORCH_COMMAND="pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118"

ディレクトリ内のwebui.shを「bash webui.sh」で実行するとインストールが走る。
そしてエラー・・・。

SSLが有効になっていない(ダメな手順)

ここからの手順はやっても意味がないのでスキップする。参考のために残しておく。

SSLが有効になっていない。ライブラリを入れてみる。

sudo apt-get update
sudo apt-get install -y libssl-dev

opensslを指定してpython3.10を再インストール。opensslの場所は環境によって異なるので注意。

which openssl
/usr/bin/openssl

./configure --with-openssl=/usr/bin/openssl
make
sudo make install

よくよく見るとmake時に以下のエラーが・・・。

gcc -pthread -fPIC -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal -I./Include -I. -I/usr/include/x86_64-linux-gnu -I/usr/local/include -I/workspaces/generative/Python-3.10.6/Include -I/workspaces/generative/Python-3.10.6 -c /workspaces/generative/Python-3.10.6/Modules/_ctypes/_ctypes.c -o build/temp.linux-x86_64-3.10/workspaces/generative/Python-3.10.6/Modules/_ctypes/_ctypes.o -DPy_BUILD_CORE_MODULE
/workspaces/generative/Python-3.10.6/Modules/_ctypes/_ctypes.c:107:10: fatal error: ffi.h: No such file or directory
  107 | #include <ffi.h>
      |          ^~~~~~~
compilation terminated.

The necessary bits to build these optional modules were not found:
_bz2                  _curses               _curses_panel      
_dbm                  _gdbm                 _hashlib           
_lzma                 _sqlite3              _ssl               
_tkinter              _uuid                 readline           
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

ffiモジュールが見つかっていないからビルドに失敗している?ならばインストールだ。

sudo apt-get update
sudo apt-get install -y libffi-dev

make clean
./configure --with-openssl=/usr/bin/openssl
make
sudo make install

しかし、make時に以下のエラーが発生。ビルドが出来ない・・・。

#メッセージ
Could not build the ssl module!
Python requires a OpenSSL 1.1.1 or newer

#インストール
sudo apt-get update
sudo apt-get install build-essential checkinstall zlib1g-dev -y

opensslは1.1.1だけど一応アップグレードをしてみる。

sudo apt-get remove openssl

#ファイルはwgetなどでダウンロードしてくる。
tar -xzvf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l
./config --prefix=/usr/
make
sudo make install

再度pythonをアップグレードするも一考に解決せず。

python3.8 => python3.10.6をコマンドでアップグレード(うまくいった手順)

手動でインストールしようとしているのが間違っているだろう、なのでaptなど駆使してインストールを試みる。

sudo apt update
sudo apt upgrade

sudo apt install curl git
curl https://pyenv.run | bash

echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc

sudo apt install build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl

pyenv install 3.10.6
pyenv global 3.10.6

pythonはアップグレード出来たので、改めて「bash webui.sh」を実行。

起動したあああああああああ!!

webuiの動作確認

簡単な動作確認

https://civitai.com/から適当にモデルをダウンロード

モデルは大きく2つあって、原モデル(checkpoint)と追加学習モデル(LoRA等)。
TOPの画像にcheckpointか否かが分かるようにかかれている。
サイズがGB単位なのがcheckpointMB単位なのが追加学習モデル、と覚えておくと吉かも。

checkpointは「stable-diffusion-webui\models\Stable-diffusion」に置く。
今回は「cetusMix_Whalefall2」をダウンロード。

左上にcheckpointを選択するところがあるので置いたモデルを選択。
「FF7」のtxt2imgで画像生成してみる。

それっぽいのが出来たが、誰だお前。

LoRAを含めたプロンプトの確認

モデルのページにあるプロンプトをまねてみる。

https://civitai.com/images/1600801?period=AllTime&periodMode=published&sort=Newest&view=categories&modelVersionId=105924&modelId=6755&postId=404075

checkpointのみの生成。ちょっと違う。
よく見ると指変だな!

プロンプトとsamplerが違うだけで、こうまで変わるのね。samplerってなんだろね。今度調べてみよう。

追加学習モデルが必要そうなのでダウンロードしてみる。LoRAのフォルダはこんな感じ。
不要なのも入ってるけど、プロンプトで指定してそれぞれのモデルをどれくらい反映するかを決められるっぽいので、余計なものが入っていても影響はないっぽい。

↓のように指定することで、LoRAを使うことが出来る。指定したモデルがないと、VSCodeのほうでエラーを吐くものの、実行は出来てしまうようなので注意。

<lora:yae_miko_offset_9_6:0.7>

すごくいい感じな画像は出来たものの、アップロードされていたものはちゃんとは生成できなかった。
ユーザインタフェースで色々設定できるものの非表示になってるものがあるっぽいので、きっとそれの影響だろう、そうだろう。

まぁ、一旦動いたからよし!

後日、DockerFileとかdevcontainerとか手順の見直しをしてみよう。

-AI, 画像
-,