学習済みモデルを自分好みに学習し直すファインチューニング。
Stable Diffusionのファインチューニングと言えばLoRAですが、現在はそのLoRAの進化版も出ています。
今回はLoRAの進化版であるLoConをMacのローカル環境で作成します。
LoConはLyCORISの一種で別名LoRA-C3Lierです。
ややこしいここら辺のLoRAについては以下で解説しています。
準備するもの 〜kohyaスクリプト〜
今回LoConを作成するのに用いるのはkohya氏のスクリプトです。
以前のLoRA作成のときにも用いました。その時の記事は以下で紹介しています。
kohya氏のスクリプトはこの記事の時よりパワーアップしています。
- 以前のkohya氏スクリプト:LoRA作成
- 今回のkohya氏スクリプト:LoRA、LoCon、DyLoRA作成
kohya氏はLoRA = LoRA-LierLa、LoCon = LoRA-C3Lierと命名しています。
以前はLoRA(線形層への適用)のみでしたがLoCon(非線形層への適用)が現れたため、わかりやすくするために名称をつけたのだと思います。
環境構築手順
kohyaスクリプトをMacのローカル環境に構築する手順を紹介します。
MacのM1で実行するための手順です。
- kohyaスクリプトのダウンロード
 git clone https://github.com/bmaltais/kohya_ss
- 環境セットアップ
 cd kohya_ss
 ./setup.sh
1つずつ詳細を見ていきます。
1. kohyaスクリプトのダウンロード
kohya氏のGitは非常に丁寧に書かれています。
日本語のREADMEもあるためわかりやすいです。
2. 環境セットアップ
仮想環境venvを構築し、そこにpython3.10をインストールしています。
うまく環境構築できない場合
基本的には上記の手順だけでうまくいきます。
ただそれぞれ環境は異なりますので、うまくいかないこともあるでしょう。
どうしても違うバージョンのpythonでやりたい、仮想環境なんて作りたくないなんて方もいらっしゃるかもしれません。
setup.shを使わないで構築する手順は以下を試すとよいです。
ただ繰り返しになりますが、大人しくsetup.shを使う方が無難です。
- 仮想環境の構築
 python -m venv venv
- 仮想環境のアクティブ化
 source ./venv/bin/activate
- torchとtorchvisionのインストール
 conda install python==1.12.1 torchvision==0.13.1 -c pytorch
- 必要なpythonライブラリのインストール
 pip install -r ./requirements.txt
- pythonアップデート
 conda update python
学習用画像の準備
以前の記事で説明しておりますので、そちらをぜひご覧ください。
実行ファイルの作成
CUIで実行するため、以下のようなシェルファイルを作成してください。
export PRE_MODEL_NAME="runwayml/stable-diffusion-v1-5"
export DATA_DIR="./traindata"
export OUTPUT_DIR="./models/trk"
export MODEL_NAME="trk"
export EPOCH=2
export LR=1e-4
accelerate launch \
  "train_network.py" \
  --network_module=networks.lora \
  --network_dim=4 \
  --network_args "conv_dim=8" "conv_alpha=1" \
  --pretrained_model_name_or_path=$PRE_MODEL_NAME \
  --train_data_dir=$DATA_DIR \
  --output_dir=$OUTPUT_DIR \
  --output_name=$MODEL_NAME \
  --logging_dir=./log \
  --resolution=512,512 \
  --max_train_epochs=$EPOCH \
  --train_batch_size=1 \
  --learning_rate=$LR \
  --cache_latents \
  --gradient_checkpointing \
  --save_every_n_epochs=1 \
  --save_stateシェルの意味はこちらです。
| 行数 | 項目 | 意味 | 
|---|---|---|
| 1 | PRE_MODEL_NAME | 学習元となるモデルファイル | 
| 2 | DATA_DIR | 学習用画像のある親フォルダ | 
| 3 | OUTPUT_DIR | 学習したモデルを保存するフォルダ | 
| 4 | MODEL_NAME | 学習したモデルの名前 | 
| 5 | EPOCH | 学習エポック数 | 
| 6 | LR | 学習率 | 
| 9 | train_network.py | LoCon学習用ファイル LoRA学習用ファイルでもある | 
| 10 | network_module | LoCon実行に必須のオプション | 
| 11 | network_dim | LoRA(線形層)のランク数 | 
| 12 | network_args | LoCon用の設定値 LoConのランク数、LoConのalphaを指定 | 
| 17 | logging_dir | ログ出力するフォルダ | 
| 18 | resolution | 学習用画像のサイズ | 
| 20 | train_batch_size | 一度に並列処理する画像数 | 
| 23 | cache_latents | VAEの出力をキャッシュする 省メモリ用 | 
| 24 | gradient_checkpointing | 重み計算を徐々に処理する 省メモリ用 | 
| 25 | save_n_every_epochs | モデルをNエポックごとに保存 | 
| 26 | save_state | 継続学習用のファイルを保存 | 
オプションの詳細はkohya氏のGitやサイトを確認するとよいです。
ほとんどLoRA学習用のオプションと同じですが、以下が異なります。
LoConは非線形層(畳み込み層)にも適用されますので、その層を分割するときのランク(dim)とalphaを指定可能です。
- network_args
 LoRA:指定なし
 LoCon:”conv_dim=4” “conv_alpha=1“のように複数指定可能
LoConの学習
以下を実行してLoConを学習します。
CUIで実行するため、仮想環境を忘れずにアクティベートしてください。
locon.shは上記で自作したシェルファイルのことです。
学習途中、学習結果は上記のOUTPUT_DIRで指定したフォルダに出力されます。
source ./venv/bin/activate
./locon.shTorch not compiled with CUDA enabledエラーが出る場合
MacのMPSで処理していると以下のエラーが発生するかもしれません。
私は学習用画像を一通り処理した後の処理で発生しました。
AssertionError: Torch not compiled with CUDA enabledlibrary/train_util.pyのsample_imagesメソッドの以下のように修正してください。
修正前:cuda_rng_state = torch.cuda.get_rng_state()
    torch.cuda.set_rng_state(cuda_rng_state)
修正後:cuda_rng_state = torch.mps.get_rng_state()
    torch.mps.set_rng_state(cuda_rng_state)MacのGPUは、CUDAではなくMPSで処理するのでそのように指定してあげます。
おわりに
学習する箇所(層)が増えるため、LoConはLoRAより学習力が高いとされています。
その分作成したモデルの容量は大きくなりますが、それでも元モデルより大幅に小さいですので、LoConはStable Diffusionのファインチューニングのデファクトスタンダードになるでしょう。
私もいくつかLoConでファインチューニングしましたが、過学習しやすい印象を受けました。
LoRAで充分なモデルを作成できているのであれば、LoConで作らなくてもよいかもしれません。
いずれにせよ学習画像の質、パラメータ調整が大事です。
LoConをStable Diffusion Web UIで使う方法は以下で紹介しています。
ぜひ自作したLoConで画像を生成してみましょう♪
 
  
  
  
  




コメント