2023/07/31(月)Debian 12(bookworm) に sd-scripts を入れる
LoRA学習のための sd-scripts が Python 3.10 依存*1で、Debianの標準は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に設定する。