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に設定する。