最近気になるLoRAという学習方法。
DreamBoothである程度やりたいことはできていたけれど、もっと良い方法だとしたら試してみたい。
そう思って手をつけたけどなかなか上手くいきませんでした。
しかしKohya GUIというツールを知った結果ようやく成功。
その手順を共有します。
LoRAとDreamBoothの違い
画像生成モデル、かつ利用者視点での話で書くと、
「短時間、低VRAMで絵柄の追加学習ができ、ファイルサイズも少ない学習手法」
です。あくまでDreamBoothとくらべて。
学習後のファイル
LoRAの学習済みファイルは百数十MB。
これを画像生成時に追加で読み込ませ、アドインのような感覚で既存モデルの絵柄に追加要素を流し込めます。
その学習済みファイルはほぼ学習画像で構成されているようで、とても強く反映されます。そのためPromptで強度を調節しながら適用します。
凝縮された固形のカレールーみたいなものですかね。
対するDreamBoothは数GBの既存モデルの内容を上書きするように追加学習します。
結果できあがるファイルも数GBで、学習進度(学習率,step,epoch)により既存モデル内での上書き具合も変わります。
よって実際の利用には何パターンかの数GBファイルを切り替えながら試行錯誤して使います。
こちらは自分でスパイスをまぜて作るこだわりカレーのような感じ??
LoRAは使いやすい
GPUの要求にも差があります。
LoRAはメモリを節約すれば8GB程度のVRAMでも学習可能。
DreamBoothは最低12GBくらい必要で、自分の設定では24GBフルに使ってます。
このような差の他、LoRAには大きなアドバンテージがあります。
「LoRAは一つの学習済みモデルを、色々な画像生成モデルに即反映できる。
新しいモデルが公開されてもいちいち追加学習させなくていい。」
もちろん学習の際にターゲットとする既存モデルは選ぶので、他と組み合わせたときにベストな結果が出るとは言えません。
でもいい悪いなんて利用者の主観で更に曖昧だし、目的によっては元モデルの良さもある程度必要なので試してみる価値はあります。
手順
自分がやった手順を紹介します。
参考にしたのはこのツールのREADMEページとこの動画。自分の説明より数倍丁寧。
手順の大まかな流れは以下の通り。
- インストール
- ツールの起動
- 学習画像の準備
- 設定済み環境ファイルをダウンロード
- 学習の実行
- sd-webui-additional-networks拡張の追加
- LoRAモデルを使ってみる
1.インストール
実行環境準備
READMEの下の方を参照。
AUTOMATIC1111が動いていれば済んでいるはずですが、まだの人はPython3.10、Gitをインストールします。
そしてVisualStudioの再配布パッケージもインストールします。
Kohya-SSのインストール
何も細かい理解は必要ありません。
まずWinキー+Xを押してターミナル(管理者)を開きます。
そしてKohya-ssをインストールする作業場所(自分はc:\sd\kohya)を作成し、PowerShellの実行をOSに許可します。
PS C:\sd> mk kohya PS C:\sd> cd .\kohya\ PS C:\sd\kohya> Set-ExecutionPolicy Unrestricted
次にREADMEに書かれている一文をコピペして実行します。
(以下引用)
git clone https://github.com/bmaltais/kohya_ss.git cd kohya_ss python -m venv venv .\venv\Scripts\activate pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116 pip install --use-pep517 --upgrade -r requirements.txt 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 cp .\bitsandbytes_windows\*.dll .\venv\Lib\site-packages\bitsandbytes\ cp .\bitsandbytes_windows\cextension.py .\venv\Lib\site-packages\bitsandbytes\cextension.py cp .\bitsandbytes_windows\main.py .\venv\Lib\site-packages\bitsandbytes\cuda_setup\main.py accelerate config
自動でダウンロードとインストールが行われます(10分くらい)。
最後の”accelarator config”を実行すると、質問で止まります。
基本はデフォルトでいいのでEnterをそのまま押すだけ。
ただし最後の項目”Do you wish to use FP16 or BF16 (mixed precision)?”だけfp16を選ぶため”1″を押します。↑↓キーで選ぼうとするとエラーを吐いて止まるのでやり直し。
(venv) PS C:\sd\kohya\kohya_ss> accelerate config ------------------------------------------------------------------------------------------------------------------------ In which compute environment are you running? This machine ------------------------------------------------------------------------------------------------------------------------ Which type of machine are you using? No distributed training Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]: Do you wish to optimize your script with torch dynamo?[yes/NO]: Do you want to use DeepSpeed? [yes/NO]: What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]: ------------------------------------------------------------------------------------------------------------------------ Do you wish to use FP16 or BF16 (mixed precision)? fp16 accelerate configuration saved at C:\Users\XXXXXXX/.cache\huggingface\accelerate\default_config.yaml (venv) PS C:\sd\kohya\kohya_ss>
kohya GUIツールはC:\sd\kohya\kohya_ssにインストールされたようです。
CUDNN 8.6のインストール
これは任意です。
RTX3000番台以降のGPUを使用する場合、学習を加速させることができます。
Megaってちょっと身構えてしまいますが、大丈夫でした。
Zipファイルを解凍し、出てきたcudnn_windowsフォルダをKohyaインストールフォルダの直下にコピーします。
その後、インストール用スクリプトを実行します。
(venv)と表示される仮想環境で実行してください。
そのためには前段階でインストールに使ったターミナルでそのまま作業するか、改めて.\venv\Scripts\activateしてください。
(venv) PS C:\sd\kohya\kohya_ss> python .\tools\cudann_1.8_install.py
2.ツール起動
インストールされたフォルダを(ファイル)エクスプローラで開き、upgrade.ps1をダブルクリック実行します。
これで最新版にアップデートされます。
そして同じフォルダにあるgui.ps1を実行。
AUTOMATIC1111と同様、GUIのアドレスが表示されます。
これにアクセスすればKohya GUIの導入は完了です。
学習専用環境なので、DreamBooth 拡張のようにAUTOMATIC1111のアップデートに巻き込まれて動かなくなったりしません。素敵。
3.学習画像の準備
ここからはKohya GUIを使っていきます。
キャプションをつける
学習画像はこれまでと同じゲームのスクリーンショット、30枚を使用しました。
これにKohya GUIの中にあるツールを使ってキャプションファイル(.txt)を作成します。
(以前DreamBooth拡張で作ったキャプションファイルでは上手く学習されませんでした)
”Utilities”タブ>”BLIP Captioning”タブを開き、下記を設定します。
- Image folder to caption:学習画像のフォルダ
- Prefix to add to BLIP caption:学習画像の固有名詞(例:otokoyama)
[Caption images]ボタンを押せば1,2分で学習画像と同じ枚数のテキストがImage folder to captionに保存されます。
2023年2月18日追記
この方法は楽に動きますが正確ではありません。
もっと適切なタグファイルの作成方法を文末に追記しました。
一度試してうまく動いた方は文末をご覧ください。
フォルダ名の変更と配置
この画像フォルダの名前を変更し、作業場所に置きます。
具体的には作業場所がc:\image、画像は30枚、固有名詞がotokoyamaとするとこんなパスになります。
- c:\image\100_otokoyama
この100は画像1枚に行う学習回数=epoch数を表しています。
参考動画の話によると「学習画像が15枚以上なら100。15枚未満なら1500÷画像枚数の数字をフォルダの頭につける」との事でした。
本当はここらへんでも学習結果に差が出るはずですが、ベースとしてこう理解。
c:\imageの中には学習画像フォルダ以外なにも入れない様にします。
4.設定済み環境ファイルをダウンロード
学習には非常に多くのパラメータがあり混乱します。
でもYoutube動画で公開されているテンプレートを使わせてもらったら簡単でした。
- 標準環境用MegaLink:https://mega.nz/file/ndFRwTIB#-T-6AKXtK8Xa8VZGzNAjARNUyGTj2qEYSLp7zePDOIs
- 低VRAM用MegaLink:https://mega.nz/file/zFNjlJAL#uB2uTAvcqLohSUzYBgtuBcAMt4Jnclg6jVV5YE4s0F4
適当なフォルダにダウンロードしておきます。
5.学習の実行
ようやく学習します。
”DreamBooth LoRA”タブを開き、”Configuration Files”をクリック。
[Open]ボタンを押してダウンロードした環境設定ファイルを開きます。
これで細かい設定は全部入ってくれます。
次に学習のターゲットとなる既存モデルを選びます。
”Source Model”タブをクリック。
”Pretrained model name or path”横ににあるファイルボタンを押し、希望の既存モデルを選びます。
このとき、選んだモデルがStableDiffusion v2をベースにしたモデルなら”V2″にチェック。
768pxベースなら”v_parameterization”にチェックを入れます。
わからなかったらチェックせずに試すでOK。
そして”Folders”タブをクリックし、以下を埋めます。
- Image Folder:学習画像フォルダの上位フォルダ
(例で言えばc:\image\100_otokoyamaではなくc:\image) - Output Folder:AUTOMATIC1111のLoRAフォルダ
(.\SD\stable-diffusion-webui\models\Lora) - Logging Folder:c:\sd\Kohyaなど適当な作業場所
- Regularisation folder:空でもOK
(2023/02/26追記 正規化画像を使う場合は文末参照) - Model output name:作成するLoRAファイルの名前
最後に一度”Configuration Files”を開いて、設定をSaveしておきます。
全部が準備できたら[Train Model]を押すと学習がはじまります。
自分の環境では15分弱でVRAMも12GB弱(標準環境用設定)しか使っていないようでした。
グラボ単体の消費電力も300Wを超えなかったので確かにエコかもしれない。
6.拡張機能のインストール
完成したファイルを使うには、専用の拡張機能を入れる必要があるそうです。
”Extension”タブ>”Available”タブ>[Load from:]をクリック
“Kohya-ss Additional Networks”みたいな名前を見つけてインストール。
一度UIをReloadし、”Addtional Networks”タブが増えた事を確認します。
7.LoRAモデルを使ってみる
あとは使ってみるだけ。
”txt2img”タブのGenerateの下にある花札みたいなボタン。
これを押すと”Lora”というタブがあります。
設定を上記と同じにしたなら、完成した追加学習ファイルがここでカードになっているはず。
これをクリックすると、 Prompt欄に<lora:otokoyama202302101756:1>(あくまで一例)というタグが入ります。
あとは他のタグと同様に:1の数字を変化させて効き具合を調節して使います。
また固有名詞(例:otokoyama)もPromptに入れます(2023年2月18日追記)
LoRAが最適解かはまだ不明
最初にLoRAのアドバンテージを書きましたが、
最終的な目標である「学習内容を自分の理想の形で反映させる」事にLoRAが最適解かはまだわかりません。
効きすぎるような印象もあるし、公開設定ファイルからまだ詰められる項目があるかも(768×768学習とか)。
LoRAファイルを使い始めた所なので、動きの把握には今しばらくかかりそうです。
おまけ:より良きLoRAファイルのために
(2023年2月18日追記)
LoRA – としあきdiffusion Wiki*や他の方のTweetなどを読むと、ベストはまた別な方法のようです。
それについて追記します。
ちゃんとしたタグファイル生成
”BLIP Captioning”でテキストを生成すると、出来上がるのは正確にはタグファイルではなくキャプションファイルです。
よって何れかの方法で学習画像1枚1枚に対し、「Promptと同じようなカンマ区切りのタグファイル」を作成するのがベストです。
なおKohya GUIの”WD14 Captioning”タブが動けば話しが早いのですが、自分の環境では動作していません。
- AUTOMATIC1111の”Train”>”Preprocessing Images”タブを使う(過去の記事参照)
- AUTOMATIC1111拡張のGitHub – toriato/stable-diffusion-webui-wd14-taggeを使う
- BLIP Captioningで生成されたキャプションを見て、手作業で単語に区切る
BLIP Captioningを手で区切る例
otokoyama a musculer man with a white beard and a white shirt
→ otokoyama, musculer, man, white bread, shirt
何れも、ファイルの先頭には学習画像の固有名詞(今回の例:otokoyama)を入れます。
タグの選別
タグファイルが完成したら、内容を選別します。
数枚の学習画像を俯瞰し、「自分は何をもってこのキャラを認識しているのか」を確認します。具体的には「絵が出来上がった時、どの部分を見てotokoyamaが描けたと思うか?」です。
白いヒゲ(white bread)かもしれないし、ムキムキの上半身(musculer)かもしれません。
それら「キャラらしさ」を表す全てのタグを、”すべてのタグファイル”から手作業で消します。残すんじゃなくて消す。
選別の例
otokoyama, musculer, man, white bread, shirt
→ otokoyama, man, shirt
こうして学習すると、otokoyamaというタグには「白いヒゲのムキムキ」という画像情報が刷り込まれます。
そしてPromptにotokoyamaをまぜて呼び出すと、どんな絵にもotokoyama臭さが出るそうな。逆にヒゲの無いotokoyamaもガリガリのotokoyamaも出づらくなります。
このように選別するタグは「コレがなければコイツじゃない」というものが対象です。
(大量の学習画像を使えばタグ選別は要らない説もありますが、妥当性の判断が難しいため自分は選別することにしました)
正規化画像の利用
2023/02/26 追記
正規化画像を利用すると、完成するLoRAファイル(?)から指定したclass要素を抜く事ができます。
具体例として「白いヒゲのムキムキな男」を学習するときに「男」(class)要素を抜いて学習する事で、より「白いヒゲのムキムキ」要素にフォーカスしたLoRAファイルが作れます。
手順
- 除外したいclass要素だけで大量の画像を生成する
- 作った画像を”1_class要素”というフォルダに保存する
- それをさらに学習画像フォルダとはまた別のフォルダに格納する
- LoRA学習の際にRegularisation folderに指定する
1.は例えば”photo of otokoyama man”と使う予定なら、promptに”man”とだけ入れて150枚生成します。枚数は諸説ある状況なので学習画像x5=150枚用意しました。自分はQT(masterpiece, best quarity)を常に使うのでここでも入れました。
2.&3.は例としてc:\classification\1_manという感じ。c:\imageとは混ざらない別のフォルダです。
4.はc:\classificationを指定します。
効果は結構感じました。
LoRAファイルを指定して画像を生成するとき、強度を0.6とか下げたとします。
正規化画像を利用しないLoRAでは学習画像と関係ない絵柄が出ましたが、利用したLoRAでは粘って学習画像を織り込んでくれる感じ。