Skip to content

Commit a097c42

Browse files
committed
update docs
1 parent 68e0767 commit a097c42

File tree

3 files changed

+167
-15
lines changed

3 files changed

+167
-15
lines changed

train_README-ja.md

+12-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ __ドキュメント更新中のため記述に誤りがあるかもしれませ
22

33
# 学習について、共通編
44

5-
当リポジトリではモデルのfine tuning、DreamBooth、およびLoRAとTextual Inversionの学習をサポートします。この文書ではそれらに共通する、学習データの準備方法やオプション等について説明します。
5+
当リポジトリではモデルのfine tuning、DreamBooth、およびLoRAとTextual Inversion([XTI:P+](https://github.com/kohya-ss/sd-scripts/pull/327)を含む)の学習をサポートします。この文書ではそれらに共通する、学習データの準備方法やオプション等について説明します。
66

77
# 概要
88

@@ -535,7 +535,7 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
535535
536536
- `--debug_dataset`
537537
538-
このオプションを付けることで学習を行う前に事前にどのような画像データ、キャプションで学習されるかを確認できます。Escキーを押すと終了してコマンドラインに戻ります。
538+
このオプションを付けることで学習を行う前に事前にどのような画像データ、キャプションで学習されるかを確認できます。Escキーを押すと終了してコマンドラインに戻ります。`S`キーで次のステップ(バッチ)、`E`キーで次のエポックに進みます。
539539
540540
※Linux環境(Colabを含む)では画像は表示されません。
541541
@@ -545,6 +545,13 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
545545
546546
DreamBoothおよびfine tuningでは、保存されるモデルはこのVAEを組み込んだものになります。
547547
548+
- `--cache_latents`
549+
550+
使用VRAMを減らすためVAEの出力をメインメモリにキャッシュします。`flip_aug` 以外のaugmentationは使えなくなります。また全体の学習速度が若干速くなります。
551+
552+
- `--min_snr_gamma`
553+
554+
Min-SNR Weighting strategyを指定します。詳細は[こちら](https://github.com/kohya-ss/sd-scripts/pull/308)を参照してください。論文では`5`が推奨されています。
548555
549556
## オプティマイザ関係
550557
@@ -570,14 +577,16 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
570577
571578
学習率のスケジューラ関連の指定です。
572579
573-
lr_schedulerオプションで学習率のスケジューラをlinear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmupから選べます。デフォルトはconstantです。
580+
lr_schedulerオプションで学習率のスケジューラをlinear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup, 任意のスケジューラから選べます。デフォルトはconstantです。
574581
575582
lr_warmup_stepsでスケジューラのウォームアップ(だんだん学習率を変えていく)ステップ数を指定できます。
576583
577584
lr_scheduler_num_cycles は cosine with restartsスケジューラでのリスタート回数、lr_scheduler_power は polynomialスケジューラでのpolynomial power です。
578585
579586
詳細については各自お調べください。
580587
588+
任意のスケジューラを使う場合、任意のオプティマイザと同様に、`--scheduler_args`でオプション引数を指定してください。
589+
581590
### オプティマイザの指定について
582591
583592
オプティマイザのオプション引数は--optimizer_argsオプションで指定してください。key=valueの形式で、複数の値が指定できます。また、valueはカンマ区切りで複数の値が指定できます。たとえばAdamWオプティマイザに引数を指定する場合は、``--optimizer_args weight_decay=0.01 betas=.9,.999``のようになります。

train_network_README-ja.md

+154-11
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,31 @@ Conv2d 3x3への拡大は [cloneofsimo氏](https://github.com/cloneofsimo/lora)
1212

1313
[学習についての共通ドキュメント](./train_README-ja.md) もあわせてご覧ください。
1414

15+
# 学習できるLoRAの種類
16+
17+
以下の二種類をサポートします。以下は当リポジトリ内の独自の名称です。
18+
19+
1. __LoRA-LierLa__ : (LoRA for __Li__ n __e__ a __r__ __La__ yers、リエラと読みます)
20+
21+
Linear およびカーネルサイズ 1x1 の Conv2d に適用されるLoRA
22+
23+
2. __LoRA-C3Lier__ : (LoRA for __C__ olutional layers with __3__ x3 Kernel and __Li__ n __e__ a __r__ layers、セリアと読みます)
24+
25+
1.に加え、カーネルサイズ 3x3 の Conv2d に適用されるLoRA
26+
27+
LoRA-LierLaに比べ、LoRA-C3Liarは適用される層が増える分、高い精度が期待できるかもしれません。
28+
29+
また学習時は __DyLoRA__ を使用することもできます(後述します)。
30+
1531
## 学習したモデルに関する注意
1632

17-
cloneofsimo氏のリポジトリ、およびd8ahazard氏の[Dreambooth Extension for Stable-Diffusion-WebUI](https://github.com/d8ahazard/sd_dreambooth_extension)とは、現時点では互換性がありません。いくつかの機能拡張を行っているためです(後述)
33+
LoRA-LierLa は、AUTOMATIC1111氏のWeb UIのLoRA機能で使用することができます
1834

19-
WebUI等で画像生成する場合には、学習したLoRAのモデルを学習元のStable Diffusionのモデルにこのリポジトリ内のスクリプトであらかじめマージしておくか、こちらの[WebUI用extension](https://github.com/kohya-ss/sd-webui-additional-networks)を使ってください。
35+
LoRA-C3Liarを使いWeb UIで生成するには、こちらの[WebUI用extension](https://github.com/kohya-ss/sd-webui-additional-networks)を使ってください。
36+
37+
いずれも学習したLoRAのモデルを、Stable Diffusionのモデルにこのリポジトリ内のスクリプトであらかじめマージすることもできます。
38+
39+
cloneofsimo氏のリポジトリ、およびd8ahazard氏の[Dreambooth Extension for Stable-Diffusion-WebUI](https://github.com/d8ahazard/sd_dreambooth_extension)とは、現時点では互換性がありません。いくつかの機能拡張を行っているためです(後述)。
2040

2141
# 学習の手順
2242

@@ -31,9 +51,9 @@ WebUI等で画像生成する場合には、学習したLoRAのモデルを学
3151

3252
`train_network.py`を用います。
3353

34-
`train_network.py`では `--network_module` オプションに、学習対象のモジュール名を指定します。LoRAに対応するのはnetwork.loraとなりますので、それを指定してください。
54+
`train_network.py`では `--network_module` オプションに、学習対象のモジュール名を指定します。LoRAに対応するのは`network.lora`となりますので、それを指定してください。
3555

36-
なお学習率は通常のDreamBoothやfine tuningよりも高めの、1e-4程度を指定するとよいようです
56+
なお学習率は通常のDreamBoothやfine tuningよりも高めの、`1e-4``1e-3`程度を指定するとよいようです
3757

3858
以下はコマンドラインの例です。
3959

@@ -56,6 +76,8 @@ accelerate launch --num_cpu_threads_per_process 1 train_network.py
5676
--network_module=networks.lora
5777
```
5878

79+
このコマンドラインでは LoRA-LierLa が学習されます。
80+
5981
`--output_dir` オプションで指定したフォルダに、LoRAのモデルが保存されます。他のオプション、オプティマイザ等については [学習の共通ドキュメント](./train_README-ja.md) の「よく使われるオプション」も参照してください。
6082

6183
その他、以下のオプションが指定できます。
@@ -83,22 +105,143 @@ accelerate launch --num_cpu_threads_per_process 1 train_network.py
83105

84106
`--network_train_unet_only``--network_train_text_encoder_only` の両方とも未指定時(デフォルト)はText EncoderとU-Netの両方のLoRAモジュールを有効にします。
85107

86-
## LoRA を Conv2d に拡大して適用する
108+
# その他の学習方法
87109

88-
通常のLoRAは Linear およぴカーネルサイズ 1x1 の Conv2d にのみ適用されますが、カーネルサイズ 3x3 のConv2dに適用を拡大することもできます。
110+
## LoRA-C3Lier を学習する
89111

90112
`--network_args` に以下のように指定してください。`conv_dim` で Conv2d (3x3) の rank を、`conv_alpha` で alpha を指定してください。
91113

92114
```
93-
--network_args "conv_dim=1" "conv_alpha=1"
115+
--network_args "conv_dim=4" "conv_alpha=1"
94116
```
95117

96118
以下のように alpha 省略時は1になります。
97119

98120
```
99-
--network_args "conv_dim=1"
121+
--network_args "conv_dim=4"
122+
```
123+
124+
## DyLoRA
125+
126+
DyLoRAはこちらの論文で提案されたものです。[DyLoRA: Parameter Efficient Tuning of Pre-trained Models using Dynamic Search-Free Low-Rank Adaptation](https://arxiv.org/abs/2210.07558) 公式実装は[こちら](https://github.com/huawei-noah/KD-NLP/tree/main/DyLoRA)です。
127+
128+
論文によると、LoRAのrankは必ずしも高いほうが良いわけではなく、対象のモデル、データセット、タスクなどにより適切なrankを探す必要があるようです。DyLoRAを使うと、指定したdim(rank)以下のさまざまなrankで同時にLoRAを学習します。これにより最適なrankをそれぞれ学習して探す手間を省くことができます。
129+
130+
当リポジトリの実装は公式実装をベースに独自の拡張を加えています(そのため不具合などあるかもしれません)。
131+
132+
### 当リポジトリのDyLoRAの特徴
133+
134+
学習後のDyLoRAのモデルファイルはLoRAと互換性があります。また、モデルファイルから指定したdim(rank)以下の複数のdimのLoRAを抽出できます。
135+
136+
DyLoRA-LierLa、DyLoRA-C3Lierのどちらも学習できます。
137+
138+
### DyLoRAで学習する
139+
140+
`--network_module=networks.dylora` のように、DyLoRAに対応する`network.dylora`を指定してください。
141+
142+
また `--network_args` に、たとえば`--network_args "unit=4"`のように`unit`を指定します。`unit`はrankを分割する単位です。たとえば`--network_dim=16 --network_args "unit=4"` のように指定します。`unit``network_dim`を割り切れる値(`network_dim``unit`の倍数)としてください。
143+
144+
`unit`を指定しない場合は、`unit=1`として扱われます。
145+
146+
記述例は以下です。
147+
148+
```
149+
--network_module=networks.dylora --network_dim=16 --network_args "unit=4"
150+
151+
--network_module=networks.dylora --network_dim=32 --network_alpha=16 --network_args "unit=4"
100152
```
101153

154+
DyLoRA-C3Lierの場合は、`--network_args``"conv_dim=4"`のように`conv_dim`を指定します。通常のLoRAと異なり、`conv_dim``network_dim`と同じ値である必要があります。記述例は以下です。
155+
156+
```
157+
--network_module=networks.dylora --network_dim=16 --network_args "conv_dim=16" "unit=4"
158+
159+
--network_module=networks.dylora --network_dim=32 --network_alpha=16 --network_args "conv_dim=32" "conv_alpha=16" "unit=8"
160+
```
161+
162+
たとえばdim=16、unit=4(後述)で学習すると、4、8、12、16の4つのrankのLoRAを学習、抽出できます。抽出した各モデルで画像を生成し、比較することで、最適なrankのLoRAを選択できます。
163+
164+
その他のオプションは通常のLoRAと同じです。
165+
166+
`unit`は当リポジトリの独自拡張で、DyLoRAでは同dim(rank)の通常LoRAに比べると学習時間が長くなることが予想されるため、分割単位を大きくしたものです。
167+
168+
### DyLoRAのモデルからLoRAモデルを抽出する
169+
170+
`networks`フォルダ内の `extract_lora_from_dylora.py`を使用します。指定した`unit`単位で、DyLoRAのモデルからLoRAのモデルを抽出します。
171+
172+
コマンドラインはたとえば以下のようになります。
173+
174+
```powershell
175+
python networks\extract_lora_from_dylora.py --model "foldername/dylora-model.safetensors" --save_to "foldername/dylora-model-split.safetensors" --unit 4
176+
```
177+
178+
`--model` にはDyLoRAのモデルファイルを指定します。`--save_to` には抽出したモデルを保存するファイル名を指定します(rankの数値がファイル名に付加されます)。`--unit` にはDyLoRAの学習時の`unit`を指定します。
179+
180+
## 階層別学習率
181+
182+
詳細は[PR #355](https://github.com/kohya-ss/sd-scripts/pull/355) をご覧ください。
183+
184+
フルモデルの25個のブロックの重みを指定できます。最初のブロックに該当するLoRAは存在しませんが、階層別LoRA適用等との互換性のために25個としています。またconv2d3x3に拡張しない場合も一部のブロックにはLoRAが存在しませんが、記述を統一するため常に25個の値を指定してください。
185+
186+
`--network_args` で以下の引数を指定してください。
187+
188+
- `down_lr_weight` : U-Netのdown blocksの学習率の重みを指定します。以下が指定可能です。
189+
- ブロックごとの重み : `"down_lr_weight=0,0,0,0,0,0,1,1,1,1,1,1"` のように12個の数値を指定します。
190+
- プリセットからの指定 : `"down_lr_weight=sine"` のように指定します(サインカーブで重みを指定します)。sine, cosine, linear, reverse_linear, zeros が指定可能です。また `"down_lr_weight=cosine+.25"` のように `+数値` を追加すると、指定した数値を加算します(0.25~1.25になります)。
191+
- `mid_lr_weight` : U-Netのmid blockの学習率の重みを指定します。`"down_lr_weight=0.5"` のように数値を一つだけ指定します。
192+
- `up_lr_weight` : U-Netのup blocksの学習率の重みを指定します。down_lr_weightと同様です。
193+
- 指定を省略した部分は1.0として扱われます。また重みを0にするとそのブロックのLoRAモジュールは作成されません。
194+
- `block_lr_zero_threshold` : 重みがこの値以下の場合、LoRAモジュールを作成しません。デフォルトは0です。
195+
196+
### 階層別学習率コマンドライン指定例:
197+
198+
```powershell
199+
--network_args "down_lr_weight=0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0,1.5,1.5,1.5,1.5" "mid_lr_weight=2.0" "up_lr_weight=1.5,1.5,1.5,1.5,1.0,1.0,1.0,1.0,0.5,0.5,0.5,0.5"
200+
201+
--network_args "block_lr_zero_threshold=0.1" "down_lr_weight=sine+.5" "mid_lr_weight=1.5" "up_lr_weight=cosine+.5"
202+
```
203+
204+
### 階層別学習率tomlファイル指定例:
205+
206+
```toml
207+
network_args = [ "down_lr_weight=0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0,1.5,1.5,1.5,1.5", "mid_lr_weight=2.0", "up_lr_weight=1.5,1.5,1.5,1.5,1.0,1.0,1.0,1.0,0.5,0.5,0.5,0.5",]
208+
209+
network_args = [ "block_lr_zero_threshold=0.1", "down_lr_weight=sine+.5", "mid_lr_weight=1.5", "up_lr_weight=cosine+.5", ]
210+
```
211+
212+
## 階層別dim (rank)
213+
214+
フルモデルの25個のブロックのdim (rank)を指定できます。階層別学習率と同様に一部のブロックにはLoRAが存在しない場合がありますが、常に25個の値を指定してください。
215+
216+
`--network_args` で以下の引数を指定してください。
217+
218+
- `block_dims` : 各ブロックのdim (rank)を指定します。`"block_dims=2,2,2,2,4,4,4,4,6,6,6,6,8,6,6,6,6,4,4,4,4,2,2,2,2"` のように25個の数値を指定します。
219+
- `block_alphas` : 各ブロックのalphaを指定します。block_dimsと同様に25個の数値を指定します。省略時はnetwork_alphaの値が使用されます。
220+
- `conv_block_dims` : LoRAをConv2d 3x3に拡張し、各ブロックのdim (rank)を指定します。
221+
- `conv_block_alphas` : LoRAをConv2d 3x3に拡張したときの各ブロックのalphaを指定します。省略時はconv_alphaの値が使用されます。
222+
223+
### 階層別dim (rank)コマンドライン指定例:
224+
225+
```powershell
226+
--network_args "block_dims=2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2"
227+
228+
--network_args "block_dims=2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2" "conv_block_dims=2,2,2,2,4,4,4,4,6,6,6,6,8,6,6,6,6,4,4,4,4,2,2,2,2"
229+
230+
--network_args "block_dims=2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2" "block_alphas=2,2,2,2,4,4,4,4,6,6,6,6,8,6,6,6,6,4,4,4,4,2,2,2,2"
231+
```
232+
233+
### 階層別dim (rank)tomlファイル指定例:
234+
235+
```toml
236+
network_args = [ "block_dims=2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2",]
237+
238+
network_args = [ "block_dims=2,4,4,4,8,8,8,8,12,12,12,12,16,12,12,12,12,8,8,8,8,4,4,4,2", "block_alphas=2,2,2,2,4,4,4,4,6,6,6,6,8,6,6,6,6,4,4,4,4,2,2,2,2",]
239+
```
240+
241+
# その他のスクリプト
242+
243+
マージ等LoRAに関連するスクリプト群です。
244+
102245
## マージスクリプトについて
103246

104247
merge_lora.pyでStable DiffusionのモデルにLoRAの学習結果をマージしたり、複数のLoRAモデルをマージしたりできます。
@@ -323,14 +466,14 @@ python tools\resize_images_to_resolution.py --max_resolution 512x512,384x384,256
323466
- 縮小時の補完方法を指定します。``area, cubic, lanczos4``から選択可能で、デフォルトは``area``です。
324467

325468

326-
## 追加情報
469+
# 追加情報
327470

328-
### cloneofsimo氏のリポジトリとの違い
471+
## cloneofsimo氏のリポジトリとの違い
329472

330473
2022/12/25時点では、当リポジトリはLoRAの適用個所をText EncoderのMLP、U-NetのFFN、Transformerのin/out projectionに拡大し、表現力が増しています。ただその代わりメモリ使用量は増え、8GBぎりぎりになりました。
331474

332475
またモジュール入れ替え機構は全く異なります。
333476

334-
### 将来拡張について
477+
## 将来拡張について
335478

336479
LoRAだけでなく他の拡張にも対応可能ですので、それらも追加予定です。

train_ti_README-ja.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
実装に当たっては https://github.com/huggingface/diffusers/tree/main/examples/textual_inversion を大いに参考にしました。
66

7-
学習したモデルはWeb UIでもそのまま使えます。なお恐らくSD2.xにも対応していますが現時点では未テストです。
7+
学習したモデルはWeb UIでもそのまま使えます。
88

99
# 学習の手順
1010

0 commit comments

Comments
 (0)