ページ

2023年3月9日木曜日

AI神絵師 LoRA体験会

LoRAのお試し

LoRAの環境作成と試運転

Python3.10.6
Git

これらをインストール済みなことを前提とします。

※Pythonのバージョンは必ず守ってください。最新版とか3.11.とかは駄目です。


この記事では、

・学習環境のセットアップ

・テスト学習

・作成したLoRAを使った画像生成

を順番に案内します。

ネットを検索すると、簡単にセットアップ出来るBATファイルなどが配布されているので、面倒なことをしたくない場合、そちらを利用されるのが良いと思います。ぶっちゃけ手作業導入は難解で面倒なので全くおすすめできません。ちんぷんかんぷんです。


ざっくりLoRAって何?

お絵描きAIに、まだ知らないキャラクターなどを教えてあげる追加学習の一種です(意訳)。VRAMが少な目なグラフィックボードでも利用可能なので人気です。

お絵描きAIチェックポイントファイルとLoRA学習済みファイルを組み合わせて使い、学習させたキャラクターのイラストを生成します。


LoRA学習環境準備

学習用サンプルデータのダウンロードと解凍

LoRA学習用サンプルデータ

https://note.com/kohya_ss/n/nb20c5187e15a

こちらから

lora_train_sample_pack.zip

をダウンロードして、任意のフォルダに解凍する。

例 C:\SD\lora_train_sample_pack\


学習用スクリプトのダウンロードと環境設定

次いで、kohya-ss / sd-scripts

https://github.com/kohya-ss/sd-scripts/blob/main/README-ja.md

こちらの手順に従って、GitHubから学習用スクリプトをダウンロードするのですが、説明不足で初心者にはまず無理なので、以下に手順と補足を記します。


コマンドプロンプトを起動する

さきほど解凍したlora_train_sample_packフォルダを開いて、アドレスバーにcmdと入力してENTER
(※アドレスバー左端のフォルダのアイコンをクリックすると文字入力が出来ます)


コマンドプロンプト(黒いウィンドウ)が起動するので、ここに以降のコマンドを入力していきます。



学習スクリプトの環境設定

上記リンク先の、コマンドプロンプトでは以下になります。」の手順を補足します。
最新情報は上記リンク先を参照してください。

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

上記テキストを選択し、右クリック>コピー。コマンドプロンプト(黒いウィンドウ)で右クリック>Paste、と選択し、テキストを貼り付け、ENTERキーを押す。(※以降「コピペ」と略します)

すると、sd-scripts というフォルダが作成され、学習用スクリプトファイルがダウンロードされます。

フォルダはこのようになります。

続けて、環境の構築を行います。以下の水色ハイライトのコマンドをコピペ、実行していきます。

※やたらと隙間が空いて見えますが、実際には半角スペース1個分です。コピペ操作には支障は無いようです。


cd sd-scripts

とコピペしてENTER。作業位置(カレントディレクトリと言います)がsd-scriptsフォルダへ移動します。


python -m venv venv

pythonの仮想環境を作成します。\sd-scripts\venv、というフォルダが作成されます。


.\venv\Scripts\activate

このコマンドで、これ以降のコマンドを実行するための、python仮想環境を有効化します。

次いで、以下のコマンドを一つずつ順番にコピペして実行してください。ダウンロードとインストールが発生するので、それなりに時間がかかります。

(※詳細は分かりませんが、やれと言われているのでとりあえずやるのです。)


1.

pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116


2.

pip install --upgrade -r requirements.txt


3.

pip install -U -I --no-deps https://github.com/C43H66N12O12S2/stable-diffusion-webui/releases/download/f/xformers-0.0.14.dev0-cp310-cp310-win_amd64.whl


4.

copy /y .\bitsandbytes_windows\*.dll .\venv\Lib\site-packages\bitsandbytes\


5.

copy /y .\bitsandbytes_windows\cextension.py .\venv\Lib\site-packages\bitsandbytes\cextension.py


6.

copy /y .\bitsandbytes_windows\main.py .\venv\Lib\site-packages\bitsandbytes\cuda_setup\main.py


7. 次のコマンドでは質問に答えて設定ファイルを作成します。

回答には数字キーの 0、1、2~で*印を項目に合わせて選択してENTERキーで決定、
または、yes、NO、allと文字入力してENTERという操作をします。
日本語入力(IME)を有効にしないでください。

