2023/07/31(月)Debian 12(bookworm) に sd-scripts を入れる

LoRA学習のための sd-scripts が Python 3.10 依存*1で、Debianの標準は3.11のため色々大変です。

*1 : 正確にはTensorFlow 2.10依存の模様。TensorFlow 2.10はPython 3.11以降ではインストールできない。

Python 3.10のインストール

Python公式サイトから3.10系の最新ソースをダウンロードしておきます。

# 開発環境等がない場合
apt install build-essential curl git

# 必要なライブラリ
apt install xz-utils libssl-dev libbz2-dev libreadline-dev libsqlite3-dev libncursesw5-dev tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

tar xvf Python-3.10.12.tar.xz
cd Python-3.10.12
./configure --enable-optimizations
make -j 4
make altinstall
  • configure以降はrootで実行してください。
  • ライブラリ群を入れずにmakeすると、標準ライブラリが欠けた超使えないPythonが生成されます。

venv環境の作成

python3-virtualenvが必要なので入れておきます。

apt install python3-virtualenv
virtualenv --python=python3.10 .venv310
python3.10 -m venv .venv310

# activate
. .venv310/bin/activate

抜けるときは「deactivate」します。

sd-scriptsの環境整備

CUDAが入ってない場合、まずそれを入れます(参考)。

sudo apt install nvidia-cuda-toolkit nvidia-cuda-dev

sd-scriptsをcloneします。

git clone https://github.com/kohya-ss/sd-scripts
cd sd-scripts

venv環境をactivateした状態で、必要なライブラリをインストールします。

# "bdist_wheel did not run successfully" エラー対策
pip install -U pip wheel setuptools

# Debian12 は CUDA 11.8 なので合わせる
pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 torchaudio==2.0.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118

pip install xformers
pip install -U -r requirements.txt

「torch」「torchvision」「torchaudio」の3つをCUDAのバージョンに合わせることが超重要です。

sd-scripts実行用シェルスクリプト(SDXL対応)

#!/bin/sh

DIR=~/sd-scripts
MODEL_DIR=~/stable-diffusion-webui/models/Stable-diffusion
OUTPUT_DIR=~/stable-diffusion-webui/models/Lora
DATA_BASE_DIR=~/data

DIM=64
DIM_SCALE=1
BATCH_SIZE=1
STEPS=1000
MODEL=AnythingV5_v5PrtRE
MODEL_EXT=.safetensors
RESOLUTION=512,512

SCRIPT="train_network.py"
OPTIONS="--clip_skip=2"

# for Stable Diffusion XL
XL=
XL_MODEL=sd_xl_base_1.0
XL_RESOLUTION=1024,1024
XL_SCRIPT="sdxl_train_network.py"
XL_OPTIONS="--network_train_unet_only \
 --gradient_checkpointing \
 --cache_text_encoder_outputs \
 --no_half_vae"


usage() {
    echo "
usage: 
    $0 [-x] [-d dim] [-b batch_size] [-s steps] [-c count] [-m base_model] [-r w,h] <NAME> [name-ext]

    	-x	Use SDXL
" >&2
}

while getopts xb:c:d:m:r:s:h OPT
do
	case $OPT in
	x)
		XL='-xl'
		MODEL="$XL_MODEL"
		RESOLUTION="$XL_RESOLUTION"
		SCRIPT="$XL_SCRIPT"
		OPTIONS="$XL_OPTIONS"
		;;
	b)
		BATCH_SIZE="$OPTARG"
		;;
	d)
		DIM="$OPTARG"
		;;
	m)
		MODEL="$OPTARG"
		XL_MODEL="$OPTARG"
		;;
	r)
		RESOLUTION="$OPTARG"
		XL_RESOLUTION="$OPTARG"
		;;
	s)
		STEPS="$OPTARG"
		;;
	h | \?) 
        	usage && exit 1
		;;
	*)
		echo "Unknown option: -$OPT"
		exit 1;
		;;
	esac
done
shift $((OPTIND - 1))

if [ "$3" != "" ]; then
	echo "Illegal options: $2 $3 $4 $5 $6 $7 $8 $9"
	exit 1
fi

if [ "$1" = "" ]; then
	usage
	exit 1
fi

NAME="$1"
NAME_EXT="$2"

# Run sd-scripts

if [ -r "$MODEL" ]; then
	echo -n
elif [ -r "$MODEL$MODEL_EXT" ]; then
	MODEL="$MODEL$MODEL_EXT"
elif [ -r "$MODEL_DIR/$MODEL" ]; then
	MODEL="$MODEL_DIR/$MODEL"
elif [ -r "$MODEL_DIR/$MODEL$MODEL_EXT" ]; then
	MODEL="$MODEL_DIR/$MODEL$MODEL_EXT"
else
	echo "Model file not found: $MODEL";
	exit 1;
fi

DATA_DIR="$DATA_BASE_DIR/$NAME"

ALPHA=`echo | awk "{print $DIM * $DIM_SCALE}"`
LORA="$NAME$NAME_EXT$XL-lora"
LORA_FILE="$LORA.safetensors"

echo Target name: $NAME
echo Save LoRA: $LORA \($OUTPUT_DIR/$LORA_FILE\)
if [ -e "$OUTPUT_DIR/$LORA_FILE" ]; then
	echo "	rm $OUTPUT_DIR/$LORA_FILE"
	rm "$OUTPUT_DIR/$LORA_FILE"
fi
echo Base model: $MODEL
echo Larning data directory: $DATA_DIR
echo Dimension: $DIM \(alpha:$ALPHA, scale=$DIM_SCALE\)
echo Larning Steps: $STEPS \(batch:$BATCH_SIZE\)
echo Resolution: $RESOLUTION
echo

cd $DIR
accelerate launch $SCRIPT \
 --network_dim=$DIM \
 --network_alpha=$ALPHA \
 --train_batch_size=$BATCH_SIZE \
 --max_train_steps=$STEPS \
 \
 --enable_bucket \
 --bucket_no_upscale \
 --xformers \
 --cache_latents \
 \
 --mixed_precision=fp16 \
 --network_module=networks.lora \
 --persistent_data_loader_workers \
 $OPTIONS \
 \
 --optimizer_type=prodigy \
 --optimizer_args "betas=0.9,0.999" "weight_decay=0" \
 --learning_rate=1.0 \
 --lr_scheduler=cosine \
 \
 --dataset_config="$DATA_DIR/datasetconfig.toml" \
 --output_dir="$OUTPUT_DIR" \
 --output_name=$LORA \
 --save_model_as=safetensors \
 \
 --pretrained_model_name_or_path=$MODEL \
 --resolution=$RESOLUTION
  • Prodigy は「pip install prodigyopt」でインストール。
  • Prodigy使用時はlearning_rateを1に設定する

関連リンク