Ateras commited on
Commit
fe6327d
1 Parent(s): 8497735

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .cache/config/.gitkeep +0 -0
  2. .cache/keras/.gitkeep +0 -0
  3. .cache/nv/.gitkeep +0 -0
  4. .cache/triton/.gitkeep +0 -0
  5. .cache/user/.gitkeep +0 -0
  6. .dockerignore +7 -0
  7. .gitattributes +4 -35
  8. .github/workflows/typos.yaml +21 -0
  9. .github/workflows/update_space.yml +28 -0
  10. .gitignore +47 -0
  11. .release +1 -0
  12. .vscode/settings.json +4 -0
  13. Dockerfile +52 -0
  14. LICENSE.md +201 -0
  15. README-ja.md +157 -0
  16. README.md +471 -8
  17. XTI_hijack.py +201 -0
  18. __pycache__/dreambooth_gui.cpython-310.pyc +0 -0
  19. __pycache__/finetune_gui.cpython-310.pyc +0 -0
  20. __pycache__/lora_gui.cpython-310.pyc +0 -0
  21. __pycache__/textual_inversion_gui.cpython-310.pyc +0 -0
  22. _typos.toml +15 -0
  23. activate.ps1 +1 -0
  24. bitsandbytes_windows/cextension.py +54 -0
  25. bitsandbytes_windows/libbitsandbytes_cpu.dll +0 -0
  26. bitsandbytes_windows/libbitsandbytes_cuda116.dll +3 -0
  27. bitsandbytes_windows/main.py +166 -0
  28. config_files/accelerate/default_config.yaml +22 -0
  29. config_files/accelerate/runpod.yaml +22 -0
  30. convert_original_stable_diffusion_to_diffusers.py +156 -0
  31. convert_original_stable_diffusion_to_diffusers.py.1 +156 -0
  32. convert_original_stable_diffusion_to_diffusers.py.2 +156 -0
  33. dataset/.gitkeep +0 -0
  34. docker-compose.yaml +33 -0
  35. docs/Finetuning/top_level.md +28 -0
  36. docs/LoRA/top_level.md +26 -0
  37. docs/config_README-ja.md +279 -0
  38. docs/fine_tune_README_ja.md +140 -0
  39. docs/gen_img_README-ja.md +454 -0
  40. docs/image_folder_structure.md +59 -0
  41. docs/train_README-ja.md +1002 -0
  42. docs/train_README-zh.md +907 -0
  43. docs/train_db_README-ja.md +167 -0
  44. docs/train_db_README-zh.md +162 -0
  45. docs/train_network_README-ja.md +481 -0
  46. docs/train_network_README-zh.md +466 -0
  47. docs/train_ti_README-ja.md +105 -0
  48. dreambooth_gui.py +939 -0
  49. examples/caption.ps1 +14 -0
  50. examples/caption_subfolders.ps1 +20 -0
.cache/config/.gitkeep ADDED
File without changes
.cache/keras/.gitkeep ADDED
File without changes
.cache/nv/.gitkeep ADDED
File without changes
.cache/triton/.gitkeep ADDED
File without changes
.cache/user/.gitkeep ADDED
File without changes
.dockerignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ .cache/
2
+ cudnn_windows/
3
+ bitsandbytes_windows/
4
+ bitsandbytes_windows_deprecated/
5
+ dataset/
6
+ __pycache__/
7
+ venv/
.gitattributes CHANGED
@@ -1,35 +1,4 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.sh text eol=lf
2
+ *.ps1 text eol=crlf
3
+ *.bat text eol=crlf
4
+ *.cmd text eol=crlfbitsandbytes_windows/libbitsandbytes_cuda116.dll filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.github/workflows/typos.yaml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ # yamllint disable rule:line-length
3
+ name: Typos
4
+
5
+ on: # yamllint disable-line rule:truthy
6
+ push:
7
+ pull_request:
8
+ types:
9
+ - opened
10
+ - synchronize
11
+ - reopened
12
+
13
+ jobs:
14
+ build:
15
+ runs-on: ubuntu-latest
16
+
17
+ steps:
18
+ - uses: actions/checkout@v3
19
+
20
+ - name: typos-action
21
+ uses: crate-ci/typos@v1.13.10
.github/workflows/update_space.yml ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: Run Python script
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v2
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v2
18
+ with:
19
+ python-version: '3.9'
20
+
21
+ - name: Install Gradio
22
+ run: python -m pip install gradio
23
+
24
+ - name: Log in to Hugging Face
25
+ run: python -c 'import huggingface_hub; huggingface_hub.login(token="${{ secrets.hf_token }}")'
26
+
27
+ - name: Deploy to Spaces
28
+ run: gradio deploy
.gitignore ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ venv
3
+ __pycache__
4
+ *.egg-info
5
+ build
6
+ wd14_tagger_model
7
+
8
+ # IDE and Editor specific
9
+ .vscode
10
+
11
+ # CUDNN for Windows
12
+ cudnn_windows
13
+
14
+ # Cache and temporary files
15
+ .cache
16
+ .DS_Store
17
+
18
+ # Scripts and executables
19
+ locon
20
+ gui-user.bat
21
+ gui-user.ps1
22
+
23
+ # Version control
24
+ SmilingWolf
25
+ wandb
26
+
27
+ # Setup and logs
28
+ setup.log
29
+ logs
30
+
31
+ # Miscellaneous
32
+ uninstall.txt
33
+
34
+ # Test files
35
+ test/output
36
+ test/log*
37
+ test/*.json
38
+ test/ft
39
+
40
+ # Temporary requirements
41
+ requirements_tmp_for_setup.txt
42
+
43
+ # Version specific
44
+ 0.13.3
45
+
46
+ *.npz
47
+ presets/*/user_presets/*
.release ADDED
@@ -0,0 +1 @@
 
 
1
+ v21.8.2
.vscode/settings.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "python.linting.enabled": true,
3
+ "python.formatting.provider": "yapf"
4
+ }
Dockerfile ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM nvcr.io/nvidia/pytorch:23.04-py3 as base
2
+ ENV DEBIAN_FRONTEND=noninteractive
3
+ ENV TZ=Europe/London
4
+
5
+ RUN apt update && apt-get install -y software-properties-common
6
+ RUN add-apt-repository ppa:deadsnakes/ppa && \
7
+ apt update && \
8
+ apt-get install -y git curl libgl1 libglib2.0-0 libgoogle-perftools-dev \
9
+ python3.10-dev python3.10-tk python3-html5lib python3-apt python3-pip python3.10-distutils && \
10
+ rm -rf /var/lib/apt/lists/*
11
+
12
+ # Set python 3.10 and cuda 11.8 as default
13
+ RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 3 && \
14
+ update-alternatives --set python3 /usr/bin/python3.10 && \
15
+ update-alternatives --set cuda /usr/local/cuda-11.8
16
+
17
+ RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3
18
+
19
+ WORKDIR /app
20
+ RUN python3 -m pip install wheel
21
+
22
+ # Todo: Install torch 2.1.0 for cu121 support (only available as nightly as of writing)
23
+ ## RUN python3 -m pip install --pre torch ninja setuptools --extra-index-url https://download.pytorch.org/whl/nightly/cu121
24
+
25
+ # Todo: Install xformers nightly for Torch 2.1.0 support
26
+ ## RUN python3 -m pip install -v -U git+https://github.com/facebookresearch/xformers.git@main#egg=xformers
27
+
28
+ # Install requirements
29
+ COPY ./requirements.txt ./requirements_linux_docker.txt ./
30
+ COPY ./setup/docker_setup.py ./setup.py
31
+ RUN python3 -m pip install -r ./requirements_linux_docker.txt
32
+ RUN python3 -m pip install -r ./requirements.txt
33
+
34
+ # Replace pillow with pillow-simd
35
+ RUN python3 -m pip uninstall -y pillow && \
36
+ CC="cc -mavx2" python3 -m pip install -U --force-reinstall pillow-simd
37
+
38
+ # Fix missing libnvinfer7
39
+ USER root
40
+ RUN ln -s /usr/lib/x86_64-linux-gnu/libnvinfer.so /usr/lib/x86_64-linux-gnu/libnvinfer.so.7 && \
41
+ ln -s /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7
42
+
43
+ RUN useradd -m -s /bin/bash appuser && \
44
+ chown -R appuser: /app
45
+ USER appuser
46
+ COPY --chown=appuser . .
47
+
48
+ STOPSIGNAL SIGINT
49
+ ENV LD_PRELOAD=libtcmalloc.so
50
+ ENV PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
51
+ ENV PATH="$PATH:/home/appuser/.local/bin"
52
+ CMD python3 "./kohya_gui.py" ${CLI_ARGS} --listen 0.0.0.0 --server_port 7860
LICENSE.md ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [2022] [kohya-ss]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
README-ja.md ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## リポジトリについて
2
+ Stable Diffusionの学習、画像生成、その他のスクリプトを入れたリポジトリです。
3
+
4
+ [README in English](./README.md) ←更新情報はこちらにあります
5
+
6
+ GUIやPowerShellスクリプトなど、より使いやすくする機能が[bmaltais氏のリポジトリ](https://github.com/bmaltais/kohya_ss)で提供されています(英語です)のであわせてご覧ください。bmaltais氏に感謝します。
7
+
8
+ 以下のスクリプトがあります。
9
+
10
+ * DreamBooth、U-NetおよびText Encoderの学習をサポート
11
+ * fine-tuning、同上
12
+ * 画像生成
13
+ * モデル変換(Stable Diffision ckpt/safetensorsとDiffusersの相互変換)
14
+
15
+ ## 使用法について
16
+
17
+ 当リポジトリ内およびnote.comに記事がありますのでそちらをご覧ください(将来的にはすべてこちらへ移すかもしれません)。
18
+
19
+ * [学習について、共通編](./docs/train_README-ja.md) : データ整備やオプションなど
20
+ * [データセット設定](./docs/config_README-ja.md)
21
+ * [DreamBoothの学習について](./docs/train_db_README-ja.md)
22
+ * [fine-tuningのガイド](./docs/fine_tune_README_ja.md):
23
+ * [LoRAの学習について](./docs/train_network_README-ja.md)
24
+ * [Textual Inversionの学習について](./docs/train_ti_README-ja.md)
25
+ * [画像生成スクリプト](./docs/gen_img_README-ja.md)
26
+ * note.com [モデル変換スクリプト](https://note.com/kohya_ss/n/n374f316fe4ad)
27
+
28
+ ## Windowsでの動作に必要なプログラム
29
+
30
+ Python 3.10.6およびGitが必要です。
31
+
32
+ - Python 3.10.6: https://www.python.org/ftp/python/3.10.6/python-3.10.6-amd64.exe
33
+ - git: https://git-scm.com/download/win
34
+
35
+ PowerShellを使う場合、venvを使えるようにするためには以下の手順でセキュリティ設定を変更してください。
36
+ (venvに限らずスクリプトの実行が可能になりますので注意してください。)
37
+
38
+ - PowerShellを管理者として開きます。
39
+ - 「Set-ExecutionPolicy Unrestricted」と入力し、Yと答えます。
40
+ - 管理者のPowerShellを閉じます。
41
+
42
+ ## Windows環境でのインストール
43
+
44
+ 以下の例ではPyTorchは1.12.1/CUDA 11.6版をインストールします。CUDA 11.3版やPyTorch 1.13を使う場合は適宜書き換えください。
45
+
46
+ (なお、python -m venv~の行で「python」とだけ表示された場合、py -m venv~のようにpythonをpyに変更してください。)
47
+
48
+ 通常の(管理者ではない)PowerShellを開き以下を順に実行します。
49
+
50
+ ```powershell
51
+ git clone https://github.com/kohya-ss/sd-scripts.git
52
+ cd sd-scripts
53
+
54
+ python -m venv venv
55
+ .\venv\Scripts\activate
56
+
57
+ pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
58
+ pip install --upgrade -r requirements.txt
59
+ 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
60
+
61
+ cp .\bitsandbytes_windows\*.dll .\venv\Lib\site-packages\bitsandbytes\
62
+ cp .\bitsandbytes_windows\cextension.py .\venv\Lib\site-packages\bitsandbytes\cextension.py
63
+ cp .\bitsandbytes_windows\main.py .\venv\Lib\site-packages\bitsandbytes\cuda_setup\main.py
64
+
65
+ accelerate config
66
+ ```
67
+
68
+ <!--
69
+ pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117
70
+ pip install --use-pep517 --upgrade -r requirements.txt
71
+ pip install -U -I --no-deps xformers==0.0.16
72
+ -->
73
+
74
+ コマンドプロンプトでは以下になります。
75
+
76
+
77
+ ```bat
78
+ git clone https://github.com/kohya-ss/sd-scripts.git
79
+ cd sd-scripts
80
+
81
+ python -m venv venv
82
+ .\venv\Scripts\activate
83
+
84
+ pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
85
+ pip install --upgrade -r requirements.txt
86
+ 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
87
+
88
+ copy /y .\bitsandbytes_windows\*.dll .\venv\Lib\site-packages\bitsandbytes\
89
+ copy /y .\bitsandbytes_windows\cextension.py .\venv\Lib\site-packages\bitsandbytes\cextension.py
90
+ copy /y .\bitsandbytes_windows\main.py .\venv\Lib\site-packages\bitsandbytes\cuda_setup\main.py
91
+
92
+ accelerate config
93
+ ```
94
+
95
+ (注:``python -m venv venv`` のほうが ``python -m venv --system-site-packages venv`` より安全そうなため書き換えました。globalなpythonにパッケージがインストールしてあると、後者だといろいろと問題が起きます。)
96
+
97
+ accelerate configの質問には以下のように答えてください。(bf16で学習する場合、最後の質問にはbf16と答えてください。)
98
+
99
+ ※0.15.0から日本語環境では選択のためにカーソルキーを押すと落ちます(……)。数字キーの0、1、2……で選択できますので、そちらを使ってください。
100
+
101
+ ```txt
102
+ - This machine
103
+ - No distributed training
104
+ - NO
105
+ - NO
106
+ - NO
107
+ - all
108
+ - fp16
109
+ ```
110
+
111
+ ※場合によって ``ValueError: fp16 mixed precision requires a GPU`` というエラーが出ることがあるようです。この場合、6番目の質問(
112
+ ``What GPU(s) (by id) should be used for training on this machine as a comma-separated list? [all]:``)に「0」と答えてください。(id `0`のGPUが使われます。)
113
+
114
+ ### PyTorchとxformersのバージョンについて
115
+
116
+ 他のバージョンでは学習がうまくいかない場合があるようです。特に他の理由がなければ指定のバージョンをお使いください。
117
+
118
+ ### オプション:Lion8bitを使う
119
+
120
+ Lion8bitを使う場合には`bitsandbytes`を0.38.0以降にアップグレードする必要があります。`bitsandbytes`をアンインストールし、Windows環境では例えば[こちら](https://github.com/jllllll/bitsandbytes-windows-webui)などからWindows版のwhlファイルをインストールしてください。たとえば以下のような手順になります。
121
+
122
+ ```powershell
123
+ pip install https://github.com/jllllll/bitsandbytes-windows-webui/raw/main/bitsandbytes-0.38.1-py3-none-any.whl
124
+ ```
125
+
126
+ アップグレード時には`pip install .`でこのリポジトリを更新し、必要に応じて他のパッケージもアップグレードしてください。
127
+
128
+ ## アップグレード
129
+
130
+ 新しいリリースがあった場合、以下のコマンドで更新できます。
131
+
132
+ ```powershell
133
+ cd sd-scripts
134
+ git pull
135
+ .\venv\Scripts\activate
136
+ pip install --use-pep517 --upgrade -r requirements.txt
137
+ ```
138
+
139
+ コマンドが成功すれば新しいバージョンが使用できます。
140
+
141
+ ## 謝意
142
+
143
+ LoRAの実装は[cloneofsimo氏のリポジトリ](https://github.com/cloneofsimo/lora)を基にしたものです。感謝申し上げます。
144
+
145
+ Conv2d 3x3への拡大は [cloneofsimo氏](https://github.com/cloneofsimo/lora) が最初にリリースし、KohakuBlueleaf氏が [LoCon](https://github.com/KohakuBlueleaf/LoCon) でその有効性を明らかにしたものです。KohakuBlueleaf氏に深く感謝します。
146
+
147
+ ## ライセンス
148
+
149
+ スクリプトのライセンスはASL 2.0ですが(Diffusersおよびcloneofsimo氏のリポジトリ由来のものも同様)、一部他のライセンスのコードを含みます。
150
+
151
+ [Memory Efficient Attention Pytorch](https://github.com/lucidrains/memory-efficient-attention-pytorch): MIT
152
+
153
+ [bitsandbytes](https://github.com/TimDettmers/bitsandbytes): MIT
154
+
155
+ [BLIP](https://github.com/salesforce/BLIP): BSD-3-Clause
156
+
157
+
README.md CHANGED
@@ -1,12 +1,475 @@
1
  ---
2
- title: Kohya Ss
3
- emoji: 📉
4
- colorFrom: purple
5
- colorTo: green
6
  sdk: gradio
7
- sdk_version: 3.40.1
8
- app_file: app.py
9
- pinned: false
10
  ---
 
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: kohya_ss
3
+ app_file: kohya_gui.py
 
 
4
  sdk: gradio
5
+ sdk_version: 3.36.1
 
 
6
  ---
7
+ # Kohya's GUI
8
 
9
+ This repository mostly provides a Windows-focused Gradio GUI for [Kohya's Stable Diffusion trainers](https://github.com/kohya-ss/sd-scripts)... but support for Linux OS is also provided through community contributions. Macos is not great at the moment.
10
+
11
+ The GUI allows you to set the training parameters and generate and run the required CLI commands to train the model.
12
+
13
+ ## Table of Contents
14
+
15
+ 1. [Tutorials](#tutorials)
16
+ 2. [Installation](#installation)
17
+ 1. [Windows](#windows)
18
+ 1. [Windows Pre-requirements](#windows-pre-requirements)
19
+ 2. [Setup](#setup)
20
+ 3. [Optional: CUDNN 8.6](#optional-cudnn-86)
21
+ 2. [Linux and macOS](#linux-and-macos)
22
+ 1. [Linux Pre-requirements](#linux-pre-requirements)
23
+ 2. [Setup](#setup-1)
24
+ 3. [Install Location](#install-location)
25
+ 3. [Runpod](#runpod)
26
+ 4. [Docker](#docker)
27
+ 3. [Upgrading](#upgrading)
28
+ 1. [Windows Upgrade](#windows-upgrade)
29
+ 2. [Linux and macOS Upgrade](#linux-and-macos-upgrade)
30
+ 4. [Starting GUI Service](#starting-gui-service)
31
+ 1. [Launching the GUI on Windows](#launching-the-gui-on-windows)
32
+ 2. [Launching the GUI on Linux and macOS](#launching-the-gui-on-linux-and-macos)
33
+ 5. [Dreambooth](#dreambooth)
34
+ 6. [Finetune](#finetune)
35
+ 7. [Train Network](#train-network)
36
+ 8. [LoRA](#lora)
37
+ 9. [Sample image generation during training](#sample-image-generation-during-training)
38
+ 10. [Troubleshooting](#troubleshooting)
39
+ 1. [Page File Limit](#page-file-limit)
40
+ 2. [No module called tkinter](#no-module-called-tkinter)
41
+ 3. [FileNotFoundError](#filenotfounderror)
42
+ 11. [Change History](#change-history)
43
+
44
+ ## Tutorials
45
+
46
+ [How to Create a LoRA Part 1: Dataset Preparation](https://www.youtube.com/watch?v=N4_-fB62Hwk):
47
+
48
+ [![LoRA Part 1 Tutorial](https://img.youtube.com/vi/N4_-fB62Hwk/0.jpg)](https://www.youtube.com/watch?v=N4_-fB62Hwk)
49
+
50
+ [How to Create a LoRA Part 2: Training the Model](https://www.youtube.com/watch?v=k5imq01uvUY):
51
+ ### About SDXL training
52
+
53
+ The feature of SDXL training is now available in sdxl branch as an experimental feature.
54
+
55
+ Summary of the feature:
56
+
57
+ - `sdxl_train.py` is a script for SDXL fine-tuning. The usage is almost the same as `fine_tune.py`, but it also supports DreamBooth dataset.
58
+ - `--full_bf16` option is added. Thanks to KohakuBlueleaf!
59
+ - This option enables the full bfloat16 training (includes gradients). This option is useful to reduce the GPU memory usage.
60
+ - However, bitsandbytes==0.35 doesn't seem to support this. Please use a newer version of bitsandbytes or another optimizer.
61
+ - I cannot find bitsandbytes>0.35.0 that works correctly on Windows.
62
+ - In addition, the full bfloat16 training might be unstable. Please use it at your own risk.
63
+ - `prepare_buckets_latents.py` now supports SDXL fine-tuning.
64
+ - `sdxl_train_network.py` is a script for LoRA training for SDXL. The usage is almost the same as `train_network.py`.
65
+ - Both scripts has following additional options:
66
+ - `--cache_text_encoder_outputs`: Cache the outputs of the text encoders. This option is useful to reduce the GPU memory usage. This option cannot be used with options for shuffling or dropping the captions.
67
+ - `--no_half_vae`: Disable the half-precision (mixed-precision) VAE. VAE for SDXL seems to produce NaNs in some cases. This option is useful to avoid the NaNs.
68
+ - The image generation during training is now available. However, the VAE for SDXL seems to produce NaNs in some cases when using `fp16`. The images will be black. Currently, the NaNs cannot be avoided even with `--no_half_vae` option. It works with `bf16` or without mixed precision.
69
+
70
+ - `--weighted_captions` option is not supported yet for both scripts.
71
+ - `--min_timestep` and `--max_timestep` options are added to each training script. These options can be used to train U-Net with different timesteps. The default values are 0 and 1000.
72
+
73
+ - `sdxl_train_textual_inversion.py` is a script for Textual Inversion training for SDXL. The usage is almost the same as `train_textual_inversion.py`.
74
+ - `--cache_text_encoder_outputs` is not supported.
75
+ - `token_string` must be alphabet only currently, due to the limitation of the open-clip tokenizer.
76
+ - There are two options for captions:
77
+ 1. Training with captions. All captions must include the token string. The token string is replaced with multiple tokens.
78
+ 2. Use `--use_object_template` or `--use_style_template` option. The captions are generated from the template. The existing captions are ignored.
79
+ - See below for the format of the embeddings.
80
+
81
+ - `sdxl_gen_img.py` is added. This script can be used to generate images with SDXL, including LoRA. See the help message for the usage.
82
+ - Textual Inversion is supported, but the name for the embeds in the caption becomes alphabet only. For example, `neg_hand_v1.safetensors` can be activated with `neghandv`.
83
+
84
+ `requirements.txt` is updated to support SDXL training.
85
+
86
+ #### Tips for SDXL training
87
+
88
+ - The default resolution of SDXL is 1024x1024.
89
+ - The fine-tuning can be done with 24GB GPU memory with the batch size of 1. For 24GB GPU, the following options are recommended:
90
+ - Train U-Net only.
91
+ - Use gradient checkpointing.
92
+ - Use `--cache_text_encoder_outputs` option and caching latents.
93
+ - Use Adafactor optimizer. RMSprop 8bit or Adagrad 8bit may work. AdamW 8bit doesn't seem to work.
94
+ - The LoRA training can be done with 12GB GPU memory.
95
+ - `--network_train_unet_only` option is highly recommended for SDXL LoRA. Because SDXL has two text encoders, the result of the training will be unexpected.
96
+ - PyTorch 2 seems to use slightly less GPU memory than PyTorch 1.
97
+ - `--bucket_reso_steps` can be set to 32 instead of the default value 64. Smaller values than 32 will not work for SDXL training.
98
+
99
+ Example of the optimizer settings for Adafactor with the fixed learning rate:
100
+ ```toml
101
+ optimizer_type = "adafactor"
102
+ optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False" ]
103
+ lr_scheduler = "constant_with_warmup"
104
+ lr_warmup_steps = 100
105
+ learning_rate = 4e-7 # SDXL original learning rate
106
+ ```
107
+
108
+ ### Format of Textual Inversion embeddings
109
+
110
+ ```python
111
+ from safetensors.torch import save_file
112
+
113
+ state_dict = {"clip_g": embs_for_text_encoder_1280, "clip_l": embs_for_text_encoder_768}
114
+ save_file(state_dict, file)
115
+ ```
116
+
117
+ ### TODO
118
+
119
+ - [ ] Support conversion of Diffusers SDXL models.
120
+ - [ ] Support `--weighted_captions` option.
121
+ - [ ] Change `--output_config` option to continue the training.
122
+ - [ ] Extend `--full_bf16` for all the scripts.
123
+ - [x] Support Textual Inversion training.
124
+
125
+ ## About requirements.txt
126
+
127
+ [![LoRA Part 2 Tutorial](https://img.youtube.com/vi/k5imq01uvUY/0.jpg)](https://www.youtube.com/watch?v=k5imq01uvUY)
128
+
129
+ Newer Tutorial: [Generate Studio Quality Realistic Photos By Kohya LoRA Stable Diffusion Training](https://www.youtube.com/watch?v=TpuDOsuKIBo):
130
+ The scripts are tested with PyTorch 1.12.1 and 2.0.1, Diffusers 0.17.1.
131
+
132
+ [![Newer Tutorial: Generate Studio Quality Realistic Photos By Kohya LoRA Stable Diffusion Training](https://user-images.githubusercontent.com/19240467/235306147-85dd8126-f397-406b-83f2-368927fa0281.png)](https://www.youtube.com/watch?v=TpuDOsuKIBo)
133
+
134
+ Newer Tutorial: [How To Install And Use Kohya LoRA GUI / Web UI on RunPod IO](https://www.youtube.com/watch?v=3uzCNrQao3o):
135
+
136
+ [![How To Install And Use Kohya LoRA GUI / Web UI on RunPod IO With Stable Diffusion & Automatic1111](https://github-production-user-asset-6210df.s3.amazonaws.com/19240467/238678226-0c9c3f7d-c308-4793-b790-999fdc271372.png)](https://www.youtube.com/watch?v=3uzCNrQao3o)
137
+
138
+ ## Installation
139
+
140
+ ### Windows
141
+
142
+ #### Windows Pre-requirements
143
+
144
+ To install the necessary dependencies on a Windows system, follow these steps:
145
+
146
+ 1. Install [Python 3.10](https://www.python.org/ftp/python/3.10.9/python-3.10.9-amd64.exe).
147
+ - During the installation process, ensure that you select the option to add Python to the 'PATH' environment variable.
148
+
149
+ 2. Install [Git](https://git-scm.com/download/win).
150
+
151
+ 3. Install the [Visual Studio 2015, 2017, 2019, and 2022 redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe).
152
+
153
+ #### Setup
154
+
155
+ To set up the project, follow these steps:
156
+
157
+ 1. Open a terminal and navigate to the desired installation directory.
158
+
159
+ 2. Clone the repository by running the following command:
160
+ ```
161
+ git clone https://github.com/bmaltais/kohya_ss.git
162
+ ```
163
+
164
+ 3. Change into the `kohya_ss` directory:
165
+ ```
166
+ cd kohya_ss
167
+ ```
168
+
169
+ 4. Run the setup script by executing the following command:
170
+ ```
171
+ .\setup.bat
172
+ ```
173
+
174
+ #### Optional: CUDNN 8.6
175
+
176
+ The following steps are optional but can improve the learning speed for owners of NVIDIA 30X0/40X0 GPUs. These steps enable larger training batch sizes and faster training speeds.
177
+
178
+ Please note that the CUDNN 8.6 DLLs needed for this process cannot be hosted on GitHub due to file size limitations. You can download them [here](https://github.com/bmaltais/python-library/raw/main/cudnn_windows.zip) to boost sample generation speed (almost 50% on a 4090 GPU). After downloading the ZIP file, follow the installation steps below:
179
+
180
+ 1. Unzip the downloaded file and place the `cudnn_windows` folder in the root directory of the `kohya_ss` repository.
181
+
182
+ 2. Run .\setup.bat and select the option to install cudann.
183
+
184
+ ### Linux and macOS
185
+
186
+ #### Linux Pre-requirements
187
+
188
+ To install the necessary dependencies on a Linux system, ensure that you fulfill the following requirements:
189
+
190
+ - Ensure that `venv` support is pre-installed. You can install it on Ubuntu 22.04 using the command:
191
+ ```
192
+ apt install python3.10-venv
193
+ ```
194
+
195
+ - Install the cudaNN drivers by following the instructions provided in [this link](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64).
196
+
197
+ - Make sure you have Python version 3.10.6 or higher (but lower than 3.11.0) installed on your system.
198
+
199
+ - If you are using WSL2, set the `LD_LIBRARY_PATH` environment variable by executing the following command:
200
+ ```
201
+ export LD_LIBRARY_PATH=/usr/lib/wsl/lib/
202
+ ```
203
+
204
+ #### Setup
205
+
206
+ To set up the project on Linux or macOS, perform the following steps:
207
+
208
+ 1. Open a terminal and navigate to the desired installation directory.
209
+
210
+ 2. Clone the repository by running the following command:
211
+ ```
212
+ git clone https://github.com/bmaltais/kohya_ss.git
213
+ ```
214
+
215
+ 3. Change into the `kohya_ss` directory:
216
+ ```
217
+ cd kohya_ss
218
+ ```
219
+
220
+ 4. If you encounter permission issues, make the `setup.sh` script executable by running the following command:
221
+ ```
222
+ chmod +x ./setup.sh
223
+ ```
224
+
225
+ 5. Run the setup script by executing the following command:
226
+ ```
227
+ ./setup.sh
228
+ ```
229
+
230
+ Note: If you need additional options or information about the runpod environment, you can use `setup.sh -h` or `setup.sh --help` to display the help message.
231
+
232
+ #### Install Location
233
+
234
+ The default installation location on Linux is the directory where the script is located. If a previous installation is detected in that location, the setup will proceed there. Otherwise, the installation will fall back to `/opt/kohya_ss`. If `/opt` is not writable, the fallback location will be `$HOME/kohya_ss`. Finally, if none of the previous options are viable, the installation will be performed in the current directory.
235
+
236
+ For macOS and other non-Linux systems, the installation process will attempt to detect the previous installation directory based on where the script is run. If a previous installation is not found, the default location will be `$HOME/kohya_ss`. You can override this behavior by specifying a custom installation directory using the `-d` or `--dir` option when running the setup script.
237
+
238
+ If you choose to use the interactive mode, the default values for the accelerate configuration screen will be "This machine," "None," and "No" for the remaining questions. These default answers are the same as the Windows installation.
239
+
240
+ ### Runpod
241
+ #### Manual installation
242
+
243
+ To install the necessary components for Runpod and run kohya_ss, follow these steps:
244
+
245
+ 1. Select the Runpod pytorch 2.0.1 template. This is important. Other templates may not work.
246
+
247
+ 2. SSH into the Runpod.
248
+
249
+ 3. Clone the repository by running the following command:
250
+ ```
251
+ cd /workspace
252
+ git clone https://github.com/bmaltais/kohya_ss.git
253
+ ```
254
+
255
+ 4. Run the setup script:
256
+ ```
257
+ cd kohya_ss
258
+ ./setup-runpod.sh
259
+ ```
260
+
261
+ 5. Run the gui with:
262
+ ```
263
+ ./gui.sh --share --headless
264
+ ```
265
+
266
+ or with this if you expose 7860 directly via the runpod configuration
267
+
268
+ ```
269
+ ./gui.sh --listen=0.0.0.0 --headless
270
+ ```
271
+
272
+ 6. Connect to the public URL displayed after the installation process is completed.
273
+
274
+ #### Pre-built Runpod template
275
+
276
+ To run from a pre-built Runpod template you can:
277
+
278
+ 1. Open the Runpod template by clicking on https://runpod.io/gsc?template=ya6013lj5a&ref=w18gds2n
279
+
280
+ 2. Deploy the template on the desired host
281
+
282
+ 3. Once deployed connect to the Runpod on HTTP 3010 to connect to kohya_ss GUI. You can also connect to auto1111 on HTTP 3000.
283
+
284
+
285
+ ### Docker
286
+ #### Local docker build
287
+
288
+ If you prefer to use Docker, follow the instructions below:
289
+
290
+ 1. Ensure that you have Git and Docker installed on your Windows or Linux system.
291
+
292
+ 2. Open your OS shell (Command Prompt or Terminal) and run the following commands:
293
+
294
+ ```bash
295
+ git clone https://github.com/bmaltais/kohya_ss.git
296
+ cd kohya_ss
297
+ docker compose build
298
+ docker compose run --service-ports kohya-ss-gui
299
+ ```
300
+
301
+ Note: The initial run may take up to 20 minutes to complete.
302
+
303
+ Please be aware of the following limitations when using Docker:
304
+
305
+ - All training data must be placed in the `dataset` subdirectory, as the Docker container cannot access files from other directories.
306
+ - The file picker feature is not functional. You need to manually set the folder path and config file path.
307
+ - Dialogs may not work as expected, and it is recommended to use unique file names to avoid conflicts.
308
+ - There is no built-in auto-update support. To update the system, you must run update scripts outside of Docker and rebuild using `docker compose build`.
309
+
310
+ If you are running Linux, an alternative Docker container port with fewer limitations is available [here](https://github.com/P2Enjoy/kohya_ss-docker).
311
+
312
+ #### ashleykleynhans runpod docker builds
313
+
314
+ You may want to use the following Dockerfile repos to build the images:
315
+
316
+ - Standalone Kohya_ss template: https://github.com/ashleykleynhans/kohya-docker
317
+ - Auto1111 + Kohya_ss GUI template: https://github.com/ashleykleynhans/stable-diffusion-docker
318
+
319
+ ## Upgrading
320
+
321
+ To upgrade your installation to a new version, follow the instructions below.
322
+
323
+ ### Windows Upgrade
324
+
325
+ If a new release becomes available, you can upgrade your repository by running the following commands from the root directory of the project:
326
+
327
+ 1. Pull the latest changes from the repository:
328
+ ```powershell
329
+ git pull
330
+ ```
331
+
332
+ 2. Run the setup script:
333
+ ```powershell
334
+ .\setup.bat
335
+ ```
336
+
337
+ ### Linux and macOS Upgrade
338
+
339
+ To upgrade your installation on Linux or macOS, follow these steps:
340
+
341
+ 1. Open a terminal and navigate to the root
342
+
343
+ directory of the project.
344
+
345
+ 2. Pull the latest changes from the repository:
346
+ ```bash
347
+ git pull
348
+ ```
349
+
350
+ 3. Refresh and update everything:
351
+ ```bash
352
+ ./setup.sh
353
+ ```
354
+
355
+ ## Starting GUI Service
356
+
357
+ To launch the GUI service, you can use the provided scripts or run the `kohya_gui.py` script directly. Use the command line arguments listed below to configure the underlying service.
358
+
359
+ ```text
360
+ --listen: Specify the IP address to listen on for connections to Gradio.
361
+ --username: Set a username for authentication.
362
+ --password: Set a password for authentication.
363
+ --server_port: Define the port to run the server listener on.
364
+ --inbrowser: Open the Gradio UI in a web browser.
365
+ --share: Share the Gradio UI.
366
+ ```
367
+
368
+ ### Launching the GUI on Windows
369
+
370
+ On Windows, you can use either the `gui.ps1` or `gui.bat` script located in the root directory. Choose the script that suits your preference and run it in a terminal, providing the desired command line arguments. Here's an example:
371
+
372
+ ```powershell
373
+ gui.ps1 --listen 127.0.0.1 --server_port 7860 --inbrowser --share
374
+ ```
375
+
376
+ or
377
+
378
+ ```powershell
379
+ gui.bat --listen 127.0.0.1 --server_port 7860 --inbrowser --share
380
+ ```
381
+
382
+ ### Launching the GUI on Linux and macOS
383
+
384
+ To launch the GUI on Linux or macOS, run the `gui.sh` script located in the root directory. Provide the desired command line arguments as follows:
385
+
386
+ ```bash
387
+ gui.sh --listen 127.0.0.1 --server_port 7860 --inbrowser --share
388
+ ```
389
+
390
+ ## Dreambooth
391
+
392
+ For specific instructions on using the Dreambooth solution, please refer to the [Dreambooth README](https://github.com/bmaltais/kohya_ss/blob/master/train_db_README.md).
393
+
394
+ ## Finetune
395
+
396
+ For specific instructions on using the Finetune solution, please refer to the [Finetune README](https://github.com/bmaltais/kohya_ss/blob/master/fine_tune_README.md).
397
+
398
+ ## Train Network
399
+
400
+ For specific instructions on training a network, please refer to the [Train network README](https://github.com/bmaltais/kohya_ss/blob/master/train_network_README.md).
401
+
402
+ ## LoRA
403
+
404
+ To train a LoRA, you can currently use the `train_network.py` code. You can create a LoRA network by using the all-in-one GUI.
405
+
406
+ Once you have created the LoRA network, you can generate images using auto1111 by installing [this extension](https://github.com/kohya-ss/sd-webui-additional-networks).
407
+
408
+ The following are the names of LoRA types used in this repository:
409
+
410
+ 1. LoRA-LierLa: LoRA for Linear layers and Conv2d layers with a 1x1 kernel.
411
+
412
+ 2. LoRA-C3Lier: LoRA for Conv2d layers with a 3x3 kernel, in addition to LoRA-LierLa.
413
+
414
+ LoRA-LierLa is the default LoRA type for `train_network.py` (without `conv_dim` network argument). You can use LoRA-LierLa with our extension for AUTOMATIC1111's Web UI or the built-in LoRA feature of the Web UI.
415
+
416
+ To use LoRA-C3Lier with the Web UI, please use our extension.
417
+
418
+ ## Sample image generation during training
419
+
420
+ A prompt file might look like this, for example:
421
+
422
+ ```
423
+ # prompt 1
424
+ masterpiece, best quality, (1girl), in white shirts, upper body, looking at viewer, simple background --n low quality, worst quality, bad anatomy, bad composition, poor, low effort --w 768 --h 768 --d 1 --l 7.5 --s 28
425
+
426
+ # prompt 2
427
+ masterpiece, best quality, 1boy, in business suit, standing at street, looking back --n (low quality, worst quality), bad anatomy, bad composition, poor, low effort --w 576 --h 832 --d 2 --l 5.5 --s 40
428
+ ```
429
+
430
+ Lines beginning with `#` are comments. You can specify options for the generated image with options like `--n` after the prompt. The following options can be used:
431
+
432
+ - `--n`: Negative prompt up to the next option.
433
+ - `--w`: Specifies the width of the generated image.
434
+ - `--h`: Specifies the height of the generated image.
435
+ - `--d`: Specifies the seed of the generated image.
436
+ - `--l`: Specifies the CFG scale of the generated image.
437
+ - `--s`: Specifies the number of steps in the generation.
438
+
439
+ The prompt weighting such as `( )` and `[ ]` are working.
440
+
441
+ ## Troubleshooting
442
+
443
+ If you encounter any issues, refer to the troubleshooting steps below.
444
+
445
+ ### Page File Limit
446
+
447
+ If you encounter an X error related to the page file, you may need to increase the page file size limit in Windows.
448
+
449
+ ### No module called tkinter
450
+
451
+ If you encounter an error indicating that the module `tkinter` is not found, try reinstalling Python 3.10 on your system.
452
+
453
+ ### FileNotFoundError
454
+
455
+ If you come across a `FileNotFoundError`, it is likely due to an installation issue. Make sure you do not have any locally installed Python modules that could conflict with the ones installed in the virtual environment. You can uninstall them by following these steps:
456
+
457
+ 1. Open a new PowerShell terminal and ensure that no virtual environment is active.
458
+
459
+ 2. Run the following commands to create a backup file of your locally installed pip packages and then uninstall them:
460
+ ```powershell
461
+ pip freeze > uninstall.txt
462
+ pip uninstall -r uninstall.txt
463
+ ```
464
+
465
+ After uninstalling the local packages, redo the installation steps within the `kohya_ss` virtual environment.
466
+
467
+ ## Change History
468
+
469
+ * 2023/07/11 (v21.8.2)
470
+ - Let Tensorboard works in docker #1137
471
+ - Fix for accelerate issue
472
+ - Add SDXL TI training support
473
+ - Rework gui for common layout
474
+ - More LoRA tools to class
475
+ - Add no_half_vae option to TI
XTI_hijack.py ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from typing import Union, List, Optional, Dict, Any, Tuple
3
+ from diffusers.models.unet_2d_condition import UNet2DConditionOutput
4
+
5
+ from library.original_unet import SampleOutput
6
+
7
+
8
+ def unet_forward_XTI(
9
+ self,
10
+ sample: torch.FloatTensor,
11
+ timestep: Union[torch.Tensor, float, int],
12
+ encoder_hidden_states: torch.Tensor,
13
+ class_labels: Optional[torch.Tensor] = None,
14
+ return_dict: bool = True,
15
+ ) -> Union[Dict, Tuple]:
16
+ r"""
17
+ Args:
18
+ sample (`torch.FloatTensor`): (batch, channel, height, width) noisy inputs tensor
19
+ timestep (`torch.FloatTensor` or `float` or `int`): (batch) timesteps
20
+ encoder_hidden_states (`torch.FloatTensor`): (batch, sequence_length, feature_dim) encoder hidden states
21
+ return_dict (`bool`, *optional*, defaults to `True`):
22
+ Whether or not to return a dict instead of a plain tuple.
23
+
24
+ Returns:
25
+ `SampleOutput` or `tuple`:
26
+ `SampleOutput` if `return_dict` is True, otherwise a `tuple`. When returning a tuple, the first element is the sample tensor.
27
+ """
28
+ # By default samples have to be AT least a multiple of the overall upsampling factor.
29
+ # The overall upsampling factor is equal to 2 ** (# num of upsampling layears).
30
+ # However, the upsampling interpolation output size can be forced to fit any upsampling size
31
+ # on the fly if necessary.
32
+ # デフォルトではサンプルは「2^アップサンプルの数」、つまり64の倍数である必要がある
33
+ # ただそれ以外のサイズにも対応できるように、必要ならアップサンプルのサイズを変更する
34
+ # 多分画質が悪くなるので、64で割り切れるようにしておくのが良い
35
+ default_overall_up_factor = 2**self.num_upsamplers
36
+
37
+ # upsample size should be forwarded when sample is not a multiple of `default_overall_up_factor`
38
+ # 64で割り切れないときはupsamplerにサイズを伝える
39
+ forward_upsample_size = False
40
+ upsample_size = None
41
+
42
+ if any(s % default_overall_up_factor != 0 for s in sample.shape[-2:]):
43
+ # logger.info("Forward upsample size to force interpolation output size.")
44
+ forward_upsample_size = True
45
+
46
+ # 1. time
47
+ timesteps = timestep
48
+ timesteps = self.handle_unusual_timesteps(sample, timesteps) # 変な時だけ処理
49
+
50
+ t_emb = self.time_proj(timesteps)
51
+
52
+ # timesteps does not contain any weights and will always return f32 tensors
53
+ # but time_embedding might actually be running in fp16. so we need to cast here.
54
+ # there might be better ways to encapsulate this.
55
+ # timestepsは重みを含まないので常にfloat32のテンソルを返す
56
+ # しかしtime_embeddingはfp16で動いているかもしれないので、ここでキャストする必要がある
57
+ # time_projでキャストしておけばいいんじゃね?
58
+ t_emb = t_emb.to(dtype=self.dtype)
59
+ emb = self.time_embedding(t_emb)
60
+
61
+ # 2. pre-process
62
+ sample = self.conv_in(sample)
63
+
64
+ # 3. down
65
+ down_block_res_samples = (sample,)
66
+ down_i = 0
67
+ for downsample_block in self.down_blocks:
68
+ # downblockはforwardで必ずencoder_hidden_statesを受け取るようにしても良さそうだけど、
69
+ # まあこちらのほうがわかりやすいかもしれない
70
+ if downsample_block.has_cross_attention:
71
+ sample, res_samples = downsample_block(
72
+ hidden_states=sample,
73
+ temb=emb,
74
+ encoder_hidden_states=encoder_hidden_states[down_i : down_i + 2],
75
+ )
76
+ down_i += 2
77
+ else:
78
+ sample, res_samples = downsample_block(hidden_states=sample, temb=emb)
79
+
80
+ down_block_res_samples += res_samples
81
+
82
+ # 4. mid
83
+ sample = self.mid_block(sample, emb, encoder_hidden_states=encoder_hidden_states[6])
84
+
85
+ # 5. up
86
+ up_i = 7
87
+ for i, upsample_block in enumerate(self.up_blocks):
88
+ is_final_block = i == len(self.up_blocks) - 1
89
+
90
+ res_samples = down_block_res_samples[-len(upsample_block.resnets) :]
91
+ down_block_res_samples = down_block_res_samples[: -len(upsample_block.resnets)] # skip connection
92
+
93
+ # if we have not reached the final block and need to forward the upsample size, we do it here
94
+ # 前述のように最後のブロック以外ではupsample_sizeを伝える
95
+ if not is_final_block and forward_upsample_size:
96
+ upsample_size = down_block_res_samples[-1].shape[2:]
97
+
98
+ if upsample_block.has_cross_attention:
99
+ sample = upsample_block(
100
+ hidden_states=sample,
101
+ temb=emb,
102
+ res_hidden_states_tuple=res_samples,
103
+ encoder_hidden_states=encoder_hidden_states[up_i : up_i + 3],
104
+ upsample_size=upsample_size,
105
+ )
106
+ up_i += 3
107
+ else:
108
+ sample = upsample_block(
109
+ hidden_states=sample, temb=emb, res_hidden_states_tuple=res_samples, upsample_size=upsample_size
110
+ )
111
+
112
+ # 6. post-process
113
+ sample = self.conv_norm_out(sample)
114
+ sample = self.conv_act(sample)
115
+ sample = self.conv_out(sample)
116
+
117
+ if not return_dict:
118
+ return (sample,)
119
+
120
+ return SampleOutput(sample=sample)
121
+
122
+
123
+ def downblock_forward_XTI(
124
+ self, hidden_states, temb=None, encoder_hidden_states=None, attention_mask=None, cross_attention_kwargs=None
125
+ ):
126
+ output_states = ()
127
+ i = 0
128
+
129
+ for resnet, attn in zip(self.resnets, self.attentions):
130
+ if self.training and self.gradient_checkpointing:
131
+
132
+ def create_custom_forward(module, return_dict=None):
133
+ def custom_forward(*inputs):
134
+ if return_dict is not None:
135
+ return module(*inputs, return_dict=return_dict)
136
+ else:
137
+ return module(*inputs)
138
+
139
+ return custom_forward
140
+
141
+ hidden_states = torch.utils.checkpoint.checkpoint(create_custom_forward(resnet), hidden_states, temb)
142
+ hidden_states = torch.utils.checkpoint.checkpoint(
143
+ create_custom_forward(attn, return_dict=False), hidden_states, encoder_hidden_states[i]
144
+ )[0]
145
+ else:
146
+ hidden_states = resnet(hidden_states, temb)
147
+ hidden_states = attn(hidden_states, encoder_hidden_states=encoder_hidden_states[i]).sample
148
+
149
+ output_states += (hidden_states,)
150
+ i += 1
151
+
152
+ if self.downsamplers is not None:
153
+ for downsampler in self.downsamplers:
154
+ hidden_states = downsampler(hidden_states)
155
+
156
+ output_states += (hidden_states,)
157
+
158
+ return hidden_states, output_states
159
+
160
+
161
+ def upblock_forward_XTI(
162
+ self,
163
+ hidden_states,
164
+ res_hidden_states_tuple,
165
+ temb=None,
166
+ encoder_hidden_states=None,
167
+ upsample_size=None,
168
+ ):
169
+ i = 0
170
+ for resnet, attn in zip(self.resnets, self.attentions):
171
+ # pop res hidden states
172
+ res_hidden_states = res_hidden_states_tuple[-1]
173
+ res_hidden_states_tuple = res_hidden_states_tuple[:-1]
174
+ hidden_states = torch.cat([hidden_states, res_hidden_states], dim=1)
175
+
176
+ if self.training and self.gradient_checkpointing:
177
+
178
+ def create_custom_forward(module, return_dict=None):
179
+ def custom_forward(*inputs):
180
+ if return_dict is not None:
181
+ return module(*inputs, return_dict=return_dict)
182
+ else:
183
+ return module(*inputs)
184
+
185
+ return custom_forward
186
+
187
+ hidden_states = torch.utils.checkpoint.checkpoint(create_custom_forward(resnet), hidden_states, temb)
188
+ hidden_states = torch.utils.checkpoint.checkpoint(
189
+ create_custom_forward(attn, return_dict=False), hidden_states, encoder_hidden_states[i]
190
+ )[0]
191
+ else:
192
+ hidden_states = resnet(hidden_states, temb)
193
+ hidden_states = attn(hidden_states, encoder_hidden_states=encoder_hidden_states[i]).sample
194
+
195
+ i += 1
196
+
197
+ if self.upsamplers is not None:
198
+ for upsampler in self.upsamplers:
199
+ hidden_states = upsampler(hidden_states, upsample_size)
200
+
201
+ return hidden_states
__pycache__/dreambooth_gui.cpython-310.pyc ADDED
Binary file (14.5 kB). View file
 
__pycache__/finetune_gui.cpython-310.pyc ADDED
Binary file (16.6 kB). View file
 
__pycache__/lora_gui.cpython-310.pyc ADDED
Binary file (26 kB). View file
 
__pycache__/textual_inversion_gui.cpython-310.pyc ADDED
Binary file (15.6 kB). View file
 
_typos.toml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Files for typos
2
+ # Instruction: https://github.com/marketplace/actions/typos-action#getting-started
3
+
4
+ [default.extend-identifiers]
5
+
6
+ [default.extend-words]
7
+ NIN="NIN"
8
+ parms="parms"
9
+ nin="nin"
10
+ extention="extention" # Intentionally left
11
+ nd="nd"
12
+
13
+
14
+ [files]
15
+ extend-exclude = ["_typos.toml"]
activate.ps1 ADDED
@@ -0,0 +1 @@
 
 
1
+ .\venv\Scripts\activate
bitsandbytes_windows/cextension.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import ctypes as ct
2
+ from pathlib import Path
3
+ from warnings import warn
4
+
5
+ from .cuda_setup.main import evaluate_cuda_setup
6
+
7
+
8
+ class CUDALibrary_Singleton(object):
9
+ _instance = None
10
+
11
+ def __init__(self):
12
+ raise RuntimeError("Call get_instance() instead")
13
+
14
+ def initialize(self):
15
+ binary_name = evaluate_cuda_setup()
16
+ package_dir = Path(__file__).parent
17
+ binary_path = package_dir / binary_name
18
+
19
+ if not binary_path.exists():
20
+ print(f"CUDA SETUP: TODO: compile library for specific version: {binary_name}")
21
+ legacy_binary_name = "libbitsandbytes.so"
22
+ print(f"CUDA SETUP: Defaulting to {legacy_binary_name}...")
23
+ binary_path = package_dir / legacy_binary_name
24
+ if not binary_path.exists():
25
+ print('CUDA SETUP: CUDA detection failed. Either CUDA driver not installed, CUDA not installed, or you have multiple conflicting CUDA libraries!')
26
+ print('CUDA SETUP: If you compiled from source, try again with `make CUDA_VERSION=DETECTED_CUDA_VERSION` for example, `make CUDA_VERSION=113`.')
27
+ raise Exception('CUDA SETUP: Setup Failed!')
28
+ # self.lib = ct.cdll.LoadLibrary(binary_path)
29
+ self.lib = ct.cdll.LoadLibrary(str(binary_path)) # $$$
30
+ else:
31
+ print(f"CUDA SETUP: Loading binary {binary_path}...")
32
+ # self.lib = ct.cdll.LoadLibrary(binary_path)
33
+ self.lib = ct.cdll.LoadLibrary(str(binary_path)) # $$$
34
+
35
+ @classmethod
36
+ def get_instance(cls):
37
+ if cls._instance is None:
38
+ cls._instance = cls.__new__(cls)
39
+ cls._instance.initialize()
40
+ return cls._instance
41
+
42
+
43
+ lib = CUDALibrary_Singleton.get_instance().lib
44
+ try:
45
+ lib.cadam32bit_g32
46
+ lib.get_context.restype = ct.c_void_p
47
+ lib.get_cusparse.restype = ct.c_void_p
48
+ COMPILED_WITH_CUDA = True
49
+ except AttributeError:
50
+ warn(
51
+ "The installed version of bitsandbytes was compiled without GPU support. "
52
+ "8-bit optimizers and GPU quantization are unavailable."
53
+ )
54
+ COMPILED_WITH_CUDA = False
bitsandbytes_windows/libbitsandbytes_cpu.dll ADDED
Binary file (76.3 kB). View file
 
bitsandbytes_windows/libbitsandbytes_cuda116.dll ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:88f7bd2916ca3effc43f88492f1e1b9088d13cb5be3b4a3a4aede6aa3bf8d412
3
+ size 4724224
bitsandbytes_windows/main.py ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ extract factors the build is dependent on:
3
+ [X] compute capability
4
+ [ ] TODO: Q - What if we have multiple GPUs of different makes?
5
+ - CUDA version
6
+ - Software:
7
+ - CPU-only: only CPU quantization functions (no optimizer, no matrix multiple)
8
+ - CuBLAS-LT: full-build 8-bit optimizer
9
+ - no CuBLAS-LT: no 8-bit matrix multiplication (`nomatmul`)
10
+
11
+ evaluation:
12
+ - if paths faulty, return meaningful error
13
+ - else:
14
+ - determine CUDA version
15
+ - determine capabilities
16
+ - based on that set the default path
17
+ """
18
+
19
+ import ctypes
20
+
21
+ from .paths import determine_cuda_runtime_lib_path
22
+
23
+
24
+ def check_cuda_result(cuda, result_val):
25
+ # 3. Check for CUDA errors
26
+ if result_val != 0:
27
+ error_str = ctypes.c_char_p()
28
+ cuda.cuGetErrorString(result_val, ctypes.byref(error_str))
29
+ print(f"CUDA exception! Error code: {error_str.value.decode()}")
30
+
31
+ def get_cuda_version(cuda, cudart_path):
32
+ # https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART____VERSION.html#group__CUDART____VERSION
33
+ try:
34
+ cudart = ctypes.CDLL(cudart_path)
35
+ except OSError:
36
+ # TODO: shouldn't we error or at least warn here?
37
+ print(f'ERROR: libcudart.so could not be read from path: {cudart_path}!')
38
+ return None
39
+
40
+ version = ctypes.c_int()
41
+ check_cuda_result(cuda, cudart.cudaRuntimeGetVersion(ctypes.byref(version)))
42
+ version = int(version.value)
43
+ major = version//1000
44
+ minor = (version-(major*1000))//10
45
+
46
+ if major < 11:
47
+ print('CUDA SETUP: CUDA version lower than 11 are currently not supported for LLM.int8(). You will be only to use 8-bit optimizers and quantization routines!!')
48
+
49
+ return f'{major}{minor}'
50
+
51
+
52
+ def get_cuda_lib_handle():
53
+ # 1. find libcuda.so library (GPU driver) (/usr/lib)
54
+ try:
55
+ cuda = ctypes.CDLL("libcuda.so")
56
+ except OSError:
57
+ # TODO: shouldn't we error or at least warn here?
58
+ print('CUDA SETUP: WARNING! libcuda.so not found! Do you have a CUDA driver installed? If you are on a cluster, make sure you are on a CUDA machine!')
59
+ return None
60
+ check_cuda_result(cuda, cuda.cuInit(0))
61
+
62
+ return cuda
63
+
64
+
65
+ def get_compute_capabilities(cuda):
66
+ """
67
+ 1. find libcuda.so library (GPU driver) (/usr/lib)
68
+ init_device -> init variables -> call function by reference
69
+ 2. call extern C function to determine CC
70
+ (https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__DEVICE__DEPRECATED.html)
71
+ 3. Check for CUDA errors
72
+ https://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda-runtime-api
73
+ # bits taken from https://gist.github.com/f0k/63a664160d016a491b2cbea15913d549
74
+ """
75
+
76
+
77
+ nGpus = ctypes.c_int()
78
+ cc_major = ctypes.c_int()
79
+ cc_minor = ctypes.c_int()
80
+
81
+ device = ctypes.c_int()
82
+
83
+ check_cuda_result(cuda, cuda.cuDeviceGetCount(ctypes.byref(nGpus)))
84
+ ccs = []
85
+ for i in range(nGpus.value):
86
+ check_cuda_result(cuda, cuda.cuDeviceGet(ctypes.byref(device), i))
87
+ ref_major = ctypes.byref(cc_major)
88
+ ref_minor = ctypes.byref(cc_minor)
89
+ # 2. call extern C function to determine CC
90
+ check_cuda_result(
91
+ cuda, cuda.cuDeviceComputeCapability(ref_major, ref_minor, device)
92
+ )
93
+ ccs.append(f"{cc_major.value}.{cc_minor.value}")
94
+
95
+ return ccs
96
+
97
+
98
+ # def get_compute_capability()-> Union[List[str, ...], None]: # FIXME: error
99
+ def get_compute_capability(cuda):
100
+ """
101
+ Extracts the highest compute capbility from all available GPUs, as compute
102
+ capabilities are downwards compatible. If no GPUs are detected, it returns
103
+ None.
104
+ """
105
+ ccs = get_compute_capabilities(cuda)
106
+ if ccs is not None:
107
+ # TODO: handle different compute capabilities; for now, take the max
108
+ return ccs[-1]
109
+ return None
110
+
111
+
112
+ def evaluate_cuda_setup():
113
+ print('')
114
+ print('='*35 + 'BUG REPORT' + '='*35)
115
+ print('Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues')
116
+ print('For effortless bug reporting copy-paste your error into this form: https://docs.google.com/forms/d/e/1FAIpQLScPB8emS3Thkp66nvqwmjTEgxp8Y9ufuWTzFyr9kJ5AoI47dQ/viewform?usp=sf_link')
117
+ print('='*80)
118
+ return "libbitsandbytes_cuda116.dll" # $$$
119
+
120
+ binary_name = "libbitsandbytes_cpu.so"
121
+ #if not torch.cuda.is_available():
122
+ #print('No GPU detected. Loading CPU library...')
123
+ #return binary_name
124
+
125
+ cudart_path = determine_cuda_runtime_lib_path()
126
+ if cudart_path is None:
127
+ print(
128
+ "WARNING: No libcudart.so found! Install CUDA or the cudatoolkit package (anaconda)!"
129
+ )
130
+ return binary_name
131
+
132
+ print(f"CUDA SETUP: CUDA runtime path found: {cudart_path}")
133
+ cuda = get_cuda_lib_handle()
134
+ cc = get_compute_capability(cuda)
135
+ print(f"CUDA SETUP: Highest compute capability among GPUs detected: {cc}")
136
+ cuda_version_string = get_cuda_version(cuda, cudart_path)
137
+
138
+
139
+ if cc == '':
140
+ print(
141
+ "WARNING: No GPU detected! Check your CUDA paths. Processing to load CPU-only library..."
142
+ )
143
+ return binary_name
144
+
145
+ # 7.5 is the minimum CC vor cublaslt
146
+ has_cublaslt = cc in ["7.5", "8.0", "8.6"]
147
+
148
+ # TODO:
149
+ # (1) CUDA missing cases (no CUDA installed by CUDA driver (nvidia-smi accessible)
150
+ # (2) Multiple CUDA versions installed
151
+
152
+ # we use ls -l instead of nvcc to determine the cuda version
153
+ # since most installations will have the libcudart.so installed, but not the compiler
154
+ print(f'CUDA SETUP: Detected CUDA version {cuda_version_string}')
155
+
156
+ def get_binary_name():
157
+ "if not has_cublaslt (CC < 7.5), then we have to choose _nocublaslt.so"
158
+ bin_base_name = "libbitsandbytes_cuda"
159
+ if has_cublaslt:
160
+ return f"{bin_base_name}{cuda_version_string}.so"
161
+ else:
162
+ return f"{bin_base_name}{cuda_version_string}_nocublaslt.so"
163
+
164
+ binary_name = get_binary_name()
165
+
166
+ return binary_name
config_files/accelerate/default_config.yaml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ command_file: null
2
+ commands: null
3
+ compute_environment: LOCAL_MACHINE
4
+ deepspeed_config: {}
5
+ distributed_type: 'NO'
6
+ downcast_bf16: 'no'
7
+ dynamo_backend: 'NO'
8
+ fsdp_config: {}
9
+ gpu_ids: all
10
+ machine_rank: 0
11
+ main_process_ip: null
12
+ main_process_port: null
13
+ main_training_function: main
14
+ megatron_lm_config: {}
15
+ mixed_precision: 'no'
16
+ num_machines: 1
17
+ num_processes: 1
18
+ rdzv_backend: static
19
+ same_network: true
20
+ tpu_name: null
21
+ tpu_zone: null
22
+ use_cpu: false
config_files/accelerate/runpod.yaml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ command_file: null
2
+ commands: null
3
+ compute_environment: LOCAL_MACHINE
4
+ deepspeed_config: {}
5
+ distributed_type: 'NO'
6
+ downcast_bf16: 'no'
7
+ dynamo_backend: 'NO'
8
+ fsdp_config: {}
9
+ gpu_ids: all
10
+ machine_rank: 0
11
+ main_process_ip: null
12
+ main_process_port: null
13
+ main_training_function: main
14
+ megatron_lm_config: {}
15
+ mixed_precision: 'no'
16
+ num_machines: 1
17
+ num_processes: 1
18
+ rdzv_backend: static
19
+ same_network: true
20
+ tpu_name: null
21
+ tpu_zone: null
22
+ use_cpu: false
convert_original_stable_diffusion_to_diffusers.py ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2023 The HuggingFace Inc. team.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """ Conversion script for the LDM checkpoints. """
16
+
17
+ import argparse
18
+
19
+ import torch
20
+
21
+ from diffusers.pipelines.stable_diffusion.convert_from_ckpt import download_from_original_stable_diffusion_ckpt
22
+
23
+
24
+ if __name__ == "__main__":
25
+ parser = argparse.ArgumentParser()
26
+
27
+ parser.add_argument(
28
+ "--checkpoint_path", default=None, type=str, required=True, help="Path to the checkpoint to convert."
29
+ )
30
+ # !wget https://raw.githubusercontent.com/CompVis/stable-diffusion/main/configs/stable-diffusion/v1-inference.yaml
31
+ parser.add_argument(
32
+ "--original_config_file",
33
+ default=None,
34
+ type=str,
35
+ help="The YAML config file corresponding to the original architecture.",
36
+ )
37
+ parser.add_argument(
38
+ "--num_in_channels",
39
+ default=None,
40
+ type=int,
41
+ help="The number of input channels. If `None` number of input channels will be automatically inferred.",
42
+ )
43
+ parser.add_argument(
44
+ "--scheduler_type",
45
+ default="pndm",
46
+ type=str,
47
+ help="Type of scheduler to use. Should be one of ['pndm', 'lms', 'ddim', 'euler', 'euler-ancestral', 'dpm']",
48
+ )
49
+ parser.add_argument(
50
+ "--pipeline_type",
51
+ default=None,
52
+ type=str,
53
+ help=(
54
+ "The pipeline type. One of 'FrozenOpenCLIPEmbedder', 'FrozenCLIPEmbedder', 'PaintByExample'"
55
+ ". If `None` pipeline will be automatically inferred."
56
+ ),
57
+ )
58
+ parser.add_argument(
59
+ "--image_size",
60
+ default=None,
61
+ type=int,
62
+ help=(
63
+ "The image size that the model was trained on. Use 512 for Stable Diffusion v1.X and Stable Siffusion v2"
64
+ " Base. Use 768 for Stable Diffusion v2."
65
+ ),
66
+ )
67
+ parser.add_argument(
68
+ "--prediction_type",
69
+ default=None,
70
+ type=str,
71
+ help=(
72
+ "The prediction type that the model was trained on. Use 'epsilon' for Stable Diffusion v1.X and Stable"
73
+ " Diffusion v2 Base. Use 'v_prediction' for Stable Diffusion v2."
74
+ ),
75
+ )
76
+ parser.add_argument(
77
+ "--extract_ema",
78
+ action="store_true",
79
+ help=(
80
+ "Only relevant for checkpoints that have both EMA and non-EMA weights. Whether to extract the EMA weights"
81
+ " or not. Defaults to `False`. Add `--extract_ema` to extract the EMA weights. EMA weights usually yield"
82
+ " higher quality images for inference. Non-EMA weights are usually better to continue fine-tuning."
83
+ ),
84
+ )
85
+ parser.add_argument(
86
+ "--upcast_attention",
87
+ action="store_true",
88
+ help=(
89
+ "Whether the attention computation should always be upcasted. This is necessary when running stable"
90
+ " diffusion 2.1."
91
+ ),
92
+ )
93
+ parser.add_argument(
94
+ "--from_safetensors",
95
+ action="store_true",
96
+ help="If `--checkpoint_path` is in `safetensors` format, load checkpoint with safetensors instead of PyTorch.",
97
+ )
98
+ parser.add_argument(
99
+ "--to_safetensors",
100
+ action="store_true",
101
+ help="Whether to store pipeline in safetensors format or not.",
102
+ )
103
+ parser.add_argument("--dump_path", default=None, type=str, required=True, help="Path to the output model.")
104
+ parser.add_argument("--device", type=str, help="Device to use (e.g. cpu, cuda:0, cuda:1, etc.)")
105
+ parser.add_argument(
106
+ "--stable_unclip",
107
+ type=str,
108
+ default=None,
109
+ required=False,
110
+ help="Set if this is a stable unCLIP model. One of 'txt2img' or 'img2img'.",
111
+ )
112
+ parser.add_argument(
113
+ "--stable_unclip_prior",
114
+ type=str,
115
+ default=None,
116
+ required=False,
117
+ help="Set if this is a stable unCLIP txt2img model. Selects which prior to use. If `--stable_unclip` is set to `txt2img`, the karlo prior (https://huggingface.co/kakaobrain/karlo-v1-alpha/tree/main/prior) is selected by default.",
118
+ )
119
+ parser.add_argument(
120
+ "--clip_stats_path",
121
+ type=str,
122
+ help="Path to the clip stats file. Only required if the stable unclip model's config specifies `model.params.noise_aug_config.params.clip_stats_path`.",
123
+ required=False,
124
+ )
125
+ parser.add_argument(
126
+ "--controlnet", action="store_true", default=None, help="Set flag if this is a controlnet checkpoint."
127
+ )
128
+ parser.add_argument("--half", action="store_true", help="Save weights in half precision.")
129
+ args = parser.parse_args()
130
+
131
+ pipe = download_from_original_stable_diffusion_ckpt(
132
+ checkpoint_path=args.checkpoint_path,
133
+ original_config_file=args.original_config_file,
134
+ image_size=args.image_size,
135
+ prediction_type=args.prediction_type,
136
+ model_type=args.pipeline_type,
137
+ extract_ema=args.extract_ema,
138
+ scheduler_type=args.scheduler_type,
139
+ num_in_channels=args.num_in_channels,
140
+ upcast_attention=args.upcast_attention,
141
+ from_safetensors=args.from_safetensors,
142
+ device=args.device,
143
+ stable_unclip=args.stable_unclip,
144
+ stable_unclip_prior=args.stable_unclip_prior,
145
+ clip_stats_path=args.clip_stats_path,
146
+ controlnet=args.controlnet,
147
+ )
148
+
149
+ if args.half:
150
+ pipe.to(torch_dtype=torch.float16)
151
+
152
+ if args.controlnet:
153
+ # only save the controlnet model
154
+ pipe.controlnet.save_pretrained(args.dump_path, safe_serialization=args.to_safetensors)
155
+ else:
156
+ pipe.save_pretrained(args.dump_path, safe_serialization=args.to_safetensors)
convert_original_stable_diffusion_to_diffusers.py.1 ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2023 The HuggingFace Inc. team.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """ Conversion script for the LDM checkpoints. """
16
+
17
+ import argparse
18
+
19
+ import torch
20
+
21
+ from diffusers.pipelines.stable_diffusion.convert_from_ckpt import download_from_original_stable_diffusion_ckpt
22
+
23
+
24
+ if __name__ == "__main__":
25
+ parser = argparse.ArgumentParser()
26
+
27
+ parser.add_argument(
28
+ "--checkpoint_path", default=None, type=str, required=True, help="Path to the checkpoint to convert."
29
+ )
30
+ # !wget https://raw.githubusercontent.com/CompVis/stable-diffusion/main/configs/stable-diffusion/v1-inference.yaml
31
+ parser.add_argument(
32
+ "--original_config_file",
33
+ default=None,
34
+ type=str,
35
+ help="The YAML config file corresponding to the original architecture.",
36
+ )
37
+ parser.add_argument(
38
+ "--num_in_channels",
39
+ default=None,
40
+ type=int,
41
+ help="The number of input channels. If `None` number of input channels will be automatically inferred.",
42
+ )
43
+ parser.add_argument(
44
+ "--scheduler_type",
45
+ default="pndm",
46
+ type=str,
47
+ help="Type of scheduler to use. Should be one of ['pndm', 'lms', 'ddim', 'euler', 'euler-ancestral', 'dpm']",
48
+ )
49
+ parser.add_argument(
50
+ "--pipeline_type",
51
+ default=None,
52
+ type=str,
53
+ help=(
54
+ "The pipeline type. One of 'FrozenOpenCLIPEmbedder', 'FrozenCLIPEmbedder', 'PaintByExample'"
55
+ ". If `None` pipeline will be automatically inferred."
56
+ ),
57
+ )
58
+ parser.add_argument(
59
+ "--image_size",
60
+ default=None,
61
+ type=int,
62
+ help=(
63
+ "The image size that the model was trained on. Use 512 for Stable Diffusion v1.X and Stable Siffusion v2"
64
+ " Base. Use 768 for Stable Diffusion v2."
65
+ ),
66
+ )
67
+ parser.add_argument(
68
+ "--prediction_type",
69
+ default=None,
70
+ type=str,
71
+ help=(
72
+ "The prediction type that the model was trained on. Use 'epsilon' for Stable Diffusion v1.X and Stable"
73
+ " Diffusion v2 Base. Use 'v_prediction' for Stable Diffusion v2."
74
+ ),
75
+ )
76
+ parser.add_argument(
77
+ "--extract_ema",
78
+ action="store_true",
79
+ help=(
80
+ "Only relevant for checkpoints that have both EMA and non-EMA weights. Whether to extract the EMA weights"
81
+ " or not. Defaults to `False`. Add `--extract_ema` to extract the EMA weights. EMA weights usually yield"
82
+ " higher quality images for inference. Non-EMA weights are usually better to continue fine-tuning."
83
+ ),
84
+ )
85
+ parser.add_argument(
86
+ "--upcast_attention",
87
+ action="store_true",
88
+ help=(
89
+ "Whether the attention computation should always be upcasted. This is necessary when running stable"
90
+ " diffusion 2.1."
91
+ ),
92
+ )
93
+ parser.add_argument(
94
+ "--from_safetensors",
95
+ action="store_true",
96
+ help="If `--checkpoint_path` is in `safetensors` format, load checkpoint with safetensors instead of PyTorch.",
97
+ )
98
+ parser.add_argument(
99
+ "--to_safetensors",
100
+ action="store_true",
101
+ help="Whether to store pipeline in safetensors format or not.",
102
+ )
103
+ parser.add_argument("--dump_path", default=None, type=str, required=True, help="Path to the output model.")
104
+ parser.add_argument("--device", type=str, help="Device to use (e.g. cpu, cuda:0, cuda:1, etc.)")
105
+ parser.add_argument(
106
+ "--stable_unclip",
107
+ type=str,
108
+ default=None,
109
+ required=False,
110
+ help="Set if this is a stable unCLIP model. One of 'txt2img' or 'img2img'.",
111
+ )
112
+ parser.add_argument(
113
+ "--stable_unclip_prior",
114
+ type=str,
115
+ default=None,
116
+ required=False,
117
+ help="Set if this is a stable unCLIP txt2img model. Selects which prior to use. If `--stable_unclip` is set to `txt2img`, the karlo prior (https://huggingface.co/kakaobrain/karlo-v1-alpha/tree/main/prior) is selected by default.",
118
+ )
119
+ parser.add_argument(
120
+ "--clip_stats_path",
121
+ type=str,
122
+ help="Path to the clip stats file. Only required if the stable unclip model's config specifies `model.params.noise_aug_config.params.clip_stats_path`.",
123
+ required=False,
124
+ )
125
+ parser.add_argument(
126
+ "--controlnet", action="store_true", default=None, help="Set flag if this is a controlnet checkpoint."
127
+ )
128
+ parser.add_argument("--half", action="store_true", help="Save weights in half precision.")
129
+ args = parser.parse_args()
130
+
131
+ pipe = download_from_original_stable_diffusion_ckpt(
132
+ checkpoint_path=args.checkpoint_path,
133
+ original_config_file=args.original_config_file,
134
+ image_size=args.image_size,
135
+ prediction_type=args.prediction_type,
136
+ model_type=args.pipeline_type,
137
+ extract_ema=args.extract_ema,
138
+ scheduler_type=args.scheduler_type,
139
+ num_in_channels=args.num_in_channels,
140
+ upcast_attention=args.upcast_attention,
141
+ from_safetensors=args.from_safetensors,
142
+ device=args.device,
143
+ stable_unclip=args.stable_unclip,
144
+ stable_unclip_prior=args.stable_unclip_prior,
145
+ clip_stats_path=args.clip_stats_path,
146
+ controlnet=args.controlnet,
147
+ )
148
+
149
+ if args.half:
150
+ pipe.to(torch_dtype=torch.float16)
151
+
152
+ if args.controlnet:
153
+ # only save the controlnet model
154
+ pipe.controlnet.save_pretrained(args.dump_path, safe_serialization=args.to_safetensors)
155
+ else:
156
+ pipe.save_pretrained(args.dump_path, safe_serialization=args.to_safetensors)
convert_original_stable_diffusion_to_diffusers.py.2 ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ # Copyright 2023 The HuggingFace Inc. team.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """ Conversion script for the LDM checkpoints. """
16
+
17
+ import argparse
18
+
19
+ import torch
20
+
21
+ from diffusers.pipelines.stable_diffusion.convert_from_ckpt import download_from_original_stable_diffusion_ckpt
22
+
23
+
24
+ if __name__ == "__main__":
25
+ parser = argparse.ArgumentParser()
26
+
27
+ parser.add_argument(
28
+ "--checkpoint_path", default=None, type=str, required=True, help="Path to the checkpoint to convert."
29
+ )
30
+ # !wget https://raw.githubusercontent.com/CompVis/stable-diffusion/main/configs/stable-diffusion/v1-inference.yaml
31
+ parser.add_argument(
32
+ "--original_config_file",
33
+ default=None,
34
+ type=str,
35
+ help="The YAML config file corresponding to the original architecture.",
36
+ )
37
+ parser.add_argument(
38
+ "--num_in_channels",
39
+ default=None,
40
+ type=int,
41
+ help="The number of input channels. If `None` number of input channels will be automatically inferred.",
42
+ )
43
+ parser.add_argument(
44
+ "--scheduler_type",
45
+ default="pndm",
46
+ type=str,
47
+ help="Type of scheduler to use. Should be one of ['pndm', 'lms', 'ddim', 'euler', 'euler-ancestral', 'dpm']",
48
+ )
49
+ parser.add_argument(
50
+ "--pipeline_type",
51
+ default=None,
52
+ type=str,
53
+ help=(
54
+ "The pipeline type. One of 'FrozenOpenCLIPEmbedder', 'FrozenCLIPEmbedder', 'PaintByExample'"
55
+ ". If `None` pipeline will be automatically inferred."
56
+ ),
57
+ )
58
+ parser.add_argument(
59
+ "--image_size",
60
+ default=None,
61
+ type=int,
62
+ help=(
63
+ "The image size that the model was trained on. Use 512 for Stable Diffusion v1.X and Stable Siffusion v2"
64
+ " Base. Use 768 for Stable Diffusion v2."
65
+ ),
66
+ )
67
+ parser.add_argument(
68
+ "--prediction_type",
69
+ default=None,
70
+ type=str,
71
+ help=(
72
+ "The prediction type that the model was trained on. Use 'epsilon' for Stable Diffusion v1.X and Stable"
73
+ " Diffusion v2 Base. Use 'v_prediction' for Stable Diffusion v2."
74
+ ),
75
+ )
76
+ parser.add_argument(
77
+ "--extract_ema",
78
+ action="store_true",
79
+ help=(
80
+ "Only relevant for checkpoints that have both EMA and non-EMA weights. Whether to extract the EMA weights"
81
+ " or not. Defaults to `False`. Add `--extract_ema` to extract the EMA weights. EMA weights usually yield"
82
+ " higher quality images for inference. Non-EMA weights are usually better to continue fine-tuning."
83
+ ),
84
+ )
85
+ parser.add_argument(
86
+ "--upcast_attention",
87
+ action="store_true",
88
+ help=(
89
+ "Whether the attention computation should always be upcasted. This is necessary when running stable"
90
+ " diffusion 2.1."
91
+ ),
92
+ )
93
+ parser.add_argument(
94
+ "--from_safetensors",
95
+ action="store_true",
96
+ help="If `--checkpoint_path` is in `safetensors` format, load checkpoint with safetensors instead of PyTorch.",
97
+ )
98
+ parser.add_argument(
99
+ "--to_safetensors",
100
+ action="store_true",
101
+ help="Whether to store pipeline in safetensors format or not.",
102
+ )
103
+ parser.add_argument("--dump_path", default=None, type=str, required=True, help="Path to the output model.")
104
+ parser.add_argument("--device", type=str, help="Device to use (e.g. cpu, cuda:0, cuda:1, etc.)")
105
+ parser.add_argument(
106
+ "--stable_unclip",
107
+ type=str,
108
+ default=None,
109
+ required=False,
110
+ help="Set if this is a stable unCLIP model. One of 'txt2img' or 'img2img'.",
111
+ )
112
+ parser.add_argument(
113
+ "--stable_unclip_prior",
114
+ type=str,
115
+ default=None,
116
+ required=False,
117
+ help="Set if this is a stable unCLIP txt2img model. Selects which prior to use. If `--stable_unclip` is set to `txt2img`, the karlo prior (https://huggingface.co/kakaobrain/karlo-v1-alpha/tree/main/prior) is selected by default.",
118
+ )
119
+ parser.add_argument(
120
+ "--clip_stats_path",
121
+ type=str,
122
+ help="Path to the clip stats file. Only required if the stable unclip model's config specifies `model.params.noise_aug_config.params.clip_stats_path`.",
123
+ required=False,
124
+ )
125
+ parser.add_argument(
126
+ "--controlnet", action="store_true", default=None, help="Set flag if this is a controlnet checkpoint."
127
+ )
128
+ parser.add_argument("--half", action="store_true", help="Save weights in half precision.")
129
+ args = parser.parse_args()
130
+
131
+ pipe = download_from_original_stable_diffusion_ckpt(
132
+ checkpoint_path=args.checkpoint_path,
133
+ original_config_file=args.original_config_file,
134
+ image_size=args.image_size,
135
+ prediction_type=args.prediction_type,
136
+ model_type=args.pipeline_type,
137
+ extract_ema=args.extract_ema,
138
+ scheduler_type=args.scheduler_type,
139
+ num_in_channels=args.num_in_channels,
140
+ upcast_attention=args.upcast_attention,
141
+ from_safetensors=args.from_safetensors,
142
+ device=args.device,
143
+ stable_unclip=args.stable_unclip,
144
+ stable_unclip_prior=args.stable_unclip_prior,
145
+ clip_stats_path=args.clip_stats_path,
146
+ controlnet=args.controlnet,
147
+ )
148
+
149
+ if args.half:
150
+ pipe.to(torch_dtype=torch.float16)
151
+
152
+ if args.controlnet:
153
+ # only save the controlnet model
154
+ pipe.controlnet.save_pretrained(args.dump_path, safe_serialization=args.to_safetensors)
155
+ else:
156
+ pipe.save_pretrained(args.dump_path, safe_serialization=args.to_safetensors)
dataset/.gitkeep ADDED
File without changes
docker-compose.yaml ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: "3.8"
2
+ services:
3
+ kohya-ss-gui:
4
+ container_name: kohya-ss-gui
5
+ image: kohya-ss-gui:latest
6
+ build:
7
+ context: .
8
+ ports:
9
+ - 127.0.0.1:3000:3000
10
+ - 7860:7860
11
+ - 6006:6006
12
+ tty: true
13
+ ipc: host
14
+ environment:
15
+ CLI_ARGS: ""
16
+ SAFETENSORS_FAST_GPU: 1
17
+ DISPLAY: $DISPLAY
18
+ tmpfs:
19
+ - /tmp
20
+ volumes:
21
+ - ./dataset:/dataset
22
+ - ./.cache/user:/home/appuser/.cache
23
+ - ./.cache/triton:/home/appuser/.triton
24
+ - ./.cache/config:/app/appuser/.config
25
+ - ./.cache/nv:/home/appuser/.nv
26
+ - ./.cache/keras:/home/appuser/.keras
27
+ - /tmp/.X11-unix:/tmp/.X11-unix
28
+ deploy:
29
+ resources:
30
+ reservations:
31
+ devices:
32
+ - driver: nvidia
33
+ device_ids: ['all']
docs/Finetuning/top_level.md ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Finetuning Resource Guide
2
+
3
+ This guide is a resource compilation to facilitate the development of robust LoRA models.
4
+
5
+ -Need to add resources here
6
+
7
+ ## Guidelines for SDXL Finetuning
8
+
9
+ - Set the `Max resolution` to at least 1024x1024, as this is the standard resolution for SDXL.
10
+ - The fine-tuning can be done with 24GB GPU memory with the batch size of 1.
11
+ - Train U-Net only.
12
+ - Use gradient checkpointing.
13
+ - Use `--cache_text_encoder_outputs` option and caching latents.
14
+ - Use Adafactor optimizer. RMSprop 8bit or Adagrad 8bit may work. AdamW 8bit doesn't seem to work.
15
+ - PyTorch 2 seems to use slightly less GPU memory than PyTorch 1.
16
+
17
+ Example of the optimizer settings for Adafactor with the fixed learning rate:
18
+ ```
19
+ optimizer_type = "adafactor"
20
+ optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False" ]
21
+ lr_scheduler = "constant_with_warmup"
22
+ lr_warmup_steps = 100
23
+ learning_rate = 4e-7 # SDXL original learning rate
24
+ ```
25
+
26
+ ## Resource Contributions
27
+
28
+ If you have valuable resources to add, kindly create a PR on Github.
docs/LoRA/top_level.md ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # LoRA Resource Guide
2
+
3
+ This guide is a resource compilation to facilitate the development of robust LoRA models.
4
+
5
+ Access EDG's tutorials here: https://ko-fi.com/post/EDGs-tutorials-P5P6KT5MT
6
+
7
+ ## Guidelines for SDXL LoRA Training
8
+
9
+ - Set the `Max resolution` to at least 1024x1024, as this is the standard resolution for SDXL.
10
+ - Use a GPU that has at least 12GB memory for the LoRA training process.
11
+ - We strongly recommend using the `--train_unet_only` option for SDXL LoRA to avoid unforeseen training results caused by dual text encoders in SDXL.
12
+ - PyTorch 2 tends to use less GPU memory than PyTorch 1.
13
+
14
+ Here's an example configuration for the Adafactor optimizer with a fixed learning rate:
15
+
16
+ ```
17
+ optimizer_type = "adafactor"
18
+ optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False" ]
19
+ lr_scheduler = "constant_with_warmup"
20
+ lr_warmup_steps = 100
21
+ learning_rate = 4e-7 # This is the standard learning rate for SDXL
22
+ ```
23
+
24
+ ## Resource Contributions
25
+
26
+ If you have valuable resources to add, kindly create a PR on Github.
docs/config_README-ja.md ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ For non-Japanese speakers: this README is provided only in Japanese in the current state. Sorry for inconvenience. We will provide English version in the near future.
2
+
3
+ `--dataset_config` で渡すことができる設定ファイルに関する説明です。
4
+
5
+ ## 概要
6
+
7
+ 設定ファイルを渡すことにより、ユーザが細かい設定を行えるようにします。
8
+
9
+ * 複数のデータセットが設定可能になります
10
+ * 例えば `resolution` をデータセットごとに設定して、それらを混合して学習できます。
11
+ * DreamBooth の手法と fine tuning の手法の両方に対応している学習方法では、DreamBooth 方式と fine tuning 方式のデータセットを混合することが可能です。
12
+ * サブセットごとに設定を変更することが可能になります
13
+ * データセットを画像ディレクトリ別またはメタデータ別に分割したものがサブセットです。いくつかのサブセットが集まってデータセットを構成します。
14
+ * `keep_tokens` や `flip_aug` 等のオプションはサブセットごとに設定可能です。一方、`resolution` や `batch_size` といったオプションはデータセットごとに設定可能で、同じデータセットに属するサブセットでは値が共通になります。詳しくは後述します。
15
+
16
+ 設定ファイルの形式は JSON か TOML を利用できます。記述のしやすさを考えると [TOML](https://toml.io/ja/v1.0.0-rc.2) を利用するのがオススメです。以下、TOML の利用を前提に説明します。
17
+
18
+ TOML で記述した設定ファイルの例です。
19
+
20
+ ```toml
21
+ [general]
22
+ shuffle_caption = true
23
+ caption_extension = '.txt'
24
+ keep_tokens = 1
25
+
26
+ # これは DreamBooth 方式のデータセット
27
+ [[datasets]]
28
+ resolution = 512
29
+ batch_size = 4
30
+ keep_tokens = 2
31
+
32
+ [[datasets.subsets]]
33
+ image_dir = 'C:\hoge'
34
+ class_tokens = 'hoge girl'
35
+ # このサブセットは keep_tokens = 2 (所属する datasets の値が使われる)
36
+
37
+ [[datasets.subsets]]
38
+ image_dir = 'C:\fuga'
39
+ class_tokens = 'fuga boy'
40
+ keep_tokens = 3
41
+
42
+ [[datasets.subsets]]
43
+ is_reg = true
44
+ image_dir = 'C:\reg'
45
+ class_tokens = 'human'
46
+ keep_tokens = 1
47
+
48
+ # これは fine tuning 方式のデータセット
49
+ [[datasets]]
50
+ resolution = [768, 768]
51
+ batch_size = 2
52
+
53
+ [[datasets.subsets]]
54
+ image_dir = 'C:\piyo'
55
+ metadata_file = 'C:\piyo\piyo_md.json'
56
+ # このサブセットは keep_tokens = 1 (general の値が使われる)
57
+ ```
58
+
59
+ この例では、3 つのディレクトリを DreamBooth 方式のデータセットとして 512x512 (batch size 4) で学習させ、1 つのディレクトリを fine tuning 方式のデータセットとして 768x768 (batch size 2) で学習させることになります。
60
+
61
+ ## データセット・サブセットに関する設定
62
+
63
+ データセット・サブセットに関する設定は、登録可能な箇所がいくつかに分かれています。
64
+
65
+ * `[general]`
66
+ * 全データセットまたは全サブセットに適用されるオプションを指定する箇所です。
67
+ * データセットごとの設定及びサブセットごとの設定に同名のオプションが存在していた場合には、データセット・サブセットごとの設定が優先されます。
68
+ * `[[datasets]]`
69
+ * `datasets` はデータセットに関する設定の登録箇所になります。各データセットに個別に適用されるオプションを指定する箇所です。
70
+ * サブセットごとの設定が存在していた場合には、サブセットごとの設定が優先されます。
71
+ * `[[datasets.subsets]]`
72
+ * `datasets.subsets` はサブセットに関する設定の登録箇所になります。各サブセットに個別に適用されるオプションを指定する箇所です。
73
+
74
+ 先程の例における、画像ディレクトリと登録箇所の対応に関するイメージ図です。
75
+
76
+ ```
77
+ C:\
78
+ ├─ hoge -> [[datasets.subsets]] No.1 ┐ ┐
79
+ ├─ fuga -> [[datasets.subsets]] No.2 |-> [[datasets]] No.1 |-> [general]
80
+ ├─ reg -> [[datasets.subsets]] No.3 ┘ |
81
+ └─ piyo -> [[datasets.subsets]] No.4 --> [[datasets]] No.2 ┘
82
+ ```
83
+
84
+ 画像ディレクトリがそれぞれ1つの `[[datasets.subsets]]` に対応しています。そして `[[datasets.subsets]]` が1つ以上組み合わさって1つの `[[datasets]]` を構成します。`[general]` には全ての `[[datasets]]`, `[[datasets.subsets]]` が属します。
85
+
86
+ 登録箇所ごとに指定可能なオプションは異なりますが、同名のオプションが指定された場合は下位の登録箇所にある値が優先されます。先程の例の `keep_tokens` オプションの扱われ方を確認してもらうと理解しやすいかと思います。
87
+
88
+ 加えて、学習方法が対応している手法によっても指定可能なオプションが変化します。
89
+
90
+ * DreamBooth 方式専用のオプション
91
+ * fine tuning 方式専用のオプション
92
+ * caption dropout の手法が使える場合のオプション
93
+
94
+ DreamBooth の手法と fine tuning の手法の両方とも利用可能な学習方法では、両者を併用することができます。
95
+ 併用する際の注意点として、DreamBooth 方式なのか fine tuning 方式なのかはデータセット単位で判別を行っているため、同じデータセット中に DreamBooth 方式のサブセットと fine tuning 方式のサブセットを混在させることはできません。
96
+ つまり、これらを併用したい場合には異なる方式のサブセットが異なるデータセットに所属するように設定する必要があります。
97
+
98
+ プログラムの挙動としては、後述する `metadata_file` オプションが存在していたら fine tuning 方式のサブセットだと判断します。
99
+ そのため、同一のデータセットに所属するサブセットについて言うと、「全てが `metadata_file` オプションを持つ」か「全てが `metadata_file` オプションを持たない」かのどちらかになっていれば問題ありません。
100
+
101
+ 以下、利用可能なオプションを説明します。コマンドライン引数と名称が同一のオプションについては、基本的に説明を割愛します。他の README を参照してください。
102
+
103
+ ### 全学習方法で共通のオプション
104
+
105
+ 学習方法によらずに指定可能なオプションです。
106
+
107
+ #### データセット向けオプション
108
+
109
+ データセットの設定に関わるオプションです。`datasets.subsets` には記述できません。
110
+
111
+ | オプション名 | 設定例 | `[general]` | `[[datasets]]` |
112
+ | ---- | ---- | ---- | ---- |
113
+ | `batch_size` | `1` | o | o |
114
+ | `bucket_no_upscale` | `true` | o | o |
115
+ | `bucket_reso_steps` | `64` | o | o |
116
+ | `enable_bucket` | `true` | o | o |
117
+ | `max_bucket_reso` | `1024` | o | o |
118
+ | `min_bucket_reso` | `128` | o | o |
119
+ | `resolution` | `256`, `[512, 512]` | o | o |
120
+
121
+ * `batch_size`
122
+ * コマンドライン引数の `--train_batch_size` と同等です。
123
+
124
+ これらの設定はデータセットごとに固定です。
125
+ つまり、データセットに所属するサブセットはこれらの設定を共有することになります。
126
+ 例えば解像度が異なるデータセットを用意したい場合は、上に挙げた例のように別々のデータセットとして定義すれば別々の解像度を設定可能です。
127
+
128
+ #### サブセット向けオプション
129
+
130
+ サブセットの設定に関わるオプションです。
131
+
132
+ | オプション名 | 設定例 | `[general]` | `[[datasets]]` | `[[dataset.subsets]]` |
133
+ | ---- | ---- | ---- | ---- | ---- |
134
+ | `color_aug` | `false` | o | o | o |
135
+ | `face_crop_aug_range` | `[1.0, 3.0]` | o | o | o |
136
+ | `flip_aug` | `true` | o | o | o |
137
+ | `keep_tokens` | `2` | o | o | o |
138
+ | `num_repeats` | `10` | o | o | o |
139
+ | `random_crop` | `false` | o | o | o |
140
+ | `shuffle_caption` | `true` | o | o | o |
141
+
142
+ * `num_repeats`
143
+ * サブセットの画像の繰り返し回数を指定します。fine tuning における `--dataset_repeats` に相当しますが、`num_repeats` はどの学習方法でも指定可能です。
144
+
145
+ ### DreamBooth 方式専用のオプション
146
+
147
+ DreamBooth 方式のオプションは、サブセット向けオプションのみ存在します。
148
+
149
+ #### サブセット向けオプション
150
+
151
+ DreamBooth 方式のサブセットの設定に関わるオプションです。
152
+
153
+ | オプション名 | 設定例 | `[general]` | `[[datasets]]` | `[[dataset.subsets]]` |
154
+ | ---- | ---- | ---- | ---- | ---- |
155
+ | `image_dir` | `‘C:\hoge’` | - | - | o(必須) |
156
+ | `caption_extension` | `".txt"` | o | o | o |
157
+ | `class_tokens` | `“sks girl”` | - | - | o |
158
+ | `is_reg` | `false` | - | - | o |
159
+
160
+ まず注意点として、 `image_dir` には画像ファイルが直下に置かれているパスを指定する必要があります。従来の DreamBooth の手法ではサブディレクトリに画像を置く必要がありましたが、そちらとは仕様に互換性がありません。また、`5_cat` のようなフォルダ名にしても、画像の繰り返し回数とクラス名は反映されません。これらを個別に設定したい場合、`num_repeats` と `class_tokens` で明示的に指定する必要があることに注意してください。
161
+
162
+ * `image_dir`
163
+ * 画像ディレクトリのパスを指定します。指定必須オプションです。
164
+ * 画像はディレクトリ直下に置かれている必要があります。
165
+ * `class_tokens`
166
+ * クラストークンを設定します。
167
+ * 画像に対応する caption ファイルが存在しない場合にのみ学習時に利用されます。利用するかどうかの判定は画像ごとに行います。`class_tokens` を指定しなかった場合に caption ファイル���見つからなかった場合にはエラーになります。
168
+ * `is_reg`
169
+ * サブセットの画像が正規化用かどうかを指定します。指定しなかった場合は `false` として、つまり正規化画像ではないとして扱います。
170
+
171
+ ### fine tuning 方式専用のオプション
172
+
173
+ fine tuning 方式のオプションは、サブセット向けオプションのみ存在します。
174
+
175
+ #### サブセット向けオプション
176
+
177
+ fine tuning 方式のサブセットの設定に関わるオプションです。
178
+
179
+ | オプション名 | 設定例 | `[general]` | `[[datasets]]` | `[[dataset.subsets]]` |
180
+ | ---- | ---- | ---- | ---- | ---- |
181
+ | `image_dir` | `‘C:\hoge’` | - | - | o |
182
+ | `metadata_file` | `'C:\piyo\piyo_md.json'` | - | - | o(必須) |
183
+
184
+ * `image_dir`
185
+ * 画像ディレクトリのパスを指定します。DreamBooth の手法の方とは異なり指定は必須ではありませんが、設定することを推奨します。
186
+ * 指定する必要がない状況としては、メタデータファイルの生成時に `--full_path` を付与して実行していた場合です。
187
+ * 画像はディレクトリ直下に置かれている必要があります。
188
+ * `metadata_file`
189
+ * サブセットで利用されるメタデータファイルのパスを指定します。指定必須オプションです。
190
+ * コマンドライン引数の `--in_json` と同等です。
191
+ * サブセットごとにメタデータファイルを指定する必要がある仕様上、ディレクトリを跨いだメタデータを1つのメタデータファイルとして作成することは避けた方が良いでしょう。画像ディレクトリごとにメタデータファイルを用意し、それらを別々のサブセットとして登録することを強く推奨します。
192
+
193
+ ### caption dropout の手法が使える場合に指定可能なオプション
194
+
195
+ caption dropout の手法が使える場合のオプションは、サブセット向けオプションのみ存在します。
196
+ DreamBooth 方式か fine tuning 方式かに関わらず、caption dropout に対応している学習方法であれば指定可能です。
197
+
198
+ #### サブセット向けオプション
199
+
200
+ caption dropout が使えるサブセットの設定に関わるオプションです。
201
+
202
+ | オプション名 | `[general]` | `[[datasets]]` | `[[dataset.subsets]]` |
203
+ | ---- | ---- | ---- | ---- |
204
+ | `caption_dropout_every_n_epochs` | o | o | o |
205
+ | `caption_dropout_rate` | o | o | o |
206
+ | `caption_tag_dropout_rate` | o | o | o |
207
+
208
+ ## 重複したサブセットが存在する時の挙動
209
+
210
+ DreamBooth 方式のデータセットの場合、その中にある `image_dir` が同一のサブセットは重複していると見なされます。
211
+ fine tuning 方式のデータセットの場合は、その中にある `metadata_file` が同一のサブセットは重複していると見なされます。
212
+ データセット中に重複したサブセットが存在する場合、2個目以降は無視されます。
213
+
214
+ 一方、異なるデータセットに所属している場合は、重複しているとは見なされません。
215
+ 例えば、以下のように同一の `image_dir` を持つサブセットを別々のデータセットに入れた場合には、重複していないと見なします。
216
+ これは、同じ画像でも異なる解像度で学習したい場合に役立ちます。
217
+
218
+ ```toml
219
+ # 別々のデータセットに存在している場合は重複とは見なされず、両方とも学習に使われる
220
+
221
+ [[datasets]]
222
+ resolution = 512
223
+
224
+ [[datasets.subsets]]
225
+ image_dir = 'C:\hoge'
226
+
227
+ [[datasets]]
228
+ resolution = 768
229
+
230
+ [[datasets.subsets]]
231
+ image_dir = 'C:\hoge'
232
+ ```
233
+
234
+ ## コマンドライン引数との併用
235
+
236
+ 設定ファイルのオプションの中には、コマンドライン引数のオプションと役割が重複しているものがあります。
237
+
238
+ 以下に挙げるコマンドライン引数のオプションは、設定ファイルを渡した場合には無視されます。
239
+
240
+ * `--train_data_dir`
241
+ * `--reg_data_dir`
242
+ * `--in_json`
243
+
244
+ 以下に挙げるコマンドライン引数のオプションは、コマンドライン引数と設定ファイルで同時に指定された場合、コマンドライン引数の値よりも設定ファイルの値が優先されます。特に断りがなければ同名のオプションとなります。
245
+
246
+ | コマンドライン引数のオプション | 優先される設定ファイルのオプション |
247
+ | ---------------------------------- | ---------------------------------- |
248
+ | `--bucket_no_upscale` | |
249
+ | `--bucket_reso_steps` | |
250
+ | `--caption_dropout_every_n_epochs` | |
251
+ | `--caption_dropout_rate` | |
252
+ | `--caption_extension` | |
253
+ | `--caption_tag_dropout_rate` | |
254
+ | `--color_aug` | |
255
+ | `--dataset_repeats` | `num_repeats` |
256
+ | `--enable_bucket` | |
257
+ | `--face_crop_aug_range` | |
258
+ | `--flip_aug` | |
259
+ | `--keep_tokens` | |
260
+ | `--min_bucket_reso` | |
261
+ | `--random_crop` | |
262
+ | `--resolution` | |
263
+ | `--shuffle_caption` | |
264
+ | `--train_batch_size` | `batch_size` |
265
+
266
+ ## エラーの手引き
267
+
268
+ 現在、外部ライブラリを利用して設定ファイルの記述が正しいかどうかをチェックしているのですが、整備が行き届いておらずエラーメッセージがわかりづらいという問題があります。
269
+ 将来的にはこの問題の改善に取り組む予定です。
270
+
271
+ 次善策として、頻出のエラーとその対処法について載せておきます。
272
+ 正しいはずなのにエラーが出る場合、エラー内容がどうしても分からない場合は、バグかもしれないのでご連絡ください。
273
+
274
+ * `voluptuous.error.MultipleInvalid: required key not provided @ ...`: 指定必須のオプションが指定されていないというエラーです。指定を忘れているか、オプション名を間違って記述している可能性が高いです。
275
+ * `...` の箇所にはエラーが発生した場所が載っています。例えば `voluptuous.error.MultipleInvalid: required key not provided @ data['datasets'][0]['subsets'][0]['image_dir']` のようなエラーが出たら、0 番目の `datasets` 中の 0 番目の `subsets` の設定に `image_dir` が存在しないということになります。
276
+ * `voluptuous.error.MultipleInvalid: expected int for dictionary value @ ...`: 指定する値の形式が不正というエラーです。値の形式が間違っている可能性が高いです。`int` の部分は対象となるオプションによって変わります。この README に載っているオプションの「設定例」が役立つかもしれません。
277
+ * `voluptuous.error.MultipleInvalid: extra keys not allowed @ ...`: 対応していないオプション名が存在している場合に発生するエラーです。オプション名を間違って記述しているか、誤って紛れ込んでいる可能性が高いです。
278
+
279
+
docs/fine_tune_README_ja.md ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ NovelAIの提案した学習手法、自動キャプションニング、タグ付け、Windows+VRAM 12GB(SD v1.xの場合)環境等に対応したfine tuningです。ここでfine tuningとは、モデルを画像とキャプションで学習することを指します(LoRAやTextual Inversion、Hypernetworksは含みません)
2
+
3
+ [学習についての共通ドキュメント](./train_README-ja.md) もあわせてご覧ください。
4
+
5
+ # 概要
6
+
7
+ Diffusersを用いてStable DiffusionのU-Netのfine tuningを行います。NovelAIの記事にある以下の改善に対応しています(Aspect Ratio BucketingについてはNovelAIのコードを参考にしましたが、最終的なコードはすべてオリジナルです)。
8
+
9
+ * CLIP(Text Encoder)の最後の層ではなく最後から二番目の層の出力を用いる。
10
+ * 正方形以外の解像度での学習(Aspect Ratio Bucketing) 。
11
+ * トークン長を75から225に拡張する。
12
+ * BLIPによるキャプショニング(キャプションの自動作成)、DeepDanbooruまたはWD14Taggerによる自動タグ付けを行う。
13
+ * Hypernetworkの学習にも対応する。
14
+ * Stable Diffusion v2.0(baseおよび768/v)に対応。
15
+ * VAEの出力をあらかじめ取得しディスクに保存しておくことで、学習の省メモリ化、高速化を図る。
16
+
17
+ デフォルトではText Encoderの学習は行いません。モデル全体のfine tuningではU-Netだけを学習するのが一般的なようです(NovelAIもそのようです)。オプション指定でText Encoderも学習対象とできます。
18
+
19
+ # 追加機能について
20
+
21
+ ## CLIPの出力の変更
22
+
23
+ プロンプトを画像に反映するため、テキストの特徴量への変換を行うのがCLIP(Text Encoder)です。Stable DiffusionではCLIPの最後の層の出力を用いていますが、それを最後から二番目の層の出力を用いるよう変更できます。NovelAIによると、これによりより正確にプロンプトが反映されるようになるとのことです。
24
+ 元のまま、最後の層の出力を用いることも可能です。
25
+
26
+ ※Stable Diffusion 2.0では最後から二番目の層をデフォルトで使います。clip_skipオプションを指定しないでください。
27
+
28
+ ## 正方形以外の解像度での学習
29
+
30
+ Stable Diffusionは512\*512で学習されていますが、それに加えて256\*1024や384\*640といった解像度でも学習します。これによりトリミングされる部分が減り、より正しくプロンプトと画像の関係が学習されることが期待されます。
31
+ 学習解像度はパラメータとして与えられた解像度の面積(=メモリ使用量)を超えない範囲で、64ピクセル単位で縦横に調整、作成されます。
32
+
33
+ 機械学習では入力サイズをすべて統一するのが一般的ですが、特に制約があるわけではなく、実際は同一のバッチ内で統一されていれば大丈夫です。NovelAIの言うbucketingは、あらかじめ教師データを、アスペクト比に応じた学習解像度ごとに分類しておくことを指しているようです。そしてバッチを各bucket内の画像で作成することで、バッチの画像サイズを統一します。
34
+
35
+ ## トークン長の75から225への拡張
36
+
37
+ Stable Diffusionでは最大75トークン(開始・終了を含むと77トークン)ですが、それを225トークンまで拡張します。
38
+ ただしCLIPが受け付ける最大長は75トークンですので、225トークンの場合、単純に三分割してCLIPを呼び出してから結果を連結しています。
39
+
40
+ ※これが望ましい実装なのかどうかはいまひとつわかりません。とりあえず動いてはいるようです。特に2.0では何も参考になる実装がないので独自に実装してあります。
41
+
42
+ ※Automatic1111氏のWeb UIではカンマを意識して分割、といったこともしているようですが、私の場合はそこまでしておらず単純な分割です。
43
+
44
+ # 学習の手順
45
+
46
+ あらかじめこのリポジトリのREADMEを参照し、環境整備を行ってください。
47
+
48
+ ## データの準備
49
+
50
+ [学習データの準備について](./train_README-ja.md) を参照してください。fine tuningではメタデータを用いるfine tuning方式のみ対応しています。
51
+
52
+ ## 学習の実行
53
+ たとえば以下のように実行します。以下は省メモリ化のための設定です。それぞれの行を必要に応じて書き換えてください。
54
+
55
+ ```
56
+ accelerate launch --num_cpu_threads_per_process 1 fine_tune.py
57
+ --pretrained_model_name_or_path=<.ckptまたは.safetensordまたはDiffusers版モデルのディレクトリ>
58
+ --output_dir=<学習したモデルの出力先フォルダ>
59
+ --output_name=<学習したモデル出力時のファイル名>
60
+ --dataset_config=<データ準備で作成した.tomlファイル>
61
+ --save_model_as=safetensors
62
+ --learning_rate=5e-6 --max_train_steps=10000
63
+ --use_8bit_adam --xformers --gradient_checkpointing
64
+ --mixed_precision=fp16
65
+ ```
66
+
67
+ `num_cpu_threads_per_process` には通常は1を指定するとよいようです。
68
+
69
+ `pretrained_model_name_or_path` に追加学習を行う元となるモデルを指定します。Stable Diffusionのcheckpointファイル(.ckptまたは.safetensors)、Diffusersのローカルディスクにあるモデルディレクトリ、DiffusersのモデルID("stabilityai/stable-diffusion-2"など)が指定できます。
70
+
71
+ `output_dir` に学習後のモデルを保存するフォルダを指定します。`output_name` にモデルのファイル名を拡張子を除いて指定します。`save_model_as` でsafetensors形式での保存を指定しています。
72
+
73
+ `dataset_config` に `.toml` ファイルを指定します。ファイル内でのバッチサイズ指定は、当初はメモリ消費を抑えるために `1` としてください。
74
+
75
+ 学習させるステップ数 `max_train_steps` を10000とします。学習率 `learning_rate` はここでは5e-6を指定しています。
76
+
77
+ 省メモリ化のため `mixed_precision="fp16"` を指定します(RTX30 シリーズ以降では `bf16` も指定できます。環境整備時にaccelerateに行った設定と合わせてください)。また `gradient_checkpointing` を指定します。
78
+
79
+ オプティマイザ(モデルを学習データにあうように最適化=学習させるクラス)にメモリ消費の少ない 8bit AdamW を使うため、 `optimizer_type="AdamW8bit"` を指定します。
80
+
81
+ `xformers` オプションを指定し、xformersのCrossAttentionを用います。xformersをインストールしていない場合やエラーとなる場合(環境にもよりますが `mixed_precision="no"` の場合など)、代わりに `mem_eff_attn` オプションを指定すると省メモリ版CrossAttentionを使用します(速度は遅くなります)。
82
+
83
+ ある程度メモリがある場合は、`.toml` ファイルを編集してバッチサイズをたとえば `4` くらいに増やしてください(高速化と精度向上の可能性があります)。
84
+
85
+ ### よく使われるオプションについて
86
+
87
+ 以下の場合にはオプションに関するドキュメントを参照してください。
88
+
89
+ - Stable Diffusion 2.xまたはそこからの派生モデルを学習する
90
+ - clip skipを2以上を前提としたモデルを学習する
91
+ - 75トークンを超えたキャプションで学習する
92
+
93
+ ### バッチサイズについて
94
+
95
+ モデル全体を学習するためLoRA等の学習に比べるとメモリ消費量は多くなります(DreamBoothと同じ)。
96
+
97
+ ### 学習率について
98
+
99
+ 1e-6から5e-6程度が一般的なようです。他のfine tuningの例なども参照してみてください。
100
+
101
+ ### 以前の形式のデータセット指定をした場合のコマンドライン
102
+
103
+ 解像度やバッチサイズをオプションで指定します。コマンドラインの例は以下の通りです。
104
+
105
+ ```
106
+ accelerate launch --num_cpu_threads_per_process 1 fine_tune.py
107
+ --pretrained_model_name_or_path=model.ckpt
108
+ --in_json meta_lat.json
109
+ --train_data_dir=train_data
110
+ --output_dir=fine_tuned
111
+ --shuffle_caption
112
+ --train_batch_size=1 --learning_rate=5e-6 --max_train_steps=10000
113
+ --use_8bit_adam --xformers --gradient_checkpointing
114
+ --mixed_precision=bf16
115
+ --save_every_n_epochs=4
116
+ ```
117
+
118
+ <!--
119
+ ### 勾配をfp16とした学習(実験的機能)
120
+ full_fp16オプションを指定すると勾配を通常のfloat32からfloat16(fp16)に変更して学習します(mixed precisionではなく完全なfp16学習になるようです)。これによりSD1.xの512*512サイズでは8GB未満、SD2.xの512*512サイズで12GB未満のVRAM使用量で学習できるようです。
121
+
122
+ あらかじめaccelerate configでfp16を指定し、オプションでmixed_precision="fp16"としてください(bf16では動作しません)。
123
+
124
+ メモリ使用量を最小化するためには、xformers、use_8bit_adam、gradient_checkpointingの各オプションを指定し、train_batch_sizeを1としてください。
125
+ (余裕があるようならtrain_batch_sizeを段階的に増やすと若干精度が上がるはずです。)
126
+
127
+ PyTorchのソースにパッチを当てて無理やり実現しています(PyTorch 1.12.1と1.13.0で確認)。精度はかなり落ちますし、途中で学習失敗する確率も高くなります。学習率やステップ数の設定もシビアなようです。それらを認識したうえで自己責任でお使いください。
128
+ -->
129
+
130
+ # fine tuning特有のその他の主なオプション
131
+
132
+ すべてのオプションについては別文書を参照してください。
133
+
134
+ ## `train_text_encoder`
135
+ Text Encoderも学習対象とします。メモリ使用量が若干増加します。
136
+
137
+ 通常のfine tuningではText Encoderは学習対象としませんが(恐らくText Encoderの出力に従うようにU-Netを学習するため)、学習データ数が少ない場合には、DreamBoothのようにText Encoder側に学習させるのも有効的なようです。
138
+
139
+ ## `diffusers_xformers`
140
+ スクリプト独自のxformers置換機能ではなくDiffusersのxformers機能を利用します。Hypernetworkの学習はできなくなります。
docs/gen_img_README-ja.md ADDED
@@ -0,0 +1,454 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ SD 1.xおよび2.xのモデル、当リポジトリで学習したLoRA、ControlNet(v1.0のみ動作確認)などに対応した、Diffusersベースの推論(画像生成)スクリプトです。コマンドラインから用います。
2
+
3
+ # 概要
4
+
5
+ * Diffusers (v0.10.2) ベースの推論(画像生成)スクリプト。
6
+ * SD 1.xおよび2.x (base/v-parameterization)モデルに対応。
7
+ * txt2img、img2img、inpaintingに対応。
8
+ * 対話モード、およびファイルからのプロンプト読み込み、連続生成に対応。
9
+ * プロンプト1行あたりの生成枚数を指定可能。
10
+ * 全体の繰り返し回数を指定可能。
11
+ * `fp16`だけでなく`bf16`にも対応。
12
+ * xformersに対応し高速生成が可能。
13
+ * xformersにより省メモリ生成を行いますが、Automatic 1111氏のWeb UIほど最適化していないため、512*512の画像生成でおおむね6GB程度のVRAMを使用します。
14
+ * プロンプトの225トークンへの拡張。ネガティブプロンプト、重みづけに対応。
15
+ * Diffusersの各種samplerに対応(Web UIよりもsampler数は少ないです)。
16
+ * Text Encoderのclip skip(最後からn番目の層の出力を用いる)に対応。
17
+ * VAEの別途読み込み。
18
+ * CLIP Guided Stable Diffusion、VGG16 Guided Stable Diffusion、Highres. fix、upscale対応。
19
+ * Highres. fixはWeb UIの実装を全く確認していない独自実装のため、出力結果は異なるかもしれません。
20
+ * LoRA対応。適用率指定、複数LoRA同時利用、重みのマージに対応。
21
+ * Text EncoderとU-Netで別の適用率を指定することはできません。
22
+ * Attention Coupleに対応。
23
+ * ControlNet v1.0に対応。
24
+ * 途中でモデルを切り替えることはできませんが、バッチファイルを組むことで対応できます。
25
+ * 個人的に欲しくなった機能をいろいろ追加。
26
+
27
+ 機能追加時にすべてのテストを行っているわけではないため、以前の機能に影響が出て一部機能が動かない可能性があります。何か問題があればお知らせください。
28
+
29
+ # 基本的な使い方
30
+
31
+ ## 対話モードでの画像生成
32
+
33
+ 以下のように入力してください。
34
+
35
+ ```batchfile
36
+ python gen_img_diffusers.py --ckpt <モデル名> --outdir <画像出力先> --xformers --fp16 --interactive
37
+ ```
38
+
39
+ `--ckpt`オプションにモデル(Stable Diffusionのcheckpointファイル、またはDiffusersのモデルフォルダ)、`--outdir`オプションに画像の出力先フォルダを指定します。
40
+
41
+ `--xformers`オプションでxformersの使用を指定します(xformersを使わない場合は外してください)。`--fp16`オプションでfp16(単精度)での推論を行います。RTX 30系のGPUでは `--bf16`オプションでbf16(bfloat16)での推論を行うこともできます。
42
+
43
+ `--interactive`オプションで対話モードを指定しています。
44
+
45
+ Stable Diffusion 2.0(またはそこからの追加学習モデル)を使う場合は`--v2`オプションを追加してください。v-parameterizationを使うモデル(`768-v-ema.ckpt`およびそこからの追加学習モデル)を使う場合はさらに`--v_parameterization`を追加してください。
46
+
47
+ `--v2`の指定有無が間違っているとモデル読み込み時にエラーになります。`--v_parameterization`の指定有無が間違っていると茶色い画像が表示されます。
48
+
49
+ `Type prompt:`と表示されたらプロンプトを入力してください。
50
+
51
+ ![image](https://user-images.githubusercontent.com/52813779/235343115-f3b8ac82-456d-4aab-9724-0cc73c4534aa.png)
52
+
53
+ ※画像が表示されずエラーになる場合、headless(画面表示機能なし)のOpenCVがインストールされているかもしれません。`pip install opencv-python`として通常のOpenCVを入れてください。または`--no_preview`オプションで画像表示を止めてください。
54
+
55
+ 画像ウィンドウを選択してから何らかのキーを押すとウィンドウが閉じ、次のプロンプトが入力できます。プロンプトでCtrl+Z、エンターの順に打鍵するとスクリプトを閉じます。
56
+
57
+ ## 単一のプロンプトで画像を一括生成
58
+
59
+ 以下のように入力します(実際には1行で入力します)。
60
+
61
+ ```batchfile
62
+ python gen_img_diffusers.py --ckpt <モデル名> --outdir <画像出力先>
63
+ --xformers --fp16 --images_per_prompt <生成枚数> --prompt "<プロンプト>"
64
+ ```
65
+
66
+ `--images_per_prompt`オプションで、プロンプト1件当たりの生成枚数を指定します。`--prompt`オプションでプロンプトを指定します。スペースを含む場合はダブルクォーテーションで囲んでください。
67
+
68
+ `--batch_size`オプションでバッチサイズを指定できます(後述)。
69
+
70
+ ## ファイルからプロンプトを読み込み一括生成
71
+
72
+ 以下のように入力します。
73
+
74
+ ```batchfile
75
+ python gen_img_diffusers.py --ckpt <モデル名> --outdir <画像出力先>
76
+ --xformers --fp16 --from_file <プロンプトファイル名>
77
+ ```
78
+
79
+ `--from_file`オプションで、プロンプトが記述されたファイルを指定します。1行1プロンプトで記述してください。`--images_per_prompt`オプションを指定して1行あたり生成枚数を指定できます。
80
+
81
+ ## ネガティブプロンプト、重みづけの使用
82
+
83
+ プロンプトオプション(プロンプト内で`--x`のように指定、後述)で`--n`を書くと、以降がネガティブプロンプトとなります。
84
+
85
+ またAUTOMATIC1111氏のWeb UIと同様の `()` や` []` 、`(xxx:1.3)` などによる重みづけが可能です(実装はDiffusersの[Long Prompt Weighting Stable Diffusion](https://github.com/huggingface/diffusers/blob/main/examples/community/README.md#long-prompt-weighting-stable-diffusion)からコピーしたものです)。
86
+
87
+ コマンドラインからのプロンプト指定、ファイルからのプロンプト読み込みでも同様に指定できます。
88
+
89
+ ![image](https://user-images.githubusercontent.com/52813779/235343128-e79cd768-ec59-46f5-8395-fce9bdc46208.png)
90
+
91
+ # 主なオプション
92
+
93
+ コマンドラインから指定してください。
94
+
95
+ ## モデルの指定
96
+
97
+ - `--ckpt <モデル名>`:モデル名を指定します。`--ckpt`オプションは必須です。Stable Diffusionのcheckpointファイル、またはDiffusersのモデルフォルダ、Hugging FaceのモデルIDを指定できます。
98
+
99
+ - `--v2`:Stable Diffusion 2.x系のモデルを使う場合に指定します。1.x系の場合には指定不要です。
100
+
101
+ - `--v_parameterization`:v-parameterizationを使うモデルを使う場合に指定します(`768-v-ema.ckpt`およびそこからの追加学習モデル、Waifu Diffusion v1.5など)。
102
+
103
+ `--v2`の指定有無が間違っているとモデル読み込み時にエラーになります。`--v_parameterization`の指定有無が間違っていると茶色い画像が表示されます。
104
+
105
+ - `--vae`:使用するVAEを指定します。未指定時はモデル内のVAEを使用します。
106
+
107
+ ## 画像生成と出力
108
+
109
+ - `--interactive`:インタラクティブモードで動作します。プロンプトを入力すると画像が生成されます。
110
+
111
+ - `--prompt <プロンプト>`:プロンプトを指定します。スペースを含む場合はダブルクォーテーションで囲んでください。
112
+
113
+ - `--from_file <プロンプトファイル名>`:プロンプトが記述されたファイルを指定します。1行1プロンプトで記述してください。なお画像サイズやguidance scaleはプロンプトオプション(後述)で指定できます。
114
+
115
+ - `--W <画像幅>`:画像の幅を指定します。デフォルトは`512`です。
116
+
117
+ - `--H <画像高さ>`:画像の高さを指定します。デフォルトは`512`です。
118
+
119
+ - `--steps <ステップ数>`:サンプリングステップ数を指定します。デフォルトは`50`です。
120
+
121
+ - `--scale <ガイダンススケール>`:unconditionalガイダンススケールを指定します。デフォルトは`7.5`です。
122
+
123
+ - `--sampler <サンプラー名>`:サンプラーを指定します。デフォルトは`ddim`です。Diffusersで提供されているddim、pndm、dpmsolver、dpmsolver+++、lms、euler、euler_a、が指定可能です(後ろの三つはk_lms、k_euler、k_euler_aでも指定できます)。
124
+
125
+ - `--outdir <画像出力先フォルダ>`:画像の出力先を指定します。
126
+
127
+ - `--images_per_prompt <生成枚数>`:プロンプト1件当たりの生成枚数を指定します。デフォルトは`1`です。
128
+
129
+ - `--clip_skip <スキップ数>`:CLIPの後ろから何番目の層を使うかを指定します。省略時は最後の層を使います。
130
+
131
+ - `--max_embeddings_multiples <倍数>`:CLIPの入出力長をデフォルト(75)の何倍にするかを指定します。未指定時は75のままです。たとえば3を指定すると入出力長が225になります。
132
+
133
+ - `--negative_scale` : uncoditioningのguidance scaleを個別に指定します。[gcem156氏のこちらの記事](https://note.com/gcem156/n/ne9a53e4a6f43)を参考に実装したものです。
134
+
135
+ ## メモリ使用量や生成速度の調整
136
+
137
+ - `--batch_size <バッチサイズ>`:バッチサイズを指定します。デフォルトは`1`です。バッチサイズが大きいとメモリを多く消費しますが、生成速度が速くなります。
138
+
139
+ - `--vae_batch_size <VAEのバッチサイズ>`:VAEのバッチサイズを指定します。デフォルトはバッチサイズと同じです。
140
+ VAEのほうがメモリを多く消費するため、デノイジング後(stepが100%になった後)でメモリ不足になる場合があります。このような場合にはVAEのバッチサイズを小さくしてくだ���い。
141
+
142
+ - `--xformers`:xformersを使う場合に指定します。
143
+
144
+ - `--fp16`:fp16(単精度)での推論を行います。`fp16`と`bf16`をどちらも指定しない場合はfp32(単精度)での推論を行います。
145
+
146
+ - `--bf16`:bf16(bfloat16)での推論を行います。RTX 30系のGPUでのみ指定可能です。`--bf16`オプションはRTX 30系以外のGPUではエラーになります。`fp16`よりも`bf16`のほうが推論結果がNaNになる(真っ黒の画像になる)可能性が低いようです。
147
+
148
+ ## 追加ネットワーク(LoRA等)の使用
149
+
150
+ - `--network_module`:使用する追加ネットワークを指定します。LoRAの場合は`--network_module networks.lora`と指定します。複数のLoRAを使用する場合は`--network_module networks.lora networks.lora networks.lora`のように指定します。
151
+
152
+ - `--network_weights`:使用する追加ネットワークの重みファイルを指定します。`--network_weights model.safetensors`のように指定します。複数のLoRAを使用する場合は`--network_weights model1.safetensors model2.safetensors model3.safetensors`のように指定します。引数の数は`--network_module`で指定した数と同じにしてください。
153
+
154
+ - `--network_mul`:使用する追加ネットワークの重みを何倍にするかを指定します。デフォルトは`1`です。`--network_mul 0.8`のように指定します。複数のLoRAを使用する場合は`--network_mul 0.4 0.5 0.7`のように指定します。引数の数は`--network_module`で指定した数と同じにしてください。
155
+
156
+ - `--network_merge`:使用する追加ネットワークの重みを`--network_mul`に指定した重みであらかじめマージします。`--network_pre_calc` と同時に使用できません。プロンプトオプションの`--am`、およびRegional LoRAは使用できなくなりますが、LoRA未使用時と同じ程度まで生成が高速化されます。
157
+
158
+ - `--network_pre_calc`:使用する追加ネットワークの重みを生成ごとにあらかじめ計算します。プロンプトオプションの`--am`が使用できます。LoRA未使用時と同じ程度まで生成は高速化されますが、生成前に重みを計算する時間が必要で、またメモリ使用量も若干増加します。Regional LoRA使用時は無効になります 。
159
+
160
+ # 主なオプションの指定例
161
+
162
+ 次は同一プロンプトで64枚をバッチサイズ4で一括生成する例です。
163
+
164
+ ```batchfile
165
+ python gen_img_diffusers.py --ckpt model.ckpt --outdir outputs
166
+ --xformers --fp16 --W 512 --H 704 --scale 12.5 --sampler k_euler_a
167
+ --steps 32 --batch_size 4 --images_per_prompt 64
168
+ --prompt "beautiful flowers --n monochrome"
169
+ ```
170
+
171
+ 次はファイルに書かれたプロンプトを、それぞれ10枚ずつ、バッチサイズ4で一括生成する例です。
172
+
173
+ ```batchfile
174
+ python gen_img_diffusers.py --ckpt model.ckpt --outdir outputs
175
+ --xformers --fp16 --W 512 --H 704 --scale 12.5 --sampler k_euler_a
176
+ --steps 32 --batch_size 4 --images_per_prompt 10
177
+ --from_file prompts.txt
178
+ ```
179
+
180
+ Textual Inversion(後述)およびLoRAの使用例です。
181
+
182
+ ```batchfile
183
+ python gen_img_diffusers.py --ckpt model.safetensors
184
+ --scale 8 --steps 48 --outdir txt2img --xformers
185
+ --W 512 --H 768 --fp16 --sampler k_euler_a
186
+ --textual_inversion_embeddings goodembed.safetensors negprompt.pt
187
+ --network_module networks.lora networks.lora
188
+ --network_weights model1.safetensors model2.safetensors
189
+ --network_mul 0.4 0.8
190
+ --clip_skip 2 --max_embeddings_multiples 1
191
+ --batch_size 8 --images_per_prompt 1 --interactive
192
+ ```
193
+
194
+ # プロンプトオプション
195
+
196
+ プロンプト内で、`--n`のように「ハイフンふたつ+アルファベットn文字」でプロンプトから各種オプションの指定が可能です。対話モード、コマンドライン、ファイル、いずれからプロンプトを指定する場合でも有効です。
197
+
198
+ プロンプトのオプション指定`--n`の前後にはスペースを入れてください。
199
+
200
+ - `--n`:ネガティブプロンプトを指定します。
201
+
202
+ - `--w`:画像幅を指定します。コマンドラインからの指定を上書きします。
203
+
204
+ - `--h`:画像高さを指定します。コマンドラインからの指定を上書きします。
205
+
206
+ - `--s`:ステップ数を指定します。コマンドラインからの指定を上書きします。
207
+
208
+ - `--d`:この画像の乱数seedを指定します。`--images_per_prompt`を指定している場合は「--d 1,2,3,4」のようにカンマ区切りで複数指定してください。
209
+ ※様々な理由により、Web UIとは同じ乱数seedでも生成される画像が異なる場合があります。
210
+
211
+ - `--l`:guidance scaleを指定します。コマンドラインからの指定を上書きします。
212
+
213
+ - `--t`:img2img(後述)のstrengthを指定します。コ��ンドラインからの指定を上書きします。
214
+
215
+ - `--nl`:ネガティブプロンプトのguidance scaleを指定します(後述)。コマンドラインからの指定を上書きします。
216
+
217
+ - `--am`:追加ネットワークの重みを指定します。コマンドラインからの指定を上書きします。複数の追加ネットワークを使用する場合は`--am 0.8,0.5,0.3`のように __カンマ区切りで__ 指定します。
218
+
219
+ ※これらのオプションを指定すると、バッチサイズよりも小さいサイズでバッチが実行される場合があります(これらの値が異なると一括生成できないため)。(あまり気にしなくて大丈夫ですが、ファイルからプロンプトを読み込み生成する場合は、これらの値が同一のプロンプトを並べておくと効率が良くなります。)
220
+
221
+ 例:
222
+ ```
223
+ (masterpiece, best quality), 1girl, in shirt and plated skirt, standing at street under cherry blossoms, upper body, [from below], kind smile, looking at another, [goodembed] --n realistic, real life, (negprompt), (lowres:1.1), (worst quality:1.2), (low quality:1.1), bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, normal quality, jpeg artifacts, signature, watermark, username, blurry --w 960 --h 640 --s 28 --d 1
224
+ ```
225
+
226
+ ![image](https://user-images.githubusercontent.com/52813779/235343446-25654172-fff4-4aaf-977a-20d262b51676.png)
227
+
228
+ # img2img
229
+
230
+ ## オプション
231
+
232
+ - `--image_path`:img2imgに利用する画像を指定します。`--image_path template.png`のように指定します。フォルダを指定すると、そのフォルダの画像を順次利用します。
233
+
234
+ - `--strength`:img2imgのstrengthを指定します。`--strength 0.8`のように指定します。デフォルトは`0.8`です。
235
+
236
+ - `--sequential_file_name`:ファイル名を連番にするかどうかを指定します。指定すると生成されるファイル名が`im_000001.png`からの連番になります。
237
+
238
+ - `--use_original_file_name`:指定すると生成ファイル名がオリジナルのファイル名と同じになります。
239
+
240
+ ## コマンドラインからの実行例
241
+
242
+ ```batchfile
243
+ python gen_img_diffusers.py --ckpt trinart_characters_it4_v1_vae_merged.ckpt
244
+ --outdir outputs --xformers --fp16 --scale 12.5 --sampler k_euler --steps 32
245
+ --image_path template.png --strength 0.8
246
+ --prompt "1girl, cowboy shot, brown hair, pony tail, brown eyes,
247
+ sailor school uniform, outdoors
248
+ --n lowres, bad anatomy, bad hands, error, missing fingers, cropped,
249
+ worst quality, low quality, normal quality, jpeg artifacts, (blurry),
250
+ hair ornament, glasses"
251
+ --batch_size 8 --images_per_prompt 32
252
+ ```
253
+
254
+ `--image_path`オプションにフォルダを指定すると、そのフォルダの画像を順次読み込みます。生成される枚数は画像枚数ではなく、プロンプト数になりますので、`--images_per_promptPPオプションを指定してimg2imgする画像の枚数とプロンプト数を合わせてください。
255
+
256
+ ファイルはファイル名でソートして読み込みます。なおソート順は文字列順となりますので(`1.jpg→2.jpg→10.jpg`ではなく`1.jpg→10.jpg→2.jpg`の順)、頭を0埋めするなどしてご対応ください(`01.jpg→02.jpg→10.jpg`)。
257
+
258
+ ## img2imgを利用したupscale
259
+
260
+ img2img時にコマンドラインオプションの`--W`と`--H`で生成画像サイズを指定すると、元画像をそのサイズにリサイズしてからimg2imgを行います。
261
+
262
+ またimg2imgの元画像がこのスクリプトで生成した画像の場合、プロンプトを省略すると、元画像のメタデータからプロンプトを取得しそのまま用います。これによりHighres. fixの2nd stageの動作だけを行うことができます。
263
+
264
+ ## img2img時のinpainting
265
+
266
+ 画像およびマスク画像を指定してinpaintingできます(inpaintingモデルには対応しておらず、単にマスク領域を対象にimg2imgするだけです)。
267
+
268
+ オプションは以下の通りです。
269
+
270
+ - `--mask_image`:マスク画像を指定します。`--img_path`と同様にフォルダを指定すると、そのフォルダの画像を順次利用します。
271
+
272
+ マスク画像はグレースケール画像で、白の部分がinpaintingされます。境界をグラデーションしておくとなんとなく滑らかになりますのでお勧めです。
273
+
274
+ ![image](https://user-images.githubusercontent.com/52813779/235343795-9eaa6d98-02ff-4f32-b089-80d1fc482453.png)
275
+
276
+ # その他の機能
277
+
278
+ ## Textual Inversion
279
+
280
+ `--textual_inversion_embeddings`オプションで使用するembeddingsを指定します(複数指定可)。拡張子を除いたファイル名をプロンプト内で使用することで、そのembeddingsを利用します(Web UIと同様の使用法です)。ネガティブプロンプト内でも使用できます。
281
+
282
+ モデルとして、当リポジトリで学習したTextual Inversionモデル、およびWeb UIで学習したTextual Inversionモデル(画像埋め込みは非対応)を利用できます
283
+
284
+ ## Extended Textual Inversion
285
+
286
+ `--textual_inversion_embeddings`の代わりに`--XTI_embeddings`オプションを指定してください。使用法は`--textual_inversion_embeddings`と同じです。
287
+
288
+ ## Highres. fix
289
+
290
+ AUTOMATIC1111氏のWeb UIにある機能の類似機能です(独自実装のためもしかしたらいろいろ異なるかもしれません)。最初に小さめの画像を生成し、その画像を元にimg2imgすることで、画像全体の破綻を防ぎつつ大きな解像度の画像を生成します。
291
+
292
+ 2nd stageのstep数は`--steps` と`--strength`オプションの値から計算されます(`steps*strength`)。
293
+
294
+ img2imgと併用できません。
295
+
296
+ 以下のオプションがあります。
297
+
298
+ - `--highres_fix_scale`:Highres. fixを有効にして、1st stageで生成する画像のサイズを、倍率で指定します。最終出力が1024x1024で、最初に512x512の画像を生成する場合は`--highres_fix_scale 0.5`のように指定します。Web UI出の指定の逆数になっていますのでご注意ください。
299
+
300
+ - `--highres_fix_steps`:1st stageの画像のステップ数を指定します。デフォルトは`28`です。
301
+
302
+ - `--highres_fix_save_1st`:1st stageの画像を保存するかどうかを指定します。
303
+
304
+ - `--highres_fix_latents_upscaling`:指定すると2nd stageの画像生成時に1st stageの画像をlatentベースでupscalingします(bilinearのみ対応)。未指定時は画像をLANCZOS4でupscalingします。
305
+
306
+ - `--highres_fix_upscaler`:2nd stageに任意のupscalerを利用します。現在は`--highres_fix_upscaler tools.latent_upscaler` のみ対応しています。
307
+
308
+ - `--highres_fix_upscaler_args`:`--highres_fix_upscaler`で指定したupscalerに渡す引数を指定します。
309
+ `tools.latent_upscaler`の場合は、`--highres_fix_upscaler_args "weights=D:\Work\SD\Models\others\etc\upscaler-v1-e100-220.safetensors"`のように重みファイルを指定します。
310
+
311
+ コマンドラインの例です。
312
+
313
+ ```batchfile
314
+ python gen_img_diffusers.py --ckpt trinart_characters_it4_v1_vae_merged.ckpt
315
+ --n_iter 1 --scale 7.5 --W 1024 --H 1024 --batch_size 1 --outdir ../txt2img
316
+ --steps 48 --sampler ddim --fp16
317
+ --xformers
318
+ --images_per_prompt 1 --interactive
319
+ --highres_fix_scale 0.5 --highres_fix_steps 28 --strength 0.5
320
+ ```
321
+
322
+ ## ControlNet
323
+
324
+ 現在はControlNet 1.0のみ動作確認しています。プリプロセスはCannyのみサポートしています。
325
+
326
+ 以下のオプションがあります。
327
+
328
+ - `--control_net_models`:ControlNetのモデルファイルを指定します。
329
+ 複数指定すると、それらをstepごとに切り替えて利用します(Web UIのControlNet拡張の実装と異なります)。diffと通常の両方をサポートします。
330
+
331
+ - `--guide_image_path`:ControlNetに使うヒント画像を指定します。`--img_path`と同様にフォルダを指定すると、そのフォルダの画像を順次利用します。Canny以外のモデルの場合には、あらかじめプリプロセスを行っておいてください。
332
+
333
+ - `--control_net_preps`:ControlNetのプリプロセスを指定します。`--control_net_models`と同様に複数指定可能です。現在はcannyのみ対応しています。対象モデルでプリプロセスを使用しない場合は `none` を指定します。
334
+ cannyの場合 `--control_net_preps canny_63_191`のように、閾値1と2を'_'で区切って指定できます。
335
+
336
+ - `--control_net_weights`:ControlNetの適用時の重みを指定します(`1.0`で通常、`0.5`なら半分の影響力で適用)。`--control_net_models`と同様に複数指定可能です。
337
+
338
+ - `--control_net_ratios`:ControlNetを適用するstepの範囲を指定します。`0.5`の場合は、step数の半分までControlNetを適用します。`--control_net_models`と同様に複数指定可能です。
339
+
340
+ コマンドラインの例です。
341
+
342
+ ```batchfile
343
+ python gen_img_diffusers.py --ckpt model_ckpt --scale 8 --steps 48 --outdir txt2img --xformers
344
+ --W 512 --H 768 --bf16 --sampler k_euler_a
345
+ --control_net_models diff_control_sd15_canny.safetensors --control_net_weights 1.0
346
+ --guide_image_path guide.png --control_net_ratios 1.0 --interactive
347
+ ```
348
+
349
+ ## Attention Couple + Reginal LoRA
350
+
351
+ プロンプトをいくつかの部分に分割し、それぞれのプロンプトを画像内のどの領域に適用するかを指定できる機能です。個別のオプションはありませんが、`mask_path`とプロンプトで指定します。
352
+
353
+ まず、プロンプトで` AND `を利用して、複数部分を定義します。最初の3つに対して領域指定ができ、以降の部分は画像全体へ適用されます。ネガティブプロンプトは画像全体に適用されます。
354
+
355
+ 以下ではANDで3つの部分を定義しています。
356
+
357
+ ```
358
+ shs 2girls, looking at viewer, smile AND bsb 2girls, looking back AND 2girls --n bad quality, worst quality
359
+ ```
360
+
361
+ 次にマスク画像を用意します。マスク画像はカラーの画像で、RGBの各チャネルがプロンプトのANDで区切られた部分に対応します。またあるチャネルの値がすべて0の場合、画像全体に適用されます。
362
+
363
+ 上記の例では、Rチャネルが`shs 2girls, looking at viewer, smile`、Gチャネルが`bsb 2girls, looking back`に、Bチャネルが`2girls`に対応します。次のようなマスク画像を使用すると、Bチャネルに指定がありませんので、`2girls`は画像全体に適用されます。
364
+
365
+ ![image](https://user-images.githubusercontent.com/52813779/235343061-b4dc9392-3dae-4831-8347-1e9ae5054251.png)
366
+
367
+ マスク画像は`--mask_path`で指定します。現在は1枚のみ対応しています。指定した画像サイズに自動的にリサイズされ適用されます。
368
+
369
+ ControlNetと組み合わせることも可能です(細かい位置指定にはControlNetとの組み合わせを推奨します)。
370
+
371
+ LoRAを指定すると、`--network_weights`で指定した複数のLoRAがそれぞれANDの各部分に対応します。現在の制約として、LoRAの数はANDの部分の数と同じである必要があります。
372
+
373
+ ## CLIP Guided Stable Diffusion
374
+
375
+ DiffusersのCommunity Examplesの[こちらのcustom pipeline](https://github.com/huggingface/diffusers/blob/main/examples/community/README.md#clip-guided-stable-diffusion)からソースをコピー、変更したものです。
376
+
377
+ 通常のプロンプトによる生成指定に加えて、追加でより大規模のCLIPでプロンプトのテキストの特徴量を取得し、生成中の画像の特徴量がそのテキストの特徴量に近づくよう、生成される画像をコントロールします(私のざっくりとした理解です)。大きめのCLIPを使いますのでVRAM使用量はかなり増加し(VRAM 8GBでは512*512でも厳しいかもしれません)、生成時間も掛かります。
378
+
379
+ なお選択できるサンプラーはDDIM、PNDM、LMSのみとなります。
380
+
381
+ `--clip_guidance_scale`オプションにどの程度、CLIPの特徴量を反映するかを数値で指定します。先のサンプルでは100になっていますので、そのあたりから始めて増減すると良いようです。
382
+
383
+ デフォルトではプロンプトの先頭75トークン(重みづけの特殊文字を除く)がCLIPに渡されます。プロンプトの`--c`オプションで、通常のプロンプトではなく、CLIPに渡すテキストを別に指定できます(たとえばCLIPはDreamBoothのidentifier(識別子)や「1girl」などのモデル特有の単語は認識できないと思われますので、それらを省いたテキストが良いと思われます)。
384
+
385
+ コマンドラインの例です。
386
+
387
+ ```batchfile
388
+ python gen_img_diffusers.py --ckpt v1-5-pruned-emaonly.ckpt --n_iter 1
389
+ --scale 2.5 --W 512 --H 512 --batch_size 1 --outdir ../txt2img --steps 36
390
+ --sampler ddim --fp16 --opt_channels_last --xformers --images_per_prompt 1
391
+ --interactive --clip_guidance_scale 100
392
+ ```
393
+
394
+ ## CLIP Image Guided Stable Diffusion
395
+
396
+ テキストではなくCLIPに別の画像を渡し、その特徴量に近づくよう生成をコントロールする機能です。`--clip_image_guidance_scale`オプションで適用量の数値を、`--guide_image_path`オプションでguideに使用する画像(ファイルまたはフォルダ)を指定してください。
397
+
398
+ コマンドラインの例です。
399
+
400
+ ```batchfile
401
+ python gen_img_diffusers.py --ckpt trinart_characters_it4_v1_vae_merged.ckpt
402
+ --n_iter 1 --scale 7.5 --W 512 --H 512 --batch_size 1 --outdir ../txt2img
403
+ --steps 80 --sampler ddim --fp16 --opt_channels_last --xformers
404
+ --images_per_prompt 1 --interactive --clip_image_guidance_scale 100
405
+ --guide_image_path YUKA160113420I9A4104_TP_V.jpg
406
+ ```
407
+
408
+ ### VGG16 Guided Stable Diffusion
409
+
410
+ 指定した画像に近づくように画像生成する機能です。通常のプロンプトによる生成指定に加えて、追加でVGG16の特徴量を取得し、生成中の画像が指定したガイド画像に近づくよう、生成される画像をコントロールします。img2imgでの使用をお勧めします(通常の生成では画像がぼやけた感じになります)。CLIP Guided Stable Diffusionの仕組みを流用した独自の機能です。またアイデアはVGGを利用したスタイル変換から拝借しています。
411
+
412
+ なお選択できるサンプラーはDDIM、PNDM、LMSのみとなります。
413
+
414
+ `--vgg16_guidance_scale`オプションにどの程度、VGG16特徴量を反映するかを数値で指定します。試した感じでは100くらいから始めて増減すると良いようです。`--guide_image_path`オプションでguideに使用する画像(ファイルまたはフォルダ)を指定してください。
415
+
416
+ 複数枚の画像を一括でimg2img変換し、元画像をガイド画像とする場合、`--guide_image_path`と`--image_path`に同じ値を指定すればOKです。
417
+
418
+ コマンドラインの例です。
419
+
420
+ ```batchfile
421
+ python gen_img_diffusers.py --ckpt wd-v1-3-full-pruned-half.ckpt
422
+ --n_iter 1 --scale 5.5 --steps 60 --outdir ../txt2img
423
+ --xformers --sampler ddim --fp16 --W 512 --H 704
424
+ --batch_size 1 --images_per_prompt 1
425
+ --prompt "picturesque, 1girl, solo, anime face, skirt, beautiful face
426
+ --n lowres, bad anatomy, bad hands, error, missing fingers,
427
+ cropped, worst quality, low quality, normal quality,
428
+ jpeg artifacts, blurry, 3d, bad face, monochrome --d 1"
429
+ --strength 0.8 --image_path ..\src_image
430
+ --vgg16_guidance_scale 100 --guide_image_path ..\src_image
431
+ ```
432
+
433
+ `--vgg16_guidance_layerPで特徴量取得に使用するVGG16のレイヤー番号を指定できます(デフォルトは20でconv4-2のReLUです)。上の層ほど画風を表現し、下の層ほどコンテンツを表現するといわれています。
434
+
435
+ ![image](https://user-images.githubusercontent.com/52813779/235343813-3c1f0d7a-4fb3-4274-98e4-b92d76b551df.png)
436
+
437
+ # その他のオプション
438
+
439
+ - `--no_preview` : 対話モードでプレビュー画像を表示しません。OpenCVがインストールされていない場合や、出力されたファイルを直接確認する場合に指定してください。
440
+
441
+ - `--n_iter` : 生成を繰り返す回数を指定します。デフォルトは1です。プロンプトをファイルから読み込むとき、複数回の生成を行いたい場合に指定します。
442
+
443
+ - `--tokenizer_cache_dir` : トークナイザーのキャッシュディレクトリを指定します。(作業中)
444
+
445
+ - `--seed` : 乱数seedを指定します。1枚生成時はその画像のseed、複数枚生成時は各画像のseedを生成するための乱数のseedになります(`--from_file`で複数画像生成するとき、`--seed`オプションを指定すると複数回実行したときに各画像が同じseedになります)。
446
+
447
+ - `--iter_same_seed` : プロンプトに乱数seedの指定がないとき、`--n_iter`の繰り返し内ではすべて同じseedを使います。`--from_file`で指定した複数のプロンプト間でseedを統一して比較するときに使います。
448
+
449
+ - `--diffusers_xformers` : Diffuserのxformersを使用します。
450
+
451
+ - `--opt_channels_last` : 推論時にテンソルのチャンネルを最後に配置します。場合によっては高速化されることがあります。
452
+
453
+ - `--network_show_meta` : 追加ネットワークのメタデータを表示します。
454
+
docs/image_folder_structure.md ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Drambootd, Lora and TI image folder structure
2
+
3
+ To ensure successful training with Kohya, it is crucial to follow a specific folder structure that provides the necessary image repeats. Please adhere to the following structure precisely:
4
+
5
+ Folder Structure Example:
6
+
7
+ ```txt
8
+ c:
9
+ |
10
+ ├──images
11
+ | |
12
+ | ├── 30_cat
13
+ | | |
14
+ | | ├── image1.jpg
15
+ | | ├── image1.txt
16
+ | | ├── image2.png
17
+ | | └── image2.txt
18
+ | |
19
+ | ├── 30_dog
20
+ | | |
21
+ | | ├── image1.jpg
22
+ | | ├── image1.txt
23
+ | | ├── image2.png
24
+ | | └── image2.txt
25
+ | |
26
+ | └── 40_black mamba
27
+ | |
28
+ | ├── image1.jpg
29
+ | ├── image1.txt
30
+ | ├── image2.png
31
+ | └── image2.txt
32
+ |
33
+ ├──regularization
34
+ | |
35
+ | ├── 1_cat
36
+ | | |
37
+ | | ├── reg1.jpg
38
+ | | ├── reg2.jpg
39
+ | |
40
+ | ├── 1_dog
41
+ | | |
42
+ | | ├── reg1.jpg
43
+ | | ├── reg2.jpg
44
+ | |
45
+ | └── 1_black mamba
46
+ | |
47
+ | ├── reg1.jpg
48
+ | ├── reg2.jpg
49
+
50
+ ```
51
+
52
+ Please note the following important information regarding file extensions and their impact on concept names during model training:
53
+
54
+ If a file with a .txt or .caption extension and the same name as an image is present in the image subfolder, it will take precedence over the concept name during the model training process.
55
+ For example, if there is an image file named image1.jpg in the 30_cat subfolder, and there is a corresponding text file named image1.txt or image1.caption in the same subfolder, the concept name used during training will be determined by the content of that text file rather than the subfolder name.
56
+
57
+ Ensure that the content of such text files accurately reflects the desired concept name or any relevant caption information associated with the corresponding image.
58
+
59
+ By considering this information and maintaining the proper folder structure, including any necessary text or caption files, you can ensure a smooth and effective training process with Kohya.
docs/train_README-ja.md ADDED
@@ -0,0 +1,1002 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ __ドキュメント更新中のため記述に誤りがあるかもしれません。__
2
+
3
+ # 学習について、共通編
4
+
5
+ 当リポジトリではモデルのfine tuning、DreamBooth、およびLoRAとTextual Inversion([XTI:P+](https://github.com/kohya-ss/sd-scripts/pull/327)を含む)の学習をサポートします。この文書ではそれらに共通する、学習データの準備方法やオプション等について説明します。
6
+
7
+ # 概要
8
+
9
+ あらかじめこのリポジトリのREADMEを参照し、環境整備を行ってください。
10
+
11
+
12
+ 以下について説明します。
13
+
14
+ 1. 学習データの準備について(設定ファイルを用いる新形式)
15
+ 1. 学習で使われる用語のごく簡単な解説
16
+ 1. 以前の指定形式(設定ファイルを用いずコマンドラインから指定)
17
+ 1. 学習途中のサンプル画像生成
18
+ 1. 各スクリプトで共通の、よく使われるオプション
19
+ 1. fine tuning 方式のメタデータ準備:キャプションニングなど
20
+
21
+ 1.だけ実行すればとりあえず学習は可能です(学習については各スクリプトのドキュメントを参照)。2.以降は必要に応じて参照してください。
22
+
23
+
24
+ # 学習データの準備について
25
+
26
+ 任意のフォルダ(複数でも可)に学習データの画像ファイルを用意しておきます。`.png`, `.jpg`, `.jpeg`, `.webp`, `.bmp` をサポートします。リサイズなどの前処理は基本的に必要ありません。
27
+
28
+ ただし学習解像度(後述)よりも極端に小さい画像は使わないか、あらかじめ超解像AIなどで拡大しておくことをお勧めします。また極端に大きな画像(3000x3000ピクセル程度?)よりも大きな画像はエラーになる場合があるようですので事前に縮小してください。
29
+
30
+ 学習時には、モデルに学ばせる画像データを整理し、スクリプトに対して指定する必要があります。学習データの数、学習対象、キャプション(画像の説明)が用意できるか否かなどにより、いくつかの方法で学習データを指定できます。以下の方式があります(それぞれの名前は一般的なものではなく、当リポジトリ独自の定義です)。正則化画像については後述します。
31
+
32
+ 1. DreamBooth、class+identifier方式(正則化画像使用可)
33
+
34
+ 特定の単語 (identifier) に学習対象を紐づけるように学習します。キャプションを用意する必要はありません。たとえば特定のキャラを学ばせる場合に使うとキャプションを用意する必要がない分、手軽ですが、髪型や服装、背景など学習データの全要素が identifier に紐づけられて学習されるため、生成時のプロンプトで服が変えられない、といった事態も起こりえます。
35
+
36
+ 1. DreamBooth、キャプション方式(正則化画像使用可)
37
+
38
+ 画像ごとにキャプションが記録されたテキストファイルを用意して学習します。たとえば特定のキャラを学ばせると、画像の詳細をキャプションに記述することで(白い服を着たキャラA、赤い服を着たキャラA、など)キャラとそれ以外の要素が分離され、より厳密にモデルがキャラだけを学ぶことが期待できます。
39
+
40
+ 1. fine tuning方式(正則化画像使用不可)
41
+
42
+ あらかじめキャプションをメタデータファイルにまとめます。タグとキャプションを分けて管理したり、学習を高速化するためlatentsを事前キャッシュしたりなどの機能をサポートします(いずれも別文書で説明しています)。(fine tuning方式という名前ですが fine tuning 以外でも使えます。)
43
+
44
+ 学習したいものと使用できる指定方法の組み合わせは以下の通りです。
45
+
46
+ | 学習対象または方法 | スクリプト | DB / class+identifier | DB / キャプション | fine tuning |
47
+ | ----- | ----- | ----- | ----- | ----- |
48
+ | モデルをfine tuning | `fine_tune.py`| x | x | o |
49
+ | モデルをDreamBooth | `train_db.py`| o | o | x |
50
+ | LoRA | `train_network.py`| o | o | o |
51
+ | Textual Invesion | `train_textual_inversion.py`| o | o | o |
52
+
53
+ ## どれを選ぶか
54
+
55
+ LoRA、Textual Inversionについては、手軽にキャプションファイルを用意せずに学習したい場合はDreamBooth class+identifier、用意できるならDreamBooth キャプション方式がよいでしょう。学習データの枚数が多く、かつ正則化画像を使用しない場合はfine tuning方式も検討してください。
56
+
57
+ DreamBoothについても同様ですが、fine tuning方式は使えません。fine tuningの場合はfine tuning方式のみです。
58
+
59
+ # 各方式の指定方法について
60
+
61
+ ここではそれぞれの指定方法で典型的なパターンについてだけ説明します。より詳細な指定方法については [データセット設定](./config_README-ja.md) をご覧ください。
62
+
63
+ # DreamBooth、class+identifier方式(正則化画像使用可)
64
+
65
+ この方式では、各画像は `class identifier` というキャプションで学習されたのと同じことになります(`shs dog` など)。
66
+
67
+ ## step 1. identifierとclassを決める
68
+
69
+ 学ばせたい対象を結びつける単語identifierと、対象の属するclassを決めます。
70
+
71
+ (instanceなどいろいろな呼び方がありますが、とりあえず元の論文に合わせます。)
72
+
73
+ 以下ごく簡単に説明します(詳しくは調べてください)。
74
+
75
+ classは学習対象の一般的な種別です。たとえば特定の犬種を学ばせる場合には、classはdogになります。アニメキャラならモデルによりboyやgirl、1boyや1girlになるでしょう。
76
+
77
+ identifierは学習対象を識別して学習するためのものです。任意の単語で構いませんが、元論文によると「tokinizerで1トークンになる3文字以下でレアな単語」が良いとのことです。
78
+
79
+ identifierとclassを使い、たとえば「shs dog」などでモデルを学習することで、学習させたい対象をclassから識別して学習できます。
80
+
81
+ 画像生成時には「shs dog」とすれば学ばせた犬種の画像が生成されます。
82
+
83
+ (identifierとして私が最近使っているものを参考までに挙げると、``shs sts scs cpc coc cic msm usu ici lvl cic dii muk ori hru rik koo yos wny`` などです。本当は Danbooru Tag に含まれないやつがより望ましいです。)
84
+
85
+ ## step 2. 正則化画像を使うか否かを決め、使う場合には正則化画像を生成する
86
+
87
+ 正則化画像とは、前述のclass全体が、学習対象に引っ張られることを防ぐための画像です(language drift)。正則化画像を使わないと、たとえば `shs 1girl` で特定のキャラクタを学ばせると、単なる `1girl` というプロンプトで生成してもそのキャラに似てきます。これは `1girl` が学習時のキャプションに含まれているためです。
88
+
89
+ 学習対象の画像と正則化画像を同時に学ばせることで、class は class のままで留まり、identifier をプロンプトにつけた時だけ学習対象が生成されるようになります。
90
+
91
+ LoRAやDreamBoothで特定のキャラだけ出てくればよい場合は、正則化画像を用いなくても良いといえます。
92
+
93
+ Textual Inversionでは用いなくてよいでしょう(学ばせる token string がキャプションに含まれない場合はなにも学習されないため)。
94
+
95
+ 正則化画像としては、学習対象のモデルで、class 名だけで生成した画像を用いるのが一般的です(たとえば `1girl`)。ただし生成画像の品質が悪い場合には、プロンプトを工夫したり、ネットから別途ダウンロードした画像を用いることもできます。
96
+
97
+ (正則化画像も学習されるため、その品質はモデルに影響します。)
98
+
99
+ 一般的には数百枚程度、用意するのが望ましいようです(枚数が少ないと class 画像が一般化されずそれらの特徴を学んでしまいます)。
100
+
101
+ 生成画像を使う場合、通常、生成画像のサイズは学習解像度(より正確にはbucketの解像度、後述)にあわせてください。
102
+
103
+ ## step 2. 設定ファイルの記述
104
+
105
+ テキストファイルを作成し、拡張子を `.toml` にします。たとえば以下のように記述します。
106
+
107
+ (`#` で始まっている部分はコメントですので、このままコピペしてそのままでもよいですし、削除しても問題ありません。)
108
+
109
+ ```toml
110
+ [general]
111
+ enable_bucket = true # Aspect Ratio Bucketingを使うか否か
112
+
113
+ [[datasets]]
114
+ resolution = 512 # 学習解像度
115
+ batch_size = 4 # バッチサイズ
116
+
117
+ [[datasets.subsets]]
118
+ image_dir = 'C:\hoge' # 学習用画像を入れたフォルダを指定
119
+ class_tokens = 'hoge girl' # identifier class を指定
120
+ num_repeats = 10 # 学習用画像の繰り返し回数
121
+
122
+ # 以下は正則化画像を用いる場合のみ記述する。用いない場合は削除する
123
+ [[datasets.subsets]]
124
+ is_reg = true
125
+ image_dir = 'C:\reg' # 正則化画像を入れたフォルダを指定
126
+ class_tokens = 'girl' # class を指定
127
+ num_repeats = 1 # 正則化画像の繰り返し回数、基本的には1でよい
128
+ ```
129
+
130
+ 基本的には以下の場所のみ書き換えれば学習できます。
131
+
132
+ 1. 学習解像度
133
+
134
+ 数値1つを指定すると正方形(`512`なら512x512)、鍵カッコカンマ区切りで2つ指定する��横×縦(`[512,768]`なら512x768)になります。SD1.x系ではもともとの学習解像度は512です。`[512,768]` 等の大きめの解像度を指定すると縦長、横長画像生成時の破綻を小さくできるかもしれません。SD2.x 768系では `768` です。
135
+
136
+ 1. バッチサイズ
137
+
138
+ 同時に何件のデータを学習するかを指定します。GPUのVRAMサイズ、学習解像度によって変わってきます。詳しくは後述します。またfine tuning/DreamBooth/LoRA等でも変わってきますので各スクリプトの説明もご覧ください。
139
+
140
+ 1. フォルダ指定
141
+
142
+ 学習用画像、正則化画像(使用する場合のみ)のフォルダを指定します。画像データが含まれているフォルダそのものを指定します。
143
+
144
+ 1. identifier と class の指定
145
+
146
+ 前述のサンプルの通りです。
147
+
148
+ 1. 繰り返し回数
149
+
150
+ 後述します。
151
+
152
+ ### 繰り返し回数について
153
+
154
+ 繰り返し回数は、正則化画像の枚数と学習用画像の枚数を調整するために用いられます。正則化画像の枚数は学習用画像よりも多いため、学習用画像を繰り返して枚数を合わせ、1対1の比率で学習できるようにします。
155
+
156
+ 繰り返し回数は「 __学習用画像の繰り返し回数×学習用画像の枚数≧正則化画像の繰り返し回数×正則化画像の枚数__ 」となるように指定してください。
157
+
158
+ (1 epoch(データが一周すると1 epoch)のデータ数が「学習用画像の繰り返し回数×学習用画像の枚数」となります。正則化画像の枚数がそれより多いと、余った部分の正則化画像は使用されません。)
159
+
160
+ ## step 3. 学習
161
+
162
+ それぞれのドキュメントを参考に学習を行ってください。
163
+
164
+ # DreamBooth、キャプション方式(正則化画像使用可)
165
+
166
+ この方式では各画像はキャプションで学習されます。
167
+
168
+ ## step 1. キャプションファイルを準備する
169
+
170
+ 学習用画像のフォルダに、画像と同じファイル名で、拡張子 `.caption`(設定で変えられます)のファイルを置いてください。それぞれのファイルは1行のみとしてください。エンコーディングは `UTF-8` です。
171
+
172
+ ## step 2. 正則化画像を使うか否かを決め、使う場合には正則化画像を生成する
173
+
174
+ class+identifier形式と同様です。なお正則化画像にもキャプションを付けることができますが、通常は不要でしょう。
175
+
176
+ ## step 2. 設定ファイルの記述
177
+
178
+ テキストファイルを作成し、拡張子を `.toml` にします。たとえば以下のように記述します。
179
+
180
+ ```toml
181
+ [general]
182
+ enable_bucket = true # Aspect Ratio Bucketingを使うか否か
183
+
184
+ [[datasets]]
185
+ resolution = 512 # 学習解像度
186
+ batch_size = 4 # バッチサイズ
187
+
188
+ [[datasets.subsets]]
189
+ image_dir = 'C:\hoge' # 学習用画像を入れたフォルダを指定
190
+ caption_extension = '.caption' # キャプションファイルの拡張子 .txt を使う場合には書き換える
191
+ num_repeats = 10 # 学習用画像の繰り返し回数
192
+
193
+ # 以下は正則化画像を用いる場合のみ記述する。用いない場合は削除する
194
+ [[datasets.subsets]]
195
+ is_reg = true
196
+ image_dir = 'C:\reg' # 正則化画像を入れたフォルダを指定
197
+ class_tokens = 'girl' # class を指定
198
+ num_repeats = 1 # 正則化画像の繰り返し回数、基本的には1でよい
199
+ ```
200
+
201
+ 基本的には以下を場所のみ書き換えれば学習できます。特に記述がない部分は class+identifier 方式と同じです。
202
+
203
+ 1. 学習解像度
204
+ 1. バッチサイズ
205
+ 1. フォルダ指定
206
+ 1. キャプションファイルの拡張子
207
+
208
+ 任意の拡張子を指定できます。
209
+ 1. 繰り返し回数
210
+
211
+ ## step 3. 学習
212
+
213
+ それぞれのドキュメントを参考に学習を行ってください。
214
+
215
+ # fine tuning 方式
216
+
217
+ ## step 1. メタデータを準備する
218
+
219
+ キャプションやタグをまとめた管理用ファイルをメタデータと呼びます。json形式で拡張子は `.json`
220
+ です。作成方法は長くなりますのでこの文書の末尾に書きました。
221
+
222
+ ## step 2. 設定ファイルの記述
223
+
224
+ テキストファイルを作成し、拡張子を `.toml` にします。たとえば以下のように記述します。
225
+
226
+ ```toml
227
+ [general]
228
+ shuffle_caption = true
229
+ keep_tokens = 1
230
+
231
+ [[datasets]]
232
+ resolution = 512 # 学習解像度
233
+ batch_size = 4 # バッチサイズ
234
+
235
+ [[datasets.subsets]]
236
+ image_dir = 'C:\piyo' # 学習用画像を入れたフォルダを指定
237
+ metadata_file = 'C:\piyo\piyo_md.json' # メタデータファイル名
238
+ ```
239
+
240
+ 基本的には以下を場所のみ書き換えれば学習できます。特に記述がない部分は DreamBooth, class+identifier 方式と同じです。
241
+
242
+ 1. 学習解像度
243
+ 1. バッチサイズ
244
+ 1. フォルダ指定
245
+ 1. メタデータファイル名
246
+
247
+ 後述の方法で作成したメタデータファイルを指定します。
248
+
249
+
250
+ ## step 3. 学習
251
+
252
+ それぞれのドキュメントを参考に学習を行ってください。
253
+
254
+ # 学習で使われる用語のごく簡単な解説
255
+
256
+ 細かいことは省略していますし私も完全には理解していないため、詳しくは各自お調べください。
257
+
258
+ ## fine tuning(ファインチューニング)
259
+
260
+ モデルを学習して微調整することを指します。使われ方によって意味が異なってきますが、狭義のfine tuningはStable Diffusionの場合、モデルを画像とキャプションで学習することです。DreamBoothは狭義のfine tuningのひとつの特殊なやり方と言えます。広義のfine tuningは、LoRAやTextual Inversion、Hypernetworksなどを含み、モデルを学習することすべてを含みます。
261
+
262
+ ## ステップ
263
+
264
+ ざっくりいうと学習データで1回計算すると1ステップです。「学習データのキャプションを今のモデルに流してみて、出てくる画像を学習データの画像と比較し、学習データに近づくようにモデルをわずかに変更する」のが1ステップです。
265
+
266
+ ## バッチサイズ
267
+
268
+ バッチサイズは1ステップで何件のデータをまとめて計算するかを指定する値です。まとめて計算するため速度は相対的に向上します。また一般的には精度も高くなるといわれています。
269
+
270
+ `バッチサイズ×ステップ数` が学習に使われるデータの件数になります。そのため、バッチサイズを増やした分だけステップ数を減らすとよいでしょう。
271
+
272
+ (ただし、たとえば「バッチサイズ1で1600ステップ」と「バッチサイズ4で400ステップ」は同じ結果にはなりません。同じ学習率の場合、一般的には後者のほうが学習不足になります。学習率を多少大きくするか(たとえば `2e-6` など)、ステップ数をたとえば500ステップにするなどして工夫してください。)
273
+
274
+ バッチサイズを大きくするとその分だけGPUメモリを消費します。メモリが足りなくなるとエラーになりますし、エラーにならないギリギリでは学習速度が低下します。タスクマネージャーや `nvidia-smi` コマンドで使用メモリ量を確認しながら調整するとよいでしょう。
275
+
276
+ なお、バッチは「一塊のデータ」位の意味です。
277
+
278
+ ## 学習率
279
+
280
+ ざっくりいうと1ステップごとにどのくらい変化させるかを表します。大きな値を指定するとそれだけ速く学習が進みますが、変化しすぎてモデルが壊れたり、最適な状態にまで至れない場合があります。小さい値を指定すると学習速度は遅くなり、また最適な状態にやはり至れない場合があります。
281
+
282
+ fine tuning、DreamBoooth、LoRAそれぞれで大きく異なり、また学習データや学習させたいモデル、バッチサイズやステップ数によっても変わってきます。一般的な値から初めて学習状態を見ながら増減してください。
283
+
284
+ デフォルトでは学習全体を通して学習率は固定です。スケジューラの指定で学習率をどう変化させるか決められますので、それらによっても結果は変わってきます。
285
+
286
+ ## エポック(epoch)
287
+
288
+ 学習データが一通り学習されると(データが一周すると)1 epochです。繰り返し回数を指定した場合は、その繰り返し後のデータが一周すると1 epochです。
289
+
290
+ 1 epochのステップ数は、基本的には `データ件数÷バッチサイズ` ですが、Aspect Ratio Bucketing を使うと微妙に増えます(異なるbucketのデータは同じバッチにできないため、ステップ数が増えます)。
291
+
292
+ ## Aspect Ratio Bucketing
293
+
294
+ Stable Diffusion のv1は512\*512で学習されていますが、それに加えて256\*1024や384\*640といった解像度でも学習します。これによりトリミングされる部分が減り、より正しくキャプションと画像の関係が学習されることが期待されます。
295
+
296
+ また任意の解像度で学習するため、事前に画像データの縦横比を統一しておく必要がなくなります。
297
+
298
+ 設定で有効、向こうが切り替えられますが、ここまでの設定ファイルの記述例では有効になっています(`true` が設定されています)。
299
+
300
+ 学習解像度はパラメータとして与えられた解像度の面積(=メモリ使用量)を超えない範囲で、64ピクセル単位(デフォルト、変更可)で縦横に調整、作成されます。
301
+
302
+ 機械学習では入力サイズをすべて統一するのが一般的ですが、特に制約があるわけではなく、実際は同一のバッチ内で統一されていれば大丈夫です。NovelAIの言うbucketingは、あらかじめ教師データを、アスペクト比に応じた学習解像度ごとに分類しておくことを指しているようです。そしてバッチを各bucket内の画像で作成することで、バッチの画像サイズを統一します。
303
+
304
+ # 以前の指定形式(設定ファイルを用いずコマンドラインから指定)
305
+
306
+ `.toml` ファイルを指定せずコマンドラインオプションで指定する方法です。DreamBooth class+identifier方式、DreamBooth キャプション方式、fine tuning方式があります。
307
+
308
+ ## DreamBooth、class+identifier方式
309
+
310
+ フォルダ名で繰り返し回数を指定します。また `train_data_dir` オプションと `reg_data_dir` オプションを用います。
311
+
312
+ ### step 1. 学習用画像の準備
313
+
314
+ 学習用画像を格納するフォルダを作成します。 __さらにその中に__ 、以下の名前でディレクトリを作成します。
315
+
316
+ ```
317
+ <繰り返し回数>_<identifier> <class>
318
+ ```
319
+
320
+ 間の``_``を忘れないでください。
321
+
322
+ たとえば「sls frog」というプロンプトで、データを20回繰り返す場合、「20_sls frog」となります。以下のようになります。
323
+
324
+ ![image](https://user-images.githubusercontent.com/52813779/210770636-1c851377-5936-4c15-90b7-8ac8ad6c2074.png)
325
+
326
+ ### 複数class、複数対象(identifier)の学習
327
+
328
+ 方法は単純で、学習用画像のフォルダ内に ``繰り返し回数_<identifier> <class>`` のフォルダを複数、正則化画像フォルダにも同様に ``繰り返し回数_<class>`` のフォルダを複数、用意してください。
329
+
330
+ たとえば「sls frog」と「cpc rabbit」を同時に学習する場合、以下のようになります。
331
+
332
+ ![image](https://user-images.githubusercontent.com/52813779/210777933-a22229db-b219-4cd8-83ca-e87320fc4192.png)
333
+
334
+ classがひとつで対象が複数の場合、正則化画像フォルダはひとつで構いません。たとえば1girlにキャラAとキャラBがいる場合は次のようにします。
335
+
336
+ - train_girls
337
+ - 10_sls 1girl
338
+ - 10_cpc 1girl
339
+ - reg_girls
340
+ - 1_1girl
341
+
342
+ ### step 2. 正則化画像の準備
343
+
344
+ 正則化画像を使う場合の手順です。
345
+
346
+ 正則化画像を格納するフォルダを作成します。 __さらにその中に__ ``<繰り返し回数>_<class>`` という名前でディレクトリを作成します。
347
+
348
+ たとえば「frog」というプロンプトで、データを繰り返さない(1回だけ)場合、以下のようになります。
349
+
350
+ ![image](https://user-images.githubusercontent.com/52813779/210770897-329758e5-3675-49f1-b345-c135f1725832.png)
351
+
352
+
353
+ ### step 3. 学習の実行
354
+
355
+ 各学習スクリプトを実行します。 `--train_data_dir` オプションで前述の学習用データのフォルダを(__画像を含むフォルダではなく、その親フォルダ__)、`--reg_data_dir` オプションで正則化画像のフォルダ(__画像を含むフォルダではなく、その親フォルダ__)を指定してください。
356
+
357
+ ## DreamBooth、キャプション方式
358
+
359
+ 学習用画像、正則化画像のフォルダに、画像と同じファイル名で、拡張子.caption(オプションで変えられます)のファイルを置くと、そのファイルからキャプションを読み込みプロンプトとして学習します。
360
+
361
+ ※それらの画像の学習に、フォルダ名(identifier class)は使用されなくなります。
362
+
363
+ キャプションファイルの拡張子はデフォルトで.captionです。学習スクリプトの `--caption_extension` オプションで変更できます。`--shuffle_caption` オプションで学習時のキャプションについて、カンマ区切りの各部分をシャッフルしながら学習します。
364
+
365
+ ## fine tuning 方式
366
+
367
+ メタデータを作るところまでは設定ファイルを使う場合と同様です。`in_json` オプションでメタデータファイルを指定します。
368
+
369
+ # 学習途中でのサンプル出力
370
+
371
+ 学習中のモデルで試しに画像生成することで学習の進み方を確認できます。学習スクリプトに以下のオプションを指定します。
372
+
373
+ - `--sample_every_n_steps` / `--sample_every_n_epochs`
374
+
375
+ サンプル出力するステップ数またはエポック数を指定します。この数ごとにサンプル出力します。両方指定するとエポック数が優先されます。
376
+
377
+ - `--sample_prompts`
378
+
379
+ サンプル出力用プロンプトのファイルを指定します。
380
+
381
+ - `--sample_sampler`
382
+
383
+ サンプル出力に使うサンプラーを指定します。
384
+ `'ddim', 'pndm', 'heun', 'dpmsolver', 'dpmsolver++', 'dpmsingle', 'k_lms', 'k_euler', 'k_euler_a', 'k_dpm_2', 'k_dpm_2_a'`が選べます。
385
+
386
+ サンプル出力を行うにはあらかじめプロンプトを記述したテキストファイルを用意しておく必要があります。1行につき1プロンプトで記述します。
387
+
388
+ たとえば以下のようになります。
389
+
390
+ ```txt
391
+ # prompt 1
392
+ masterpiece, best quality, 1girl, in white shirts, upper body, looking at viewer, simple background --n low quality, worst quality, bad anatomy,bad composition, poor, low effort --w 768 --h 768 --d 1 --l 7.5 --s 28
393
+
394
+ # prompt 2
395
+ masterpiece, best quality, 1boy, in business suit, standing at street, looking back --n low quality, worst quality, bad anatomy,bad composition, poor, low effort --w 576 --h 832 --d 2 --l 5.5 --s 40
396
+ ```
397
+
398
+ 先頭が `#` の行はコメントになります。`--n` のように 「`--` + 英小文字」で生成画像へのオプションを指定できます。以下が使えます。
399
+
400
+ - `--n` 次のオプションまでをネガティブプロンプトとします。
401
+ - `--w` 生成画像の横幅を指定します。
402
+ - `--h` 生成画像の高さを指定します。
403
+ - `--d` 生成画像のseedを指定します。
404
+ - `--l` 生成画像のCFG scaleを指定します。
405
+ - `--s` 生成時のステップ数を指定します。
406
+
407
+
408
+ # 各スクリプトで共通の、よく使われるオプション
409
+
410
+ スクリプトの更新後、ドキュメントの更新が追い付いていない場合があります。その場合は `--help` オプションで使用できるオプションを確認してください。
411
+
412
+ ## 学習に使うモデル指定
413
+
414
+ - `--v2` / `--v_parameterization`
415
+
416
+ 学習対象モデルとしてHugging Faceのstable-diffusion-2-base、またはそこからのfine tuningモデルを使う場合(推論時に `v2-inference.yaml` を使うように指示されているモデルの場合)は `--v2` オプションを、stable-diffusion-2や768-v-ema.ckpt、およびそれらのfine tuningモデルを使う場合(推論時に `v2-inference-v.yaml` を使うモデルの場合)は `--v2` と `--v_parameterization` の両方のオプションを指定してください。
417
+
418
+ Stable Diffusion 2.0では大きく以下の点が変わっています。
419
+
420
+ 1. 使用するTokenizer
421
+ 2. 使用するText Encoderおよび使用する出力層(2.0は最後から二番目の層を使う)
422
+ 3. Text Encoderの出力次元数(768->1024)
423
+ 4. U-Netの構造(CrossAttentionのhead数など)
424
+ 5. v-parameterization(サンプリング方法が変更されているらしい)
425
+
426
+ このうちbaseでは1~4が、baseのつかない方(768-v)では1~5が採用されています。1~4を有効にするのがv2オプション、5を有効にするのがv_parameterizationオプションです。
427
+
428
+ - `--pretrained_model_name_or_path`
429
+
430
+ 追加学習を行う元となるモデルを指定します。Stable Diffusionのcheckpointファイル(.ckptまたは.safetensors)、Diffusersのローカルディスクにあるモデルディレクトリ、DiffusersのモデルID("stabilityai/stable-diffusion-2"など)が指定できます。
431
+
432
+ ## 学習に関する設定
433
+
434
+ - `--output_dir`
435
+
436
+ 学習後のモデルを保存するフォルダを指定します。
437
+
438
+ - `--output_name`
439
+
440
+ モデルのファイル名を拡張子を除いて指定します。
441
+
442
+ - `--dataset_config`
443
+
444
+ データセットの設定を記述した `.toml` ファイルを指定します。
445
+
446
+ - `--max_train_steps` / `--max_train_epochs`
447
+
448
+ 学習するステップ数やエポック数を指定します。両方指定するとエポック数のほうが優先されます。
449
+
450
+ - `--mixed_precision`
451
+
452
+ 省メモリ化のため mixed precision (混合精度)で学習します。`--mixed_precision="fp16"` のように指定します。mixed precision なし(デフォルト)と比べて精度が低くなる可能性がありますが、学習に必要なGPUメモリ量が大きく減ります。
453
+
454
+ (RTX30 シリーズ以降では `bf16` も指定できます。環境整備時にaccelerateに行った設定と合わせてください)。
455
+
456
+ - `--gradient_checkpointing`
457
+
458
+ 学習時の重みの計算をまとめて行うのではなく少しずつ行うことで、学習に必要なGPUメモリ量を減らします。オンオフは精度には影響しませんが、オンにするとバッチサイズを大きくできるため、そちらでの影響はあります。
459
+
460
+ また一般的にはオンにすると速度は低下しますが、バッチサイズを大きくできるので、トータルでの学習時間はむしろ速くなるかもしれません。
461
+
462
+ - `--xformers` / `--mem_eff_attn`
463
+
464
+ xformersオプションを指定するとxformersのCrossAttentionを用います。xformersをインストールしていない場合やエラーとなる場合(環境にもよ���ますが `mixed_precision="no"` の場合など)、代わりに `mem_eff_attn` オプションを指定すると省メモリ版CrossAttentionを使用します(xformersよりも速度は遅くなります)。
465
+
466
+ - `--clip_skip`
467
+
468
+ `2` を指定すると、Text Encoder (CLIP) の後ろから二番目の層の出力を用います。1またはオプション省略時は最後の層を用います。
469
+
470
+ ※SD2.0はデフォルトで後ろから二番目の層を使うため、SD2.0の学習では指定しないでください。
471
+
472
+ 学習対象のモデルがもともと二番目の層を使うように学習されている場合は、2を指定するとよいでしょう。
473
+
474
+ そうではなく最後の層を使用していた場合はモデル全体がそれを前提に学習されています。そのため改めて二番目の層を使用して学習すると、望ましい学習結果を得るにはある程度の枚数の教師データ、長めの学習が必要になるかもしれません。
475
+
476
+ - `--max_token_length`
477
+
478
+ デフォルトは75です。`150` または `225` を指定することでトークン長を拡張して学習できます。長いキャプションで学習する場合に指定してください。
479
+
480
+ ただし学習時のトークン拡張の仕様は Automatic1111 氏のWeb UIとは微妙に異なるため(分割の仕様など)、必要なければ75で学習することをお勧めします。
481
+
482
+ clip_skipと同様に、モデルの学習状態と異なる長さで学習するには、ある程度の教師データ枚数、長めの学習時間が必要になると思われます。
483
+
484
+ - `--weighted_captions`
485
+
486
+ 指定するとAutomatic1111氏のWeb UIと同様の重み付きキャプションが有効になります。「Textual Inversion と XTI」以外の学習に使用できます。キャプションだけでなく DreamBooth 手法の token string でも有効です。
487
+
488
+ 重みづけキャプションの記法はWeb UIとほぼ同じで、(abc)や[abc]、(abc:1.23)などが使用できます。入れ子も可能です。括弧内にカンマを含めるとプロンプトのshuffle/dropoutで括弧の対応付けがおかしくなるため、括弧内にはカンマを含めないでください。
489
+
490
+ - `--persistent_data_loader_workers`
491
+
492
+ Windows環境で指定するとエポック間の待ち時間が大幅に短縮されます。
493
+
494
+ - `--max_data_loader_n_workers`
495
+
496
+ データ読み込みのプロセス数を指定します。プロセス数が多いとデータ読み込みが速くなりGPUを効率的に利用できますが、メインメモリを消費します。デフォルトは「`8` または `CPU同時実行スレッド数-1` の小さいほう」なので、メインメモリに余裕がない場合や、GPU使用率が90%程度以上なら、それらの数値を見ながら `2` または `1` 程度まで下げてください。
497
+
498
+ - `--logging_dir` / `--log_prefix`
499
+
500
+ 学習ログの保存に関するオプションです。logging_dirオプションにログ保存先フォルダを指定してください。TensorBoard形式のログが保存されます。
501
+
502
+ たとえば--logging_dir=logsと指定すると、作業フォルダにlogsフォルダが作成され、その中の日時フォルダにログが保存されます。
503
+ また--log_prefixオプションを指定すると、日時の前に指定した文字列が追加されます。「--logging_dir=logs --log_prefix=db_style1_」などとして識別用にお使いください。
504
+
505
+ TensorBoardでログを確認するには、別のコマンドプロンプトを開き、作業フォルダで以下のように入力します。
506
+
507
+ ```
508
+ tensorboard --logdir=logs
509
+ ```
510
+
511
+ (tensorboardは環境整備時にあわせてインストールされると思いますが、もし入っていないなら `pip install tensorboard` で入れてください。)
512
+
513
+ その後ブラウザを開き、http://localhost:6006/ へアクセスすると表示されます。
514
+
515
+ - `--log_with` / `--log_tracker_name`
516
+
517
+ 学習ログの保存に関するオプションです。`tensorboard` だけでなく `wandb`への保存が可能です。詳細は [PR#428](https://github.com/kohya-ss/sd-scripts/pull/428)をご覧ください。
518
+
519
+ - `--noise_offset`
520
+
521
+ こちらの記事の実装になります: https://www.crosslabs.org//blog/diffusion-with-offset-noise
522
+
523
+ 全体的に暗い、明るい画像の生成結果が良くなる可能性があるようです。LoRA学習でも有効なようです。`0.1` 程度の値を指定するとよいようです。
524
+
525
+ - `--adaptive_noise_scale` (実験的オプション)
526
+
527
+ Noise offsetの値を、latentsの各チャネルの平均値の絶対値に応じて自動調整するオプションです。`--noise_offset` と同時に指定することで有効になります。Noise offsetの値は `noise_offset + abs(mean(latents, dim=(2,3))) * adaptive_noise_scale` で計算さ��ます。latentは正規分布に近いためnoise_offsetの1/10~同程度の値を指定するとよいかもしれません。
528
+
529
+ 負の値も指定でき、その場合はnoise offsetは0以上にclipされます。
530
+
531
+ - `--multires_noise_iterations` / `--multires_noise_discount`
532
+
533
+ Multi resolution noise (pyramid noise)の設定です。詳細は [PR#471](https://github.com/kohya-ss/sd-scripts/pull/471) およびこちらのページ [Multi-Resolution Noise for Diffusion Model Training](https://wandb.ai/johnowhitaker/multires_noise/reports/Multi-Resolution-Noise-for-Diffusion-Model-Training--VmlldzozNjYyOTU2) を参照してください。
534
+
535
+ `--multires_noise_iterations` に数値を指定すると有効になります。6~10程度の値が良いようです。`--multires_noise_discount` に0.1~0.3 程度の値(LoRA学習等比較的データセットが小さい場合のPR作者の推奨)、ないしは0.8程度の値(元記事の推奨)を指定してください(デフォルトは 0.3)。
536
+
537
+ - `--debug_dataset`
538
+
539
+ このオプションを付けることで学習を行う前に事前にどのような画像データ、キャプションで学習されるかを確認できます。Escキーを押すと終了してコマンドラインに戻ります。`S`キーで次のステップ(バッチ)、`E`キーで次のエポックに進みます。
540
+
541
+ ※Linux環境(Colabを含む)では画像は表示されません。
542
+
543
+ - `--vae`
544
+
545
+ vaeオプションにStable Diffusionのcheckpoint、VAEのcheckpointファイル、DiffusesのモデルまたはVAE(ともにローカルまたはHugging FaceのモデルIDが指定できます)のいずれかを指定すると、そのVAEを使って学習します(latentsのキャッシュ時または学習中のlatents取得時)。
546
+
547
+ DreamBoothおよびfine tuningでは、保存されるモデルはこのVAEを組み込んだものになります。
548
+
549
+ - `--cache_latents` / `--cache_latents_to_disk`
550
+
551
+ 使用VRAMを減らすためVAEの出力をメインメモリにキャッシュします。`flip_aug` 以外のaugmentationは使えなくなります。また全体の学習速度が若干速くなります。
552
+
553
+ cache_latents_to_diskを指定するとキャッシュをディスクに保存します。スクリプトを終了し、再度起動した場合もキャッシュが有効になります。
554
+
555
+ - `--min_snr_gamma`
556
+
557
+ Min-SNR Weighting strategyを指定します。詳細は[こちら](https://github.com/kohya-ss/sd-scripts/pull/308)を参照してください。論文では`5`が推奨されています。
558
+
559
+ ## モデルの保存に関する設定
560
+
561
+ - `--save_precision`
562
+
563
+ 保存時のデータ精度を指定します。save_precisionオプションにfloat、fp16、bf16のいずれかを指定すると、その形式でモデルを保存します(DreamBooth、fine tuningでDiffusers形式でモデルを保存する場合は無効です)。モデルのサイズを削減したい場合などにお使いください。
564
+
565
+ - `--save_every_n_epochs` / `--save_state` / `--resume`
566
+
567
+ save_every_n_epochsオプションに数値を指定すると、そのエポックごとに学習途中のモデルを保存します。
568
+
569
+ save_stateオプションを同時に指定すると、optimizer等の状態も含めた学習状態を合わせて保存します(保存したモデルからも学習再開できますが、それに比べると精度の向上、学習時間の短縮が期待できます)。保存先はフォルダになります。
570
+
571
+ 学習状態は保存先フォルダに `<output_name>-??????-state`(??????はエポック数)という名前のフォルダで出力されます。長時間にわたる学習時にご利用ください。
572
+
573
+ 保存された学習状態から学習を再開するにはresumeオプションを使います。学習状態のフォルダ(`output_dir` ではなくその中のstateのフォルダ)を指定してください。
574
+
575
+ なおAcceleratorの仕様により、エポック数、global stepは保存されておらず、resumeしたときにも1からになりますがご容赦ください。
576
+
577
+ - `--save_every_n_steps`
578
+
579
+ save_every_n_stepsオプションに数値を指定すると、そのステップごとに学習途中のモデルを保存します。save_every_n_epochsと同時に指定できます。
580
+
581
+ - `--save_model_as` (DreamBooth, fine tuning のみ)
582
+
583
+ モデルの保存形式を`ckpt, safetensors, diffusers, diffusers_safetensors` から選べます。
584
+
585
+ `--save_model_as=safetensors` のように指定します。Stable Diffusion形式(ckptまたはsafetensors)を読み込み、Diffusers形式で保存する場合、不足する情報はHugging Faceからv1.5またはv2.1の情報を落としてきて補完します。
586
+
587
+ - `--huggingface_repo_id` 等
588
+
589
+ huggingface_repo_idが指定されているとモデル保存時に同時にHuggingFaceにアップロードします。アクセストー��ンの取り扱いに注意してください(HuggingFaceのドキュメントを参照してください)。
590
+
591
+ 他の引数をたとえば以下のように指定してください。
592
+
593
+ - `--huggingface_repo_id "your-hf-name/your-model" --huggingface_path_in_repo "path" --huggingface_repo_type model --huggingface_repo_visibility private --huggingface_token hf_YourAccessTokenHere`
594
+
595
+ huggingface_repo_visibilityに`public`を指定するとリポジトリが公開されます。省略時または`private`(などpublic以外)を指定すると非公開になります。
596
+
597
+ `--save_state`オプション指定時に`--save_state_to_huggingface`を指定するとstateもアップロードします。
598
+
599
+ `--resume`オプション指定時に`--resume_from_huggingface`を指定するとHuggingFaceからstateをダウンロードして再開します。その時の --resumeオプションは `--resume {repo_id}/{path_in_repo}:{revision}:{repo_type}`になります。
600
+
601
+ 例: `--resume_from_huggingface --resume your-hf-name/your-model/path/test-000002-state:main:model`
602
+
603
+ `--async_upload`オプションを指定するとアップロードを非同期で行います。
604
+
605
+ ## オプティマイザ関係
606
+
607
+ - `--optimizer_type`
608
+ --オプティマイザの種類を指定します。以下が指定できます。
609
+ - AdamW : [torch.optim.AdamW](https://pytorch.org/docs/stable/generated/torch.optim.AdamW.html)
610
+ - 過去のバージョンのオプション未指定時と同じ
611
+ - AdamW8bit : 引数は同上
612
+ - 過去のバージョンの--use_8bit_adam指定時と同じ
613
+ - Lion : https://github.com/lucidrains/lion-pytorch
614
+ - 過去のバージョンの--use_lion_optimizer指定時と同じ
615
+ - Lion8bit : 引数は同上
616
+ - SGDNesterov : [torch.optim.SGD](https://pytorch.org/docs/stable/generated/torch.optim.SGD.html), nesterov=True
617
+ - SGDNesterov8bit : 引数は同上
618
+ - DAdaptation(DAdaptAdamPreprint) : https://github.com/facebookresearch/dadaptation
619
+ - DAdaptAdam : 引数は同上
620
+ - DAdaptAdaGrad : 引数は同上
621
+ - DAdaptAdan : 引数は同上
622
+ - DAdaptAdanIP : 引数は同上
623
+ - DAdaptLion : 引数は同上
624
+ - DAdaptSGD : 引数は同上
625
+ - Prodigy : https://github.com/konstmish/prodigy
626
+ - AdaFactor : [Transformers AdaFactor](https://huggingface.co/docs/transformers/main_classes/optimizer_schedules)
627
+ - 任意のオプティマイザ
628
+
629
+ - `--learning_rate`
630
+
631
+ 学習率を指定します。適切な学習率は学習スクリプトにより異なりますので、それぞれの説明を参照してください。
632
+
633
+ - `--lr_scheduler` / `--lr_warmup_steps` / `--lr_scheduler_num_cycles` / `--lr_scheduler_power`
634
+
635
+ 学習率のスケジューラ関連の指定です。
636
+
637
+ lr_schedulerオプションで学習率のスケジューラをlinear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup, 任意のスケジューラから選べます。デフォルトはconstantです。
638
+
639
+ lr_warmup_stepsでスケジューラのウォームアップ(だんだん学習率を変えていく)ステップ数を指定できます。
640
+
641
+ lr_scheduler_num_cycles は cosine with restartsスケジューラでのリスタート回数、lr_scheduler_power は polynomialスケジューラでのpolynomial power です。
642
+
643
+ 詳細については各自お調べください。
644
+
645
+ 任意のスケジューラを使う場合、任意のオプティマイザと同様に、`--scheduler_args`でオプション引数を指定してください。
646
+
647
+ ### オプティマイザの指定について
648
+
649
+ オプティマイザのオプション引数は--optimizer_argsオプションで指定してください。key=valueの形式で、複数の値が指定できます。また、valueはカンマ区切りで複数の値が指定できます。たとえばAdamWオプティマイザに引数を指定する場合は、``--optimizer_args weight_decay=0.01 betas=.9,.999``のようになります。
650
+
651
+ オプション引数を指定する場合は、それぞれのオプティマイザの仕様をご確認ください。
652
+
653
+ 一部のオプティマイザでは必須の引数があり、省略すると自動的に追加されます(SGDNesterovのmomentumなど)。コンソールの出力を確認してください。
654
+
655
+ D-Adaptationオプティマイザは学習率を自動調整します。学習率のオプションに指定した値は学習率そのものではなくD-Adaptationが決定した学習率の適用率になりますので、通常は1.0を指定してください。Text EncoderにU-Netの半分の学習率を指定したい場合は、``--text_encoder_lr=0.5 --unet_lr=1.0``と指定します。
656
+
657
+ AdaFactorオプティマイザはrelative_step=Trueを指定すると学習率を自動調整できます(省略時はデフォルトで追加されます)。自動調整する場合は学習率のスケジューラにはadafactor_schedulerが強制的に使用されます。またscale_parameterとwarmup_initを指定するとよいようです。
658
+
659
+ 自動調整する場合のオプション指定はたとえば ``--optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True"`` のようになります。
660
+
661
+ 学習率を自動調整しない場合はオプション引数 ``relative_step=False`` を追加してください。その場合、学習率のスケジューラにはconstant_with_warmupが、また勾配のclip normをしないことが推奨されているようです。そのため引数は ``--optimizer_type=adafactor --optimizer_args "relative_step=False" --lr_scheduler="constant_with_warmup" --max_grad_norm=0.0`` のようになります。
662
+
663
+ ### 任意のオプティマイザを使う
664
+
665
+ ``torch.optim`` のオプティマイザを使う場合にはクラス名のみを(``--optimizer_type=RMSprop``など)、他のモジュールのオプティマイザを使う時は「モジュール名.クラス名」を指定してください(``--optimizer_type=bitsandbytes.optim.lamb.LAMB``など)。
666
+
667
+ (内部でimportlibしているだけで動作は未確認です。必要ならパッケージをインストールしてください。)
668
+
669
+
670
+ <!--
671
+ ## 任意サイズの画像での学習 --resolution
672
+ 正方形以外で学習できます。resolutionに「448,640」のように「幅,高さ」で指定してください。幅と高さは64で割り切れる必要があります。学習用画像、正則化画像のサイズを合わせてください。
673
+
674
+ 個人的には縦長の画像を生成することが多いため「448,640」などで学習することもあります。
675
+
676
+ ## Aspect Ratio Bucketing --enable_bucket / --min_bucket_reso / --max_bucket_reso
677
+ enable_bucketオプションを指定すると有効になります。Stable Diffusionは512x512で学習されていますが、それに加えて256x768や384x640といった解像度でも学習します。
678
+
679
+ このオプションを指定した場合は、学習用画像、正則化画像を特定の解像度に統一する必要はありません。いくつかの解像度(アスペクト比)から最適なものを選び、その解像度で学習します。
680
+ 解像度は64ピクセル単位のため、元画像とアスペクト比が完全に一致しない場合がありますが、その場合は、はみ出した部分がわずかにトリミングされます。
681
+
682
+ 解像度の最小サイズをmin_bucket_resoオプションで、最大サイズをmax_bucket_resoで指定できます。デフォルトはそれぞれ256、1024です。
683
+ たとえば最小サイズに384を指定すると、256x1024や320x768などの解像度は使わなくなります。
684
+ 解像度を768x768のように大きくした場合、最大サイズに1280などを指定しても良いかもしれません。
685
+
686
+ なおAspect Ratio Bucketingを有効にするときには、正則化画像についても、学習用画像と似た傾向の様々な解像度を用意した方がいいかもしれません。
687
+
688
+ (ひとつのバッチ内の画像が学習用画像、正則化画像に偏らなくなるため。そこまで大きな影響はないと思いますが……。)
689
+
690
+ ## augmentation --color_aug / --flip_aug
691
+ augmentationは学習時に動的にデータを変化させることで、モデルの性能を上げる手法です。color_augで色合いを微妙に変えつつ、flip_augで左右反転をしつつ、学習します。
692
+
693
+ 動的にデータを変化させるため、cache_latentsオプションと同時に指定できません。
694
+
695
+
696
+ ## 勾配をfp16とした学習(実験的機能) --full_fp16
697
+ full_fp16オプションを指定すると勾配を通常のfloat32からfloat16(fp16)に変更して学習します(mixed precisionではなく完全なfp16学習になるようです)。
698
+ これによりSD1.xの512x512サイズでは8GB未満、SD2.xの512x512サイズで12GB未満のVRAM使用量で学習できるようです。
699
+
700
+ あらかじめaccelerate configでfp16を指定し、オプションで ``mixed_precision="fp16"`` としてください(bf16では動作しません)。
701
+
702
+ メモリ使用量を最小化するためには、xformers、use_8bit_adam、cache_latents、gradient_checkpointingの各オプションを指定し、train_batch_sizeを1としてください。
703
+
704
+ (余裕があるようならtrain_batch_sizeを段階的に増やすと若干精度が上がるはずです。)
705
+
706
+ PyTorchのソースにパッチを当てて無理やり実現しています(PyTorch 1.12.1と1.13.0で確認)。精度はかなり落ちますし、途中で学習失敗する確率も高くなります。
707
+ 学習率やステップ数の設定もシビアなようです。それらを認識したうえで自己責任でお使いください。
708
+
709
+ -->
710
+
711
+ # メタデータファイルの作成
712
+
713
+ ## 教師データの用意
714
+
715
+ 前述のように学習させたい画像データを用意し、任意のフォルダに入れてください。
716
+
717
+ たとえば以下のように画像を格納���ます。
718
+
719
+ ![教師データフォルダのスクショ](https://user-images.githubusercontent.com/52813779/208907739-8e89d5fa-6ca8-4b60-8927-f484d2a9ae04.png)
720
+
721
+ ## 自動キャプショニング
722
+
723
+ キャプションを使わずタグだけで学習する場合はスキップしてください。
724
+
725
+ また手動でキャプションを用意する場合、キャプションは教師データ画像と同じディレクトリに、同じファイル名、拡張子.caption等で用意してください。各ファイルは1行のみのテキストファイルとします。
726
+
727
+ ### BLIPによるキャプショニング
728
+
729
+ 最新版ではBLIPのダウンロード、重みのダウンロード、仮想環境の追加は不要になりました。そのままで動作します。
730
+
731
+ finetuneフォルダ内のmake_captions.pyを実行します。
732
+
733
+ ```
734
+ python finetune\make_captions.py --batch_size <バッチサイズ> <教師データフォルダ>
735
+ ```
736
+
737
+ バッチサイズ8、教師データを親フォルダのtrain_dataに置いた場合、以下のようになります。
738
+
739
+ ```
740
+ python finetune\make_captions.py --batch_size 8 ..\train_data
741
+ ```
742
+
743
+ キャプションファイルが教師データ画像と同じディレクトリに、同じファイル名、拡張子.captionで作成されます。
744
+
745
+ batch_sizeはGPUのVRAM容量に応じて増減してください。大きいほうが速くなります(VRAM 12GBでももう少し増やせると思います)。
746
+ max_lengthオプションでキャプションの最大長を指定できます。デフォルトは75です。モデルをトークン長225で学習する場合には長くしても良いかもしれません。
747
+ caption_extensionオプションでキャプションの拡張子を変更できます。デフォルトは.captionです(.txtにすると後述のDeepDanbooruと競合します)。
748
+
749
+ 複数の教師データフォルダがある場合には、それぞれのフォルダに対して実行してください。
750
+
751
+ なお、推論にランダム性があるため、実行するたびに結果が変わります。固定する場合には--seedオプションで `--seed 42` のように乱数seedを指定してください。
752
+
753
+ その他のオプションは `--help` でヘルプをご参照ください(パラメータの意味についてはドキュメントがまとまっていないようで、ソースを見るしかないようです)。
754
+
755
+ デフォルトでは拡張子.captionでキャプションファイルが生成されます。
756
+
757
+ ![captionが生成されたフォルダ](https://user-images.githubusercontent.com/52813779/208908845-48a9d36c-f6ee-4dae-af71-9ab462d1459e.png)
758
+
759
+ たとえば以下のようなキャプションが付きます。
760
+
761
+ ![キャプションと画像](https://user-images.githubusercontent.com/52813779/208908947-af936957-5d73-4339-b6c8-945a52857373.png)
762
+
763
+ ## DeepDanbooruによるタグ付け
764
+
765
+ danbooruタグのタグ付け自体を行わない場合は「キャプションとタグ情報の前処理」に進んでください。
766
+
767
+ タグ付けはDeepDanbooruまたはWD14Taggerで行います。WD14Taggerのほうが精度が良いようです。WD14Taggerでタグ付けする場合は、次の章へ進んでください。
768
+
769
+ ### 環境整備
770
+
771
+ DeepDanbooru https://github.com/KichangKim/DeepDanbooru を作業フォルダにcloneしてくるか、zipをダウンロードして展開します。私はzipで展開しました。
772
+ またDeepDanbooruのReleasesのページ https://github.com/KichangKim/DeepDanbooru/releases の「DeepDanbooru Pretrained Model v3-20211112-sgd-e28」のAssetsから、deepdanbooru-v3-20211112-sgd-e28.zipをダウンロードしてきてDeepDanbooruのフォルダに展開します。
773
+
774
+ 以下からダウンロードします。Assetsをクリックして開き、そこからダウンロードします。
775
+
776
+ ![DeepDanbooruダウンロードページ](https://user-images.githubusercontent.com/52813779/208909417-10e597df-7085-41ee-bd06-3e856a1339df.png)
777
+
778
+ 以下のようなこういうディレクトリ構造にしてください
779
+
780
+ ![DeepDanbooruのディレクトリ構造](https://user-images.githubusercontent.com/52813779/208909486-38935d8b-8dc6-43f1-84d3-fef99bc471aa.png)
781
+
782
+ Diffusersの環境に必要なライブラリをインストールします。DeepDanbooruのフォルダに移動してインストールします(実質的にはtensorflow-ioが追加されるだけだと思います)。
783
+
784
+ ```
785
+ pip install -r requirements.txt
786
+ ```
787
+
788
+ 続いてDeepDanbooru自体をインストールします。
789
+
790
+ ```
791
+ pip install .
792
+ ```
793
+
794
+ 以上でタグ付けの環境整備は完了です。
795
+
796
+ ### タグ付けの実施
797
+ DeepDanbooruのフォルダに移動し、deepdanbooruを実行してタグ付けを行います。
798
+
799
+ ```
800
+ deepdanbooru evaluate <教師データフォルダ> --project-path deepdanbooru-v3-20211112-sgd-e28 --allow-folder --save-txt
801
+ ```
802
+
803
+ 教師データを親フォルダのtrain_dataに置いた場合、以下のようになります。
804
+
805
+ ```
806
+ deepdanbooru evaluate ../train_data --project-path deepdanbooru-v3-20211112-sgd-e28 --allow-folder --save-txt
807
+ ```
808
+
809
+ タグファイルが教師データ画像と同じディレクトリに、同じファイル名、拡張子.txtで作成されます。1件ずつ処理されるためわりと遅いです。
810
+
811
+ 複数の教師データフォルダがある場合には、それぞれのフォルダに対して実行してください。
812
+
813
+ 以下のように生成されます。
814
+
815
+ ![DeepDanbooruの生成ファイル](https://user-images.githubusercontent.com/52813779/208909855-d21b9c98-f2d3-4283-8238-5b0e5aad6691.png)
816
+
817
+ こんな感じにタグが付きます(すごい情報量……)。
818
+
819
+ ![DeepDanbooruタグと画像](https://user-images.githubusercontent.com/52813779/208909908-a7920174-266e-48d5-aaef-940aba709519.png)
820
+
821
+ ## WD14Taggerによるタグ付け
822
+
823
+ DeepDanbooruの代わりにWD14Taggerを用いる手順です。
824
+
825
+ Automatic1111氏のWebUIで使用しているtaggerを利用します。こちらのgithubページ(https://github.com/toriato/stable-diffusion-webui-wd14-tagger#mrsmilingwolfs-model-aka-waifu-diffusion-14-tagger )の情報を参考にさせていただきました。
826
+
827
+ 最初の環境整備で必要なモジュールはインストール済みです。また重みはHugging Faceから自動的にダウンロードしてきます。
828
+
829
+ ### タグ付けの実施
830
+
831
+ スクリプトを実行してタグ付けを行います。
832
+ ```
833
+ python tag_images_by_wd14_tagger.py --batch_size <バッチサイズ> <教師データフォルダ>
834
+ ```
835
+
836
+ 教師データを親フォルダのtrain_dataに置いた場合、以下のようになります。
837
+ ```
838
+ python tag_images_by_wd14_tagger.py --batch_size 4 ..\train_data
839
+ ```
840
+
841
+ 初回起動時にはモデルファイルがwd14_tagger_modelフォルダに自動的にダウンロードされます(フォルダはオプションで変えられます)。以下のようになります。
842
+
843
+ ![ダウンロードされたファイル](https://user-images.githubusercontent.com/52813779/208910447-f7eb0582-90d6-49d3-a666-2b508c7d1842.png)
844
+
845
+ タグファイルが教師データ画像と同じディレクトリに、同じファイル名、拡張子.txtで作成されます。
846
+
847
+ ![生成されたタグファイル](https://user-images.githubusercontent.com/52813779/208910534-ea514373-1185-4b7d-9ae3-61eb50bc294e.png)
848
+
849
+ ![タグと画像](https://user-images.githubusercontent.com/52813779/208910599-29070c15-7639-474f-b3e4-06bd5a3df29e.png)
850
+
851
+ threshオプションで、判定されたタグのconfidence(確信度)がいくつ以上でタグをつけるかが指定できます。デフォルトはWD14Taggerのサンプルと同じ0.35です。値を下げるとより多くのタグが付与されますが、精度は下がります。
852
+
853
+ batch_sizeはGPUのVRAM容量に応じて増減してください。大きいほうが速くなります(VRAM 12GBでももう少し増やせると思います)。caption_extensionオプションでタグファイルの拡張子を変更できます。デフォルトは.txtです。
854
+
855
+ model_dirオプションでモデルの保存先フォルダを指定できます。
856
+
857
+ またforce_downloadオプションを指定すると保存先フォルダがあってもモデルを再ダウンロードします。
858
+
859
+ 複数の教師データフォルダがある場合には、それぞれのフォルダに対して実行してください。
860
+
861
+ ## キャプションとタグ情報の前処理
862
+
863
+ スクリプトから処理しやすいようにキャプションとタグをメタデータとしてひとつのファイルにまとめます。
864
+
865
+ ### キャプションの前処理
866
+
867
+ キャプションをメタデータに入れるには、作業フォルダ内で以下を実行してください(キャプションを学習に使わない場合は実行不要です)(実際は1行で記述します、以下同様)。`--full_path` オプションを指定してメタデータに画像ファイルの場所をフルパスで格納します。このオプションを省略すると相対パスで記録されますが、フォルダ指定が `.toml` ファイル内で別途必要になります。
868
+
869
+ ```
870
+ python merge_captions_to_metadata.py --full_path <教師データフォルダ>
871
+   --in_json <読み込むメタデータファイル名> <メタデータファイル名>
872
+ ```
873
+
874
+ メタデータファイル名は任意の名前です。
875
+ 教師データがtrain_data、読み込むメタデータファイルなし、メタデータファイルがmeta_cap.jsonの場合、以下のようになります。
876
+
877
+ ```
878
+ python merge_captions_to_metadata.py --full_path train_data meta_cap.json
879
+ ```
880
+
881
+ caption_extensionオプションでキャプションの拡張子を指定できます。
882
+
883
+ 複数の教師データフォルダがある場合には、full_path引数を指定しつつ、それぞれのフォルダに対して実行してください。
884
+
885
+ ```
886
+ python merge_captions_to_metadata.py --full_path
887
+ train_data1 meta_cap1.json
888
+ python merge_captions_to_metadata.py --full_path --in_json meta_cap1.json
889
+ train_data2 meta_cap2.json
890
+ ```
891
+
892
+ in_jsonを省略すると書き込み先メタデータファイルがあるとそこから読み込み、そこに上書きします。
893
+
894
+ __※in_jsonオプションと書き込み先を都度書き換えて、別のメタデータファイルへ書き出すようにすると安全です。__
895
+
896
+ ### タグの前処理
897
+
898
+ 同様にタグもメタデータにまとめます(タグを学習に使わない場合は実行不要です)。
899
+ ```
900
+ python merge_dd_tags_to_metadata.py --full_path <教師データフォルダ>
901
+ --in_json <読み込むメタデータファイル名> <書き込むメタデータファイル名>
902
+ ```
903
+
904
+ 先と同じディレクトリ構成で、meta_cap.jsonを読み、meta_cap_dd.jsonに書きだす場合、以下となります。
905
+ ```
906
+ python merge_dd_tags_to_metadata.py --full_path train_data --in_json meta_cap.json meta_cap_dd.json
907
+ ```
908
+
909
+ 複数の教師データフォルダがある場合には、full_path引数を指定しつつ、それぞれのフォルダに対して実行してください。
910
+
911
+ ```
912
+ python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap2.json
913
+ train_data1 meta_cap_dd1.json
914
+ python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap_dd1.json
915
+ train_data2 meta_cap_dd2.json
916
+ ```
917
+
918
+ in_jsonを省略すると書き込み先メタデータファイルがあるとそこから読み込み、そこに上書きします。
919
+
920
+ __※in_jsonオプションと書き込み先を都度書き換えて、別のメタデータファイルへ書き出すようにすると安全です。__
921
+
922
+ ### キャプションとタグのクリーニング
923
+
924
+ ここまででメタデータファイルにキャプションとDeepDanbooruのタグがまとめられています。ただ自動キャプショニングにしたキャプションは表記ゆれなどがあり微妙(※)ですし、タグにはアンダースコアが含まれていたりratingが付いていたりしますので(DeepDanbooruの場合)、エディタの置換機能などを用いてキャプションとタグのクリーニングをしたほうがいいでしょう。
925
+
926
+ ※たとえばアニメ絵の少女を学習する場合、キャプションにはgirl/girls/woman/womenなどのばらつきがあります。また「anime girl」なども単に「girl」としたほうが適切かもしれません。
927
+
928
+ クリーニング用のスクリプトが用意してありますので、スクリプトの内容を状況に応じて編集してお使いください。
929
+
930
+ (教師データフォルダの指定は不要になりました。メタデータ内の全データをクリーニングします。)
931
+
932
+ ```
933
+ python clean_captions_and_tags.py <読み込むメタデータファイル名> <書き込むメタデータファイル名>
934
+ ```
935
+
936
+ --in_jsonは付きませんのでご注意ください。たとえば次のようになります。
937
+
938
+ ```
939
+ python clean_captions_and_tags.py meta_cap_dd.json meta_clean.json
940
+ ```
941
+
942
+ 以上でキャプションとタグの前処理は完了です。
943
+
944
+ ## latentsの事前取得
945
+
946
+ ※ このステップは必須ではありません。省略しても学習時にlatentsを取得しながら学習できます。
947
+ また学習時に `random_crop` や `color_aug` などを行う場合にはlatentsの事前取得はできません(画像を毎回変えながら学習するため)。事前取得をしない場合、ここまでのメタデータで学習できます。
948
+
949
+ あらかじめ画像の潜在表現を取得しディスクに保存しておきます。それにより、学習を高速に進めることができます。あわせてbucketing(教師データをアスペクト比に応じて分類する)を行います。
950
+
951
+ 作業フォルダで以下のように入力してください。
952
+ ```
953
+ python prepare_buckets_latents.py --full_path <教師データフォルダ>
954
+ <読み込むメタデータファイル名> <書き込むメタデータファイル名>
955
+ <fine tuningするモデル名またはcheckpoint>
956
+ --batch_size <バッチサイズ>
957
+ --max_resolution <解像度 幅,高さ>
958
+ --mixed_precision <精度>
959
+ ```
960
+
961
+ モデルがmodel.ckpt、バッチサイズ4、学習解像度は512\*512、精度no(float32)で、meta_clean.jsonからメタデータを読み込み、meta_lat.jsonに書き込む場合、以下のようになります。
962
+
963
+ ```
964
+ python prepare_buckets_latents.py --full_path
965
+ train_data meta_clean.json meta_lat.json model.ckpt
966
+ --batch_size 4 --max_resolution 512,512 --mixed_precision no
967
+ ```
968
+
969
+ 教師データフォルダにnumpyのnpz形式でlatentsが保存されます。
970
+
971
+ 解像度の最小サイズを--min_bucket_resoオプションで、最大サイズを--max_bucket_resoで指定できます。デフォルトはそれぞれ256、1024です。たとえば最小サイズに384を指定すると、256\*1024や320\*768などの解像度は使わなくなります。
972
+ 解像度を768\*768のように大きくした場合、最大サイズに1280などを指定すると良いでしょう。
973
+
974
+ --flip_augオプションを指定すると左右反転のaugmentation(データ拡張)を行います。疑似的にデータ量を二倍に増やすことができますが、データが左右対称でない場合に指定すると(例えばキャラクタの外見、髪型など)学習がうまく行かなくなります。
975
+
976
+
977
+ (反転した画像についてもlatentsを取得し、\*\_flip.npzファイルを保存する単純な実装です。fline_tune.pyには特にオプション指定は必要ありません。\_flip付きのファイルがある場合、flip付き・なしのファイルを、ランダムに読み込みます。)
978
+
979
+ バッチサイズはVRAM 12GBでももう少し増やせるかもしれません。
980
+ 解像度は64で割り切れる数字で、"幅,高さ"で指定します。解像度はfine tuning時のメモリサイズに直結します。VRAM 12GBでは512,512が限界と思われます(※)。16GBなら512,704や512,768まで上げられるかもしれません。なお256,256等にしてもVRAM 8GBでは厳しいようです(パラメータやoptimizerなどは解像度に関係せず一定のメモリが必要なため)。
981
+
982
+ ※batch size 1の学習で12GB VRAM、640,640で動いたとの報告もありました。
983
+
984
+ 以下のようにbucketingの結果が表示されます。
985
+
986
+ ![bucketingの結果](https://user-images.githubusercontent.com/52813779/208911419-71c00fbb-2ce6-49d5-89b5-b78d7715e441.png)
987
+
988
+ 複数の教師データフォルダがある場合には、full_path引数を指定しつつ、それぞれのフォルダに対して実行してください。
989
+ ```
990
+ python prepare_buckets_latents.py --full_path
991
+ train_data1 meta_clean.json meta_lat1.json model.ckpt
992
+ --batch_size 4 --max_resolution 512,512 --mixed_precision no
993
+
994
+ python prepare_buckets_latents.py --full_path
995
+ train_data2 meta_lat1.json meta_lat2.json model.ckpt
996
+ --batch_size 4 --max_resolution 512,512 --mixed_precision no
997
+
998
+ ```
999
+ 読み込み元と書き込み先を同じにすることも可能ですが別々の方が安全です。
1000
+
1001
+ __※引数を都度書き換えて、別のメタデータファイルに書き込むと安全です。__
1002
+
docs/train_README-zh.md ADDED
@@ -0,0 +1,907 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ __由于文档正在更新中,描述可能有错误。__
2
+
3
+ # 关于本学习文档,通用描述
4
+ 本库支持模型微调(fine tuning)、DreamBooth、训练LoRA和文本反转(Textual Inversion)(包括[XTI:P+](https://github.com/kohya-ss/sd-scripts/pull/327)
5
+
6
+ 本文档将说明它们通用的学习数据准备方法和选项等。
7
+
8
+ # 概要
9
+
10
+ 请提前参考本仓库的README,准备好环境。
11
+
12
+
13
+ 以下本节说明。
14
+
15
+ 1. 关于准备学习数据的新形式(使用设置文件)
16
+ 1. 对于在学习中使用的术语的简要解释
17
+ 1. 先前的指定格式(不使用设置文件,而是从命令行指定)
18
+ 1. 生成学习过程中的示例图像
19
+ 1. 各脚本中常用的共同选项
20
+ 1. 准备 fine tuning 方法的元数据:如说明文字(打标签)等
21
+
22
+
23
+ 1. 如果只执行一次,学习就可以进行(相关内容,请参阅各个脚本的文档)。如果需要,以后可以随时参考。
24
+
25
+
26
+
27
+ # 关于准备训练数据
28
+
29
+ 在任意文件夹(也可以是多个文件夹)中准备好训练数据的图像文件。支持 `.png`, `.jpg`, `.jpeg`, `.webp`, `.bmp` 格式的文件。通常不需要进行任何预处理,如调整大小等。
30
+
31
+ 但是请勿使用极小的图像,其尺寸比训练分辨率(稍后将提到)还小,建议事先使用超分辨率AI等进行放大。另外,请注意不要使用过大的图像(约为3000 x 3000像素以上),因为这可能会导致错误,建议事先缩小。
32
+
33
+ 在训练时,需要整理要用于训练模型的图像数据,并将其指定给脚本。根据训练数据的数量、训练目标和说明(图像描述)是否可用等因素,可以使用几种方法指定训练数据。以下是其中的一些方法(每个名称都不是通用的,而是该存储库自定义的定义)。有关正则化图像的信息将在稍后提供。
34
+
35
+ 1. DreamBooth、class + identifier方式(可使用正则化图像)
36
+
37
+ 将训练目标与特定单词(identifier)相关联进行训练。无需准备说明。例如,当要学习特定角色时,由于无需准备说明,因此比较方便,但由于学习数据的所有元素都与identifier相关联,例如发型、服装、背景等,因此在生成时可能会出现无法更换服装的情况。
38
+
39
+ 2. DreamBooth、说明方式(可使用正则化图像)
40
+
41
+ 准备记录每个图像说明的文本文件进行训练。例如,通过将图像详细信息(如穿着白色衣服的角色A、穿着红色衣服的角色A等)记录在说明中,可以将角色和其他元素分离,并期望模型更准确地学习角色。
42
+
43
+ 3. 微调方式(不可使用正则化图像)
44
+
45
+ 先将说明收集到元数据文件中。支持分离标签和说明以及预先缓存latents等功能,以加速训练(这些将在另一篇文档中介绍)。(虽然名为fine tuning方式,但不仅限于fine tuning。)
46
+ 你要学的东西和你可以使用的规范方法的组合如下。
47
+
48
+ | 学习对象或方法 | 脚本 | DB/class+identifier | DB/caption | fine tuning |
49
+ |----------------| ----- | ----- | ----- | ----- |
50
+ | fine tuning微调模型 | `fine_tune.py`| x | x | o |
51
+ | DreamBooth训练模型 | `train_db.py`| o | o | x |
52
+ | LoRA | `train_network.py`| o | o | o |
53
+ | Textual Invesion | `train_textual_inversion.py`| o | o | o |
54
+
55
+ ## 选择哪一个
56
+
57
+ 如果您想要学习LoRA、Textual Inversion而不需要准备简介文件,则建议使用DreamBooth class+identifier。如果您能够准备好,则DreamBooth Captions方法更好。如果您有大量的训练数据并且不使用规则化图像,则请考虑使用fine-tuning方法。
58
+
59
+ 对于DreamBooth也是一样的,但不能使用fine-tuning方法。对于fine-tuning方法,只能使用fine-tuning方式。
60
+
61
+ # 每种方法的指定方式
62
+
63
+ 在这里,我们只介绍每种指定方法的典型模式。有关更详细的指定方法,请参见[数据集设置](./config_README-ja.md)。
64
+
65
+ # DreamBooth,class+identifier方法(可使用规则化图像)
66
+
67
+ 在该方法中,每个图像将被视为使用与 `class identifier` 相同的标题进行训练(例如 `shs dog`)。
68
+
69
+ 这样一来,每张图片都相当于使用标题“分类标识”(例如“shs dog”)进行训练。
70
+
71
+ ## step 1.确定identifier和class
72
+
73
+ 要将学习的目标与identifier和属于该目标的class相关联。
74
+
75
+ (虽然有很多称呼,但暂时按照原始论文的说法。)
76
+
77
+ 以下是简要说明(请查阅详细信息)。
78
+
79
+ class是学习目标的一般类别。例如,如果要学习特定品种的狗,则class将是“dog”。对于动漫角色,根据模型不同,可能是“boy”或“girl”,也可能是“1boy”或“1girl”。
80
+
81
+ identifier是用于识别学习目标并进行学习的单词。可以使用任何单词,但是根据原始论文,“Tokenizer生成的3个或更少字符的罕见单词”是最好的选择。
82
+
83
+ 使用identifier和class,例如,“shs dog”可以将模型训练为从class中识别并学习所需的目标。
84
+
85
+ 在图像生成时,使用“shs dog”将生成所学习狗种的图像。
86
+
87
+ (作为identifier,我最近使用的一些参考是“shs sts scs cpc coc cic msm usu ici lvl cic dii muk ori hru rik koo yos wny”等。最好是不包含在Danbooru标签中的单词。)
88
+
89
+ ## step 2. 决定是否使用正则化图像,并生成正则化图像
90
+
91
+ 正则化图像是为防止前面提到的语言漂移,即整个类别被拉扯成为学习目标而生成的图像。如果不使用正则化图像,例如在 `shs 1girl` 中学习特定角色时,即使在简单的 `1girl` 提示下生成,也会越来越像该角色。这是因为 `1girl` 在训练时的标题中包含了该角色的信息。
92
+
93
+ 通过同时学习目标图像和正则化图像,类别仍然保持不变,仅在将标识符附加到提示中时才生成目标图像。
94
+
95
+ 如果您只想在LoRA或DreamBooth中使用特定的角色,则可以不使用正则化图像。
96
+
97
+ 在Textual Inversion中也不需要使用(如果要学习的token string不包含在标题中,则不会学习任何内容)。
98
+
99
+ 一般情况下,使用在训练目标模型时只使用类别名称生成的图像作为正则化图像是常见的做法(例如 `1girl`)。但是,如果生成的图像质量不佳,可以尝试修改提示或使用从网络上另外下载的图像。
100
+
101
+ (由于正则化图像也被训练,因此其质量会影响模型。)
102
+
103
+ 通常,准备数百张图像是理想的(图像数量太少会导致类别图像无法推广并学习它们的特征)。
104
+
105
+ 如果要使用生成的图像,请将其大小通常与训练分辨率(更准确地说是bucket的分辨率)相适应。
106
+
107
+ ## step 2. 设置文件的描述
108
+
109
+ 创建一个文本文件,并将其扩展名更改为`.toml`。例如,您可以按以下方式进行描述:
110
+
111
+ (以`#`开头的部分是注释,因此您可以直接复制粘贴,或者将其删除,都没有问题。)
112
+
113
+ ```toml
114
+ [general]
115
+ enable_bucket = true # 是否使用Aspect Ratio Bucketing
116
+
117
+ [[datasets]]
118
+ resolution = 512 # 学习分辨率
119
+ batch_size = 4 # 批量大小
120
+
121
+ [[datasets.subsets]]
122
+ image_dir = 'C:\hoge' # 指定包含训练图像的文件夹
123
+ class_tokens = 'hoge girl' # 指定标识符类
124
+ num_repeats = 10 # 训练图像的迭代次数
125
+
126
+ # 以下仅在使用正则化图像时进行描述。不使用则删除
127
+ [[datasets.subsets]]
128
+ is_reg = true
129
+ image_dir = 'C:\reg' # 指定包含正则化图像的文件夹
130
+ class_tokens = 'girl' # 指定类别
131
+ num_repeats = 1 # 正则化图像的迭代次数,基本上1就可以了
132
+ ```
133
+
134
+ 基本上只需更改以下位置即可进行学习。
135
+
136
+ 1. 学习分辨率
137
+
138
+ 指定一个数字表示正方形(如果是 `512`,则为 512x512),如果使用方括号和逗号分隔的两个数字,则表示横向×纵向(如果是`[512,768]`,则为 512x768)。在SD1.x系列中,原始学习分辨率为512。指定较大的分辨率,如 `[512,768]` 可能会减少纵向和横向图像生成时的错误。在SD2.x 768系列中,分辨率为 `768`。
139
+
140
+ 1. 批量大小
141
+
142
+ 指定同时学习多少个数据。这取决于GPU的VRAM大小和学习分辨率。详细信息将在后面说明。此外,fine tuning/DreamBooth/LoRA等也会影响批量大小,请查看各个脚本的说明。
143
+
144
+ 1. 文件夹指定
145
+
146
+ 指定用于学习的图像和正则化图像(仅在使用时)的文件夹。指定包含图像数据的文件夹。
147
+
148
+ 1. identifier 和 class 的指定
149
+
150
+ 如前所述,与示例相同。
151
+
152
+ 1. 迭代次数
153
+
154
+ 将在后面说明。
155
+
156
+ ### 关于重复次数
157
+
158
+ 重复次数用于调整正则化图像和训练用图像的数量。由于正则化图像的数量多于训练用图像,因此需要重复使用训练用图像来达到一对一的比例,从而实现训练。
159
+
160
+ 请将重复次数指定为“ __训练用图像的重复次数×训练用图像的数量≥正则化图像的重复次数×正则化图像的数量__ ”。
161
+
162
+ (1个epoch(数据一周一次)的数据量为“训练用图像的重复次数×训练用图像的数量”。如果正则化图像的数量多于这个值,则剩余的正则化图像将不会被使用。)
163
+
164
+ ## 步骤 3. 学习
165
+
166
+ 请根据每个文档的参考进行学习。
167
+
168
+ # DreamBooth,标题方式(可使用规范化图像)
169
+
170
+ 在此方式中,每个图像都将通过标题进行学习。
171
+
172
+ ## 步骤 1. 准备标题文件
173
+
174
+ 请将与图像具有相同文件名且扩展名为 `.caption`(可以在设置中更改)的文件放置在用于训练图像的文件夹中。每个文件应该只有一行。编码为 `UTF-8`。
175
+
176
+ ## 步骤 2. 决定是否使用规范化图像,并在使用时生成规范化图像
177
+
178
+ 与class+identifier格式相同。可以在规范化图像上附加标题,但通常不需要。
179
+
180
+ ## 步��� 2. 编写设置文件
181
+
182
+ 创建一个文本文件并将扩展名更改为 `.toml`。例如,可以按以下方式进行记录。
183
+
184
+ ```toml
185
+ [general]
186
+ enable_bucket = true # Aspect Ratio Bucketingを使うか否か
187
+
188
+ [[datasets]]
189
+ resolution = 512 # 学習解像度
190
+ batch_size = 4 # 批量大小
191
+
192
+ [[datasets.subsets]]
193
+ image_dir = 'C:\hoge' # 指定包含训练图像的文件夹
194
+ caption_extension = '.caption' # 使用字幕文件扩展名 .txt 时重写
195
+ num_repeats = 10 # 训练图像的迭代次数
196
+
197
+ # 以下仅在使用正则化图像时进行描述。不使用则删除
198
+ [[datasets.subsets]]
199
+ is_reg = true
200
+ image_dir = 'C:\reg' #指定包含正则化图像的文件夹
201
+ class_tokens = 'girl' # class を指定
202
+ num_repeats = 1 #
203
+ 正则化图像的迭代次数,基本上1就可以了
204
+ ```
205
+
206
+ 基本上,您可以通过仅重写以下位置来学习。除非另有说明,否则与类+标识符方法相同。
207
+
208
+ 1. 学习分辨率
209
+ 2. 批量大小
210
+ 3. 文件夹指定
211
+ 4. 标题文件的扩展名
212
+
213
+ 可以指定任意的扩展名。
214
+ 5. 重复次数
215
+
216
+ ## 步骤 3. 学习
217
+
218
+ 请参考每个文档进行学习。
219
+
220
+ # 微调方法
221
+
222
+ ## 步骤 1. 准备元数据
223
+
224
+ 将标题和标签整合到管理文件中称为元数据。它的扩展名为 `.json`,格式为json。由于创建方法较长,因此在本文档的末尾进行了描述。
225
+
226
+ ## 步骤 2. 编写设置文件
227
+
228
+ 创建一个文本文件,将扩展名设置为 `.toml`。例如,可以按以下方式编写:
229
+ ```toml
230
+ [general]
231
+ shuffle_caption = true
232
+ keep_tokens = 1
233
+
234
+ [[datasets]]
235
+ resolution = 512 # 图像分辨率
236
+ batch_size = 4 # 批量大小
237
+
238
+ [[datasets.subsets]]
239
+ image_dir = 'C:\piyo' # 指定包含训练图像的文件夹
240
+ metadata_file = 'C:\piyo\piyo_md.json' # 元数据文件名
241
+ ```
242
+
243
+ 基本上,您可以通过仅重写以下位置来学习。如无特别说明,与DreamBooth相同,类+标识符方式。
244
+
245
+ 1. 学习解像度
246
+ 2. 批次大小
247
+ 3. 指定文件夹
248
+ 4. 元数据文件名
249
+
250
+ 指定使用后面所述方法创建的元数据文件。
251
+
252
+
253
+ ## 第三步:学习
254
+
255
+ 请参考各个文档进行学习。
256
+
257
+ # 学习中使用的术语简单解释
258
+
259
+ 由于省略了细节并且我自己也没有完全理解,因此请自行查阅详细信息。
260
+
261
+ ## 微调(fine tuning)
262
+
263
+ 指训练模型并微调其性能。具体含义因用法而异,但在 Stable Diffusion 中,狭义的微调是指使用图像和标题进行训练模型。DreamBooth 可视为狭义微调的一种特殊方法。广义的微调包括 LoRA、Textual Inversion、Hypernetworks 等,包括训练模型的所有内容。
264
+
265
+ ## 步骤(step)
266
+
267
+ 粗略地说,每次在训练数据上进行一次计算即为一步。具体来说,“将训练数据的标题传递给当前模型,将生成的图像与训练数据的图像进行比较,稍微更改模型,以使其更接近训练数据”即为一步。
268
+
269
+ ## 批次大小(batch size)
270
+
271
+ 批次大小指定每个步骤要计算多少数据。批量计算可以提高速度。一般来说,批次大小越大,精度也越高。
272
+
273
+ “批次大小×步数”是用于训练的数据数量。因此,建议减少步数以增加批次大小。
274
+
275
+ (但是,例如,“批次大小为 1,步数为 1600”和“批次大小为 4,步数为 400”将不会产生相同的结果。如果使用相同的学习速率,通常后者会导致模型欠拟合。请尝试增加学习率(例如 `2e-6`),将步数设置为 500 等。)
276
+
277
+ 批次大小越大,GPU 内存消耗就越大。如果内存不足,将导致错误,或者在边缘时将导致训练速度降低。建议在任务管理器或 `nvidia-smi` 命令中检查使用的内存量进行调整。
278
+
279
+ 另外,批次是指“一块数据”的意思。
280
+
281
+ ## 学习率
282
+
283
+ 学习率指的是每个步骤中改变的程度。如果指定一个大的值,学习速度就会加快,但是可能会出现变化太大导致模型崩溃或无法达到最佳状态的情况。如果指定一个小的值,学习速度会变慢,也可能无法达到最佳状态。
284
+
285
+ 在fine tuning、DreamBooth、LoRA等过程中,学习率会有很大的差异,并且也会受到训练数据、所需训练的模型、批量大小和步骤数等因素的影响。建议从一般的值开始,观察训练状态并逐渐调整。
286
+
287
+ 默认情况下,整个训练过程中学习率是固定的。但是可以通过调度程序指定学习率如何变化,因此结果也会有所不同。
288
+
289
+ ## 时代(epoch)
290
+
291
+ Epoch指的是训练数据被完整训练一遍(即数据一周)的情况。如果指定了重复次数,则在重复后的数据一周后,就是1个epoch。
292
+
293
+ 1个epoch的步骤数通常为“数据量÷批量大��”,但如果使用Aspect Ratio Bucketing,则略微增加(由于不同bucket的数据不能在同一个批次中,因此步骤数会增加)。
294
+
295
+ ## 纵横比分桶(Aspect Ratio Bucketing)
296
+
297
+ Stable Diffusion 的 v1 是以 512\*512 的分辨率进行训练的,但同时也可以在其他分辨率下进行训练,例如 256\*1024 和 384\*640。这样可以减少裁剪的部分,期望更准确地学习图像和标题之间的关系。
298
+
299
+ 此外,由于可以在任意分辨率下进行训练,因此不再需要事先统一图像数据的纵横比。
300
+
301
+ 该设置在配置中有效,可以切换,但在此之前的配置文件示例中已启用(设置为 `true`)。
302
+
303
+ 学习分辨率将根据参数所提供的分辨率面积(即内存使用量)进行调整,以64像素为单位(默认值,可更改)在纵横方向上进行调整和创建。
304
+
305
+ 在机器学习中,通常需要将所有输入大小统一,但实际上只要在同一批次中统一即可。 NovelAI 所说的分桶(bucketing) 指的是,预先将训练数据按照纵横比分类到每个学习分辨率下,并通过使用每个 bucket 内的图像创建批次来统一批次图像大小。
306
+
307
+ # 以前的指定格式(不使用 .toml 文件,而是使用命令行选项指定)
308
+
309
+ 这是一种通过命令行选项而不是指定 .toml 文件的方法。有 DreamBooth 类+标识符方法、DreamBooth 标题方法、微调方法三种方式。
310
+
311
+ ## DreamBooth、类+标识符方式
312
+
313
+ 指定文件夹名称以指定迭代次数。还要使用 `train_data_dir` 和 `reg_data_dir` 选项。
314
+
315
+ ### 第1步。准备用于训练的图像
316
+
317
+ 创建一个用于存储训练图像的文件夹。__此外__,按以下名称创建目录。
318
+
319
+ ```
320
+ <迭代次数>_<标识符> <类别>
321
+ ```
322
+
323
+ 不要忘记下划线``_``。
324
+
325
+ 例如,如果在名为“sls frog”的提示下重复数据 20 次,则为“20_sls frog”。如下所示:
326
+
327
+ ![image](https://user-images.githubusercontent.com/52813779/210770636-1c851377-5936-4c15-90b7-8ac8ad6c2074.png)
328
+
329
+ ### 多个类别、多个标识符的学习
330
+
331
+ 该方法很简单,在用于训练的图像文件夹中,需要准备多个文件夹,每个文件夹都是以“重复次数_<标识符> <类别>”命名的,同样,在正则化图像文件夹中,也需要准备多个文件夹,每个文件夹都是以“重复次数_<类别>”命名的。
332
+
333
+ 例如,如果要同时训练“sls青蛙”和“cpc兔子”,则应按以下方式准备文件夹。
334
+
335
+ ![image](https://user-images.githubusercontent.com/52813779/210777933-a22229db-b219-4cd8-83ca-e87320fc4192.png)
336
+
337
+ 如果一个类别包含多个对象,可以只使用一个正则化图像文件夹。例如,如果在1girl类别中有角色A和角色B,则可以按照以下方式处理:
338
+
339
+ - train_girls
340
+ - 10_sls 1girl
341
+ - 10_cpc 1girl
342
+ - reg_girls
343
+ - 1_1girl
344
+
345
+ ### step 2. 准备正规化图像
346
+
347
+ 这是使用规则化图像时的过程。
348
+
349
+ 创建一个文件夹来存储规则化的图像。 __此外,__ 创建一个名为``<repeat count>_<class>`` 的目录。
350
+
351
+ 例如,使用提示“frog”并且不重复数据(仅一次):
352
+ ![image](https://user-images.githubusercontent.com/52813779/210770897-329758e5-3675-49f1-b345-c135f1725832.png)
353
+
354
+
355
+ 步骤3. 执行学习
356
+
357
+ 执行每个学习脚本。使用 `--train_data_dir` 选项指定包含训练数据文件夹的父文件夹(不是包含图像的文件夹),使用 `--reg_data_dir` 选项指定包含正则化图像的父文件夹(不是包含图像的文件夹)。
358
+
359
+ ## DreamBooth,带标题方式
360
+
361
+ 在包含训练图像和正则化图像的文件夹中,将与图像具有相同文件名的文件.caption(可以使用选项进行更改)放置在该文件夹中,然后从该文件中加载标题作为提示进行学习。
362
+
363
+ ※文件夹名称(标识符类)不再用于这些图像的训练。
364
+
365
+ 默认的标题文件扩展名为.caption。可以使用学习脚本的 `--caption_extension` 选项进行更改。 使用 `--shuffle_caption` 选项,同时对每个逗号分隔的部分进行学习时会对学习时的标题进行混洗。
366
+
367
+ ## 微调方式
368
+
369
+ 创建元数据的方式与使用配置文件相同。 使用 `in_json` 选项指定元数据文件。
370
+
371
+ # 学习过程中的样本输出
372
+
373
+ 通过在训练中使用模型生成图像,可以检查学习进度。将以下选项指定为学习脚本。
374
+
375
+ - `--sample_every_n_steps` / `--sample_every_n_epochs`
376
+
377
+ 指定要采样的步数或纪元数。为这些数字中的每一个输出样本。如果两者都指定,则 epoch 数优先。
378
+ - `--sample_prompts`
379
+
380
+ 指定示例输出的提示文件。
381
+
382
+ - `--sample_sampler`
383
+
384
+ 指定用于采样输出的采样器。
385
+ `'ddim', 'pndm', 'heun', 'dpmsolver', 'dpmsolver++', 'dpmsingle', 'k_lms', 'k_euler', 'k_euler_a', 'k_dpm_2', 'k_dpm_2_a'`が選べます。
386
+
387
+ 要输出样本,您需要提前准备一个包含提示的文本文件。每行输入一个提示。
388
+
389
+ ```txt
390
+ # prompt 1
391
+ masterpiece, best quality, 1girl, in white shirts, upper body, looking at viewer, simple background --n low quality, worst quality, bad anatomy,bad composition, poor, low effort --w 768 --h 768 --d 1 --l 7.5 --s 28
392
+
393
+ # prompt 2
394
+ masterpiece, best quality, 1boy, in business suit, standing at street, looking back --n low quality, worst quality, bad anatomy,bad composition, poor, low effort --w 576 --h 832 --d 2 --l 5.5 --s 40
395
+ ```
396
+
397
+ 以“#”开头的行是注释。您可以使用“`--` + 小写字母”为生成的图像指定选项,例如 `--n`。您可以使用:
398
+
399
+ - `--n` 否定提示到下一个选项。
400
+ - `--w` 指定生成图像的宽度。
401
+ - `--h` 指定生成图像的高度。
402
+ - `--d` 指定生成图像的种子。
403
+ - `--l` 指定生成图像的 CFG 比例。
404
+ - `--s` 指定生成过程中的步骤数。
405
+
406
+
407
+ # 每个脚本通用的常用选项
408
+
409
+ 文档更新可能跟不上脚本更新。在这种情况下,请使用 `--help` 选项检查可用选项。
410
+ ## 学习模型规范
411
+
412
+ - `--v2` / `--v_parameterization`
413
+
414
+ 如果使用 Hugging Face 的 stable-diffusion-2-base 或来自它的微调模型作为学习目标模型(对于在推理时指示使用 `v2-inference.yaml` 的模型),`- 当使用-v2` 选项与 stable-diffusion-2、768-v-ema.ckpt 及其微调模型(对于在推理过程中使用 `v2-inference-v.yaml` 的模型),`- 指定两个 -v2`和 `--v_parameterization` 选项。
415
+
416
+ 以下几点在 Stable Diffusion 2.0 中发生了显着变化。
417
+
418
+ 1. 使用分词器
419
+ 2. 使用哪个Text Encoder,使用哪个输出层(2.0使用倒数第二层)
420
+ 3. Text Encoder的输出维度(768->1024)
421
+ 4. U-Net的结构(CrossAttention的头数等)
422
+ 5. v-parameterization(采样方式好像变了)
423
+
424
+ 其中碱基使用1-4个,非碱基使用1-5个(768-v)。使用 1-4 进行 v2 选择,使用 5 进行 v_parameterization 选择。
425
+ -`--pretrained_model_name_or_path`
426
+
427
+ 指定要从中执行额外训练的模型。您可以指定稳定扩散检查点文件(.ckpt 或 .safetensors)、扩散器本地磁盘上的模型目录或扩散器模型 ID(例如“stabilityai/stable-diffusion-2”)。
428
+ ## 学习设置
429
+
430
+ - `--output_dir`
431
+
432
+ 指定训练后保存模型的文件夹。
433
+
434
+ - `--output_name`
435
+
436
+ 指定不带扩展名的模型文件名。
437
+
438
+ - `--dataset_config`
439
+
440
+ 指定描述数据集配置的 .toml 文件。
441
+
442
+ - `--max_train_steps` / `--max_train_epochs`
443
+
444
+ 指定要学习的步数或纪元数。如果两者都指定,则 epoch 数优先。
445
+ -
446
+ - `--mixed_precision`
447
+
448
+ 训练混合精度以节省内存。指定像`--mixed_precision = "fp16"`。与无混合精度(默认)相比,精度可能较低,但训练所需的 GPU 内存明显较少。
449
+
450
+ (在RTX30系列以后也可以指定`bf16`,请配合您在搭建环境时做的加速设置)。
451
+ - `--gradient_checkpointing`
452
+
453
+ 通过逐步计算权重而不是在训练期间一次计算所有权重来减少训练所需的 GPU 内存量。关闭它不会影响准确性,但打开它允许更大的批量大小,所以那里有影响。
454
+
455
+ 另外,打开它通常会减慢速度,但可以增加批量大小,因此总的学习时间实际上可能会更快。
456
+
457
+ - `--xformers` / `--mem_eff_attn`
458
+
459
+ 当指定 xformers 选项时,使用 xformers 的 CrossAttention。如果未安装 xformers 或发生错误(取决于环境,例如 `mixed_precision="no"`),请指定 `mem_eff_attn` 选项而不是使用 CrossAttention 的内存节省版本(xformers 比 慢)。
460
+ - `--save_precision`
461
+
462
+ 指定保存时的数据精度。为 save_precision 选项指定 float、fp16 或 bf16 将以该格式保存模型(在 DreamBooth 中保存 Diffusers 格式时无效,微调)。当您想缩小模型的尺寸时请使用它。
463
+ - `--save_every_n_epochs` / `--save_state` / `--resume`
464
+ 为 save_every_n_epochs 选项指定一个数字可以在每个时期的训练期间保存模型。
465
+
466
+ 如果同时指定save_state选项,学习状态包括优化器的状态等都会一起保存。。保存目的地将是一个文件夹。
467
+
468
+ 学习状态输出到目标文件夹中名为“<output_name>-??????-state”(??????是纪元数)的文件夹中。长时间学习时请使用。
469
+
470
+ 使用 resume 选项从保存的训练状态恢复训练。指定学习状态文件夹(其中的状态文件夹,而不是 `output_dir`)。
471
+
472
+ 请注意,由于 Accelerator 规范,epoch 数和全局步数不会保存,即使恢复时它们也从 1 开始。
473
+ - `--save_model_as` (DreamBooth, fine tuning 仅有的)
474
+
475
+ 您可以从 `ckpt, safetensors, diffusers, diffusers_safetensors` 中选择模型保存格式。
476
+
477
+ - `--save_model_as=safetensors` 指定喜欢当读取稳定扩散格式(ckpt 或安全张量)并以扩散器格式保存时,缺少的信息通过从 Hugging Face 中删除 v1.5 或 v2.1 信息来补充。
478
+
479
+ - `--clip_skip`
480
+
481
+ `2` 如果指定,则使用文本编码器 (CLIP) 的倒数第二层的输出。如果省略 1 或选项,则使用最后���层。
482
+
483
+ *SD2.0默认使用倒数第二层,学习SD2.0时请不要指定。
484
+
485
+ 如果被训练的模型最初被训练为使用第二层,则 2 是一个很好的值。
486
+
487
+ 如果您使用的是最后一层,那么整个模型都会根据该假设进行训练。因此,如果再次使用第二层进行训练,可能需要一定数量的teacher数据和更长时间的学习才能得到想要的学习结果。
488
+ - `--max_token_length`
489
+
490
+ 默认值为 75。您可以通过指定“150”或“225”来扩展令牌长度来学习。使用长字幕学习时指定。
491
+
492
+ 但由于学习时token展开的规范与Automatic1111的web UI(除法等规范)略有不同,如非必要建议用75学习。
493
+
494
+ 与clip_skip一样,学习与模型学习状态不同的长度可能需要一定量的teacher数据和更长的学习时间。
495
+
496
+ - `--persistent_data_loader_workers`
497
+
498
+ 在 Windows 环境中指定它可以显着减少时期之间的延迟。
499
+
500
+ - `--max_data_loader_n_workers`
501
+
502
+ 指定数据加载的进程数。大量的进程会更快地加载数据并更有效地使用 GPU,但会消耗更多的主内存。默认是"`8`或者`CPU并发执行线程数 - 1`,取小者",所以如果主存没有空间或者GPU使用率大概在90%以上,就看那些数字和 `2` 或将其降低到大约 `1`。
503
+ - `--logging_dir` / `--log_prefix`
504
+
505
+ 保存学习日志的选项。在 logging_dir 选项中指定日志保存目标文件夹。以 TensorBoard 格式保存日志。
506
+
507
+ 例如,如果您指定 --logging_dir=logs,将在您的工作文件夹中创建一个日志文件夹,并将日志保存在日期/时间文件夹中。
508
+ 此外,如果您指定 --log_prefix 选项,则指定的字符串将添加到日期和时间之前。使用“--logging_dir=logs --log_prefix=db_style1_”进行识别。
509
+
510
+ 要检查 TensorBoard 中的日志,请打开另一个命令提示符并在您的工作文件夹中键入:
511
+ ```
512
+ tensorboard --logdir=logs
513
+ ```
514
+
515
+ 我觉得tensorboard会在环境搭建的时候安装,如果没有安装,请用`pip install tensorboard`安装。)
516
+
517
+ 然后打开浏览器到http://localhost:6006/就可以看到了。
518
+ - `--noise_offset`
519
+ 本文的实现:https://www.crosslabs.org//blog/diffusion-with-offset-noise
520
+
521
+ 看起来它可能会为整体更暗和更亮的图像产生更好的结果。它似乎对 LoRA 学习也有效。指定一个大约 0.1 的值似乎很好。
522
+
523
+ - `--debug_dataset`
524
+
525
+ 通过添加此选项,您可以在学习之前检查将学习什么样的图像数据和标题。按 Esc 退出并返回命令行。按 `S` 进入下一步(批次),按 `E` 进入下一个纪元。
526
+
527
+ *图片在 Linux 环境(包括 Colab)下不显示。
528
+
529
+ - `--vae`
530
+
531
+ 如果您在 vae 选项中指定稳定扩散检查点、VAE 检查点文件、扩散模型或 VAE(两者都可以指定本地或拥抱面模型 ID),则该 VAE 用于学习(缓存时的潜伏)或在学习过程中获得潜伏)。
532
+
533
+ 对于 DreamBooth 和微调,保存的模型将包含此 VAE
534
+
535
+ - `--cache_latents`
536
+
537
+ 在主内存中缓存 VAE 输出以减少 VRAM 使用。除 flip_aug 之外的任何增强都将不可用。此外,整体学习速度略快。
538
+ - `--min_snr_gamma`
539
+
540
+ 指定最小 SNR 加权策略。细节是[这里](https://github.com/kohya-ss/sd-scripts/pull/308)请参阅。论文中推荐`5`。
541
+
542
+ ## 优化器相关
543
+
544
+ - `--optimizer_type`
545
+ -- 指定优化器类型。您可以指定
546
+ - AdamW : [torch.optim.AdamW](https://pytorch.org/docs/stable/generated/torch.optim.AdamW.html)
547
+ - 与过去版本中未指定选项时相同
548
+ - AdamW8bit : 同上
549
+ - 与过去版本中指定的 --use_8bit_adam 相同
550
+ - Lion : https://github.com/lucidrains/lion-pytorch
551
+ - 与过去版本中指定的 --use_lion_optimizer 相同
552
+ - SGDNesterov : [torch.optim.SGD](https://pytorch.org/docs/stable/generated/torch.optim.SGD.html), nesterov=True
553
+ - SGDNesterov8bit : 参数同上
554
+ - DAdaptation(DAdaptAdamPreprint) : https://github.com/facebookresearch/dadaptation
555
+ - DAdaptAdam : 参数同上
556
+ - DAdaptAdaGrad : 参数同上
557
+ - DAdaptAdan : 参数同上
558
+ - DAdaptAdanIP : 参数同上
559
+ - DAdaptLion : 参数同上
560
+ - DAdaptSGD : 参数同上
561
+ - Prodigy : https://github.com/konstmish/prodigy
562
+ - AdaFactor : [Transformers AdaFactor](https://huggingface.co/docs/transformers/main_classes/optimizer_schedules)
563
+ - 任何优化器
564
+
565
+ - `--learning_rate`
566
+
567
+ 指定学习率。合适的学习率取决于学习脚本,所以请参考每个解释。
568
+ - `--lr_scheduler` / `--lr_warmup_steps` / `--lr_scheduler_num_cycles` / `--lr_scheduler_power`
569
+
570
+ 学习率的调度程序相关规范。
571
+
572
+ 使用 lr_scheduler 选项,您可以从线性、余弦、cosine_with_restarts、多项式、常数、constant_with_warmup 或任何调度程序中选择学习率调度程序。默认值是常量。
573
+
574
+ 使用 lr_warmup_steps,您可以指定预热调度程序的步数(逐渐改变学习率)。
575
+
576
+ lr_scheduler_num_cycles 是 cosine with restarts 调度器中的重启次数,lr_scheduler_power 是多项式调度器中的多项式幂。
577
+
578
+ 有关详细信息,请自行研究。
579
+
580
+ 要使用任何调度程序,请像使用任何优化器一样使用“--scheduler_args”指定可选参数。
581
+ ### 关于指定优化器
582
+
583
+ 使用 --optimizer_args 选项指定优化器选项参数。可以以key=value的格式指定多个值。此外,您可以指定多个值,以逗号分隔。例如,要指定 AdamW 优化器的参数,``--optimizer_args weight_decay=0.01 betas=.9,.999``。
584
+
585
+ 指定可选参数时,请检查每个优化器的规格。
586
+ 一些优化器有一个必需的参数,如果省略它会自动添加(例如 SGDNesterov 的动量)。检查控制台输出。
587
+
588
+ D-Adaptation 优化器自动调整学习率。学习率选项指定的值不是学习率本身,而是D-Adaptation决定的学习率的应用率,所以通常指定1.0。如果您希望 Text Encoder 的学习率是 U-Net 的一半,请指定 ``--text_encoder_lr=0.5 --unet_lr=1.0``。
589
+ 如果指定 relative_step=True,AdaFactor 优化器可以自动调整学习率(如果省略,将默认添加)。自动调整时,学习率调度器被迫使用 adafactor_scheduler。此外,指定 scale_parameter 和 warmup_init 似乎也不错。
590
+
591
+ 自动调整的选项类似于``--optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True"``。
592
+
593
+ 如果您不想自动调整学习率,请添加可选参数 ``relative_step=False``。在那种情况下,似乎建议将 constant_with_warmup 用于学习率调度程序,而不要为梯度剪裁范数。所以参数就像``--optimizer_type=adafactor --optimizer_args "relative_step=False" --lr_scheduler="constant_with_warmup" --max_grad_norm=0.0``。
594
+
595
+ ### 使用任何优化器
596
+
597
+ 使用 ``torch.optim`` 优化器时,仅指定类名(例如 ``--optimizer_type=RMSprop``),使用其他模块的优化器时,指定“模块名.类名”。(例如``--optimizer_type=bitsandbytes.optim.lamb.LAMB``)。
598
+
599
+ (内部仅通过 importlib 未确认操作。如果需要,请安装包。)
600
+ <!--
601
+ ## 使用任意大小的图像进行训练 --resolution
602
+ 你可以在广场外学习。请在分辨率中指定“宽度、高度”,如“448,640”。宽度和高度必须能被 64 整除。匹配训练图像和正则化图像的大小。
603
+
604
+ 就我个人而言,我经常生成垂直长的图像,所以我有时会用“448、640”来学习。
605
+
606
+ ## 纵横比分桶 --enable_bucket / --min_bucket_reso / --max_bucket_reso
607
+ 它通过指定 enable_bucket 选项来启用。 Stable Diffusion 在 512x512 分辨率下训练,但也在 256x768 和 384x640 等分辨率下训练。
608
+
609
+ 如果指定此选项,则不需要将训练图像和正则化图像统一为特定分辨率。从多种分辨率(纵横比)中进行选择,并在该分辨率下学习。
610
+ 由于分辨率为 64 像素,纵横比可能与原始图像不完全相同。
611
+
612
+ 您可以使用 min_bucket_reso 选项指定分辨率的最小大小,使用 max_bucket_reso 指定最大大小。默认值分别为 256 和 1024。
613
+ 例如,将最小尺寸指定为 384 将不会使用 256x1024 或 320x768 等分辨率。
614
+ 如果将分辨率增加到 768x768,您可能需要将 1280 指定为最大尺寸。
615
+
616
+ 启用 Aspect Ratio Ratio Bucketing 时,最好准备具有与训练图像相似的各种分辨率的正则化图像。
617
+
618
+ (因为一批中的图像不偏向于训练图像和正则化图像。
619
+
620
+ ## 扩充 --color_aug / --flip_aug
621
+ 增强是一种通过在学习过程中动态改变数据来提高模型性能的方法。在使用 color_aug 巧妙地改变色调并使用 flip_aug 左右翻转的同时学习。
622
+
623
+ 由于数据是动态变化的,因此不能与 cache_latents 选项一起指定。
624
+
625
+ ## 使用 fp16 梯度训练(实验特征)--full_fp16
626
+ 如果指定 full_fp16 选项,梯度从普通 float32 变为 float16 (fp16) 并学习(它似乎是 full fp16 学习而不是混合精度)。
627
+ 结果,似乎 SD1.x 512x512 大小可以在 VRAM 使用量小于 8GB 的​​情况下学习,而 SD2.x 512x512 大小可以在 VRAM 使用量小于 12GB 的情况下学习。
628
+
629
+ 预先在加速配置中指定 fp16,并可选择设置 ``mixed_precision="fp16"``(bf16 不起作用)。
630
+
631
+ 为了最大限度地减少内存使用,请使用 xformers、use_8bit_adam、cache_latents、gradient_checkpointing 选项并将 train_batch_size 设置为 1。
632
+
633
+ (如果你负担得起,逐步增加 train_batch_size 应该会提高一点精度。)
634
+
635
+ 它是通过修补 PyTorch 源代码实现的(已通过 PyTorch 1.12.1 和 1.13.0 确认)。准确率会大幅下降,途中学习失败的概率也会增加。
636
+ 学习率和步数的设置似乎很严格。请注意它们并自行承担使用它们的风险。
637
+ -->
638
+
639
+ # 创建元数据文件
640
+
641
+ ## 准备教师资料
642
+
643
+ 如上所述准备好你要学习的图像数据,放在任意文件夹中。
644
+
645
+ 例如,存储这样的图像:
646
+
647
+ ![教师数据文件夹的屏幕截图](https://user-images.githubusercontent.com/52813779/208907739-8e89d5fa-6ca8-4b60-8927-f484d2a9ae04.png)
648
+
649
+ ## 自动字幕
650
+
651
+ 如果您只想学习没有标题的标签,请跳过。
652
+
653
+ 另外,手动准备字幕时,请准备在与教师数据图像相同的目录下,文件名相同,扩展名.caption等。每个文件应该是只有一行的文本文件。
654
+ ### 使用 BLIP 添加字幕
655
+
656
+ 最新版本不再需要 BLIP 下载、权重下载和额外的虚拟环境。按原样工作。
657
+
658
+ 运行 finetune 文件夹中的 make_captions.py。
659
+
660
+ ```
661
+ python finetune\make_captions.py --batch_size <バッチサイズ> <教師データフォルダ>
662
+ ```
663
+
664
+ 如果batch size为8,训练数据放在父文件夹train_data中,则会如下所示
665
+ ```
666
+ python finetune\make_captions.py --batch_size 8 ..\train_data
667
+ ```
668
+
669
+ 字幕文件创建在与教师数据图像相同的目录中,具有相同的文件名和扩展名.caption。
670
+
671
+ 根据 GPU 的 VRAM 容量增加或减少 batch_size。越大越快(我认为 12GB 的 VRAM 可以多一点)。
672
+ 您可以使用 max_length 选项指定标题的最大长度。默认值为 75。如果使用 225 的令牌长度训练模型,它可能会更长。
673
+ 您可以使用 caption_extension 选项更改标题扩展名。默认为 .caption(.txt 与稍后描述的 DeepDanbooru 冲突)。
674
+ 如果有多个教师数据文件夹,则对每个文件夹执行。
675
+
676
+ 请注意,推理是随机的,因此每次运行时结果都会发生变化。如果要修复它,请使用 --seed 选项指定一个随机数种子,例如 `--seed 42`。
677
+
678
+ 其他的选项,请参考help with `--help`(好像没有文档说明参数的含义,得看源码)。
679
+
680
+ 默认情况下,会生成扩展名为 .caption 的字幕文件。
681
+
682
+ ![caption生成的文件夹](https://user-images.githubusercontent.com/52813779/208908845-48a9d36c-f6ee-4dae-af71-9ab462d1459e.png)
683
+
684
+ 例如,标题如下:
685
+
686
+ ![字幕和图像](https://user-images.githubusercontent.com/52813779/208908947-af936957-5d73-4339-b6c8-945a52857373.png)
687
+
688
+ ## 由 DeepDanbooru 标记
689
+
690
+ 如果不想给danbooru标签本身打标签,请继续“标题和标签信息的预处理”。
691
+
692
+ 标记是使用 DeepDanbooru 或 WD14Tagger 完成的。 WD14Tagger 似乎更准确。如果您想使用 WD14Tagger 进行标记,请跳至下一章。
693
+ ### 环境布置
694
+
695
+ 将 DeepDanbooru https://github.com/KichangKim/DeepDanbooru 克隆到您的工作文件夹中,或下载并展开 zip。我解压缩了它。
696
+ 另外,从 DeepDanbooru 发布页面 https://github.com/KichangKim/DeepDanbooru/releases 上的“DeepDanbooru 预训练模型 v3-20211112-sgd-e28”的资产下载 deepdanbooru-v3-20211112-sgd-e28.zip 并解压到 DeepDanbooru 文件夹。
697
+
698
+ 从下面下载。单击以打开资产并从那里下载。
699
+
700
+ ![DeepDanbooru下载页面](https://user-images.githubusercontent.com/52813779/208909417-10e597df-7085-41ee-bd06-3e856a1339df.png)
701
+
702
+ 做一个这样的目录结构
703
+
704
+ ![DeepDanbooru的目录结构](https://user-images.githubusercontent.com/52813779/208909486-38935d8b-8dc6-43f1-84d3-fef99bc471aa.png)
705
+ 为扩散器环境安装必要的库。进入 DeepDanbooru 文件夹并安装它(我认为它实际上只是添加了 tensorflow-io)。
706
+ ```
707
+ pip install -r requirements.txt
708
+ ```
709
+
710
+ 接下来,安装 DeepDanbooru 本身。
711
+
712
+ ```
713
+ pip install .
714
+ ```
715
+
716
+ 这样就完成了标注环境的准备工作。
717
+
718
+ ### 实施标记
719
+ 转到 DeepDanbooru 的文件夹并运行 deepdanbooru 进行标记。
720
+ ```
721
+ deepdanbooru evaluate <教师资料夹> --project-path deepdanbooru-v3-20211112-sgd-e28 --allow-folder --save-txt
722
+ ```
723
+
724
+ 如果将训练数据放在父文件夹train_data中,则如下所示。
725
+ ```
726
+ deepdanbooru evaluate ../train_data --project-path deepdanbooru-v3-20211112-sgd-e28 --allow-folder --save-txt
727
+ ```
728
+
729
+ 在与教师数据图像相同的目录中创建具有相同文件名和扩展名.txt 的标记文件。它很慢,因为它是一个接一个地处理的。
730
+
731
+ 如果有多个教师数据文件夹,则对每个文件夹执行。
732
+
733
+ 它生成如下。
734
+
735
+ ![DeepDanbooru生成的文件](https://user-images.githubusercontent.com/52813779/208909855-d21b9c98-f2d3-4283-8238-5b0e5aad6691.png)
736
+
737
+ 它会被这样标记(信息量很大...)。
738
+
739
+ ![DeepDanbooru标签和图片](https://user-images.githubusercontent.com/52813779/208909908-a7920174-266e-48d5-aaef-940aba709519.png)
740
+
741
+ ## WD14Tagger标记为
742
+
743
+ 此过程使用 WD14Tagger 而不是 DeepDanbooru。
744
+
745
+ 使用 Mr. Automatic1111 的 WebUI 中使用的标记器。我参考了这个 github 页面上的信息 (https://github.com/toriato/stable-diffusion-webui-wd14-tagger#mrsmilingwolfs-model-aka-waifu-diffusion-14-tagger)。
746
+
747
+ 初始环境维护所需的模块已经安装。权重自动从 Hugging Face 下载。
748
+ ### 实施标记
749
+
750
+ 运行脚本以进行标记。
751
+ ```
752
+ python tag_images_by_wd14_tagger.py --batch_size <バッチサイズ> <教師データフォルダ>
753
+ ```
754
+
755
+ 如果将训练数据放在父文件夹train_data中,则如下所示
756
+ ```
757
+ python tag_images_by_wd14_tagger.py --batch_size 4 ..\train_data
758
+ ```
759
+
760
+ 模型文件将在首次启动时自动下载到 wd14_tagger_model 文件夹(文件夹可以在选项中更改)。它将如下所示。
761
+ ![下载文件](https://user-images.githubusercontent.com/52813779/208910447-f7eb0582-90d6-49d3-a666-2b508c7d1842.png)
762
+
763
+ 在与教师数据图像相同的目录中创建具有相同文件名和扩展名.txt 的标记文件。
764
+ ![生成的标签文件](https://user-images.githubusercontent.com/52813779/208910534-ea514373-1185-4b7d-9ae3-61eb50bc294e.png)
765
+
766
+ ![标签和图片](https://user-images.githubusercontent.com/52813779/208910599-29070c15-7639-474f-b3e4-06bd5a3df29e.png)
767
+
768
+ 使用 thresh 选项,您可以指定确定的标签的置信度数以附加标签。默认值为 0.35,与 WD14Tagger 示例相同。较低的值给出更多的标签,但准确性较低。
769
+
770
+ 根据 GPU 的 VRAM 容量增加或减少 batch_size。越大越快(我认为 12GB 的 VRAM 可以多一点)。您可以使用 caption_extension 选项更改标记文件扩展名。默认为 .txt。
771
+
772
+ 您可以使用 model_dir 选项指定保存模型的文件夹。
773
+
774
+ 此外,如果指定 force_download 选项,即使有保存目标文件夹,也会重新下载模型。
775
+
776
+ 如果有多个教师数据文件夹,则对每个文件夹执行。
777
+
778
+ ## 预处理字幕和标签信息
779
+
780
+ 将字幕和标签作为元数据合并到一个文件中,以便从脚本中轻松处理。
781
+ ### 字幕预处理
782
+
783
+ 要将字幕放入元数据,请在您的工作文件夹中运行以下命令(如果您不使用字幕进行学习,则不需要运行它)(它实际上是一行,依此类推)。指定 `--full_path` 选项以将图像文件的完整路径存储在元数据中。如果省略此选项,则会记录相对路径,但 .toml 文件中需要单独的文件夹规范。
784
+ ```
785
+ python merge_captions_to_metadata.py --full_path <教师资料夹>
786
+   --in_json <要读取的元数据文件名> <元数据文件名>
787
+ ```
788
+
789
+ 元数据文件名是任意名称。
790
+ 如果训练数据为train_data,没有读取元数据文件,元数据文件为meta_cap.json,则会如下。
791
+ ```
792
+ python merge_captions_to_metadata.py --full_path train_data meta_cap.json
793
+ ```
794
+
795
+ 您可以使用 caption_extension 选项指定标题扩展。
796
+
797
+ 如果有多个教师数据文件夹,请指定 full_path 参数并为每个文件夹执行。
798
+ ```
799
+ python merge_captions_to_metadata.py --full_path
800
+ train_data1 meta_cap1.json
801
+ python merge_captions_to_metadata.py --full_path --in_json meta_cap1.json
802
+ train_data2 meta_cap2.json
803
+ ```
804
+ 如果省略in_json,如果有写入目标元数据文件,将从那里读取并覆盖。
805
+
806
+ __* 每次重写 in_json 选项和写入目标并写入单独的元数据文件是安全的。 __
807
+ ### 标签预处理
808
+
809
+ 同样,标签也收集在元数据中(如果标签不用于学习,则无需这样做)。
810
+ ```
811
+ python merge_dd_tags_to_metadata.py --full_path <教师资料夹>
812
+ --in_json <要读取的元数据文件名> <要写入的元数据文件名>
813
+ ```
814
+
815
+ 同样的目录结构,读取meta_cap.json和写入meta_cap_dd.json时,会是这样的。
816
+ ```
817
+ python merge_dd_tags_to_metadata.py --full_path train_data --in_json meta_cap.json meta_cap_dd.json
818
+ ```
819
+
820
+ 如果有多个教师数据文件夹,请指定 full_path 参数并为每个文件夹执行。
821
+
822
+ ```
823
+ python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap2.json
824
+ train_data1 meta_cap_dd1.json
825
+ python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap_dd1.json
826
+ train_data2 meta_cap_dd2.json
827
+ ```
828
+
829
+ 如果省略in_json,如果有写入目标元数据文件,将从那里读取并覆盖。
830
+ __※ 通过每次重写 in_json 选项和写入目标,写入单独的元数据文件是安全的。 __
831
+ ### 标题和标签清理
832
+
833
+ 到目前为止,标题和DeepDanbooru标签已经被整理到元数据文件中。然而,自动标题生成的标题存在表达差异等微妙问题(※),而标签中可能包含下划线和评级(DeepDanbooru的情况下)。因此,最好使用编辑器的替换功能清理标题和标签。
834
+
835
+ ※例如,如果要学习动漫中的女孩,标题可能会包含girl/girls/woman/women等不同的表达方式。另外,将"anime girl"简单地替换为"girl"可能更合适。
836
+
837
+ 我们提供了用于清理的脚本,请根据情况编辑脚本并使用它。
838
+
839
+ (不需要指定教师数据文件夹。将清理元数据中的所有数据。)
840
+
841
+ ```
842
+ python clean_captions_and_tags.py <要读取的元数据文件名> <要写入的元数据文件名>
843
+ ```
844
+
845
+ --in_json 请注意,不包括在内。例如:
846
+
847
+ ```
848
+ python clean_captions_and_tags.py meta_cap_dd.json meta_clean.json
849
+ ```
850
+
851
+ 标题和标签的预处理现已完成。
852
+
853
+ ## 预先获取 latents
854
+
855
+ ※ 这一步骤并非必须。即使省略此步骤,也可以在训练过程中获取 latents。但是,如果在训练时执行 `random_crop` 或 `color_aug` 等操作,则无法预先获取 latents(因为每次图像都会改变)。如果不进���预先获取,则可以使用到目前为止的元数据进行训练。
856
+
857
+ 提前获取图像的潜在表达并保存到磁盘上。这样可以加速训练过程。同时进行 bucketing(根据宽高比对训练数据进行分类)。
858
+
859
+ 请在工作文件夹中输入以下内容。
860
+
861
+ ```
862
+ python prepare_buckets_latents.py --full_path <教师资料夹>
863
+ <要读取的元数据文件名> <要写入的元数据文件名>
864
+ <要微调的模型名称或检查点>
865
+ --batch_size <批量大小>
866
+ --max_resolution <分辨率宽、高>
867
+ --mixed_precision <准确性>
868
+ ```
869
+
870
+ 如果要从meta_clean.json中读取元数据,并将其写入meta_lat.json,使用模型model.ckpt,批处理大小为4,训练分辨率为512*512,精度为no(float32),则应如下所示。
871
+ ```
872
+ python prepare_buckets_latents.py --full_path
873
+ train_data meta_clean.json meta_lat.json model.ckpt
874
+ --batch_size 4 --max_resolution 512,512 --mixed_precision no
875
+ ```
876
+
877
+ 教师数据文件夹中,latents以numpy的npz格式保存。
878
+
879
+ 您可以使用--min_bucket_reso选项指定最小分辨率大小,--max_bucket_reso指定最大大小。默认值分别为256和1024。例如,如果指定最小大小为384,则将不再使用分辨率为256 * 1024或320 * 768等。如果将分辨率增加到768 * 768等较大的值,则最好将最大大小指定为1280等。
880
+
881
+ 如果指定--flip_aug选项,则进行左右翻转的数据增强。虽然这可以使数据量伪造一倍,但如果数据不是左右对称的(例如角色外观、发型等),则可能会导致训练不成功。
882
+
883
+ 对于翻转的图像,也会获取latents,并保存名为\ *_flip.npz的文件,这是一个简单的实现。在fline_tune.py中不需要特定的选项。如果有带有\_flip的文件,则会随机加载带有和不带有flip的文件。
884
+
885
+ 即使VRAM为12GB,批量大小也可以稍微增加。分辨率以“宽度,高度”的形式指定,必须是64的倍数。分辨率直接影响fine tuning时的内存大小。在12GB VRAM中,512,512似乎是极限(*)。如果有16GB,则可以将其提高到512,704或512,768。即使分辨率为256,256等,VRAM 8GB也很难承受(因为参数、优化器等与分辨率无关,需要一定的内存)。
886
+
887
+ *有报道称,在batch size为1的训练中,使用12GB VRAM和640,640的分辨率。
888
+
889
+ 以下是bucketing结果的显示方式。
890
+
891
+ ![bucketing的結果](https://user-images.githubusercontent.com/52813779/208911419-71c00fbb-2ce6-49d5-89b5-b78d7715e441.png)
892
+
893
+ 如果有多个教师数据文件夹,请指定 full_path 参数并为每个文件夹执行
894
+
895
+ ```
896
+ python prepare_buckets_latents.py --full_path
897
+ train_data1 meta_clean.json meta_lat1.json model.ckpt
898
+ --batch_size 4 --max_resolution 512,512 --mixed_precision no
899
+
900
+ python prepare_buckets_latents.py --full_path
901
+ train_data2 meta_lat1.json meta_lat2.json model.ckpt
902
+ --batch_size 4 --max_resolution 512,512 --mixed_precision no
903
+
904
+ ```
905
+ 可以将读取源和写入目标设为相同,但分开设定更为安全。
906
+
907
+ __※建议每次更改参数并将其写入另一个元数据文件,以确保安全性。__
docs/train_db_README-ja.md ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ DreamBoothのガイドです。
2
+
3
+ [学習についての共通ドキュメント](./train_README-ja.md) もあわせてご覧ください。
4
+
5
+ # 概要
6
+
7
+ DreamBoothとは、画像生成モデルに特定の主題を追加学習し、それを特定の識別子で生成する技術です。[論文はこちら](https://arxiv.org/abs/2208.12242)。
8
+
9
+ 具体的には、Stable Diffusionのモデルにキャラや画風などを学ばせ、それを `shs` のような特定の単語で呼び出せる(生成画像に出現させる)ことができます。
10
+
11
+ スクリプトは[DiffusersのDreamBooth](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth)を元にしていますが、以下のような機能追加を行っています(いくつかの機能は元のスクリプト側もその後対応しています)。
12
+
13
+ スクリプトの主な機能は以下の通りです。
14
+
15
+ - 8bit Adam optimizerおよびlatentのキャッシュによる省メモリ化([Shivam Shrirao氏版](https://github.com/ShivamShrirao/diffusers/tree/main/examples/dreambooth)と同様)。
16
+ - xformersによる省メモリ化。
17
+ - 512x512だけではなく任意サイズでの学習。
18
+ - augmentationによる品質の向上。
19
+ - DreamBoothだけではなくText Encoder+U-Netのfine tuningに対応。
20
+ - Stable Diffusion形式でのモデルの読み書き。
21
+ - Aspect Ratio Bucketing。
22
+ - Stable Diffusion v2.0対応。
23
+
24
+ # 学習の手順
25
+
26
+ あらかじめこのリポジトリのREADMEを参照し、環境整備を行ってください。
27
+
28
+ ## データの準備
29
+
30
+ [学習データの準備について](./train_README-ja.md) を参照してください。
31
+
32
+ ## 学習の実行
33
+
34
+ スクリプトを実行します。最大限、メモリを節約したコマンドは以下のようになります(実際には1行で入力します)。それぞれの行を必要に応じて書き換えてください。12GB程度のVRAMで動作するようです。
35
+
36
+ ```
37
+ accelerate launch --num_cpu_threads_per_process 1 train_db.py
38
+ --pretrained_model_name_or_path=<.ckptまたは.safetensordまたはDiffusers版モデルのディレクトリ>
39
+ --dataset_config=<データ準備で作成した.tomlファイル>
40
+ --output_dir=<学習したモデルの出力先フォルダ>
41
+ --output_name=<学習したモデル出力時のファイル名>
42
+ --save_model_as=safetensors
43
+ --prior_loss_weight=1.0
44
+ --max_train_steps=1600
45
+ --learning_rate=1e-6
46
+ --optimizer_type="AdamW8bit"
47
+ --xformers
48
+ --mixed_precision="fp16"
49
+ --cache_latents
50
+ --gradient_checkpointing
51
+ ```
52
+
53
+ `num_cpu_threads_per_process` には通常は1を指定するとよいようです。
54
+
55
+ `pretrained_model_name_or_path` に追加学習を行う元となるモデルを指定します。Stable Diffusionのcheckpointファイル(.ckptまたは.safetensors)、Diffusersのローカルディスクにあるモデルディレクトリ、DiffusersのモデルID("stabilityai/stable-diffusion-2"など)が指定できます。
56
+
57
+ `output_dir` に学習後のモデルを保存するフォルダを指定します。`output_name` にモデルのファイル名を拡張子を除いて指定します。`save_model_as` でsafetensors形式での保存を指定しています。
58
+
59
+ `dataset_config` に `.toml` ファイルを指定します。ファイル内でのバッチサイズ指定は、当初はメモリ消費を抑えるために `1` としてください。
60
+
61
+ `prior_loss_weight` は正則化画像のlossの重みです。通常は1.0を指定します。
62
+
63
+ 学習させるステップ数 `max_train_steps` を1600とします。学習率 `learning_rate` はここでは1e-6を指定しています。
64
+
65
+ 省メモリ化のため `mixed_precision="fp16"` を指定します(RTX30 シリーズ以降では `bf16` も指定できます。環境整備時にaccelerateに行った設定と合わせてください)。また `gradient_checkpointing` を指定します。
66
+
67
+ オプティマイザ(モデルを学習データにあうように最適化=学習させるクラス)にメモリ消費の少ない 8bit AdamW を使うため、 `optimizer_type="AdamW8bit"` を指定します。
68
+
69
+ `xformers` オプションを指定し、xformersのCrossAttentionを用います。xformersをインストールしていない場合やエラーとなる場合(環境にもよりますが `mixed_precision="no"` の場合など)、代わりに `mem_eff_attn` オプションを指定すると省メモリ版CrossAttentionを使用します(速度は遅くなります)。
70
+
71
+ 省メモリ化のため `cache_latents` オプションを指定してVAEの出力をキャッシュします。
72
+
73
+ ある程度メモリがある場合は、`.toml` ファイルを編集してバッチサイズをたとえば `4` くらいに増やしてください(高速化と精度向上の可能性があります)。また `cache_latents` を外すことで augmentation が可能になります。
74
+
75
+ ### よく使われるオプションについて
76
+
77
+ 以下の場合には [学習の共通ドキュメント](./train_README-ja.md) の「よく使われるオプション」を参照してください。
78
+
79
+ - Stable Diffusion 2.xまたはそこからの派生モデルを学習する
80
+ - clip skipを2以上を前提としたモデルを学習する
81
+ - 75トークンを超えたキャプションで学習する
82
+
83
+ ### DreamBoothでのステップ数について
84
+
85
+ 当スクリプトでは省メモリ化のため、ステップ当たりの学習回数が元のスクリプトの半分になっています(対象の画像と正則化画像を同一のバッチではなく別のバッチに分割して学習するため)。
86
+
87
+ 元のDiffusers版やXavierXiao氏のStable Diffusion版とほぼ同じ学習を行うには、ステップ数を倍にしてください。
88
+
89
+ (学習画像と正則化画像をまとめてから shuffle するため厳密にはデータの順番が変わってしまいますが、学習には大きな影響はないと思います。)
90
+
91
+ ### DreamBoothでのバッチサイズについて
92
+
93
+ モデル全体を学習するためLoRA等の学習に比べるとメモリ消費量は多くなります(fine tuningと同じ)。
94
+
95
+ ### 学習率について
96
+
97
+ Diffusers版では5e-6ですがStable Diffusion版は1e-6ですので、上のサンプルでは1e-6を指定しています。
98
+
99
+ ### 以前の形式のデータセット指定をした場合のコマンドライン
100
+
101
+ 解像度やバッチサイズをオプションで指定します。コマンドラインの例は以下の通りです。
102
+
103
+ ```
104
+ accelerate launch --num_cpu_threads_per_process 1 train_db.py
105
+ --pretrained_model_name_or_path=<.ckptまたは.safetensordまたはDiffusers版モデルのディレクトリ>
106
+ --train_data_dir=<学習用データのディレクトリ>
107
+ --reg_data_dir=<正則化画像のディレクトリ>
108
+ --output_dir=<学習したモデルの出力先ディレクトリ>
109
+ --output_name=<学習したモデル出力時のファイル名>
110
+ --prior_loss_weight=1.0
111
+ --resolution=512
112
+ --train_batch_size=1
113
+ --learning_rate=1e-6
114
+ --max_train_steps=1600
115
+ --use_8bit_adam
116
+ --xformers
117
+ --mixed_precision="bf16"
118
+ --cache_latents
119
+ --gradient_checkpointing
120
+ ```
121
+
122
+ ## 学習したモデルで画像生成する
123
+
124
+ 学習が終わると指定したフォルダに指定した名前でsafetensorsファイルが出力されます。
125
+
126
+ v1.4/1.5およびその他の派生モデルの場合、このモデルでAutomatic1111氏のWebUIなどで推論できます。models\Stable-diffusionフォルダに置いてください。
127
+
128
+ v2.xモデルでWebUIで画像生成する場合、モデルの仕様が記述された.yamlファイルが別途必要になります。v2.x baseの場合はv2-inference.yamlを、768/vの場合はv2-inference-v.yamlを、同じフォルダに置き、拡張子の前の部分をモデルと同じ名前にしてください。
129
+
130
+ ![image](https://user-images.githubusercontent.com/52813779/210776915-061d79c3-6582-42c2-8884-8b91d2f07313.png)
131
+
132
+ 各yamlファイルは[Stability AIのSD2.0のリポジトリ](https://github.com/Stability-AI/stablediffusion/tree/main/configs/stable-diffusion)にあります。
133
+
134
+ # DreamBooth特有のその他の主なオプション
135
+
136
+ すべてのオプションについては別文書を参照してください。
137
+
138
+ ## Text Encoderの学習を途中から行わない --stop_text_encoder_training
139
+
140
+ stop_text_encoder_trainingオプションに数値を指定すると、そのステップ数以降はText Encoderの学習を行わずU-Netだけ学習します。場合によっては精度の向上が期待できるかもしれません。
141
+
142
+ (恐らくText Encoderだけ先に過学習することがあり、それを防げるのではないかと推測していますが、詳細な影響は不明です。)
143
+
144
+ ## Tokenizerのパディングをしない --no_token_padding
145
+ no_token_paddingオプションを指定するとTokenizerの出力をpaddingしません(Diffusers版の旧DreamBoothと同じ動きになります)。
146
+
147
+
148
+ <!--
149
+ bucketing(後述)を利用しかつaugmentation(後述)を使う場合の例は以下のようになります。
150
+
151
+ ```
152
+ accelerate launch --num_cpu_threads_per_process 8 train_db.py
153
+ --pretrained_model_name_or_path=<.ckptまたは.safetensordまたはDiffusers版モデルのディレクトリ>
154
+ --train_data_dir=<学習用データのディレクトリ>
155
+ --reg_data_dir=<正則化画像のディレクトリ>
156
+ --output_dir=<学習したモデルの出力先ディレクトリ>
157
+ --resolution=768,512
158
+ --train_batch_size=20 --learning_rate=5e-6 --max_train_steps=800
159
+ --use_8bit_adam --xformers --mixed_precision="bf16"
160
+ --save_every_n_epochs=1 --save_state --save_precision="bf16"
161
+ --logging_dir=logs
162
+ --enable_bucket --min_bucket_reso=384 --max_bucket_reso=1280
163
+ --color_aug --flip_aug --gradient_checkpointing --seed 42
164
+ ```
165
+
166
+
167
+ -->
docs/train_db_README-zh.md ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 这是DreamBooth的指南。
2
+
3
+ 请同时查看[关于学习的通用文档](./train_README-zh.md)。
4
+
5
+ # 概要
6
+
7
+ DreamBooth是一种将特定主题添加到图像生成模型中进行学习,并使用特定识别子生成它的技术。论文链接。
8
+
9
+ 具体来说,它可以将角色和绘画风格等添加到Stable Diffusion模型中进行学习,并使用特定的单词(例如`shs`)来调用(呈现在生成的图像中)。
10
+
11
+ 脚本基于Diffusers的DreamBooth,但添加了以下功能(一些功能已在原始脚本中得到支持)。
12
+
13
+ 脚本的主要功能如下:
14
+
15
+ - 使用8位Adam优化器和潜在变量的缓存来节省内存(与Shivam Shrirao版相似)。
16
+ - 使用xformers来节省内存。
17
+ - 不仅支持512x512,还支持任意尺寸的训练。
18
+ - 通过数据增强来提高质量。
19
+ - 支持DreamBooth和Text Encoder + U-Net的微调。
20
+ - 支持以Stable Diffusion格式读写模型。
21
+ - 支持Aspect Ratio Bucketing。
22
+ - 支持Stable Diffusion v2.0。
23
+
24
+ # 训练步骤
25
+
26
+ 请先参阅此存储库的README以进行环境设置。
27
+
28
+ ## 准备数据
29
+
30
+ 请参阅[有关准备训练数据的说明](./train_README-zh.md)。
31
+
32
+ ## 运行训练
33
+
34
+ 运行脚本。以下是最大程度地节省内存的命令(实际上,这将在一行中输入)。请根据需要修改每行。它似乎需要约12GB的VRAM才能运行。
35
+ ```
36
+ accelerate launch --num_cpu_threads_per_process 1 train_db.py
37
+ --pretrained_model_name_or_path=<.ckpt或.safetensord或Diffusers版模型的目录>
38
+ --dataset_config=<数据准备时创建的.toml文件>
39
+ --output_dir=<训练模型的输出目录>
40
+ --output_name=<训练模型输出时的文件名>
41
+ --save_model_as=safetensors
42
+ --prior_loss_weight=1.0
43
+ --max_train_steps=1600
44
+ --learning_rate=1e-6
45
+ --optimizer_type="AdamW8bit"
46
+ --xformers
47
+ --mixed_precision="fp16"
48
+ --cache_latents
49
+ --gradient_checkpointing
50
+ ```
51
+ `num_cpu_threads_per_process` 通常应该设置为1。
52
+
53
+ `pretrained_model_name_or_path` 指定要进行追加训练的基础模型。可以指定 Stable Diffusion 的 checkpoint 文件(.ckpt 或 .safetensors)、Diffusers 的本地模型目录或模型 ID(如 "stabilityai/stable-diffusion-2")。
54
+
55
+ `output_dir` 指定保存训练后模型的文件夹。在 `output_name` 中指定模型文件名,不包括扩展名。使用 `save_model_as` 指定以 safetensors 格式保存。
56
+
57
+ 在 `dataset_config` 中指定 `.toml` 文件。初始批处理大小应为 `1`,以减少内存消耗。
58
+
59
+ `prior_loss_weight` 是正则化图像损失的权重。通常设为1.0。
60
+
61
+ 将要训练的步数 `max_train_steps` 设置为1600。在这里,学习率 `learning_rate` 被设置为1e-6。
62
+
63
+ 为了节省内存,设置 `mixed_precision="fp16"`(在 RTX30 系列及更高版本中也可以设置为 `bf16`)。同时指定 `gradient_checkpointing`。
64
+
65
+ 为了使用内存消耗较少的 8bit AdamW 优化器(将模型优化为适合于训练数据的状态),指定 `optimizer_type="AdamW8bit"`。
66
+
67
+ 指定 `xformers` 选项,并使用 xformers 的 CrossAttention。如果未安装 xformers 或出现错误(具体情况取决于环境,例如使用 `mixed_precision="no"`),则可以指定 `mem_eff_attn` 选项以使用省内存版的 CrossAttention(速度会变慢)。
68
+
69
+ 为了节省内存,指定 `cache_latents` 选项以缓存 VAE 的输出。
70
+
71
+ 如果有足够的内存,请编辑 `.toml` 文件将批处理大小增加到大约 `4`(可能会提高速度和精度)。此外,取消 `cache_latents` 选项可以进行数据增强。
72
+
73
+ ### 常用选项
74
+
75
+ 对于以下情况,请参阅“常用选项”部分。
76
+
77
+ - 学习 Stable Diffusion 2.x 或其衍生模型。
78
+ - 学习基于 clip skip 大于等于2的模型。
79
+ - 学习超过75个令牌的标题。
80
+
81
+ ### 关于DreamBooth中的步数
82
+
83
+ 为了实现省内存化,该脚本中每个步骤的学习次数减半(因为学习和正则化的图像在训练时被分为不同的批次)。
84
+
85
+ 要进行与原始Diffusers版或XavierXiao的Stable Diffusion版几乎相同的学习,请将步骤数加倍。
86
+
87
+ (虽然在将学习图像和正则化图像整合后再打乱顺序,但我认为对学习没有太大影响。)
88
+
89
+ 关于DreamBooth的批量大小
90
+
91
+ 与像LoRA这样的学习相比,为了训练整个模型,内存消耗量会更大(与微调相同)。
92
+
93
+ 关于学习率
94
+
95
+ 在Diffusers版中,学习率为5e-6,而在Stable Diffusion版中为1e-6,因此在上面的示例中指定了1e-6。
96
+
97
+ 当使用旧格式的数据集指定命令行时
98
+
99
+ 使用选项指定分辨率和批量大小。命令行示例如下。
100
+ ```
101
+ accelerate launch --num_cpu_threads_per_process 1 train_db.py
102
+ --pretrained_model_name_or_path=<.ckpt或.safetensord或Diffusers版模型的目录>
103
+ --train_data_dir=<训练数据的目录>
104
+ --reg_data_dir=<正则化图像的目录>
105
+ --output_dir=<训练后模型的输出目录>
106
+ --output_name=<训练后模型输出文件的名称>
107
+ --prior_loss_weight=1.0
108
+ --resolution=512
109
+ --train_batch_size=1
110
+ --learning_rate=1e-6
111
+ --max_train_steps=1600
112
+ --use_8bit_adam
113
+ --xformers
114
+ --mixed_precision="bf16"
115
+ --cache_latents
116
+ --gradient_checkpointing
117
+ ```
118
+
119
+ ## 使用训练好的模型生成图像
120
+
121
+ 训练完成后,将在指定的文件夹中以指定的名称输出safetensors文件。
122
+
123
+ 对于v1.4/1.5和其他派生模型,可以在此模型中使用Automatic1111先生的WebUI进行推断。请将其放置在models\Stable-diffusion文件夹中。
124
+
125
+ 对于使用v2.x模型在WebUI中生成图像的情况,需要单独的.yaml文件来描述模型的规格。对于v2.x base,需要v2-inference.yaml,对于768/v,则需要v2-inference-v.yaml。请将它们放置在相同的文件夹中,并将文件扩展名之前的部分命名为与模型相同的名称。
126
+ ![image](https://user-images.githubusercontent.com/52813779/210776915-061d79c3-6582-42c2-8884-8b91d2f07313.png)
127
+
128
+ 每个yaml文件都在[Stability AI的SD2.0存储库](https://github.com/Stability-AI/stablediffusion/tree/main/configs/stable-diffusion)……之中。
129
+
130
+ # DreamBooth的其他主要选项
131
+
132
+ 有关所有选项的详细信息,请参阅另一份文档。
133
+
134
+ ## 不在中途开始对文本编码器进行训练 --stop_text_encoder_training
135
+
136
+ 如果在stop_text_encoder_training选项中指定一个数字,则在该步骤之后,将不再对文本编码器进行训练,只会对U-Net进行训练。在某些情况下,可能会期望提高精度。
137
+
138
+ (我们推测可能会有时候仅仅文本编码器会过度学习,而这样做可以避免这种情况,但详细影响尚不清楚。)
139
+
140
+ ## 不进行分词器的填充 --no_token_padding
141
+
142
+ 如果指定no_token_padding选项,则不会对分词器的输出进行填充(与Diffusers版本的旧DreamBooth相同)。
143
+
144
+ <!--
145
+ 如果使用分桶(bucketing)和数据增强(augmentation),则使用示例如下:
146
+ ```
147
+ accelerate launch --num_cpu_threads_per_process 8 train_db.py
148
+ --pretrained_model_name_or_path=<.ckpt或.safetensord或Diffusers版模型的目录>
149
+ --train_data_dir=<训练数据的目录>
150
+ --reg_data_dir=<正则化图像的目录>
151
+ --output_dir=<训练后模型的输出目录>
152
+ --resolution=768,512
153
+ --train_batch_size=20 --learning_rate=5e-6 --max_train_steps=800
154
+ --use_8bit_adam --xformers --mixed_precision="bf16"
155
+ --save_every_n_epochs=1 --save_state --save_precision="bf16"
156
+ --logging_dir=logs
157
+ --enable_bucket --min_bucket_reso=384 --max_bucket_reso=1280
158
+ --color_aug --flip_aug --gradient_checkpointing --seed 42
159
+ ```
160
+
161
+
162
+ -->
docs/train_network_README-ja.md ADDED
@@ -0,0 +1,481 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # LoRAの学習について
2
+
3
+ [LoRA: Low-Rank Adaptation of Large Language Models](https://arxiv.org/abs/2106.09685)(arxiv)、[LoRA](https://github.com/microsoft/LoRA)(github)をStable Diffusionに適用したものです。
4
+
5
+ [cloneofsimo氏のリポジトリ](https://github.com/cloneofsimo/lora)を大いに参考にさせていただきました。ありがとうございます。
6
+
7
+ 通常のLoRAは Linear およぴカーネルサイズ 1x1 の Conv2d にのみ適用されますが、カーネルサイズ 3x3 のConv2dに適用を拡大することもできます。
8
+
9
+ Conv2d 3x3への拡大は [cloneofsimo氏](https://github.com/cloneofsimo/lora) が最初にリリースし、KohakuBlueleaf氏が [LoCon](https://github.com/KohakuBlueleaf/LoCon) でその有効性を明らかにしたものです。KohakuBlueleaf氏に深く感謝します。
10
+
11
+ 8GB VRAMでもぎりぎり動作するようです。
12
+
13
+ [学習についての共通ドキュメント](./train_README-ja.md) もあわせてご覧ください。
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
+
31
+ ## 学習したモデルに関する注意
32
+
33
+ LoRA-LierLa は、AUTOMATIC1111氏のWeb UIのLoRA機能で使用することができます。
34
+
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)とは、現時点では互換性がありません。いくつかの機能拡張を行っているためです(後述)。
40
+
41
+ # 学習の手順
42
+
43
+ あらかじめこのリポジトリのREADMEを参照し、環境整備を行ってください。
44
+
45
+ ## データの準備
46
+
47
+ [学習データの準備について](./train_README-ja.md) を参照してください。
48
+
49
+
50
+ ## 学習の実行
51
+
52
+ `train_network.py`を用います。
53
+
54
+ `train_network.py`では `--network_module` オプションに、学習対象のモジュール名を指定します。LoRAに対応するのは`network.lora`となりますので、それを指定してください。
55
+
56
+ なお学習率は通常のDreamBoothやfine tuningよりも高めの、`1e-4`~`1e-3`程度を指定するとよいようです。
57
+
58
+ 以下はコマンドラインの例です。
59
+
60
+ ```
61
+ accelerate launch --num_cpu_threads_per_process 1 train_network.py
62
+ --pretrained_model_name_or_path=<.ckptまたは.safetensordまたはDiffusers版モデルのディレクトリ>
63
+ --dataset_config=<データ準備で作成した.tomlファイル>
64
+ --output_dir=<学習したモデルの出力先フォルダ>
65
+ --output_name=<学習したモデル出力時のファイル名>
66
+ --save_model_as=safetensors
67
+ --prior_loss_weight=1.0
68
+ --max_train_steps=400
69
+ --learning_rate=1e-4
70
+ --optimizer_type="AdamW8bit"
71
+ --xformers
72
+ --mixed_precision="fp16"
73
+ --cache_latents
74
+ --gradient_checkpointing
75
+ --save_every_n_epochs=1
76
+ --network_module=networks.lora
77
+ ```
78
+
79
+ このコマンドラインでは LoRA-LierLa が学習されます。
80
+
81
+ `--output_dir` オプションで指定したフォルダに、LoRAのモデルが保存されます。他のオプション、オプティマイザ等については [学習の共通ドキュメント](./train_README-ja.md) の「よく使われるオプション」も参照してください。
82
+
83
+ その他、以下のオプションが指定できます。
84
+
85
+ * `--network_dim`
86
+ * LoRAのRANKを指定します(``--networkdim=4``など)。省略時は4になります。数が多いほど表現力は増しますが、学習に必要なメモリ、時間は増えます。また闇雲に増やしても良くないようです。
87
+ * `--network_alpha`
88
+ * アンダーフローを防ぎ安定して学習するための ``alpha`` 値を指定します。デフォルトは1です。``network_dim``と同じ値を指定すると以前のバージョンと同じ動作になります。
89
+ * `--persistent_data_loader_workers`
90
+ * Windows環境で指定するとエポック間��待ち時間が大幅に短縮されます。
91
+ * `--max_data_loader_n_workers`
92
+ * データ読み込みのプロセス数を指定します。プロセス数が多いとデータ読み込みが速くなりGPUを効率的に利用できますが、メインメモリを消費します。デフォルトは「`8` または `CPU同時実行スレッド数-1` の小さいほう」なので、メインメモリに余裕がない場合や、GPU使用率が90%程度以上なら、それらの数値を見ながら `2` または `1` 程度まで下げてください。
93
+ * `--network_weights`
94
+ * 学習前に学習済みのLoRAの重みを読み込み、そこから追加で学習します。
95
+ * `--network_train_unet_only`
96
+ * U-Netに関連するLoRAモジュールのみ有効とします。fine tuning的な学習で指定するとよいかもしれません。
97
+ * `--network_train_text_encoder_only`
98
+ * Text Encoderに関連するLoRAモジュールのみ有効とします。Textual Inversion的な効果が期待できるかもしれません。
99
+ * `--unet_lr`
100
+ * U-Netに関連するLoRAモジュールに、通常の学習率(--learning_rateオプションで指定)とは異なる学習率を使う時に指定します。
101
+ * `--text_encoder_lr`
102
+ * Text Encoderに関連するLoRAモジュールに、通常の学習率(--learning_rateオプションで指定)とは異なる学習率を使う時に指定します。Text Encoderのほうを若干低めの学習率(5e-5など)にしたほうが良い、という話もあるようです。
103
+ * `--network_args`
104
+ * 複数の引数を指定できます。後述します。
105
+
106
+ `--network_train_unet_only` と `--network_train_text_encoder_only` の両方とも未指定時(デフォルト)はText EncoderとU-Netの両方のLoRAモジュールを有効にします。
107
+
108
+ # その他の学習方法
109
+
110
+ ## LoRA-C3Lier を学習する
111
+
112
+ `--network_args` に以下のように指定してください。`conv_dim` で Conv2d (3x3) の rank を、`conv_alpha` で alpha を指定してください。
113
+
114
+ ```
115
+ --network_args "conv_dim=4" "conv_alpha=1"
116
+ ```
117
+
118
+ 以下のように alpha 省略時は1になります。
119
+
120
+ ```
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"
152
+ ```
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
+
245
+ ## マージスクリプトについて
246
+
247
+ merge_lora.pyでStable DiffusionのモデルにLoRAの学習結果をマージしたり、複数のLoRAモデルをマージしたりできます。
248
+
249
+ ### Stable DiffusionのモデルにLoRAのモデルをマージする
250
+
251
+ マージ後のモデルは通常のStable Diffusionのckptと同様に扱えます。たとえば以下のようなコマンドラインになります。
252
+
253
+ ```
254
+ python networks\merge_lora.py --sd_model ..\model\model.ckpt
255
+ --save_to ..\lora_train1\model-char1-merged.safetensors
256
+ --models ..\lora_train1\last.safetensors --ratios 0.8
257
+ ```
258
+
259
+ Stable Diffusion v2.xのモデルで学習し、それにマージする場合は、--v2オプションを指定してください。
260
+
261
+ --sd_modelオプションにマージの元となるStable Diffusionのモデルファイルを指定します(.ckptまたは.safetensorsのみ対応で、Diffusersは今のところ対応していません)。
262
+
263
+ --save_toオプションにマージ後のモデルの保存先を指定します(.ckptまたは.safetensors、拡張子で自動判定)。
264
+
265
+ --modelsに学習したLoRAのモデルファイルを指定します。複数指定も可能で、その時は順にマージします。
266
+
267
+ --ratiosにそれぞれのモデルの適用率(どのくらい重みを元モデルに反映するか)を0~1.0の数値で指定します。例えば過学習に近いような場合は、適用率を下げるとマシになるかもしれません。モデルの数と同じだけ指定してください。
268
+
269
+ 複数指定時は以下のようになります。
270
+
271
+ ```
272
+ python networks\merge_lora.py --sd_model ..\model\model.ckpt
273
+ --save_to ..\lora_train1\model-char1-merged.safetensors
274
+ --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors --ratios 0.8 0.5
275
+ ```
276
+
277
+ ### 複数のLoRAのモデルをマージする
278
+
279
+ __複数のLoRAをマージする場合は原則として `svd_merge_lora.py` を使用してください。__ 単純なup同士やdown同士のマージでは、計算結果が正しくなくなるためです。
280
+
281
+ `merge_lora.py` によるマージは差分抽出法でLoRAを生成する場合等、ごく限られた場合でのみ有効です。
282
+
283
+ たとえば以下のようなコマンドラインになります。
284
+
285
+ ```
286
+ python networks\merge_lora.py
287
+ --save_to ..\lora_train1\model-char1-style1-merged.safetensors
288
+ --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors --ratios 0.6 0.4
289
+ ```
290
+
291
+ --sd_modelオプションは指定不要です。
292
+
293
+ --save_toオプションにマージ後のLoRAモデルの保存先を指定します(.ckptまたは.safetensors、拡張子で自動判定)。
294
+
295
+ --modelsに学習したLoRAのモデルファイルを指定します。三つ以上も指定可能です。
296
+
297
+ --ratiosにそれぞれのモデルの比率(どのくらい重みを元モデルに反映するか)を0~1.0の数値で指定します。二つのモデルを一対一でマージす場合は、「0.5 0.5」になります。「1.0 1.0」では合計の重みが大きくなりすぎて、恐らく結果はあまり望ましくないものになると思われます。
298
+
299
+ v1で学習したLoRAとv2で学習したLoRA、rank(次元数)の異なるLoRAはマージできません。U-NetだけのLoRAとU-Net+Text EncoderのLoRAはマージできるはずですが、結果は未知数です。
300
+
301
+
302
+ ### その他のオプション
303
+
304
+ * precision
305
+ * マージ計算時の精度をfloat、fp16、bf16から指定できます。省略時は精度を確保するためfloatになります。メモリ使用量を減らしたい場合はfp16/bf16を指定してください。
306
+ * save_precision
307
+ * モデル保存時の精度をfloat、fp16、bf16から指定できます。省略時はprecisionと同じ精度になります。
308
+
309
+
310
+ ## 複数のrankが異なるLoRAのモデルをマージする
311
+
312
+ 複数のLoRAをひとつのLoRAで近似します(完全な再現はできません)。`svd_merge_lora.py`を用います。たとえば以下のようなコマンドラインになります。
313
+
314
+ ```
315
+ python networks\svd_merge_lora.py
316
+ --save_to ..\lora_train1\model-char1-style1-merged.safetensors
317
+ --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors
318
+ --ratios 0.6 0.4 --new_rank 32 --device cuda
319
+ ```
320
+
321
+ `merge_lora.py` と主なオプションは同一です。以下のオプションが追加されています。
322
+
323
+ - `--new_rank`
324
+ - 作成するLoRAのrankを指定します。
325
+ - `--new_conv_rank`
326
+ - 作成する Conv2d 3x3 LoRA の rank を指定します。省略時は `new_rank` と同じになります。
327
+ - `--device`
328
+ - `--device cuda`としてcudaを指定すると計算をGPU上で行います。処理が速くなります。
329
+
330
+ ## 当リポジトリ内の画像生成スクリプトで生成する
331
+
332
+ gen_img_diffusers.pyに、--network_module、--network_weightsの各オプションを追加してくだ��い。意味は学習時と同様です。
333
+
334
+ --network_mulオプションで0~1.0の数値を指定すると、LoRAの適用率を変えられます。
335
+
336
+ ## Diffusersのpipelineで生成する
337
+
338
+ 以下の例を参考にしてください。必要なファイルはnetworks/lora.pyのみです。Diffusersのバージョンは0.10.2以外では動作しない可能性があります。
339
+
340
+ ```python
341
+ import torch
342
+ from diffusers import StableDiffusionPipeline
343
+ from networks.lora import LoRAModule, create_network_from_weights
344
+ from safetensors.torch import load_file
345
+
346
+ # if the ckpt is CompVis based, convert it to Diffusers beforehand with tools/convert_diffusers20_original_sd.py. See --help for more details.
347
+
348
+ model_id_or_dir = r"model_id_on_hugging_face_or_dir"
349
+ device = "cuda"
350
+
351
+ # create pipe
352
+ print(f"creating pipe from {model_id_or_dir}...")
353
+ pipe = StableDiffusionPipeline.from_pretrained(model_id_or_dir, revision="fp16", torch_dtype=torch.float16)
354
+ pipe = pipe.to(device)
355
+ vae = pipe.vae
356
+ text_encoder = pipe.text_encoder
357
+ unet = pipe.unet
358
+
359
+ # load lora networks
360
+ print(f"loading lora networks...")
361
+
362
+ lora_path1 = r"lora1.safetensors"
363
+ sd = load_file(lora_path1) # If the file is .ckpt, use torch.load instead.
364
+ network1, sd = create_network_from_weights(0.5, None, vae, text_encoder,unet, sd)
365
+ network1.apply_to(text_encoder, unet)
366
+ network1.load_state_dict(sd)
367
+ network1.to(device, dtype=torch.float16)
368
+
369
+ # # You can merge weights instead of apply_to+load_state_dict. network.set_multiplier does not work
370
+ # network.merge_to(text_encoder, unet, sd)
371
+
372
+ lora_path2 = r"lora2.safetensors"
373
+ sd = load_file(lora_path2)
374
+ network2, sd = create_network_from_weights(0.7, None, vae, text_encoder,unet, sd)
375
+ network2.apply_to(text_encoder, unet)
376
+ network2.load_state_dict(sd)
377
+ network2.to(device, dtype=torch.float16)
378
+
379
+ lora_path3 = r"lora3.safetensors"
380
+ sd = load_file(lora_path3)
381
+ network3, sd = create_network_from_weights(0.5, None, vae, text_encoder,unet, sd)
382
+ network3.apply_to(text_encoder, unet)
383
+ network3.load_state_dict(sd)
384
+ network3.to(device, dtype=torch.float16)
385
+
386
+ # prompts
387
+ prompt = "masterpiece, best quality, 1girl, in white shirt, looking at viewer"
388
+ negative_prompt = "bad quality, worst quality, bad anatomy, bad hands"
389
+
390
+ # exec pipe
391
+ print("generating image...")
392
+ with torch.autocast("cuda"):
393
+ image = pipe(prompt, guidance_scale=7.5, negative_prompt=negative_prompt).images[0]
394
+
395
+ # if not merged, you can use set_multiplier
396
+ # network1.set_multiplier(0.8)
397
+ # and generate image again...
398
+
399
+ # save image
400
+ image.save(r"by_diffusers..png")
401
+ ```
402
+
403
+ ## 二つのモデルの差分からLoRAモデルを作成する
404
+
405
+ [こちらのディスカッション](https://github.com/cloneofsimo/lora/discussions/56)を参考に実装したものです。数式はそのまま使わせていただきました(よく理解していませんが近似には特異値分解を用いるようです)。
406
+
407
+ 二つのモデル(たとえばfine tuningの元モデルとfine tuning後のモデル)の差分を、LoRAで近似します。
408
+
409
+ ### スクリプトの実行方法
410
+
411
+ 以下のように指定してください。
412
+ ```
413
+ python networks\extract_lora_from_models.py --model_org base-model.ckpt
414
+ --model_tuned fine-tuned-model.ckpt
415
+ --save_to lora-weights.safetensors --dim 4
416
+ ```
417
+
418
+ --model_orgオプションに元のStable Diffusionモデルを指定します。作成したLoRAモデルを適用する場合は、このモデルを指定して適用することになります。.ckptまたは.safetensorsが指定できます。
419
+
420
+ --model_tunedオプションに差分を抽出する対象のStable Diffusionモデルを指定します。たとえばfine tuningやDreamBooth後のモデルを指定します。.ckptまたは.safetensorsが指定できます。
421
+
422
+ --save_toにLoRAモデルの保存先を指定します。--dimにLoRAの次元数を指定します。
423
+
424
+ 生成されたLoRAモデルは、学習したLoRAモデルと同様に使用できます。
425
+
426
+ Text Encoderが二つのモデルで同じ場合にはLoRAはU-NetのみのLoRAとなります。
427
+
428
+ ### その他のオプション
429
+
430
+ - `--v2`
431
+ - v2.xのStable Diffusionモデルを使う場合に指定してください。
432
+ - `--device`
433
+ - ``--device cuda``としてcudaを指定すると計算をGPU上で行います。処理が速くなります(CPUでもそこまで遅くないため、せいぜい倍~数倍程度のようです)。
434
+ - `--save_precision`
435
+ - LoRAの保存形式を"float", "fp16", "bf16"から指定します。省略時はfloatになります。
436
+ - `--conv_dim`
437
+ - 指定するとLoRAの適用範囲を Conv2d 3x3 へ拡大します。Conv2d 3x3 の rank を指定します。
438
+
439
+ ## 画像リサイズスクリプト
440
+
441
+ (のちほどドキュメントを整理しますがとりあえずここに説明を書いておきます。)
442
+
443
+ Aspect Ratio Bucketingの機能拡張で、小さな画像については拡大しないでそのまま教師データとすることが可能になりました。元の教師画像を縮小した画像を、教師デ���タに加えると精度が向上したという報告とともに前処理用のスクリプトをいただきましたので整備して追加しました。bmaltais氏に感謝します。
444
+
445
+ ### スクリプトの実行方法
446
+
447
+ 以下のように指定してください。元の画像そのまま、およびリサイズ後の画像が変換先フォルダに保存されます。リサイズ後の画像には、ファイル名に ``+512x512`` のようにリサイズ先の解像度が付け加えられます(画像サイズとは異なります)。リサイズ先の解像度より小さい画像は拡大されることはありません。
448
+
449
+ ```
450
+ python tools\resize_images_to_resolution.py --max_resolution 512x512,384x384,256x256 --save_as_png
451
+ --copy_associated_files 元画像フォルダ 変換先フォルダ
452
+ ```
453
+
454
+ 元画像フォルダ内の画像ファイルが、指定した解像度(複数指定可)と同じ面積になるようにリサイズされ、変換先フォルダに保存されます。画像以外のファイルはそのままコピーされます。
455
+
456
+ ``--max_resolution`` オプションにリサイズ先のサイズを例のように指定してください。面積がそのサイズになるようにリサイズします。複数指定すると、それぞれの解像度でリサイズされます。``512x512,384x384,256x256``なら、変換先フォルダの画像は、元サイズとリサイズ後サイズ×3の計4枚になります。
457
+
458
+ ``--save_as_png`` オプションを指定するとpng形式で保存します。省略するとjpeg形式(quality=100)で保存されます。
459
+
460
+ ``--copy_associated_files`` オプションを指定すると、拡張子を除き画像と同じファイル名(たとえばキャプションなど)のファイルが、リサイズ後の画像のファイル名と同じ名前でコピーされます。
461
+
462
+
463
+ ### その他のオプション
464
+
465
+ - divisible_by
466
+ - リサイズ後の画像のサイズ(縦、横のそれぞれ)がこの値で割り切れるように、画像中心を切り出します。
467
+ - interpolation
468
+ - 縮小時の補完方法を指定します。``area, cubic, lanczos4``から選択可能で、デフォルトは``area``です。
469
+
470
+
471
+ # 追加情報
472
+
473
+ ## cloneofsimo氏のリポジトリとの違い
474
+
475
+ 2022/12/25時点では、当リポジトリはLoRAの適用個所をText EncoderのMLP、U-NetのFFN、Transformerのin/out projectionに拡大し、表現力が増しています。ただその代わりメモリ使用量は増え、8GBぎりぎりになりました。
476
+
477
+ またモジュール入れ替え機構は全く異なります。
478
+
479
+ ## 将来拡張について
480
+
481
+ LoRAだけでなく他の拡張にも対応可能ですので、それらも追加予定です。
docs/train_network_README-zh.md ADDED
@@ -0,0 +1,466 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 关于LoRA的学习。
2
+
3
+ [LoRA: Low-Rank Adaptation of Large Language Models](https://arxiv.org/abs/2106.09685)(arxiv)、[LoRA](https://github.com/microsoft/LoRA)(github)这是应用于Stable Diffusion“稳定扩散”的内容。
4
+
5
+ [cloneofsimo先生的代码仓库](https://github.com/cloneofsimo/lora) 我们非常感謝您提供的参考。非常感謝。
6
+
7
+ 通常情況下,LoRA只适用于Linear和Kernel大小为1x1的Conv2d,但也可以將其擴展到Kernel大小为3x3的Conv2d。
8
+
9
+ Conv2d 3x3的扩展最初是由 [cloneofsimo先生的代码仓库](https://github.com/cloneofsimo/lora)
10
+ 而KohakuBlueleaf先生在[LoCon](https://github.com/KohakuBlueleaf/LoCon)中揭示了其有效性。我们深深地感谢KohakuBlueleaf先生。
11
+
12
+ 看起来即使在8GB VRAM上也可以勉强运行。
13
+
14
+ 请同时查看关于[学习的通用文档](./train_README-zh.md)。
15
+ # 可学习的LoRA 类型
16
+
17
+ 支持以下两种类型。以下是本仓库中自定义的名称。
18
+
19
+ 1. __LoRA-LierLa__:(用于 __Li__ n __e__ a __r__ __La__ yers 的 LoRA,读作 "Liela")
20
+
21
+ 适用于 Linear 和卷积层 Conv2d 的 1x1 Kernel 的 LoRA
22
+
23
+ 2. __LoRA-C3Lier__:(用于具有 3x3 Kernel 的卷积层和 __Li__ n __e__ a __r__ 层的 LoRA,读作 "Seria")
24
+
25
+ 除了第一种类型外,还适用于 3x3 Kernel 的 Conv2d 的 LoRA
26
+
27
+ 与 LoRA-LierLa 相比,LoRA-C3Lier 可能会获得更高的准确性,因为它适用于更多的层。
28
+
29
+ 在训练时,也可以使用 __DyLoRA__(将在后面介绍)。
30
+
31
+ ## 请注意与所学模型相关的事项。
32
+
33
+ LoRA-LierLa可以用于AUTOMATIC1111先生的Web UI LoRA功能。
34
+
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先生的[Stable-Diffusion-WebUI的Dreambooth扩展](https://github.com/d8ahazard/sd_dreambooth_extension)不兼容,因为它们进行了一些功能扩展(如下文所述)。
40
+
41
+ # 学习步骤
42
+
43
+ 请先参考此存储库的README文件并进行环境设置。
44
+
45
+ ## 准备数据
46
+
47
+ 请参考 [关于准备学习数据](./train_README-zh.md)。
48
+
49
+ ## 网络训练
50
+
51
+ 使用`train_network.py`。
52
+
53
+ 在`train_network.py`中,使用`--network_module`选项指定要训练的模块名称。对于LoRA模块,它应该是`network.lora`,请指定它。
54
+
55
+ 请注意,学习率应该比通常的DreamBooth或fine tuning要高,建议指定为`1e-4`至`1e-3`左右。
56
+
57
+ 以下是命令行示例。
58
+
59
+ ```
60
+ accelerate launch --num_cpu_threads_per_process 1 train_network.py
61
+ --pretrained_model_name_or_path=<.ckpt或.safetensord或Diffusers版模型目录>
62
+ --dataset_config=<数据集配置的.toml文件>
63
+ --output_dir=<训练过程中的模型输出文件夹>
64
+ --output_name=<训练模型输出时的文件名>
65
+ --save_model_as=safetensors
66
+ --prior_loss_weight=1.0
67
+ --max_train_steps=400
68
+ --learning_rate=1e-4
69
+ --optimizer_type="AdamW8bit"
70
+ --xformers
71
+ --mixed_precision="fp16"
72
+ --cache_latents
73
+ --gradient_checkpointing
74
+ --save_every_n_epochs=1
75
+ --network_module=networks.lora
76
+ ```
77
+
78
+ 在这个命令行中,LoRA-LierLa将会被训练。
79
+
80
+ LoRA的模型将会被保存在通过`--output_dir`选项指定的文件夹中。关于其他选项和优化器等,请参阅[学习的通用文档](./train_README-zh.md)中的“常用选项”。
81
+
82
+ 此外,还可以指定以下选项:
83
+
84
+ * `--network_dim`
85
+ * 指定LoRA的RANK(例如:`--network_dim=4`)。默认值为4。数值越大表示表现力越强,但需要更多的内存和时间来训练。而且不要盲目增加此数值。
86
+ * `--network_alpha`
87
+ * 指定用于防止下溢并稳定训练的alpha值。默认值为1。如果与`network_dim`指定相同的值,则将获得与以前版本相同的行为。
88
+ * `--persistent_data_loader_workers`
89
+ * 在Windows环境中指定可大幅缩短epoch之间的等待时间。
90
+ * `--max_data_loader_n_workers`
91
+ * 指定数据读取进程的数量。进程数越多,数据读取速度越快,可以更有效地利用GPU,但会占用主存。默认值为“`8`或`CPU同步执行线程数-1`的最小值”,因此如果主存不足或GPU使用率超过90%,则应将这些数字降低到约`2`或`1`。
92
+ * `--network_weights`
93
+ * 在训练之前读取预训练的LoRA权重,并在此基础上进行进一步的训练。
94
+ * `--network_train_unet_only`
95
+ * 仅启用与U-Net相关的LoRA模块。在类似fine tuning的学习中指定此选项可能会很有用。
96
+ * `--network_train_text_encoder_only`
97
+ * 仅启用与Text Encoder相关的LoRA模块。可能会期望Textual Inversion效果。
98
+ * `--unet_lr`
99
+ * 当在U-Net相关的LoRA模块中使用与常规学习率(由`--learning_rate`选项指定)不同的学习率时,应指定此选项。
100
+ * `--text_encoder_lr`
101
+ * 当在Text Encoder相关的LoRA模块中使用与常规学习率(由`--learning_rate`选项指定)不同的学习率时,应指定此选项。可能最好将Text Encoder的学习率稍微降低(例如5e-5)。
102
+ * `--network_args`
103
+ * 可以指定多个参数。将在下面详细说明。
104
+
105
+ 当未指定`--network_train_unet_only`和`--network_train_text_encoder_only`时(默认情况),将启用Text Encoder和U-Net的两个LoRA模块。
106
+
107
+ # 其他的学习方法
108
+
109
+ ## 学习 LoRA-C3Lier
110
+
111
+ 请使用以下方式
112
+
113
+ ```
114
+ --network_args "conv_dim=4"
115
+ ```
116
+
117
+ DyLoRA是在这篇论文中提出的[DyLoRA: Parameter Efficient Tuning of Pre-trained Models using Dynamic Search-Free Low-Rank Adaptation](​https://arxiv.org/abs/2210.07558),
118
+ [其官方实现可在这里找到](​https://github.com/huawei-noah/KD-NLP/tree/main/DyLoRA)。
119
+
120
+ 根据论文,LoRA的rank并不是越高越好,而是需要根据模型、数据集、任务等因素来寻找合适的rank。使用DyLoRA,可以同时在指定的维度(rank)下学习多种rank的LoRA,从而省去了寻找最佳rank的麻烦。
121
+
122
+ 本存储库的实现基于官方实现进行了自定义扩展(因此可能存在缺陷)。
123
+
124
+ ### 本存储库DyLoRA的特点
125
+
126
+ DyLoRA训练后的模型文件与LoRA兼容。此外,可以从模型文件中提取多个低于指定维度(rank)的LoRA。
127
+
128
+ DyLoRA-LierLa和DyLoRA-C3Lier均可训练。
129
+
130
+ ### 使用DyLoRA进行训练
131
+
132
+ 请指定与DyLoRA相对应的`network.dylora`,例如 `--network_module=networks.dylora`。
133
+
134
+ 此外,通过 `--network_args` 指定例如`--network_args "unit=4"`的参数。`unit`是划分rank的单位。例如,可以指定为`--network_dim=16 --network_args "unit=4"`。请将`unit`视为可以被`network_dim`整除的值(`network_dim`是`unit`的倍数)。
135
+
136
+ 如果未指定`unit`,则默认为`unit=1`。
137
+
138
+ 以下是示例说明。
139
+
140
+ ```
141
+ --network_module=networks.dylora --network_dim=16 --network_args "unit=4"
142
+
143
+ --network_module=networks.dylora --network_dim=32 --network_alpha=16 --network_args "unit=4"
144
+ ```
145
+
146
+ 对于DyLoRA-C3Lier,需要在 `--network_args` 中指定 `conv_dim`,例如 `conv_dim=4`。与普通的LoRA不同,`conv_dim`必须与`network_dim`具有相同的值。以下是一个示例描述:
147
+
148
+ ```
149
+ --network_module=networks.dylora --network_dim=16 --network_args "conv_dim=16" "unit=4"
150
+
151
+ --network_module=networks.dylora --network_dim=32 --network_alpha=16 --network_args "conv_dim=32" "conv_alpha=16" "unit=8"
152
+ ```
153
+
154
+ 例如,当使用dim=16、unit=4(如下所述)进行学习时,可以学习和提取4个rank的LoRA,即4、8、12和16。通过在每个提取的模型中生成图像并进行比较,可以选择最佳rank的LoRA。
155
+
156
+ 其他选项与普通的LoRA相同。
157
+
158
+ *`unit`是本存储库的独有扩展,在DyLoRA中,由于预计相比同维度(rank)的普通LoRA,学习时间更长,因此将分割单位增加。
159
+
160
+ ### 从DyLoRA模型中提取LoRA模型
161
+
162
+ 请使用`networks`文件夹中的`extract_lora_from_dylora.py`。指定`unit`单位后,从DyLoRA模型中提取LoRA模型。
163
+
164
+ 例如,命令行如下:
165
+
166
+ ```powershell
167
+ python networks\extract_lora_from_dylora.py --model "foldername/dylora-model.safetensors" --save_to "foldername/dylora-model-split.safetensors" --unit 4
168
+ ```
169
+
170
+ `--model` 参数用于指定DyLoRA模型文件。`--save_to` 参数用于指定要保存提取的模型的文件名(rank值将附加到文件名中)。`--unit` 参数用于指定DyLoRA训练时的`unit`。
171
+
172
+ ## 分层学习率
173
+
174
+ 请参阅PR#355了解详细信息。
175
+
176
+ 您可以指定完整模型的25个块的权重。虽然第一个块没有对应的LoRA,但为了与分层LoRA应用等的兼容性,将其设为25个。此外,如果不扩展到conv2d3x3,则某些块中可能不存在LoRA,但为了统一描述,请始终指定25个值。
177
+
178
+ 请在 `--network_args` 中指定以下参数。
179
+
180
+ - `down_lr_weight`:指定U-Net down blocks的学习率权重。可以指定以下内容:
181
+ - 每个块的权重:指定12个数字,例如`"down_lr_weight=0,0,0,0,0,0,1,1,1,1,1,1"`
182
+ - 从预设中指定:例如`"down_lr_weight=sine"`(使用正弦曲线指定权重)。可以指定sine、cosine、linear、reverse_linear、zeros。另外,添加 `+数字` 时,可以将指定的数字加上(变为0.25〜1.25)。
183
+ - `mid_lr_weight`:指定U-Net mid block的学习率权重。只需指定一个数字,例如 `"mid_lr_weight=0.5"`。
184
+ - `up_lr_weight`:指定U-Net up blocks的学习率权重。与down_lr_weight相同。
185
+ - 省略指定的部分将被视为1.0。另外,如果将权重设为0,则不会创建该块的LoRA模块。
186
+ - `block_lr_zero_threshold`:如果权重小于此值,则不会创建LoRA模块。默认值为0。
187
+
188
+ ### 分层学习率命令行指定示例:
189
+
190
+
191
+ ```powershell
192
+ --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"
193
+
194
+ --network_args "block_lr_zero_threshold=0.1" "down_lr_weight=sine+.5" "mid_lr_weight=1.5" "up_lr_weight=cosine+.5"
195
+ ```
196
+
197
+ ### Hierarchical Learning Rate指定的toml文件示例:
198
+
199
+ ```toml
200
+ 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",]
201
+
202
+ network_args = [ "block_lr_zero_threshold=0.1", "down_lr_weight=sine+.5", "mid_lr_weight=1.5", "up_lr_weight=cosine+.5", ]
203
+ ```
204
+
205
+ ## 层次结构维度(rank)
206
+
207
+ 您可以指定完整模型的25个块的维度(rank)。与分层学习率一样,某些块可能不存在LoRA,但请始终指定25个值。
208
+
209
+ 请在 `--network_args` 中指定以下参数:
210
+
211
+ - `block_dims`:指定每个块的维度(rank)。指定25个数字,例如 `"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"`。
212
+ - `block_alphas`:指定每个块的alpha。与block_dims一样,指定25个数字。如果省略,将使用network_alpha的值。
213
+ - `conv_block_dims`:将LoRA扩展到Conv2d 3x3,并指定每个块的维度(rank)。
214
+ - `conv_block_alphas`:在将LoRA扩展到Conv2d 3x3时指定每个块的alpha。如果省略,将使用conv_alpha的值。
215
+
216
+ ### 层次结构维度(rank)命令行指定示例:
217
+
218
+
219
+ ```powershell
220
+ --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"
221
+
222
+ --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"
223
+
224
+ --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"
225
+ ```
226
+
227
+ ### 层级别dim(rank) toml文件指定示例:
228
+
229
+ ```toml
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",]
231
+
232
+ 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",]
233
+ ```
234
+
235
+ # Other scripts
236
+ 这些是与LoRA相关的脚本,如合并脚本等。
237
+
238
+ 关于合并脚本
239
+ 您可以使用merge_lora.py脚本将LoRA的训练结果合并到稳定扩散模型中,也可以将多个LoRA模型合并。
240
+
241
+ 合并到稳定扩散模型中的LoRA模型
242
+ 合并后的模型可以像常规的稳定扩散ckpt一样使用。例如,以下是一个命令行示例:
243
+
244
+ ```
245
+ python networks\merge_lora.py --sd_model ..\model\model.ckpt
246
+ --save_to ..\lora_train1\model-char1-merged.safetensors
247
+ --models ..\lora_train1\last.safetensors --ratios 0.8
248
+ ```
249
+
250
+ 请使用 Stable Diffusion v2.x 模型进行训练并进行合并时,需要指定--v2选项。
251
+
252
+ 使用--sd_model选项指定要合并的 Stable Diffusion 模型文件(仅支持 .ckpt 或 .safetensors 格式,目前不支持 Diffusers)。
253
+
254
+ 使用--save_to选项指定合并后模型的保存路径(根据扩展名自动判断为 .ckpt 或 .safetensors)。
255
+
256
+ 使用--models选项指定已训练的 LoRA 模型文件,也可以指定多个,然后按顺序进行合并。
257
+
258
+ 使用--ratios选项以0~1.0的数字指定每个模型的应用率(将多大比例的权重反映到原始模型中)。例如,在接近过度拟合的情况下,降低应用率可能会使结果更好。请指定与模型数量相同的比率。
259
+
260
+ 当指定多个模型时,格式如下:
261
+
262
+
263
+ ```
264
+ python networks\merge_lora.py --sd_model ..\model\model.ckpt
265
+ --save_to ..\lora_train1\model-char1-merged.safetensors
266
+ --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors --ratios 0.8 0.5
267
+ ```
268
+
269
+ ### 将多个LoRA模型合并
270
+
271
+ 将多个LoRA模型逐个应用于SD模型与将多个LoRA模型合并后再应用于SD模型之间,由于计算顺序的不同,会得到微妙不同的结果。
272
+
273
+ 例如,下面是一个命令行示例:
274
+
275
+ ```
276
+ python networks\merge_lora.py
277
+ --save_to ..\lora_train1\model-char1-style1-merged.safetensors
278
+ --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors --ratios 0.6 0.4
279
+ ```
280
+
281
+ --sd_model选项不需要指定。
282
+
283
+ 通过--save_to选项指定合并后的LoRA模型的保存位置(.ckpt或.safetensors,根据扩展名自动识别)。
284
+
285
+ 通过--models选项指定学习的LoRA模型文件。可以指定三个或更多。
286
+
287
+ 通过--ratios选项以0~1.0的数字指定每个模型的比率(反映多少权重来自原始模型)。如果将两个模型一对一合并,则比率将是“0.5 0.5”。如果比率为“1.0 1.0”,则总重量将过大,可能会产生不理想的结果。
288
+
289
+ 在v1和v2中学习的LoRA,以及rank(维数)或“alpha”不同的LoRA不能合并。仅包含U-Net的LoRA和包含U-Net+文本编码器的LoRA可以合并,但结果未知。
290
+
291
+ ### 其他选项
292
+
293
+ * 精度
294
+ * 可以从float、fp16或bf16中选择合并计算时的精度。默认为float以保证精度。如果想减少内存使用量,请指定fp16/bf16。
295
+ * save_precision
296
+ * 可以从float、fp16或bf16中选择在保存模型时的精度。默认与精度相同。
297
+
298
+ ## 合并多个维度不同的LoRA模型
299
+
300
+ 将多个LoRA近似为一个LoRA(无法完全复制)。使用'svd_merge_lora.py'。例如,以下是命令行的示例。
301
+ ```
302
+ python networks\svd_merge_lora.py
303
+ --save_to ..\lora_train1\model-char1-style1-merged.safetensors
304
+ --models ..\lora_train1\last.safetensors ..\lora_train2\last.safetensors
305
+ --ratios 0.6 0.4 --new_rank 32 --device cuda
306
+ ```
307
+ `merge_lora.py`和主要选项相同。以下选项已添加:
308
+
309
+ - `--new_rank`
310
+ - 指定要创建的LoRA rank。
311
+ - `--new_conv_rank`
312
+ - 指定要创建的Conv2d 3x3 LoRA的rank。如果省略,则与`new_rank`相同。
313
+ - `--device`
314
+ - 如果指定为`--device cuda`,则在GPU上执行计算。处理速度将更快。
315
+
316
+ ## 在此存储库中生成图像的脚本中
317
+
318
+ 请在`gen_img_diffusers.py`中添加`--network_module`和`--network_weights`选项。其含义与训练时相同。
319
+
320
+ 通过`--network_mul`选项,可以指定0~1.0的数字来改变LoRA的应用率。
321
+
322
+ ## 请参考以下示例,在Diffusers的pipeline中生成。
323
+
324
+ 所需文件仅为networks/lora.py。请注意,该示例只能在Diffusers版本0.10.2中正常运行。
325
+
326
+ ```python
327
+ import torch
328
+ from diffusers import StableDiffusionPipeline
329
+ from networks.lora import LoRAModule, create_network_from_weights
330
+ from safetensors.torch import load_file
331
+
332
+ # if the ckpt is CompVis based, convert it to Diffusers beforehand with tools/convert_diffusers20_original_sd.py. See --help for more details.
333
+
334
+ model_id_or_dir = r"model_id_on_hugging_face_or_dir"
335
+ device = "cuda"
336
+
337
+ # create pipe
338
+ print(f"creating pipe from {model_id_or_dir}...")
339
+ pipe = StableDiffusionPipeline.from_pretrained(model_id_or_dir, revision="fp16", torch_dtype=torch.float16)
340
+ pipe = pipe.to(device)
341
+ vae = pipe.vae
342
+ text_encoder = pipe.text_encoder
343
+ unet = pipe.unet
344
+
345
+ # load lora networks
346
+ print(f"loading lora networks...")
347
+
348
+ lora_path1 = r"lora1.safetensors"
349
+ sd = load_file(lora_path1) # If the file is .ckpt, use torch.load instead.
350
+ network1, sd = create_network_from_weights(0.5, None, vae, text_encoder,unet, sd)
351
+ network1.apply_to(text_encoder, unet)
352
+ network1.load_state_dict(sd)
353
+ network1.to(device, dtype=torch.float16)
354
+
355
+ # # You can merge weights instead of apply_to+load_state_dict. network.set_multiplier does not work
356
+ # network.merge_to(text_encoder, unet, sd)
357
+
358
+ lora_path2 = r"lora2.safetensors"
359
+ sd = load_file(lora_path2)
360
+ network2, sd = create_network_from_weights(0.7, None, vae, text_encoder,unet, sd)
361
+ network2.apply_to(text_encoder, unet)
362
+ network2.load_state_dict(sd)
363
+ network2.to(device, dtype=torch.float16)
364
+
365
+ lora_path3 = r"lora3.safetensors"
366
+ sd = load_file(lora_path3)
367
+ network3, sd = create_network_from_weights(0.5, None, vae, text_encoder,unet, sd)
368
+ network3.apply_to(text_encoder, unet)
369
+ network3.load_state_dict(sd)
370
+ network3.to(device, dtype=torch.float16)
371
+
372
+ # prompts
373
+ prompt = "masterpiece, best quality, 1girl, in white shirt, looking at viewer"
374
+ negative_prompt = "bad quality, worst quality, bad anatomy, bad hands"
375
+
376
+ # exec pipe
377
+ print("generating image...")
378
+ with torch.autocast("cuda"):
379
+ image = pipe(prompt, guidance_scale=7.5, negative_prompt=negative_prompt).images[0]
380
+
381
+ # if not merged, you can use set_multiplier
382
+ # network1.set_multiplier(0.8)
383
+ # and generate image again...
384
+
385
+ # save image
386
+ image.save(r"by_diffusers..png")
387
+ ```
388
+
389
+ ## 从两个模型的差异中创建LoRA模型。
390
+
391
+ [参考讨论链接](https://github.com/cloneofsimo/lora/discussions/56)這是參考實現的結果。數學公式沒有改變(我並不完全理解,但似乎使用奇異值分解進行了近似)。
392
+
393
+ 将两个模型(例如微调原始模型和微调后的模型)的差异近似为LoRA。
394
+
395
+ ### 脚本执行方法
396
+
397
+ 请按以下方式指定。
398
+
399
+ ```
400
+ python networks\extract_lora_from_models.py --model_org base-model.ckpt
401
+ --model_tuned fine-tuned-model.ckpt
402
+ --save_to lora-weights.safetensors --dim 4
403
+ ```
404
+
405
+ --model_org 选项指定原始的Stable Diffusion模型。如果要应用创建的LoRA模型,则需要指定该模型并将其应用。可以指定.ckpt或.safetensors文件。
406
+
407
+ --model_tuned 选项指定要提取差分的目标Stable Diffusion模型。例如,可以指定经过Fine Tuning或DreamBooth后的模型。可以指定.ckpt或.safetensors文件。
408
+
409
+ --save_to 指定LoRA模型的保存路径。--dim指定LoRA的维数。
410
+
411
+ 生成的LoRA模型可以像已训练的LoRA模型一样使用。
412
+
413
+ 当两个模型的文本编码器相同时,LoRA将成为仅包含U-Net的LoRA。
414
+
415
+ ### 其他选项
416
+
417
+ - `--v2`
418
+ - 如果使用v2.x的稳定扩散模型,请指定此选项。
419
+ - `--device`
420
+ - 指定为 ``--device cuda`` 可在GPU上执行计算。这会使处理速度更快(即使在CPU上也不会太慢,大约快几倍)。
421
+ - `--save_precision`
422
+ - 指定LoRA的保存格式为“float”、“fp16”、“bf16”。如果省略,将使用float。
423
+ - `--conv_dim`
424
+ - 指定后,将扩展LoRA的应用范围到Conv2d 3x3。指定Conv2d 3x3的rank。
425
+ -
426
+ ## 图像大小调整脚本
427
+
428
+ (稍后将整理文件,但现在先在这里写下说明。)
429
+
430
+ 在 Aspect Ratio Bucketing 的功能扩��中,现在可以将小图像直接用作教师数据,而无需进行放大。我收到了一个用于前处理的脚本,其中包括将原始教师图像缩小的图像添加到教师数据中可以提高准确性的报告。我整理了这个脚本并加入了感谢 bmaltais 先生。
431
+
432
+ ### 执行脚本的方法如下。
433
+ 原始图像以及调整大小后的图像将保存到转换目标文件夹中。调整大小后的图像将在文件名中添加“+512x512”之类的调整后的分辨率(与图像大小不同)。小于调整大小后分辨率的图像将不会被放大。
434
+
435
+ ```
436
+ python tools\resize_images_to_resolution.py --max_resolution 512x512,384x384,256x256 --save_as_png
437
+ --copy_associated_files 源图像文件夹目标文件夹
438
+ ```
439
+
440
+ 在元画像文件夹中的图像文件将被调整大小以达到指定的分辨率(可以指定多个),并保存到目标文件夹中。除图像外的文件将被保留为原样。
441
+
442
+ 请使用“--max_resolution”选项指定调整大小后的大小,使其达到指定的面积大小。如果指定多个,则会在每个分辨率上进行调整大小。例如,“512x512,384x384,256x256”将使目标文件夹中的图像变为原始大小和调整大小后的大小×3共计4张图像。
443
+
444
+ 如果使用“--save_as_png”选项,则会以PNG格式保存。如果省略,则默认以JPEG格式(quality=100)保存。
445
+
446
+ 如果使用“--copy_associated_files”选项,则会将与图像相同的文件名(例如标题等)的文件复制到调整大小后的图像文件的文件名相同的位置,但不包括扩展名。
447
+
448
+ ### 其他选项
449
+
450
+ - divisible_by
451
+ - 将图像中心裁剪到能够被该值整除的大小(分别是垂直和水平的大小),以便调整大小后的图像大小可以被该值整除。
452
+ - interpolation
453
+ - 指定缩小时的插值方法。可从``area、cubic、lanczos4``中选择,默认为``area``。
454
+
455
+
456
+ # 追加信息
457
+
458
+ ## 与cloneofsimo的代码库的区别
459
+
460
+ 截至2022年12月25日,本代码库将LoRA应用扩展到了Text Encoder的MLP、U-Net的FFN以及Transformer的输入/输出投影中,从而增强了表现力。但是,内存使用量增加了,接近了8GB的限制。
461
+
462
+ 此外,模块交换机制也完全不同。
463
+
464
+ ## 关于未来的扩展
465
+
466
+ 除了LoRA之外,我们还计划添加其他扩展,以支持更多的功能。
docs/train_ti_README-ja.md ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [Textual Inversion](https://textual-inversion.github.io/) の学習についての説明です。
2
+
3
+ [学習についての共通ドキュメント](./train_README-ja.md) もあわせてご覧ください。
4
+
5
+ 実装に当たっては https://github.com/huggingface/diffusers/tree/main/examples/textual_inversion を大いに参考にしました。
6
+
7
+ 学習したモデルはWeb UIでもそのまま使えます。
8
+
9
+ # 学習の手順
10
+
11
+ あらかじめこのリポジトリのREADMEを参照し、環境整備を行ってください。
12
+
13
+ ## データの準備
14
+
15
+ [学習データの準備について](./train_README-ja.md) を参照してください。
16
+
17
+ ## 学習の実行
18
+
19
+ ``train_textual_inversion.py`` を用います。以下はコマンドラインの例です(DreamBooth手法)。
20
+
21
+ ```
22
+ accelerate launch --num_cpu_threads_per_process 1 train_textual_inversion.py
23
+ --dataset_config=<データ準備で作成した.tomlファイル>
24
+ --output_dir=<学習したモデルの出力先フォルダ>
25
+ --output_name=<学習したモデル出力時のファイル名>
26
+ --save_model_as=safetensors
27
+ --prior_loss_weight=1.0
28
+ --max_train_steps=1600
29
+ --learning_rate=1e-6
30
+ --optimizer_type="AdamW8bit"
31
+ --xformers
32
+ --mixed_precision="fp16"
33
+ --cache_latents
34
+ --gradient_checkpointing
35
+ --token_string=mychar4 --init_word=cute --num_vectors_per_token=4
36
+ ```
37
+
38
+ ``--token_string`` に学習時のトークン文字列を指定します。__学習時のプロンプトは、この文字列を含むようにしてください(token_stringがmychar4なら、``mychar4 1girl`` など)__。プロンプトのこの文字列の部分が、Textual Inversionの新しいtokenに置換されて学習されます。DreamBooth, class+identifier形式のデータセットとして、`token_string` をトークン文字列にするのが最も簡単で確実です。
39
+
40
+ プロンプトにトークン文字列が含まれているかどうかは、``--debug_dataset`` で置換後のtoken idが表示されますので、以下のように ``49408`` 以降のtokenが存在するかどうかで確認できます。
41
+
42
+ ```
43
+ input ids: tensor([[49406, 49408, 49409, 49410, 49411, 49412, 49413, 49414, 49415, 49407,
44
+ 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407,
45
+ 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407,
46
+ 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407,
47
+ 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407,
48
+ 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407,
49
+ 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407, 49407,
50
+ 49407, 49407, 49407, 49407, 49407, 49407, 49407]])
51
+ ```
52
+
53
+ tokenizerがすでに持っている単語(一般的な単語)は使用できません。
54
+
55
+ ``--init_word`` にembeddingsを初期化するときのコピー元トークンの文字列を指定します。学ばせたい概念が近いものを選ぶとよいようです。二つ以上のトークンになる文字列は指定できません。
56
+
57
+ ``--num_vectors_per_token`` にいくつのトークンをこの学習で使うかを指定します。多いほうが表現力が増しますが、その分多くのトークンを消費します。たとえばnum_vectors_per_token=8の場合、指定したトークン文字列は(一般的なプロンプトの77トークン制限のうち)8トークンを消費します。
58
+
59
+ 以上がTextual Inversionのための主なオプションです。以降は他の学習スクリプトと同様です。
60
+
61
+ `num_cpu_threads_per_process` には通常は1を指定するとよいようです。
62
+
63
+ `pretrained_model_name_or_path` に追加学習を行う元となるモデルを指定します。Stable Diffusionのcheckpointファイル(.ckptまたは.safetensors)、Diffusersのローカルディスクにあるモデルディレクトリ、DiffusersのモデルID("stabilityai/stable-diffusion-2"など)が指定できます。
64
+
65
+ `output_dir` に学習後のモデルを保存するフォルダを指定します。`output_name` にモデルのファイル名を拡張子を除いて指定します。`save_model_as` でsafetensors形式での保存を指定しています。
66
+
67
+ `dataset_config` に `.toml` ファイルを指定します。ファイル内でのバッチサイズ指定は、当初はメモリ消費を抑えるために `1` としてください。
68
+
69
+ 学習させるステップ数 `max_train_steps` を10000とします。学習率 `learning_rate` はここでは5e-6を指定しています。
70
+
71
+ 省メモリ化のため `mixed_precision="fp16"` を指定します(RTX30 シリーズ以降では `bf16` も指定できます。環境整備時にaccelerateに行った設定と合わせてください)。また `gradient_checkpointing` を指定します。
72
+
73
+ オプティマイザ(モデルを学習データにあうように最適化=学習させるクラス)にメモリ消費の少ない 8bit AdamW を使うため、 `optimizer_type="AdamW8bit"` を指定します。
74
+
75
+ `xformers` オプションを指定し、xformersのCrossAttentionを用います。xformersをインストールしていない場合やエラーとなる場合(環境にもよりますが `mixed_precision="no"` の場合など)、代わりに `mem_eff_attn` オプションを指定すると省メモリ版CrossAttentionを使用します(速度は遅くなります)。
76
+
77
+ ある程度メモリがある場合は、`.toml` ファイルを編集してバッチサイズをたとえば `8` くらいに増やしてください(高速化と精度向上の可能性があります)。
78
+
79
+ ### よく使われるオプションについて
80
+
81
+ 以下の場合にはオプションに関するドキュメントを参照してください。
82
+
83
+ - Stable Diffusion 2.xまたはそこからの派生モデルを学習する
84
+ - clip skipを2以上を前提としたモデルを学習する
85
+ - 75トークンを超えたキャプションで学習する
86
+
87
+ ### Textual Inversionでのバッチサイズについて
88
+
89
+ モデル全体を学習するDreamBoothやfine tuningに比べてメモリ使用量が少ないため、バッチサイズは大きめにできます。
90
+
91
+ # Textual Inversionのその他の主なオプション
92
+
93
+ すべてのオプションについては別文書を参照してください。
94
+
95
+ * `--weights`
96
+ * 学習前に学習済みのembeddingsを読み込み、そこから追加で学習します。
97
+ * `--use_object_template`
98
+ * キャプションではなく既定の物体用テンプレート文字列(``a photo of a {}``など)で学習します。公式実装と同じになります。キャプションは無視されます。
99
+ * `--use_style_template`
100
+ * キャプションではなく既定のスタイル用テンプレート文字列で学習します(``a painting in the style of {}``など)。公式実装と同じになります。キャプションは無視されます。
101
+
102
+ ## 当リポジトリ内の画像生成スクリプトで生成する
103
+
104
+ gen_img_diffusers.pyに、``--textual_inversion_embeddings`` オプションで学習したembeddingsファイルを指定してください(複数可)。プロンプトでembeddingsファイルのファイル名(拡張子を除く)を使うと、そのembeddingsが適用されます。
105
+
dreambooth_gui.py ADDED
@@ -0,0 +1,939 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # v1: initial release
2
+ # v2: add open and save folder icons
3
+ # v3: Add new Utilities tab for Dreambooth folder preparation
4
+ # v3.1: Adding captionning of images to utilities
5
+
6
+ import gradio as gr
7
+ import json
8
+ import math
9
+ import os
10
+ import subprocess
11
+ import pathlib
12
+ import argparse
13
+ from datetime import datetime
14
+ from library.common_gui import (
15
+ get_file_path,
16
+ get_saveasfile_path,
17
+ color_aug_changed,
18
+ save_inference_file,
19
+ run_cmd_advanced_training,
20
+ run_cmd_training,
21
+ update_my_data,
22
+ check_if_model_exist,
23
+ output_message,
24
+ verify_image_folder_pattern,
25
+ SaveConfigFile,
26
+ save_to_file
27
+ )
28
+ from library.class_configuration_file import ConfigurationFile
29
+ from library.class_source_model import SourceModel
30
+ from library.class_basic_training import BasicTraining
31
+ from library.class_advanced_training import AdvancedTraining
32
+ from library.class_folders import Folders
33
+ from library.tensorboard_gui import (
34
+ gradio_tensorboard,
35
+ start_tensorboard,
36
+ stop_tensorboard,
37
+ )
38
+ from library.dreambooth_folder_creation_gui import (
39
+ gradio_dreambooth_folder_creation_tab,
40
+ )
41
+ from library.utilities import utilities_tab
42
+ from library.class_sample_images import SampleImages, run_cmd_sample
43
+
44
+ from library.custom_logging import setup_logging
45
+
46
+ # Set up logging
47
+ log = setup_logging()
48
+
49
+
50
+ def save_configuration(
51
+ save_as,
52
+ file_path,
53
+ pretrained_model_name_or_path,
54
+ v2,
55
+ v_parameterization,
56
+ sdxl,
57
+ logging_dir,
58
+ train_data_dir,
59
+ reg_data_dir,
60
+ output_dir,
61
+ max_resolution,
62
+ learning_rate,
63
+ lr_scheduler,
64
+ lr_warmup,
65
+ train_batch_size,
66
+ epoch,
67
+ save_every_n_epochs,
68
+ mixed_precision,
69
+ save_precision,
70
+ seed,
71
+ num_cpu_threads_per_process,
72
+ cache_latents,
73
+ cache_latents_to_disk,
74
+ caption_extension,
75
+ enable_bucket,
76
+ gradient_checkpointing,
77
+ full_fp16,
78
+ no_token_padding,
79
+ stop_text_encoder_training,
80
+ # use_8bit_adam,
81
+ xformers,
82
+ save_model_as,
83
+ shuffle_caption,
84
+ save_state,
85
+ resume,
86
+ prior_loss_weight,
87
+ color_aug,
88
+ flip_aug,
89
+ clip_skip,
90
+ vae,
91
+ output_name,
92
+ max_token_length,
93
+ max_train_epochs,
94
+ max_data_loader_n_workers,
95
+ mem_eff_attn,
96
+ gradient_accumulation_steps,
97
+ model_list,
98
+ keep_tokens,
99
+ persistent_data_loader_workers,
100
+ bucket_no_upscale,
101
+ random_crop,
102
+ bucket_reso_steps,
103
+ caption_dropout_every_n_epochs,
104
+ caption_dropout_rate,
105
+ optimizer,
106
+ optimizer_args,
107
+ noise_offset_type,
108
+ noise_offset,
109
+ adaptive_noise_scale,
110
+ multires_noise_iterations,
111
+ multires_noise_discount,
112
+ sample_every_n_steps,
113
+ sample_every_n_epochs,
114
+ sample_sampler,
115
+ sample_prompts,
116
+ additional_parameters,
117
+ vae_batch_size,
118
+ min_snr_gamma,
119
+ weighted_captions,
120
+ save_every_n_steps,
121
+ save_last_n_steps,
122
+ save_last_n_steps_state,
123
+ use_wandb,
124
+ wandb_api_key,
125
+ scale_v_pred_loss_like_noise_pred,
126
+ min_timestep,
127
+ max_timestep,
128
+ ):
129
+ # Get list of function parameters and values
130
+ parameters = list(locals().items())
131
+
132
+ original_file_path = file_path
133
+
134
+ save_as_bool = True if save_as.get('label') == 'True' else False
135
+
136
+ if save_as_bool:
137
+ log.info('Save as...')
138
+ file_path = get_saveasfile_path(file_path)
139
+ else:
140
+ log.info('Save...')
141
+ if file_path == None or file_path == '':
142
+ file_path = get_saveasfile_path(file_path)
143
+
144
+ if file_path == None or file_path == '':
145
+ return original_file_path # In case a file_path was provided and the user decide to cancel the open action
146
+
147
+ # Extract the destination directory from the file path
148
+ destination_directory = os.path.dirname(file_path)
149
+
150
+ # Create the destination directory if it doesn't exist
151
+ if not os.path.exists(destination_directory):
152
+ os.makedirs(destination_directory)
153
+
154
+ SaveConfigFile(parameters=parameters, file_path=file_path, exclusion=['file_path', 'save_as'])
155
+
156
+ return file_path
157
+
158
+
159
+ def open_configuration(
160
+ ask_for_file,
161
+ file_path,
162
+ pretrained_model_name_or_path,
163
+ v2,
164
+ v_parameterization,
165
+ sdxl,
166
+ logging_dir,
167
+ train_data_dir,
168
+ reg_data_dir,
169
+ output_dir,
170
+ max_resolution,
171
+ learning_rate,
172
+ lr_scheduler,
173
+ lr_warmup,
174
+ train_batch_size,
175
+ epoch,
176
+ save_every_n_epochs,
177
+ mixed_precision,
178
+ save_precision,
179
+ seed,
180
+ num_cpu_threads_per_process,
181
+ cache_latents,
182
+ cache_latents_to_disk,
183
+ caption_extension,
184
+ enable_bucket,
185
+ gradient_checkpointing,
186
+ full_fp16,
187
+ no_token_padding,
188
+ stop_text_encoder_training,
189
+ # use_8bit_adam,
190
+ xformers,
191
+ save_model_as,
192
+ shuffle_caption,
193
+ save_state,
194
+ resume,
195
+ prior_loss_weight,
196
+ color_aug,
197
+ flip_aug,
198
+ clip_skip,
199
+ vae,
200
+ output_name,
201
+ max_token_length,
202
+ max_train_epochs,
203
+ max_data_loader_n_workers,
204
+ mem_eff_attn,
205
+ gradient_accumulation_steps,
206
+ model_list,
207
+ keep_tokens,
208
+ persistent_data_loader_workers,
209
+ bucket_no_upscale,
210
+ random_crop,
211
+ bucket_reso_steps,
212
+ caption_dropout_every_n_epochs,
213
+ caption_dropout_rate,
214
+ optimizer,
215
+ optimizer_args,
216
+ noise_offset_type,
217
+ noise_offset,
218
+ adaptive_noise_scale,
219
+ multires_noise_iterations,
220
+ multires_noise_discount,
221
+ sample_every_n_steps,
222
+ sample_every_n_epochs,
223
+ sample_sampler,
224
+ sample_prompts,
225
+ additional_parameters,
226
+ vae_batch_size,
227
+ min_snr_gamma,
228
+ weighted_captions,
229
+ save_every_n_steps,
230
+ save_last_n_steps,
231
+ save_last_n_steps_state,
232
+ use_wandb,
233
+ wandb_api_key,
234
+ scale_v_pred_loss_like_noise_pred,
235
+ min_timestep,
236
+ max_timestep,
237
+ ):
238
+ # Get list of function parameters and values
239
+ parameters = list(locals().items())
240
+
241
+ ask_for_file = True if ask_for_file.get('label') == 'True' else False
242
+
243
+ original_file_path = file_path
244
+
245
+ if ask_for_file:
246
+ file_path = get_file_path(file_path)
247
+
248
+ if not file_path == '' and not file_path == None:
249
+ # load variables from JSON file
250
+ with open(file_path, 'r') as f:
251
+ my_data = json.load(f)
252
+ log.info('Loading config...')
253
+ # Update values to fix deprecated use_8bit_adam checkbox and set appropriate optimizer if it is set to True
254
+ my_data = update_my_data(my_data)
255
+ else:
256
+ file_path = original_file_path # In case a file_path was provided and the user decide to cancel the open action
257
+ my_data = {}
258
+
259
+ values = [file_path]
260
+ for key, value in parameters:
261
+ # Set the value in the dictionary to the corresponding value in `my_data`, or the default value if not found
262
+ if not key in ['ask_for_file', 'file_path']:
263
+ values.append(my_data.get(key, value))
264
+ return tuple(values)
265
+
266
+
267
+ def train_model(
268
+ headless,
269
+ print_only,
270
+ pretrained_model_name_or_path,
271
+ v2,
272
+ v_parameterization,
273
+ sdxl,
274
+ logging_dir,
275
+ train_data_dir,
276
+ reg_data_dir,
277
+ output_dir,
278
+ max_resolution,
279
+ learning_rate,
280
+ lr_scheduler,
281
+ lr_warmup,
282
+ train_batch_size,
283
+ epoch,
284
+ save_every_n_epochs,
285
+ mixed_precision,
286
+ save_precision,
287
+ seed,
288
+ num_cpu_threads_per_process,
289
+ cache_latents,
290
+ cache_latents_to_disk,
291
+ caption_extension,
292
+ enable_bucket,
293
+ gradient_checkpointing,
294
+ full_fp16,
295
+ no_token_padding,
296
+ stop_text_encoder_training_pct,
297
+ # use_8bit_adam,
298
+ xformers,
299
+ save_model_as,
300
+ shuffle_caption,
301
+ save_state,
302
+ resume,
303
+ prior_loss_weight,
304
+ color_aug,
305
+ flip_aug,
306
+ clip_skip,
307
+ vae,
308
+ output_name,
309
+ max_token_length,
310
+ max_train_epochs,
311
+ max_data_loader_n_workers,
312
+ mem_eff_attn,
313
+ gradient_accumulation_steps,
314
+ model_list, # Keep this. Yes, it is unused here but required given the common list used
315
+ keep_tokens,
316
+ persistent_data_loader_workers,
317
+ bucket_no_upscale,
318
+ random_crop,
319
+ bucket_reso_steps,
320
+ caption_dropout_every_n_epochs,
321
+ caption_dropout_rate,
322
+ optimizer,
323
+ optimizer_args,
324
+ noise_offset_type,
325
+ noise_offset,
326
+ adaptive_noise_scale,
327
+ multires_noise_iterations,
328
+ multires_noise_discount,
329
+ sample_every_n_steps,
330
+ sample_every_n_epochs,
331
+ sample_sampler,
332
+ sample_prompts,
333
+ additional_parameters,
334
+ vae_batch_size,
335
+ min_snr_gamma,
336
+ weighted_captions,
337
+ save_every_n_steps,
338
+ save_last_n_steps,
339
+ save_last_n_steps_state,
340
+ use_wandb,
341
+ wandb_api_key,
342
+ scale_v_pred_loss_like_noise_pred,
343
+ min_timestep,
344
+ max_timestep,
345
+ ):
346
+ # Get list of function parameters and values
347
+ parameters = list(locals().items())
348
+
349
+ print_only_bool = True if print_only.get('label') == 'True' else False
350
+ log.info(f'Start training Dreambooth...')
351
+
352
+ headless_bool = True if headless.get('label') == 'True' else False
353
+
354
+ if pretrained_model_name_or_path == '':
355
+ output_message(
356
+ msg='Source model information is missing', headless=headless_bool
357
+ )
358
+ return
359
+
360
+ if train_data_dir == '':
361
+ output_message(
362
+ msg='Image folder path is missing', headless=headless_bool
363
+ )
364
+ return
365
+
366
+ if not os.path.exists(train_data_dir):
367
+ output_message(
368
+ msg='Image folder does not exist', headless=headless_bool
369
+ )
370
+ return
371
+
372
+ if not verify_image_folder_pattern(train_data_dir):
373
+ return
374
+
375
+ if reg_data_dir != '':
376
+ if not os.path.exists(reg_data_dir):
377
+ output_message(
378
+ msg='Regularisation folder does not exist',
379
+ headless=headless_bool,
380
+ )
381
+ return
382
+
383
+ if not verify_image_folder_pattern(reg_data_dir):
384
+ return
385
+
386
+ if output_dir == '':
387
+ output_message(
388
+ msg='Output folder path is missing', headless=headless_bool
389
+ )
390
+ return
391
+
392
+ if check_if_model_exist(
393
+ output_name, output_dir, save_model_as, headless=headless_bool
394
+ ):
395
+ return
396
+
397
+ if sdxl:
398
+ output_message(
399
+ msg='TI training is not compatible with an SDXL model.',
400
+ headless=headless_bool,
401
+ )
402
+ return
403
+
404
+ # if optimizer == 'Adafactor' and lr_warmup != '0':
405
+ # output_message(
406
+ # msg="Warning: lr_scheduler is set to 'Adafactor', so 'LR warmup (% of steps)' will be considered 0.",
407
+ # title='Warning',
408
+ # headless=headless_bool,
409
+ # )
410
+ # lr_warmup = '0'
411
+
412
+ # Get a list of all subfolders in train_data_dir, excluding hidden folders
413
+ subfolders = [
414
+ f
415
+ for f in os.listdir(train_data_dir)
416
+ if os.path.isdir(os.path.join(train_data_dir, f))
417
+ and not f.startswith('.')
418
+ ]
419
+
420
+ # Check if subfolders are present. If not let the user know and return
421
+ if not subfolders:
422
+ log.info(
423
+ f"No {subfolders} were found in train_data_dir can't train..."
424
+ )
425
+ return
426
+
427
+ total_steps = 0
428
+
429
+ # Loop through each subfolder and extract the number of repeats
430
+ for folder in subfolders:
431
+ # Extract the number of repeats from the folder name
432
+ try:
433
+ repeats = int(folder.split('_')[0])
434
+ except ValueError:
435
+ log.info(
436
+ f"Subfolder {folder} does not have a proper repeat value, please correct the name or remove it... can't train..."
437
+ )
438
+ continue
439
+
440
+ # Count the number of images in the folder
441
+ num_images = len(
442
+ [
443
+ f
444
+ for f, lower_f in (
445
+ (file, file.lower())
446
+ for file in os.listdir(
447
+ os.path.join(train_data_dir, folder)
448
+ )
449
+ )
450
+ if lower_f.endswith(('.jpg', '.jpeg', '.png', '.webp'))
451
+ ]
452
+ )
453
+
454
+ if num_images == 0:
455
+ log.info(f'{folder} folder contain no images, skipping...')
456
+ else:
457
+ # Calculate the total number of steps for this folder
458
+ steps = repeats * num_images
459
+ total_steps += steps
460
+
461
+ # Print the result
462
+ log.info(f'Folder {folder} : steps {steps}')
463
+
464
+ if total_steps == 0:
465
+ log.info(
466
+ f'No images were found in folder {train_data_dir}... please rectify!'
467
+ )
468
+ return
469
+
470
+ # Print the result
471
+ # log.info(f"{total_steps} total steps")
472
+
473
+ if reg_data_dir == '':
474
+ reg_factor = 1
475
+ else:
476
+ log.info(
477
+ f'Regularisation images are used... Will double the number of steps required...'
478
+ )
479
+ reg_factor = 2
480
+
481
+ # calculate max_train_steps
482
+ max_train_steps = int(
483
+ math.ceil(
484
+ float(total_steps)
485
+ / int(train_batch_size)
486
+ / int(gradient_accumulation_steps)
487
+ * int(epoch)
488
+ * int(reg_factor)
489
+ )
490
+ )
491
+ log.info(f'max_train_steps = {max_train_steps}')
492
+
493
+ # calculate stop encoder training
494
+ if int(stop_text_encoder_training_pct) == -1:
495
+ stop_text_encoder_training = -1
496
+ elif stop_text_encoder_training_pct == None:
497
+ stop_text_encoder_training = 0
498
+ else:
499
+ stop_text_encoder_training = math.ceil(
500
+ float(max_train_steps) / 100 * int(stop_text_encoder_training_pct)
501
+ )
502
+ log.info(f'stop_text_encoder_training = {stop_text_encoder_training}')
503
+
504
+ lr_warmup_steps = round(float(int(lr_warmup) * int(max_train_steps) / 100))
505
+ log.info(f'lr_warmup_steps = {lr_warmup_steps}')
506
+
507
+ run_cmd = f'accelerate launch --num_cpu_threads_per_process={num_cpu_threads_per_process} "train_db.py"'
508
+ if v2:
509
+ run_cmd += ' --v2'
510
+ if v_parameterization:
511
+ run_cmd += ' --v_parameterization'
512
+ if enable_bucket:
513
+ run_cmd += ' --enable_bucket'
514
+ if no_token_padding:
515
+ run_cmd += ' --no_token_padding'
516
+ if weighted_captions:
517
+ run_cmd += ' --weighted_captions'
518
+ run_cmd += (
519
+ f' --pretrained_model_name_or_path="{pretrained_model_name_or_path}"'
520
+ )
521
+ run_cmd += f' --train_data_dir="{train_data_dir}"'
522
+ if len(reg_data_dir):
523
+ run_cmd += f' --reg_data_dir="{reg_data_dir}"'
524
+ run_cmd += f' --resolution="{max_resolution}"'
525
+ run_cmd += f' --output_dir="{output_dir}"'
526
+ if not logging_dir == '':
527
+ run_cmd += f' --logging_dir="{logging_dir}"'
528
+ if not stop_text_encoder_training == 0:
529
+ run_cmd += (
530
+ f' --stop_text_encoder_training={stop_text_encoder_training}'
531
+ )
532
+ if not save_model_as == 'same as source model':
533
+ run_cmd += f' --save_model_as={save_model_as}'
534
+ # if not resume == '':
535
+ # run_cmd += f' --resume={resume}'
536
+ if not float(prior_loss_weight) == 1.0:
537
+ run_cmd += f' --prior_loss_weight={prior_loss_weight}'
538
+ if not vae == '':
539
+ run_cmd += f' --vae="{vae}"'
540
+ if not output_name == '':
541
+ run_cmd += f' --output_name="{output_name}"'
542
+ if int(max_token_length) > 75:
543
+ run_cmd += f' --max_token_length={max_token_length}'
544
+ if not max_train_epochs == '':
545
+ run_cmd += f' --max_train_epochs="{max_train_epochs}"'
546
+ if not max_data_loader_n_workers == '':
547
+ run_cmd += (
548
+ f' --max_data_loader_n_workers="{max_data_loader_n_workers}"'
549
+ )
550
+ if int(gradient_accumulation_steps) > 1:
551
+ run_cmd += f' --gradient_accumulation_steps={int(gradient_accumulation_steps)}'
552
+
553
+ run_cmd += run_cmd_training(
554
+ learning_rate=learning_rate,
555
+ lr_scheduler=lr_scheduler,
556
+ lr_warmup_steps=lr_warmup_steps,
557
+ train_batch_size=train_batch_size,
558
+ max_train_steps=max_train_steps,
559
+ save_every_n_epochs=save_every_n_epochs,
560
+ mixed_precision=mixed_precision,
561
+ save_precision=save_precision,
562
+ seed=seed,
563
+ caption_extension=caption_extension,
564
+ cache_latents=cache_latents,
565
+ cache_latents_to_disk=cache_latents_to_disk,
566
+ optimizer=optimizer,
567
+ optimizer_args=optimizer_args,
568
+ )
569
+
570
+ run_cmd += run_cmd_advanced_training(
571
+ max_train_epochs=max_train_epochs,
572
+ max_data_loader_n_workers=max_data_loader_n_workers,
573
+ max_token_length=max_token_length,
574
+ resume=resume,
575
+ save_state=save_state,
576
+ mem_eff_attn=mem_eff_attn,
577
+ clip_skip=clip_skip,
578
+ flip_aug=flip_aug,
579
+ color_aug=color_aug,
580
+ shuffle_caption=shuffle_caption,
581
+ gradient_checkpointing=gradient_checkpointing,
582
+ full_fp16=full_fp16,
583
+ xformers=xformers,
584
+ keep_tokens=keep_tokens,
585
+ persistent_data_loader_workers=persistent_data_loader_workers,
586
+ bucket_no_upscale=bucket_no_upscale,
587
+ random_crop=random_crop,
588
+ bucket_reso_steps=bucket_reso_steps,
589
+ caption_dropout_every_n_epochs=caption_dropout_every_n_epochs,
590
+ caption_dropout_rate=caption_dropout_rate,
591
+ noise_offset_type=noise_offset_type,
592
+ noise_offset=noise_offset,
593
+ adaptive_noise_scale=adaptive_noise_scale,
594
+ multires_noise_iterations=multires_noise_iterations,
595
+ multires_noise_discount=multires_noise_discount,
596
+ additional_parameters=additional_parameters,
597
+ vae_batch_size=vae_batch_size,
598
+ min_snr_gamma=min_snr_gamma,
599
+ save_every_n_steps=save_every_n_steps,
600
+ save_last_n_steps=save_last_n_steps,
601
+ save_last_n_steps_state=save_last_n_steps_state,
602
+ use_wandb=use_wandb,
603
+ wandb_api_key=wandb_api_key,
604
+ scale_v_pred_loss_like_noise_pred=scale_v_pred_loss_like_noise_pred,
605
+ min_timestep=min_timestep,
606
+ max_timestep=max_timestep,
607
+ )
608
+
609
+ run_cmd += run_cmd_sample(
610
+ sample_every_n_steps,
611
+ sample_every_n_epochs,
612
+ sample_sampler,
613
+ sample_prompts,
614
+ output_dir,
615
+ )
616
+
617
+ if print_only_bool:
618
+ log.warning(
619
+ 'Here is the trainer command as a reference. It will not be executed:\n'
620
+ )
621
+ print(run_cmd)
622
+
623
+ save_to_file(run_cmd)
624
+ else:
625
+ # Saving config file for model
626
+ current_datetime = datetime.now()
627
+ formatted_datetime = current_datetime.strftime("%Y%m%d-%H%M%S")
628
+ file_path = os.path.join(output_dir, f'{output_name}_{formatted_datetime}.json')
629
+
630
+ log.info(f'Saving training config to {file_path}...')
631
+
632
+ SaveConfigFile(parameters=parameters, file_path=file_path, exclusion=['file_path', 'save_as', 'headless', 'print_only'])
633
+
634
+ log.info(run_cmd)
635
+
636
+ # Run the command
637
+ if os.name == 'posix':
638
+ os.system(run_cmd)
639
+ else:
640
+ subprocess.run(run_cmd)
641
+
642
+ # check if output_dir/last is a folder... therefore it is a diffuser model
643
+ last_dir = pathlib.Path(f'{output_dir}/{output_name}')
644
+
645
+ if not last_dir.is_dir():
646
+ # Copy inference model for v2 if required
647
+ save_inference_file(
648
+ output_dir, v2, v_parameterization, output_name
649
+ )
650
+
651
+
652
+ def dreambooth_tab(
653
+ # train_data_dir=gr.Textbox(),
654
+ # reg_data_dir=gr.Textbox(),
655
+ # output_dir=gr.Textbox(),
656
+ # logging_dir=gr.Textbox(),
657
+ headless=False,
658
+ ):
659
+ dummy_db_true = gr.Label(value=True, visible=False)
660
+ dummy_db_false = gr.Label(value=False, visible=False)
661
+ dummy_headless = gr.Label(value=headless, visible=False)
662
+
663
+ with gr.Tab('Training'):
664
+ gr.Markdown('Train a custom model using kohya dreambooth python code...')
665
+
666
+ # Setup Configuration Files Gradio
667
+ config = ConfigurationFile(headless)
668
+
669
+ source_model = SourceModel(headless=headless)
670
+
671
+ with gr.Tab('Folders'):
672
+ folders = Folders(headless=headless)
673
+ with gr.Tab('Parameters'):
674
+ basic_training = BasicTraining(
675
+ learning_rate_value='1e-5',
676
+ lr_scheduler_value='cosine',
677
+ lr_warmup_value='10',
678
+ )
679
+ with gr.Accordion('Advanced Configuration', open=False):
680
+ advanced_training = AdvancedTraining(headless=headless)
681
+ advanced_training.color_aug.change(
682
+ color_aug_changed,
683
+ inputs=[advanced_training.color_aug],
684
+ outputs=[basic_training.cache_latents],
685
+ )
686
+
687
+ sample = SampleImages()
688
+
689
+ with gr.Tab('Tools'):
690
+ gr.Markdown(
691
+ 'This section provide Dreambooth tools to help setup your dataset...'
692
+ )
693
+ gradio_dreambooth_folder_creation_tab(
694
+ train_data_dir_input=folders.train_data_dir,
695
+ reg_data_dir_input=folders.reg_data_dir,
696
+ output_dir_input=folders.output_dir,
697
+ logging_dir_input=folders.logging_dir,
698
+ headless=headless,
699
+ )
700
+
701
+ button_run = gr.Button('Train model', variant='primary')
702
+
703
+ button_print = gr.Button('Print training command')
704
+
705
+ # Setup gradio tensorboard buttons
706
+ button_start_tensorboard, button_stop_tensorboard = gradio_tensorboard()
707
+
708
+ button_start_tensorboard.click(
709
+ start_tensorboard,
710
+ inputs=folders.logging_dir,
711
+ show_progress=False,
712
+ )
713
+
714
+ button_stop_tensorboard.click(
715
+ stop_tensorboard,
716
+ show_progress=False,
717
+ )
718
+
719
+ settings_list = [
720
+ source_model.pretrained_model_name_or_path,
721
+ source_model.v2,
722
+ source_model.v_parameterization,
723
+ source_model.sdxl_checkbox,
724
+ folders.logging_dir,
725
+ folders.train_data_dir,
726
+ folders.reg_data_dir,
727
+ folders.output_dir,
728
+ basic_training.max_resolution,
729
+ basic_training.learning_rate,
730
+ basic_training.lr_scheduler,
731
+ basic_training.lr_warmup,
732
+ basic_training.train_batch_size,
733
+ basic_training.epoch,
734
+ basic_training.save_every_n_epochs,
735
+ basic_training.mixed_precision,
736
+ basic_training.save_precision,
737
+ basic_training.seed,
738
+ basic_training.num_cpu_threads_per_process,
739
+ basic_training.cache_latents,
740
+ basic_training.cache_latents_to_disk,
741
+ basic_training.caption_extension,
742
+ basic_training.enable_bucket,
743
+ advanced_training.gradient_checkpointing,
744
+ advanced_training.full_fp16,
745
+ advanced_training.no_token_padding,
746
+ basic_training.stop_text_encoder_training,
747
+ advanced_training.xformers,
748
+ source_model.save_model_as,
749
+ advanced_training.shuffle_caption,
750
+ advanced_training.save_state,
751
+ advanced_training.resume,
752
+ advanced_training.prior_loss_weight,
753
+ advanced_training.color_aug,
754
+ advanced_training.flip_aug,
755
+ advanced_training.clip_skip,
756
+ advanced_training.vae,
757
+ folders.output_name,
758
+ advanced_training.max_token_length,
759
+ advanced_training.max_train_epochs,
760
+ advanced_training.max_data_loader_n_workers,
761
+ advanced_training.mem_eff_attn,
762
+ advanced_training.gradient_accumulation_steps,
763
+ source_model.model_list,
764
+ advanced_training.keep_tokens,
765
+ advanced_training.persistent_data_loader_workers,
766
+ advanced_training.bucket_no_upscale,
767
+ advanced_training.random_crop,
768
+ advanced_training.bucket_reso_steps,
769
+ advanced_training.caption_dropout_every_n_epochs,
770
+ advanced_training.caption_dropout_rate,
771
+ basic_training.optimizer,
772
+ basic_training.optimizer_args,
773
+ advanced_training.noise_offset_type,
774
+ advanced_training.noise_offset,
775
+ advanced_training.adaptive_noise_scale,
776
+ advanced_training.multires_noise_iterations,
777
+ advanced_training.multires_noise_discount,
778
+ sample.sample_every_n_steps,
779
+ sample.sample_every_n_epochs,
780
+ sample.sample_sampler,
781
+ sample.sample_prompts,
782
+ advanced_training.additional_parameters,
783
+ advanced_training.vae_batch_size,
784
+ advanced_training.min_snr_gamma,
785
+ advanced_training.weighted_captions,
786
+ advanced_training.save_every_n_steps,
787
+ advanced_training.save_last_n_steps,
788
+ advanced_training.save_last_n_steps_state,
789
+ advanced_training.use_wandb,
790
+ advanced_training.wandb_api_key,
791
+ advanced_training.scale_v_pred_loss_like_noise_pred,
792
+ advanced_training.min_timestep,
793
+ advanced_training.max_timestep,
794
+ ]
795
+
796
+ config.button_open_config.click(
797
+ open_configuration,
798
+ inputs=[dummy_db_true, config.config_file_name] + settings_list,
799
+ outputs=[config.config_file_name] + settings_list,
800
+ show_progress=False,
801
+ )
802
+
803
+ config.button_load_config.click(
804
+ open_configuration,
805
+ inputs=[dummy_db_false, config.config_file_name] + settings_list,
806
+ outputs=[config.config_file_name] + settings_list,
807
+ show_progress=False,
808
+ )
809
+
810
+ config.button_save_config.click(
811
+ save_configuration,
812
+ inputs=[dummy_db_false, config.config_file_name] + settings_list,
813
+ outputs=[config.config_file_name],
814
+ show_progress=False,
815
+ )
816
+
817
+ config.button_save_as_config.click(
818
+ save_configuration,
819
+ inputs=[dummy_db_true, config.config_file_name] + settings_list,
820
+ outputs=[config.config_file_name],
821
+ show_progress=False,
822
+ )
823
+
824
+ button_run.click(
825
+ train_model,
826
+ inputs=[dummy_headless] + [dummy_db_false] + settings_list,
827
+ show_progress=False,
828
+ )
829
+
830
+ button_print.click(
831
+ train_model,
832
+ inputs=[dummy_headless] + [dummy_db_true] + settings_list,
833
+ show_progress=False,
834
+ )
835
+
836
+ return (
837
+ folders.train_data_dir,
838
+ folders.reg_data_dir,
839
+ folders.output_dir,
840
+ folders.logging_dir,
841
+ )
842
+
843
+
844
+ def UI(**kwargs):
845
+ css = ''
846
+
847
+ headless = kwargs.get('headless', False)
848
+ log.info(f'headless: {headless}')
849
+
850
+ if os.path.exists('./style.css'):
851
+ with open(os.path.join('./style.css'), 'r', encoding='utf8') as file:
852
+ log.info('Load CSS...')
853
+ css += file.read() + '\n'
854
+
855
+ interface = gr.Blocks(
856
+ css=css, title='Kohya_ss GUI', theme=gr.themes.Default()
857
+ )
858
+
859
+ with interface:
860
+ with gr.Tab('Dreambooth'):
861
+ (
862
+ train_data_dir_input,
863
+ reg_data_dir_input,
864
+ output_dir_input,
865
+ logging_dir_input,
866
+ ) = dreambooth_tab(headless=headless)
867
+ with gr.Tab('Utilities'):
868
+ utilities_tab(
869
+ train_data_dir_input=train_data_dir_input,
870
+ reg_data_dir_input=reg_data_dir_input,
871
+ output_dir_input=output_dir_input,
872
+ logging_dir_input=logging_dir_input,
873
+ enable_copy_info_button=True,
874
+ headless=headless,
875
+ )
876
+
877
+ # Show the interface
878
+ launch_kwargs = {}
879
+ username = kwargs.get('username')
880
+ password = kwargs.get('password')
881
+ server_port = kwargs.get('server_port', 0)
882
+ inbrowser = kwargs.get('inbrowser', False)
883
+ share = kwargs.get('share', False)
884
+ server_name = kwargs.get('listen')
885
+
886
+ launch_kwargs['server_name'] = server_name
887
+ if username and password:
888
+ launch_kwargs['auth'] = (username, password)
889
+ if server_port > 0:
890
+ launch_kwargs['server_port'] = server_port
891
+ if inbrowser:
892
+ launch_kwargs['inbrowser'] = inbrowser
893
+ if share:
894
+ launch_kwargs['share'] = share
895
+ interface.launch(**launch_kwargs)
896
+
897
+
898
+ if __name__ == '__main__':
899
+ # torch.cuda.set_per_process_memory_fraction(0.48)
900
+ parser = argparse.ArgumentParser()
901
+ parser.add_argument(
902
+ '--listen',
903
+ type=str,
904
+ default='127.0.0.1',
905
+ help='IP to listen on for connections to Gradio',
906
+ )
907
+ parser.add_argument(
908
+ '--username', type=str, default='', help='Username for authentication'
909
+ )
910
+ parser.add_argument(
911
+ '--password', type=str, default='', help='Password for authentication'
912
+ )
913
+ parser.add_argument(
914
+ '--server_port',
915
+ type=int,
916
+ default=0,
917
+ help='Port to run the server listener on',
918
+ )
919
+ parser.add_argument(
920
+ '--inbrowser', action='store_true', help='Open in browser'
921
+ )
922
+ parser.add_argument(
923
+ '--share', action='store_true', help='Share the gradio UI'
924
+ )
925
+ parser.add_argument(
926
+ '--headless', action='store_true', help='Is the server headless'
927
+ )
928
+
929
+ args = parser.parse_args()
930
+
931
+ UI(
932
+ username=args.username,
933
+ password=args.password,
934
+ inbrowser=args.inbrowser,
935
+ server_port=args.server_port,
936
+ share=args.share,
937
+ listen=args.listen,
938
+ headless=args.headless,
939
+ )
examples/caption.ps1 ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This powershell script will create a text file for each files in the folder
2
+ #
3
+ # Usefull to create base caption that will be augmented on a per image basis
4
+
5
+ $folder = "D:\some\folder\location\"
6
+ $file_pattern="*.*"
7
+ $caption_text="some caption text"
8
+
9
+ $files = Get-ChildItem $folder$file_pattern -Include *.png, *.jpg, *.webp -File
10
+ foreach ($file in $files) {
11
+ if (-not(Test-Path -Path $folder\"$($file.BaseName).txt" -PathType Leaf)) {
12
+ New-Item -ItemType file -Path $folder -Name "$($file.BaseName).txt" -Value $caption_text
13
+ }
14
+ }
examples/caption_subfolders.ps1 ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This powershell script will create a text file for each files in the folder
2
+ #
3
+ # Usefull to create base caption that will be augmented on a per image basis
4
+
5
+ $folder = "D:\test\t2\"
6
+ $file_pattern="*.*"
7
+ $text_fir_file="bigeyes style"
8
+
9
+ foreach ($file in Get-ChildItem $folder\$file_pattern -File)
10
+ {
11
+ New-Item -ItemType file -Path $folder -Name "$($file.BaseName).txt" -Value $text_fir_file
12
+ }
13
+
14
+ foreach($directory in Get-ChildItem -path $folder -Directory)
15
+ {
16
+ foreach ($file in Get-ChildItem $folder\$directory\$file_pattern)
17
+ {
18
+ New-Item -ItemType file -Path $folder\$directory -Name "$($file.BaseName).txt" -Value $text_fir_file
19
+ }
20
+ }