間違えたり、エラーなどで最後まで進めなかった場合は、ここ(7.)からやり直してください。


accelerate config


In which compute environment are you running?

* This machine
  AWS (Amazon SageMaker)

0


Which type of machine are you using?

* No distributed training
  multi-CPU
  multi-GPU
  TPU
  MPS

0


Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]

NO


Do you wish to optimize your script with troch dynamo? [yes/NO]

NO


Do you want to use DeepSpeed? [yes/NO]

NO


What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]

all

allと回答して駄目っぽい場合には、 0 (ゼロ)と回答する。


Do you wish to use FP16 or BF16 (mixed precision)?

  no
* fp16
  bf16

1

1を入力すると*印がfp16にフォーカスするのでENTER。
※表示がバグってfp166になりますが大丈夫です。


~回答ここまで。


accelerate configuration saved at C:\Users\ユーザー名/.cache\huggingface\accelerate\default_config.yaml


C:\Users\ユーザー名\.cache\huggingface\accelerate\default_config.yaml
というファイルに設定が保存されます。



環境の設定はここまでです。お疲れ様です。


以降、コマンドプロンプトはそのままでも、学習サンプルのテストを続けられます。

一端終了させるには、

deactivate

venv環境を終了して、コマンドプロンプトに戻る。


exit

コマンドプロンプトを終了してウィンドウを閉じる。

~と、操作します。単に右上×ボタンでウィンドウを閉じても大丈夫です。


学習テスト

学習用サンプルを使っての学習テスト

こちらの記事に沿って学習テストを行います。


用意されている学習用pythonスクリプトの種類

train_db.py …… DreamBooth用

fine_tune.py …… FineTuning用

train_textual_inversion.py …… Txtual Inversion用

train_network.py …… LoRA用


sd-scriptsには、いろいろな学習用スクリプト等が同梱されていますが、ここで扱うのはLoRA用の train_network.py です。

また、LoRA学習には、DreamBooth方式 と FineTuning方式 が利用できます(ややこしい)。

この学習サンプルは、LoRA の DreamBooth方式 での学習をします。


AIに覚えてほしい画像(学習用画像、教師画像)

C:\SD\lora_train_sample_pack\train\20_usu frog

に入っている鳥獣戯画のカエルのイラスト15枚が学習させたいキャラクターです。

フォルダ名の頭の20が繰り返し回数、中身が15枚なので15*20=300stepになります(多分)。

usu は特に意味を持たない単語で、識別子(identifier)として機能します。

(※日本には臼(うす)があるため、usu を識別子に使うのは、もしかしたら不適切かも?)

frogが正則化のクラスで、覚えさせたい要素のざっくりとしたくくり、グループ名です。

例えば女の子のキャラクターを覚えさせたい場合は、20_usu girl といったフォルダ名にします。


正則化画像

C:\SD\lora\lora_train_sample_pack\train\1_frog

に入っているカエルの画像50枚が正則化画像です。

フォルダ名の頭の1が繰り返し回数、frogが正則化のクラス(class)です。

例えば女の子のキャラクターを覚えさせたい場合は、10_girl といったフォルダ名にします。

繰り返し1回、中身が50枚なので50*1=50stepになります(多分)。

step数は、教師≧正則化 とするように指示されています。(適当でも行けます)


エポック ( --max_train_epochs n )

フォルダに表記した繰り返し数とは別に、学習全体を何回繰り返すかを決めるのがエポックの値です。後述の学習実行コマンドのオプションで指定します。


コマンドプロンプトの実行

例 C:\SD\lora_train_sample_pack\sd-scripts

このフォルダで、アドレスバーにcmd、と入力してコマンドプロンプトを起動します。



.\venv\Scripts\activate

とコピペして、python仮想環境を有効化します。


学習実行

下記のクソ長コマンドの model.ckpt の部分を学習に使いたいチェックポイントファイルのフルパスに書き換えます。

お手持ちのテキストエディタや、Googleドキュメントにコピペして編集してください。

例 

--pretrained_model_name_or_path="C:\SD\stable-diffusion-webui\models\Stable-diffusion\7th_anime_v2_G_fp16.safetensors"


