@@ -12,11 +12,31 @@ Conv2d 3x3への拡大は [cloneofsimo氏](https://github.com/cloneofsimo/lora)
12
12
13
13
[ 学習についての共通ドキュメント] ( ./train_README-ja.md ) もあわせてご覧ください。
14
14
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
+
15
31
## 学習したモデルに関する注意
16
32
17
- cloneofsimo氏のリポジトリ、およびd8ahazard氏の [ Dreambooth Extension for Stable-Diffusion-WebUI ] ( https://github.com/d8ahazard/sd_dreambooth_extension ) とは、現時点では互換性がありません。いくつかの機能拡張を行っているためです(後述) 。
33
+ LoRA-LierLa は、AUTOMATIC1111氏のWeb UIのLoRA機能で使用することができます 。
18
34
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 ) とは、現時点では互換性がありません。いくつかの機能拡張を行っているためです(後述)。
20
40
21
41
# 学習の手順
22
42
@@ -31,9 +51,9 @@ WebUI等で画像生成する場合には、学習したLoRAのモデルを学
31
51
32
52
` train_network.py ` を用います。
33
53
34
- ` train_network.py ` では ` --network_module ` オプションに、学習対象のモジュール名を指定します。LoRAに対応するのはnetwork.loraとなりますので 、それを指定してください。
54
+ ` train_network.py ` では ` --network_module ` オプションに、学習対象のモジュール名を指定します。LoRAに対応するのは ` network.lora ` となりますので 、それを指定してください。
35
55
36
- なお学習率は通常のDreamBoothやfine tuningよりも高めの、1e-4程度を指定するとよいようです 。
56
+ なお学習率は通常のDreamBoothやfine tuningよりも高めの、` 1e-4 ` ~ ` 1e-3 ` 程度を指定するとよいようです 。
37
57
38
58
以下はコマンドラインの例です。
39
59
@@ -56,6 +76,8 @@ accelerate launch --num_cpu_threads_per_process 1 train_network.py
56
76
--network_module=networks.lora
57
77
```
58
78
79
+ このコマンドラインでは LoRA-LierLa が学習されます。
80
+
59
81
` --output_dir ` オプションで指定したフォルダに、LoRAのモデルが保存されます。他のオプション、オプティマイザ等については [ 学習の共通ドキュメント] ( ./train_README-ja.md ) の「よく使われるオプション」も参照してください。
60
82
61
83
その他、以下のオプションが指定できます。
@@ -83,22 +105,143 @@ accelerate launch --num_cpu_threads_per_process 1 train_network.py
83
105
84
106
` --network_train_unet_only ` と ` --network_train_text_encoder_only ` の両方とも未指定時(デフォルト)はText EncoderとU-Netの両方のLoRAモジュールを有効にします。
85
107
86
- ## LoRA を Conv2d に拡大して適用する
108
+ # その他の学習方法
87
109
88
- 通常のLoRAは Linear およぴカーネルサイズ 1x1 の Conv2d にのみ適用されますが、カーネルサイズ 3x3 のConv2dに適用を拡大することもできます。
110
+ ## LoRA-C3Lier を学習する
89
111
90
112
` --network_args ` に以下のように指定してください。` conv_dim ` で Conv2d (3x3) の rank を、` conv_alpha ` で alpha を指定してください。
91
113
92
114
```
93
- --network_args "conv_dim=1 " "conv_alpha=1"
115
+ --network_args "conv_dim=4 " "conv_alpha=1"
94
116
```
95
117
96
118
以下のように alpha 省略時は1になります。
97
119
98
120
```
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"
100
152
```
101
153
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
+
102
245
## マージスクリプトについて
103
246
104
247
merge_lora.pyでStable DiffusionのモデルにLoRAの学習結果をマージしたり、複数のLoRAモデルをマージしたりできます。
@@ -323,14 +466,14 @@ python tools\resize_images_to_resolution.py --max_resolution 512x512,384x384,256
323
466
- 縮小時の補完方法を指定します。`` area, cubic, lanczos4 `` から選択可能で、デフォルトは`` area `` です。
324
467
325
468
326
- ## 追加情報
469
+ # 追加情報
327
470
328
- ### cloneofsimo氏のリポジトリとの違い
471
+ ## cloneofsimo氏のリポジトリとの違い
329
472
330
473
2022/12/25時点では、当リポジトリはLoRAの適用個所をText EncoderのMLP、U-NetのFFN、Transformerのin/out projectionに拡大し、表現力が増しています。ただその代わりメモリ使用量は増え、8GBぎりぎりになりました。
331
474
332
475
またモジュール入れ替え機構は全く異なります。
333
476
334
- ### 将来拡張について
477
+ ## 将来拡張について
335
478
336
479
LoRAだけでなく他の拡張にも対応可能ですので、それらも追加予定です。
0 commit comments