- AUTOMATIC1111's stable-diffusion-webui用の拡張です
- LoRA、iLECO及び差分LoRAを作成できます
Stable DiffusionのLoRAを学習するツールです。Stable Diffusion Web-UIの拡張として動作し、学習用の環境構築を必要としません。通常のLoRA及び、モデルの概念を除去・強調するLECOの学習を高速化したiLECO(instant-LECO)と、ふたつの差分画像からスライダーLoRAなどを作成する差分学習を行えます。
Web-UI 1.7で動作します。
Web-UIのInstall From URLにhttps://github.com/hako-mikan/sd-webui-traintrain
と入力しInstallボタンを押します。少し(数秒~数十秒)時間が掛かります。
モードごとの必須パラメーターを入力しStart Trainingボタンを押すと学習が始まります。作成されたLoRAはLoRA用のフォルダに保存されます。モデルとVAEを選択しない場合、現在ロードされているモデルとVAEが使われます。
画像からLoRAを学習します。
jpg
, jpeg
, png
, gif
, tif
, tiff
, bmp
, webp
, pcx
, ico
形式に対応します。大きさはimage size
で指定した大きさにする必要はありませんが、学習時に切り取られるため切り取られ方によってはキャプションと不整合が生じる場合があるのである程度は整形した方がいいです。画像はアスペクト比ごとに分類されます。例えばimage size
を768,512に設定した場合、768×512のピクセルサイズを最大値としていくつかの解像度のセット(bucket)が作成されます。デフォルトの場合、768×512,512×512,512×768の3種類の分類になり、画像はアスペクト比ごとに近い分類に振り分けられます。これは学習が同一のサイズでないと受け付けないためです。そのさい、画像の縮小と切り取りが行われます。画像の中心を基準点として切り取りが行われます。分類を細分化したい場合にはimage buckets step
の値を小さくします。
同じ画像を何度も学習すると過学習になり、その画像そのものが出てきます。学習画像が少ない場合、過学習に対処するために画像を縮小したり反転させたりして学習画像を増やすことをします。image size
を768,512
にimage buckets step
を128
に設定すると、
(384, 768), (512, 768), (512, 640), (512, 512), (640, 512), (768, 512), (768, 384)
の枠が作られます。さらに、image min length
を256
にすると縮小用の枠として(256, 512), (384, 640), (256, 384), (384, 512), (384, 384), (256, 256), (512, 384), (384, 256), (640, 384), (512, 256)
の枠が作られます。画像はまず普通の枠に振り分けられますが、sub image num
が設定されている場合、アスペクト比の近い縮小用の枠にも縮小して格納されます。このとき、(512, 640)
の枠に格納された画像について、sub image num
が3と設定されている場合は (384, 640)
、(256, 384)
、(384, 512)
にも縮小して格納されます。image mirroring
を有効にすると左右反転された画像も格納され、結果として1枚の画像から8枚の学習用画像が生成されます。
画像と同じファイル名のtxt
,caption
ファイルがある場合、ファイルに書かれたテキストを使って学習を行います。どちらも存在する場合、txt
ファイルが優先されます。trigger word
が設定されている場合、すべてのキャプションの前にtrigger word
が挿入されます。キャプションファイルがない場合も同様です。
Aというキャラクターを学習するとします。Aというキャラクターはツインテールで青いシャツを着て赤いスカートを着用しているとします。Aが描かれた白い背景の絵があるとして、キャプションにはAの名前と、どの方向を向いているか、背景が白いことなどを記入します。ツインテールで青いシャツを着て赤いスカートを着用しているという要素はA特有の要素で学習させたいものなのでキャプションには記入しません。一方、向きや背景、構図などは学習してもらっては困るので記入します。
iLECO(instant-LECO)はLECOの学習過程を高速化したもので、Original Promptで指定した概念をTarget Promptの概念に近づけるような学習を行います。Target Promptに何も入れない場合、その概念を除去するような学習になります。
例としてどんなモデルでも強固に出てくるMona Lisaさんを消してみます。Original Promptに「Mona Lisa」、Target Promptは空欄にします。train iteration
の値が500程度あれば収束します。alpha
の値は通常rankより小さな値を設定しますが、iLECOの場合はrankより大きな値にした方がいい場合もあります。
Mona Lisaさんを消すことができました。次にTarget Promptに「Vincent van Gogh Sunflowers」と入れてみます。すると、モナリザさんがひまわりになるLoRAができました。
Original Promptに「red」、Target Promptに「blue」を入れてみます。赤を青くするLoRAができましたね。
ふたつの差分画像からLoRAを作成します。いわゆるコピー機学習法というものです。いったん同じ画像しか出ないLoRA(コピー機)を作成した後、コピー機をLoRAを適用した状態で差分の学習を行うことで差分相当のLoRAをつくる方法です。Original, Targetに画像を設定してください。画像サイズは同じにしてください。
まずコピー機の学習が始まり、その後差分の学習が始まります。例として目を閉じるLoRAを作ってみます。以下のふたつの画像を使います。
Difference_Use2ndPassSettingsを使います。train batch size
は1~3を設定します。大きな値を入れてもあまり意味はありません。できました。目を閉じる以外はほとんど画風や構図に影響を与えていません。これは2ndPassでrank(dim)を4と小さくしているためです。これをコピー機と同じ16にしてしまうと、画風や構図に影響を与えてしまいます。
Tip
VRAMが足りない場合はgradient checkpointng
を有効化して下さい。計算時間が少し長くなる代わりにVRAM使用量を抑えられます。場合によってはgradient checkpointng
を有効化してバッチサイズを大きくした方が計算時間が短くなる場合があります。コピー機学習ではバッチサイズを3より大きくしても変化は少ないので3以下の方がいいでしょう。バッチサイズは一度に学習する画像の数ですが、バッチサイズを倍にしたときにiteration
を半分にできるかというとそう簡単な話ではありません。1ステップの学習で1回のウェイトの更新が行われますが、バッチサイズを倍にしてもこの回数は倍にはなりませんし、倍の効率で学習が行われるわけではないからです。
パラメーター | 詳細 |
---|---|
network type | lierlaが普通のLoRAです。c3lier(いわゆるLoCON)やloha(いわゆるLyCORIS)だと学習する領域が増えます。c3lier, lohaを選んだ場合、オプションのconv rank とconv alpha を設定すると追加領域のdimを調節できます |
network rank | LoRAのサイズ。dimとも言います。大きすぎても良くないので16ぐらいから始めて下さい |
network alpha | LoRAの縮小幅。通常rankと同じか小さな値を設定する。iLECOの場合はrankより大きな値を使った方がいい場合もあります |
lora data directory | LoRA学習を行う画像ファイルが保存されたフォルダを指定します。サブフォルダも含まれます |
lora trigger word | キャプションファイルを使用しないとき、ここに書かれたテキストと紐付けて学習が行われます。詳細は学習にて |
network blocks | 層別学習を行うときに使います。BASEはTextEncoderのことです。iLECO,DifferenceではBASEは使用しません |
train iterations | 学習回数。iLECO,Differenceだと500〜1000が適当です |
image size | 学習時の解像度です。height, widthの順番はiLECOの時のみ有効になります |
train batch size | 一度に何枚の画像を学習するかです。VRAMが共有メモリにはみ出ない程度に設定すると効率的です |
train learning rate | 学習率です。iLECOだと1e-3〜1e-4、Differenceだと1e-3ぐらいが適当 |
train optimizer | 最適化関数の設定です。adamwが推奨。adamw8bitだと精度が落ちます。特にDifferenceではadamw8bitだとうまくいきません |
train lr scheduler | 学習中に学習率を変化させる設定です。cosineにしとけばいいです。optimizerにadafactorを選ぶと学習率は自動的に決定されるためにこの項目は無効化されます |
save lora name | 保存時のファイル名です。設定しないとuntitledになります |
use gradient checkpointng | VRAM使用量が抑えられる代わりに少し学習が遅くなる |
オプションなので指定しなくても動作します。
パラメーター | 詳細 |
---|---|
network conv rank | c3lier, loha使用時のconv層のrank、0にするとnetwork rankの値が使われる |
network conv alpha | c3lier, loha使用時のconv層の縮小幅、0にするとnetwork alphaの値が使われる |
network element | 学習対象を細かく指定します。lohaでは動作しません。 Full : 通常のLoRAと同じです CrossAttention : プロンプトによって生成を処理する層のみを有効化します SelfAttention : プロンプトを使わず生成を処理する層のみを有効化します |
train lr step rules | lr schedulerをstepにしたときのステップを指定 |
train lr scheduler num cycles | cosine with restartの反復回数 |
train lr scheduler power | lrスケジューラーをlinearにしたときの指数 |
train lr warmup steps | 学習初期に徐々にlrを上げていく時の有効ステップ数を指定 |
train textencoder learning rate | Text Encoderの学習率、0だとtrain learning rateの値が使われる |
image buckets step | 画像をいくつかのアスペクト比に分類するときの分類の細かさを指定します |
image min length | 最小の解像度を指定します |
image max ratio | 最大のアスペクト比を指定します |
sub image num | 画像を異なる解像度に縮小する回数 |
image mirroring | 画像を左右反転する |
save per steps | 指定ステップごとにLoRAを保存します |
save overwrite | 保存時上書きするかどうか |
save as json | 学習実行時に設定を保存するかどうか。設定は拡張のフォルダのjsonフォルダに日付ごとに保存される |
model v pred | SD2.Xモデルがv-predを使用するかどうか |
train model precision | 学習時の学習対象以外の精度。fp16で問題ない |
train lora precision | 学習時の学習対象の精度。fp32で問題ない |
save precision | 保存時の精度。fp16で問題ない |
train seed | 学習時に使われるシード |
diff save 1st pass | コピー機LoRAを保存するかどうか |
diff 1st pass only | コピー機LoRAのみを学習する |
diff load 1st pass | コピー機LoRAをファイルから読み込む |
train snr gamma | timestep補正を加えるかどうか。0~20の値を設定する。推奨値は5 |
logging verbose | コマンドプロンプトにログを出力する |
logging_save_csv | csv形式でstep,loss,learning rateを記録する |
ボタンで設定を呼び出せます。設定はjsonファイルで扱います。プリセットはpresetフォルダに保存してあります。
学習を予約できます。Add to Queue
ボタンを押すと、現在の設定で学習が予約されます。学習中にこのボタンを押すと、学習後に次の学習が自動的に始まります。学習前に押すとStart Training
を押したときの設定で学習が終わった後、Queueリストの学習が順に処理されます。save lora name
が同じ設定は追加できません。
logging_save_csvオプションを有効化したとき、学習の進捗をグラフ化できます。`Name of logfile`に何も入力しない場合、学習中か直近の学習の結果が表示されます。csvファイル名を入力するとその結果が表示されます。フルパスでは無くファイル名のみで大丈夫です。ファイルはlogsフォルダに入っている必要があります。
このコードはPlat氏のLECO, laksjdjf氏の学習コード, kohya氏の学習コード、KohakuBlueleaf氏のLyCORISを参考にしています。