accelerate launch --num_cpu_threads_per_process 4 train_network.py --pretrained_model_name_or_path=..\model.ckpt --train_data_dir=..\train --reg_data_dir=..\reg --prior_loss_weight=1.0 --resolution 512 --output_dir=..\lora_output --output_name=cjgg_frog --train_batch_size=2 --learning_rate=1e-4 --max_train_epochs 4 --use_8bit_adam --xformers --mixed_precision=fp16 --save_precision=fp16 --seed 42 --save_model_as=safetensors --save_every_n_epochs=1 --max_data_loader_n_workers=1 --network_module=networks.lora --network_dim=4 --training_comment="activate by usu frog"


コマンドプロンプトにコピペして実行すると学習が始まります。

グラフィックボードのVRAMが足りない場合は --train_batch_size=2 の数値を1に下げます。それでも足りない場合は、--resolution 512 を448、384、256など16の倍数で下げれば動くかもしれません。が、おそらく学習結果の品質は低下します。


学習終了

学習が終了したら、コマンドプロンプトは閉じてもOKです。

C:\SD\lora_train_sample_pack\lora_output

というフォルダが作られて、学習したLoRAファイルが保存されています。

この学習サンプルは学習を4回繰り返し、1回ごとに途中経過のファイルを保存する設定だったので、ファイルが4つ保存されています。保存日時が新しいもほど多く学習しています。それぞれ試してみて、良い感じのやつを採用します。


学習ファイルを使って画像を生成する

LoRA学習ファイル、 cjgg_frog.safetensors を

例 

C:\SD\stable-diffusion-webui\models\Lora

に配置します。


Automatic1111WebUIを起動します。


花札のアイコンをクリックして、学習ファイルの選択メニューを表示します。


Promptの欄にカーソルをフォーカスしてから、LoRAのタブからcjgg_frog.safetensorsをクリックすると、Promptの欄に、

<lora:cjgg_frog:1>

と入力されます。

続けて、 usu frog と入力します。

<lora:cjgg_frog:1>usu frog

として、Generate。

鳥獣戯画っぽいカエルが出てくれば学習出来ていることが確認できます。

(ぶっちゃけ似てない)

Tips

学習効果の強弱

<lora:cjgg_frog:1>

の末尾の数値 1 は適用の強度です。プロンプトと同様にCtrl+カーソル上下で増減が出来ます。

学習が強すぎると感じたら0.7等に下げ、効果が薄いと感じたら1.3等に上げて効き具合を調整できます。


サムネイル登録

生成した画像の一つをクリックして、選択した状態で、LoRA選択リストのファイル名にカーソルを合わせると、サムネイルを登録するか赤字メッセージが表示されるので、クリックすると、選択している画像がサムネイルとして登録されます。更新も同様。間違えて誤登録しやすいので注意です。


以上で学習サンプルの実習は終了です。
お疲れさまでした。


LoRA実践編(手抜き)

accelerate launch --num_cpu_threads_per_process 4 train_network.py 

--seed 42 

--pretrained_model_name_or_path=..\model.ckpt 

--train_data_dir=..\train 

--reg_data_dir=..\reg 

--prior_loss_weight=1.0 

--resolution 512 

--output_dir=..\lora_output --output_name=cjgg_frog 

--save_model_as=safetensors --save_every_n_epochs=1 

--train_batch_size=2 --max_train_epochs 10 

--xformers --mixed_precision=fp16 --save_precision=fp16 

--max_data_loader_n_workers=1 

--network_module=networks.lora 

--network_dim=64 --network_alpha=32 

 --clip_skip=2 

--training_comment="activate by usu frog

--enable_bucket --min_bucket_reso=512 --max_bucket_reso=1280 

--optimizer_type=adafactor --optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True" 

--use_8bit_adam 

--learning_rate=1e-4 

--network_weights="C:\SD\stable-diffusion-webui\models\Lora\base_lora.safetensors" 


上記コマンドをGoogleドキュメント等にコピペして編集します。

行の最後には半角スペースがあります。編集中に削除しないように注意してください。

コマンドのオプションの頭の書き方は半角の、

スペース、マイナス、マイナス

となっています。


コマンドの編集

--pretrained_model_name_or_path=..\model.ckpt 


学習のベースにするチェックポイントファイルのフルパスに書き換えます。

--pretrained_model_name_or_path="C:\SD\stable-diffusion-webui\models\Stable-diffusion\7th_anime_3.1_C-pruned-fp16.safetensors" 


