MacでLoCon学習

MacでLoCon学習 Stable Diffusion
MacでLoCon学習

学習済みモデルを自分好みに学習し直すファインチューニング。
Stable Diffusionのファインチューニングと言えばLoRAですが、現在はそのLoRAの進化版も出ています。
今回はLoRAの進化版であるLoConMacのローカル環境で作成します。

LoConはLyCORISの一種で別名LoRA-C3Lierです。
ややこしいここら辺のLoRAについては以下で解説しています。

準備するもの 〜kohyaスクリプト〜

今回LoConを作成するのに用いるのはkohya氏のスクリプトです。


以前のLoRA作成のときにも用いました。その時の記事は以下で紹介しています。

kohya氏のスクリプトはこの記事の時よりパワーアップしています。

  • 以前のkohya氏スクリプト:LoRA作成
  • 今回のkohya氏スクリプト:LoRALoConDyLoRA作成

kohya氏はLoRA = LoRA-LierLaLoCon = LoRA-C3Lierと命名しています。
以前はLoRA(線形層への適用)のみでしたがLoCon(非線形層への適用)が現れたため、わかりやすくするために名称をつけたのだと思います。

環境構築手順

kohyaスクリプトをMacのローカル環境に構築する手順を紹介します。
MacのM1で実行するための手順です。

LoCon作成環境構築
  1. kohyaスクリプトのダウンロード
    git clone https://github.com/bmaltais/kohya_ss
  2. 環境セットアップ
    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で実行するため、以下のようなシェルファイルを作成してください。

実行ファイル(locon.sh)
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

シェルの意味はこちらです。

行数項目意味
1PRE_MODEL_NAME学習元となるモデルファイル
2DATA_DIR学習用画像のある親フォルダ
3OUTPUT_DIR学習したモデルを保存するフォルダ
4MODEL_NAME学習したモデルの名前
5EPOCH学習エポック数
6LR学習率
9train_network.pyLoCon学習用ファイル
LoRA学習用ファイルでもある
10network_moduleLoCon実行に必須のオプション
11network_dimLoRA(線形層)のランク数
12network_argsLoCon用の設定値
LoConのランク数、LoConのalphaを指定
17logging_dirログ出力するフォルダ
18resolution学習用画像のサイズ
20train_batch_size一度に並列処理する画像数
23cache_latentsVAEの出力をキャッシュする
省メモリ用
24gradient_checkpointing重み計算を徐々に処理する
省メモリ用
25save_n_every_epochsモデルをNエポックごとに保存
26save_state継続学習用のファイルを保存

オプションの詳細はkohya氏のGitやサイトを確認するとよいです。
ほとんどLoRA学習用のオプションと同じですが、以下が異なります。
LoConは非線形層(畳み込み層)にも適用されますので、その層を分割するときのランク(dim)とalphaを指定可能です。

LoRAと異なるLoConオプション
  • network_args
     LoRA:指定なし
     LoCon:”conv_dim=4” “conv_alpha=1“のように複数指定可能

LoConの学習

以下を実行してLoConを学習します。
CUIで実行するため、仮想環境を忘れずにアクティベートしてください。

locon.shは上記で自作したシェルファイルのことです。
学習途中、学習結果は上記のOUTPUT_DIRで指定したフォルダに出力されます。

LoConの学習
source ./venv/bin/activate
./locon.sh

Torch not compiled with CUDA enabledエラーが出る場合

MacのMPSで処理していると以下のエラーが発生するかもしれません。
私は学習用画像を一通り処理した後の処理で発生しました。

AssertionError: Torch not compiled with CUDA enabled

library/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で画像を生成してみましょう♪

コメント

タイトルとURLをコピーしました