--output_dir=..\lora_output --output_name=cjgg_frog 

cjgg_frog の部分が出力ファイル名になります。学習させるキャラクター名などに変更します。


--resolution 512 

任意サイズの画像での学習 --resolution 448,640 (幅、高さ)

任意の画像サイズで学習したい場合は --resolution 512  を書き換えます。

768等、数値を高くすると画質は良くなるが、物理メモリとVRAMが要求されるようです(エアプ)。


--train_batch_size=2 

VRAMの消費量と相談して数値を決めます。VRAMに余裕があれば上げます。無ければ下げます。VRAM12GBでの目安、1~4。


--max_train_epochs 10 

学習の繰り返し数。


--network_dim=64 --network_alpha=32 

dim … 64とか128とか。dimの数値が大きいと出来上がるファイルサイズも大きくなります。

alpha … dimと同じ数値、dimの半分、1の三択。よくわからない。


 --clip_skip=2 

生成時に設定している数値と合わせる。まぁだいたい2です。


--training_comment="activate by usu frog

コメント。呼び出し用のプロンプトを書いておけば便利かも。


--enable_bucket --min_bucket_reso=512 --max_bucket_reso=1280 

このオプションを使うと、教師画像のサイズを揃えなくても良い。


--optimizer_type=adafactor --optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True" 

--learning_rate=1.0 

学習率を良い感じに自動調整する設定。このオプションを使う場合は、Learning Rateを1前後に設定する。例えば 1.0、1.5、など。

--optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True"  は不要という説もあります。


--use_8bit_adam 

--learning_rate=1e-4 

--use_8bit_adam を指定する場合の学習率。覚えが悪い場合に5e-4など高くしてみるといいかも。謎。


--optimizer_type=adafactor  と --use_8bit_adam  とは同時に指定が出来ないのでどちらかを指定する。


--network_weights="C:\SD\stable-diffusion-webui\models\Lora\base_lora.safetensors" 

学習済みのLoRAファイルをベースに学習を追加する場合にこのオプションを指定する。ファイルパスは元にするLoRAファイルのパスに書き換えてください。


編集したコマンドを一行にまとめる

コピペして実行できるように改行を削除して、一行にします。

Googleドキュメントにて。

編集>検索と置換(Ctrl+H)。

「検索」に \n と半角英数字で入力。

※入力は ¥ で、出てくる文字は \ バックスラッシュになりますがそれでOKです。

「次に変更」には何も入力しない。

「正規表現を使用する」をチェックする。

すると、全ての行終りがハイライト表示され、検索で認識されていることが分かります。

「すべて置換」をクリック。

これで、改行が削除され、一行に変換されます。


選択してコピー。

Ctrl+A、Ctrl+C。


コマンドプロンプトにペースト。

Ctrl+V、で実行されます。


accelerate launch --num_cpu_threads_per_process 4 train_network.py --seed 42 --pretrained_model_name_or_path=..\model.ckpt --train_data_dir=..\train --reg_data_dir=..\reg --prior_loss_weight=1.0 --resolution 512 --output_dir=..\lora_output --output_name=my_lora --save_model_as=safetensors --save_every_n_epochs=1 --train_batch_size=2 --learning_rate=1.0 --max_train_epochs 10 --xformers --mixed_precision=fp16 --save_precision=fp16 --max_data_loader_n_workers=1 --network_module=networks.lora --network_dim=64 --network_alpha=32  --clip_skip=2 --training_comment="activate by my_lora" --enable_bucket --min_bucket_reso=512 --max_bucket_reso=1280 --optimizer_type=adafactor --optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True" --network_weights="C:\SD\stable-diffusion-webui\models\Lora\base_lora.safetensors"


とりあえずはこんな感じです。


ざっくりキャラLoRA作成方法

一例です。既出のことや、詳しい手順は省略します。ごめんなさい。

教師画像の用意

任意のフォルダにキャラの画像を用意します。量より質、質のいいものを多く、です。
顔が良く分かるアップ気味の画像。正面、横、斜めなどいろいろな角度。
全身の衣装が分かる引きの画像。
共通の特徴がつかみやすいように、同じ衣装にしておくといいかも。
キャラクターの設定資料のような、シンプルな画像が良いと思います。
衣装は衣装で、別学習させるのもアリらしいです。

必要ないですが、画像は分かりやすい名前に変更して連番を振っておくといいです。

正則化画像があると、正則化画像の絵柄に寄ります。多分。
正則化画像無しなら、教師画像そのままの絵柄になりますが、今一つな感じ。


タグテキストファイルの用意

画像に対応したタグを記述したテキストファイルを作成します。
ここでは、WD14-tagger というExtension(拡張機能)を利用します。
https://github.com/toriato/stable-diffusion-webui-wd14-tagger.git

Tagger タブ > Batch from directory タブ を選択。
教師画像のフォルダを指定。


Interrogator は wd14-swinv2-v2 を選択。
Additional tags (split by comma) の欄に、キャラ名、呼び出し用の単語を入力します。
例えば sakura など、他の意味、他のモノの名前と被ってしまう場合は、saakuuraaなど確実に固有な単語にした方が良いかも。
オレンジの[Interrogate]ボタンを押すと、画像に対応したタグを書き込んだテキストファイルが作成されます。


必要なら、テキストファイルを編集します。
これには、Dataset Tag Editor というExtension(拡張機能)を利用します。
https://github.com/toshiaki1729/stable-diffusion-webui-dataset-tag-editor

同じような意味のタグを消して一つにまとめたり、教師画像に含まれている要らない要素を書き加えたりします。
タグと紐づいた要素は、プロンプトに書かないと出てこなくなったり、ネガティブに書いて完全に消したり出来るはず…。(エアプ)

タグテキスト参考(良い例では無いです)


例 C:\SD\lora_train_sample_pack\train\

例によって、このフォルダに画像とテキストの入ったフォルダを置きます。
フォルダの名前は、20_koropoya girl のようにしておきます。
僕は画像枚数*繰り返し数が300~600くらいになるようにしていますが、適当です。train_batch_sizeは2。この数値も学習の具合に関連するようです。


学習実行コマンド

例 C:\SD\lora_train_sample_pack\sd-scripts で、

cmd

.\venv\Scripts\activate


以下のコマンドをコピペして実行します。
黄色いところは環境に合わせて書き換えてください。
改行されてますが、そのまま全部まとめてコピペでOKです。
最後の行末に ^ は付けません。

accelerate launch ^
--num_cpu_threads_per_process 4 train_network.py ^
--train_data_dir=..\train ^
--prior_loss_weight=1.0 ^
--output_dir=..\lora_output ^
--xformers --mixed_precision=fp16 --save_precision=fp16 ^
--seed 42 --save_model_as=safetensors --save_every_n_epochs=1 ^
--max_data_loader_n_workers=1 ^
--network_module=networks.lora ^
--color_aug ^
--persistent_data_loader_workers ^
--keep_tokens=1 --shuffle_caption ^
--caption_extension=.txt ^
--clip_skip=2 ^
--optimizer_type=adafactor --learning_rate=1.0 ^
--lr_scheduler=cosine_with_restarts ^
--enable_bucket --min_bucket_reso=256 --max_bucket_reso=1280 ^
--pretrained_model_name_or_path="C:\SD\stable-diffusion-webui\models\Stable-diffusion\7th_anime_3.1_C-pruned-fp16.safetensors" ^
--resolution 512 ^
--train_batch_size=2 ^
--max_train_epochs 5 ^
--network_dim=64 --network_alpha=32 ^
--output_name="koropoya_lora" ^
--training_comment="activate by koropoya girl"

他のオプション

必要なら上記コマンドに追加します。

既存LoRAファイルに追加学習する場合の例

--network_weights="C:\SD\stable-diffusion-webui\models\Lora\base_lora.safetensors" ^


正則化画像を使う場合の例

--reg_data_dir=..\reg ^



正則化画像の例。

regフォルダに 2_girl のようなサブフォルダを作り、入れておきます。

STEP数(繰り返し数*枚数)は学習キャラクターのそれの10~20%程度にしていますが、設定値に根拠は無いです。

上図の正則化画像を使った場合、絵柄、黒髪、現代的な背景ロケーションの影響が強く出ると思います。


LoRAを使う

LoRAファイルを指定して、タグテキスト作成時に追加したキャラ名の単語をプロンプトに書くとキャラが出てきます。

例 <lora:koropoya:0.55> koropoya, 1girl, solo, maid outfit, ...


AIやばいね

0 件のコメント:

コメントを投稿