Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .cache/config/.gitkeep +0 -0
- .cache/keras/.gitkeep +0 -0
- .cache/nv/.gitkeep +0 -0
- .cache/triton/.gitkeep +0 -0
- .cache/user/.gitkeep +0 -0
- .dockerignore +7 -0
- .gitattributes +267 -35
- .github/workflows/typos.yaml +21 -0
- .gitignore +47 -0
- .ipynb_checkpoints/fine_tune-checkpoint.py +480 -0
- .ipynb_checkpoints/finetune_gui-checkpoint.py +1061 -0
- .ipynb_checkpoints/gui-checkpoint.sh +71 -0
- .ipynb_checkpoints/kohya_gui-checkpoint.py +141 -0
- .release +1 -0
- .vscode/settings.json +4 -0
- Dockerfile +52 -0
- LICENSE.md +201 -0
- README-ja.md +167 -0
- README.md +513 -8
- XTI_hijack.py +201 -0
- __pycache__/dreambooth_gui.cpython-310.pyc +0 -0
- __pycache__/finetune_gui.cpython-310.pyc +0 -0
- __pycache__/lora_gui.cpython-310.pyc +0 -0
- __pycache__/textual_inversion_gui.cpython-310.pyc +0 -0
- _typos.toml +15 -0
- activate.ps1 +1 -0
- bitsandbytes_windows/cextension.py +54 -0
- bitsandbytes_windows/libbitsandbytes_cpu.dll +0 -0
- bitsandbytes_windows/libbitsandbytes_cuda116.dll +3 -0
- bitsandbytes_windows/libbitsandbytes_cuda118.dll +3 -0
- bitsandbytes_windows/main.py +166 -0
- config_files/accelerate/default_config.yaml +22 -0
- config_files/accelerate/runpod.yaml +22 -0
- converted_markdown.md +0 -0
- dataset/.gitkeep +0 -0
- docker-compose.yaml +33 -0
- docs/Finetuning/top_level.md +28 -0
- docs/LoRA/options.md +788 -0
- docs/LoRA/top_level.md +26 -0
- docs/config_README-ja.md +279 -0
- docs/fine_tune_README_ja.md +140 -0
- docs/gen_img_README-ja.md +454 -0
- docs/image_folder_structure.md +59 -0
- docs/train_README-ja.md +1004 -0
- docs/train_README-zh.md +911 -0
- docs/train_db_README-ja.md +167 -0
- docs/train_db_README-zh.md +162 -0
- docs/train_network_README-ja.md +481 -0
- docs/train_network_README-zh.md +466 -0
- docs/train_ti_README-ja.md +105 -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,267 @@
|
|
1 |
-
*.
|
2 |
-
*.
|
3 |
-
*.
|
4 |
-
*.
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
5 |
+
bitsandbytes_windows/libbitsandbytes_cuda118.dll filter=lfs diff=lfs merge=lfs -text
|
6 |
+
setup.log filter=lfs diff=lfs merge=lfs -text
|
7 |
+
venv/bin/python filter=lfs diff=lfs merge=lfs -text
|
8 |
+
venv/bin/python3 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
venv/bin/python3.10 filter=lfs diff=lfs merge=lfs -text
|
10 |
+
venv/lib/python3.10/site-packages/Pillow.libs/libfreetype-cb9caf6f.so.6.19.0 filter=lfs diff=lfs merge=lfs -text
|
11 |
+
venv/lib/python3.10/site-packages/Pillow.libs/libharfbuzz-3543f599.so.0.60710.0 filter=lfs diff=lfs merge=lfs -text
|
12 |
+
venv/lib/python3.10/site-packages/aiohttp/_http_parser.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
13 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda102_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
14 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda110.so filter=lfs diff=lfs merge=lfs -text
|
15 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda110_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
16 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda111.so filter=lfs diff=lfs merge=lfs -text
|
17 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda111_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
18 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda112.so filter=lfs diff=lfs merge=lfs -text
|
19 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda112_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
20 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda113.so filter=lfs diff=lfs merge=lfs -text
|
21 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda113_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
22 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda114.so filter=lfs diff=lfs merge=lfs -text
|
23 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda114_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
24 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda115.so filter=lfs diff=lfs merge=lfs -text
|
25 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda115_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
26 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda116.so filter=lfs diff=lfs merge=lfs -text
|
27 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda116_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
28 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda117.so filter=lfs diff=lfs merge=lfs -text
|
29 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda117_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
30 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda118.so filter=lfs diff=lfs merge=lfs -text
|
31 |
+
venv/lib/python3.10/site-packages/bitsandbytes/libbitsandbytes_cuda118_nocublaslt.so filter=lfs diff=lfs merge=lfs -text
|
32 |
+
venv/lib/python3.10/site-packages/clang/native/libclang.so filter=lfs diff=lfs merge=lfs -text
|
33 |
+
venv/lib/python3.10/site-packages/cmake/data/bin/cmake filter=lfs diff=lfs merge=lfs -text
|
34 |
+
venv/lib/python3.10/site-packages/cmake/data/bin/cpack filter=lfs diff=lfs merge=lfs -text
|
35 |
+
venv/lib/python3.10/site-packages/cmake/data/bin/ctest filter=lfs diff=lfs merge=lfs -text
|
36 |
+
venv/lib/python3.10/site-packages/cv2/cv2.abi3.so filter=lfs diff=lfs merge=lfs -text
|
37 |
+
venv/lib/python3.10/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz filter=lfs diff=lfs merge=lfs -text
|
38 |
+
venv/lib/python3.10/site-packages/distutils-precedence.pth filter=lfs diff=lfs merge=lfs -text
|
39 |
+
venv/lib/python3.10/site-packages/fontTools/feaLib/lexer.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
40 |
+
venv/lib/python3.10/site-packages/fontTools/misc/bezierTools.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
41 |
+
venv/lib/python3.10/site-packages/fontTools/pens/momentsPen.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
42 |
+
venv/lib/python3.10/site-packages/fontTools/qu2cu/qu2cu.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
43 |
+
venv/lib/python3.10/site-packages/fontTools/varLib/iup.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
44 |
+
venv/lib/python3.10/site-packages/google/protobuf/pyext/_message.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
45 |
+
venv/lib/python3.10/site-packages/gradio/frpc_linux_amd64_v0.2 filter=lfs diff=lfs merge=lfs -text
|
46 |
+
venv/lib/python3.10/site-packages/gradio/templates/cdn/assets/index-905fdf08.js.map filter=lfs diff=lfs merge=lfs -text
|
47 |
+
venv/lib/python3.10/site-packages/gradio/templates/frontend/assets/index-229f876f.js.map filter=lfs diff=lfs merge=lfs -text
|
48 |
+
venv/lib/python3.10/site-packages/grpc/_cython/cygrpc.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
49 |
+
venv/lib/python3.10/site-packages/h5py/h5t.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
50 |
+
venv/lib/python3.10/site-packages/h5py/tests/data_files/vlen_string_dset.h5 filter=lfs diff=lfs merge=lfs -text
|
51 |
+
venv/lib/python3.10/site-packages/h5py/tests/data_files/vlen_string_dset_utc.h5 filter=lfs diff=lfs merge=lfs -text
|
52 |
+
venv/lib/python3.10/site-packages/h5py/tests/data_files/vlen_string_s390x.h5 filter=lfs diff=lfs merge=lfs -text
|
53 |
+
venv/lib/python3.10/site-packages/h5py.libs/libhdf5-45610c27.so.200.2.0 filter=lfs diff=lfs merge=lfs -text
|
54 |
+
venv/lib/python3.10/site-packages/imwatermark/rivagan_decoder.onnx filter=lfs diff=lfs merge=lfs -text
|
55 |
+
venv/lib/python3.10/site-packages/imwatermark/rivagan_encoder.onnx filter=lfs diff=lfs merge=lfs -text
|
56 |
+
venv/lib/python3.10/site-packages/kiwisolver/_cext.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
57 |
+
venv/lib/python3.10/site-packages/library.pth filter=lfs diff=lfs merge=lfs -text
|
58 |
+
venv/lib/python3.10/site-packages/matplotlib/_image.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
59 |
+
venv/lib/python3.10/site-packages/matplotlib/_path.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
60 |
+
venv/lib/python3.10/site-packages/matplotlib/_qhull.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
61 |
+
venv/lib/python3.10/site-packages/matplotlib/backends/_backend_agg.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
62 |
+
venv/lib/python3.10/site-packages/matplotlib/ft2font.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
63 |
+
venv/lib/python3.10/site-packages/matplotlib/mpl-data/sample_data/axes_grid/bivariate_normal.npy filter=lfs diff=lfs merge=lfs -text
|
64 |
+
venv/lib/python3.10/site-packages/matplotlib/mpl-data/sample_data/goog.npz filter=lfs diff=lfs merge=lfs -text
|
65 |
+
venv/lib/python3.10/site-packages/matplotlib/mpl-data/sample_data/jacksboro_fault_dem.npz filter=lfs diff=lfs merge=lfs -text
|
66 |
+
venv/lib/python3.10/site-packages/matplotlib/mpl-data/sample_data/s1045.ima.gz filter=lfs diff=lfs merge=lfs -text
|
67 |
+
venv/lib/python3.10/site-packages/matplotlib/mpl-data/sample_data/topobathy.npz filter=lfs diff=lfs merge=lfs -text
|
68 |
+
venv/lib/python3.10/site-packages/matplotlib-3.7.2-py3.10-nspkg.pth filter=lfs diff=lfs merge=lfs -text
|
69 |
+
venv/lib/python3.10/site-packages/networkx/algorithms/flow/tests/gl1.gpickle.bz2 filter=lfs diff=lfs merge=lfs -text
|
70 |
+
venv/lib/python3.10/site-packages/networkx/algorithms/flow/tests/gw1.gpickle.bz2 filter=lfs diff=lfs merge=lfs -text
|
71 |
+
venv/lib/python3.10/site-packages/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 filter=lfs diff=lfs merge=lfs -text
|
72 |
+
venv/lib/python3.10/site-packages/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 filter=lfs diff=lfs merge=lfs -text
|
73 |
+
venv/lib/python3.10/site-packages/networkx/generators/atlas.dat.gz filter=lfs diff=lfs merge=lfs -text
|
74 |
+
venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
75 |
+
venv/lib/python3.10/site-packages/numpy/core/_simd.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
76 |
+
venv/lib/python3.10/site-packages/numpy/core/tests/data/astype_copy.pkl filter=lfs diff=lfs merge=lfs -text
|
77 |
+
venv/lib/python3.10/site-packages/numpy/lib/tests/data/py2-objarr.npy filter=lfs diff=lfs merge=lfs -text
|
78 |
+
venv/lib/python3.10/site-packages/numpy/lib/tests/data/py2-objarr.npz filter=lfs diff=lfs merge=lfs -text
|
79 |
+
venv/lib/python3.10/site-packages/numpy/lib/tests/data/py3-objarr.npy filter=lfs diff=lfs merge=lfs -text
|
80 |
+
venv/lib/python3.10/site-packages/numpy/lib/tests/data/py3-objarr.npz filter=lfs diff=lfs merge=lfs -text
|
81 |
+
venv/lib/python3.10/site-packages/numpy/lib/tests/data/python3.npy filter=lfs diff=lfs merge=lfs -text
|
82 |
+
venv/lib/python3.10/site-packages/numpy/lib/tests/data/win64python2.npy filter=lfs diff=lfs merge=lfs -text
|
83 |
+
venv/lib/python3.10/site-packages/numpy/random/_generator.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
84 |
+
venv/lib/python3.10/site-packages/numpy.libs/libgfortran-040039e1.so.5.0.0 filter=lfs diff=lfs merge=lfs -text
|
85 |
+
venv/lib/python3.10/site-packages/numpy.libs/libopenblas64_p-r0-742d56dc.3.20.so filter=lfs diff=lfs merge=lfs -text
|
86 |
+
venv/lib/python3.10/site-packages/nvfuser/_C.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
87 |
+
venv/lib/python3.10/site-packages/nvidia/cublas/lib/libcublas.so.12 filter=lfs diff=lfs merge=lfs -text
|
88 |
+
venv/lib/python3.10/site-packages/nvidia/cublas/lib/libcublasLt.so.12 filter=lfs diff=lfs merge=lfs -text
|
89 |
+
venv/lib/python3.10/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc-builtins.so.12.2 filter=lfs diff=lfs merge=lfs -text
|
90 |
+
venv/lib/python3.10/site-packages/nvidia/cuda_nvrtc/lib/libnvrtc.so.12 filter=lfs diff=lfs merge=lfs -text
|
91 |
+
venv/lib/python3.10/site-packages/nvidia/cudnn/lib/libcudnn_adv_infer.so.8 filter=lfs diff=lfs merge=lfs -text
|
92 |
+
venv/lib/python3.10/site-packages/nvidia/cudnn/lib/libcudnn_adv_train.so.8 filter=lfs diff=lfs merge=lfs -text
|
93 |
+
venv/lib/python3.10/site-packages/nvidia/cudnn/lib/libcudnn_cnn_infer.so.8 filter=lfs diff=lfs merge=lfs -text
|
94 |
+
venv/lib/python3.10/site-packages/nvidia/cudnn/lib/libcudnn_cnn_train.so.8 filter=lfs diff=lfs merge=lfs -text
|
95 |
+
venv/lib/python3.10/site-packages/nvidia/cudnn/lib/libcudnn_ops_infer.so.8 filter=lfs diff=lfs merge=lfs -text
|
96 |
+
venv/lib/python3.10/site-packages/nvidia/cudnn/lib/libcudnn_ops_train.so.8 filter=lfs diff=lfs merge=lfs -text
|
97 |
+
venv/lib/python3.10/site-packages/open_clip/bpe_simple_vocab_16e6.txt.gz filter=lfs diff=lfs merge=lfs -text
|
98 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libQt5Core-b6e66ee2.so.5.15.0 filter=lfs diff=lfs merge=lfs -text
|
99 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libQt5Gui-dd62182f.so.5.15.0 filter=lfs diff=lfs merge=lfs -text
|
100 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libQt5Widgets-e69d94fb.so.5.15.0 filter=lfs diff=lfs merge=lfs -text
|
101 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libQt5XcbQpa-dcb826d0.so.5.15.0 filter=lfs diff=lfs merge=lfs -text
|
102 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libavcodec-087c3416.so.59.37.100 filter=lfs diff=lfs merge=lfs -text
|
103 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libavformat-85e01647.so.59.27.100 filter=lfs diff=lfs merge=lfs -text
|
104 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libcrypto-9cee340d.so.1.1 filter=lfs diff=lfs merge=lfs -text
|
105 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libgfortran-91cc3cb1.so.3.0.0 filter=lfs diff=lfs merge=lfs -text
|
106 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libopenblas-r0-f650aae0.3.3.so filter=lfs diff=lfs merge=lfs -text
|
107 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libpng16-186fce2e.so.16.37.0 filter=lfs diff=lfs merge=lfs -text
|
108 |
+
venv/lib/python3.10/site-packages/opencv_python.libs/libvpx-5d0a9e1a.so.7.1.0 filter=lfs diff=lfs merge=lfs -text
|
109 |
+
venv/lib/python3.10/site-packages/pandas/_libs/algos.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
110 |
+
venv/lib/python3.10/site-packages/pandas/_libs/groupby.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
111 |
+
venv/lib/python3.10/site-packages/pandas/_libs/hashtable.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
112 |
+
venv/lib/python3.10/site-packages/pandas/_libs/interval.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
113 |
+
venv/lib/python3.10/site-packages/pandas/_libs/join.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
114 |
+
venv/lib/python3.10/site-packages/pandas/tests/io/data/legacy_pickle/1.2.4/empty_frame_v1_2_4-GH\#42345.pkl filter=lfs diff=lfs merge=lfs -text
|
115 |
+
venv/lib/python3.10/site-packages/pandas/tests/io/data/parquet/simple.parquet filter=lfs diff=lfs merge=lfs -text
|
116 |
+
venv/lib/python3.10/site-packages/pandas/tests/io/data/pickle/test_mi_py27.pkl filter=lfs diff=lfs merge=lfs -text
|
117 |
+
venv/lib/python3.10/site-packages/pandas/tests/io/data/pickle/test_py27.pkl filter=lfs diff=lfs merge=lfs -text
|
118 |
+
venv/lib/python3.10/site-packages/protobuf-3.20.3-py3.10-nspkg.pth filter=lfs diff=lfs merge=lfs -text
|
119 |
+
venv/lib/python3.10/site-packages/pywt/_extensions/_cwt.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
120 |
+
venv/lib/python3.10/site-packages/pywt/_extensions/_dwt.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
121 |
+
venv/lib/python3.10/site-packages/pywt/_extensions/_pywt.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
122 |
+
venv/lib/python3.10/site-packages/pywt/_extensions/_swt.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
123 |
+
venv/lib/python3.10/site-packages/pywt/data/aero.npz filter=lfs diff=lfs merge=lfs -text
|
124 |
+
venv/lib/python3.10/site-packages/pywt/data/ascent.npz filter=lfs diff=lfs merge=lfs -text
|
125 |
+
venv/lib/python3.10/site-packages/pywt/data/camera.npz filter=lfs diff=lfs merge=lfs -text
|
126 |
+
venv/lib/python3.10/site-packages/pywt/data/ecg.npy filter=lfs diff=lfs merge=lfs -text
|
127 |
+
venv/lib/python3.10/site-packages/pywt/data/sst_nino3.npz filter=lfs diff=lfs merge=lfs -text
|
128 |
+
venv/lib/python3.10/site-packages/pywt/tests/data/cwt_matlabR2015b_result.npz filter=lfs diff=lfs merge=lfs -text
|
129 |
+
venv/lib/python3.10/site-packages/pywt/tests/data/dwt_matlabR2012a_result.npz filter=lfs diff=lfs merge=lfs -text
|
130 |
+
venv/lib/python3.10/site-packages/pywt/tests/data/wavelab_test_signals.npz filter=lfs diff=lfs merge=lfs -text
|
131 |
+
venv/lib/python3.10/site-packages/regex/_regex.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
132 |
+
venv/lib/python3.10/site-packages/rpds/rpds.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
133 |
+
venv/lib/python3.10/site-packages/safetensors/_safetensors_rust.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
134 |
+
venv/lib/python3.10/site-packages/scipy/fft/_pocketfft/pypocketfft.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
135 |
+
venv/lib/python3.10/site-packages/scipy/fftpack/tests/fftw_double_ref.npz filter=lfs diff=lfs merge=lfs -text
|
136 |
+
venv/lib/python3.10/site-packages/scipy/fftpack/tests/fftw_longdouble_ref.npz filter=lfs diff=lfs merge=lfs -text
|
137 |
+
venv/lib/python3.10/site-packages/scipy/fftpack/tests/fftw_single_ref.npz filter=lfs diff=lfs merge=lfs -text
|
138 |
+
venv/lib/python3.10/site-packages/scipy/fftpack/tests/test.npz filter=lfs diff=lfs merge=lfs -text
|
139 |
+
venv/lib/python3.10/site-packages/scipy/interpolate/tests/data/bug-1310.npz filter=lfs diff=lfs merge=lfs -text
|
140 |
+
venv/lib/python3.10/site-packages/scipy/interpolate/tests/data/estimate_gradients_hang.npy filter=lfs diff=lfs merge=lfs -text
|
141 |
+
venv/lib/python3.10/site-packages/scipy/interpolate/tests/data/gcvspl.npz filter=lfs diff=lfs merge=lfs -text
|
142 |
+
venv/lib/python3.10/site-packages/scipy/linalg/_flapack.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
143 |
+
venv/lib/python3.10/site-packages/scipy/linalg/tests/data/carex_15_data.npz filter=lfs diff=lfs merge=lfs -text
|
144 |
+
venv/lib/python3.10/site-packages/scipy/linalg/tests/data/carex_18_data.npz filter=lfs diff=lfs merge=lfs -text
|
145 |
+
venv/lib/python3.10/site-packages/scipy/linalg/tests/data/carex_19_data.npz filter=lfs diff=lfs merge=lfs -text
|
146 |
+
venv/lib/python3.10/site-packages/scipy/linalg/tests/data/carex_20_data.npz filter=lfs diff=lfs merge=lfs -text
|
147 |
+
venv/lib/python3.10/site-packages/scipy/linalg/tests/data/carex_6_data.npz filter=lfs diff=lfs merge=lfs -text
|
148 |
+
venv/lib/python3.10/site-packages/scipy/linalg/tests/data/gendare_20170120_data.npz filter=lfs diff=lfs merge=lfs -text
|
149 |
+
venv/lib/python3.10/site-packages/scipy/misc/face.dat filter=lfs diff=lfs merge=lfs -text
|
150 |
+
venv/lib/python3.10/site-packages/scipy/optimize/_highs/_highs_wrapper.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
151 |
+
venv/lib/python3.10/site-packages/scipy/sparse/_sparsetools.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
152 |
+
venv/lib/python3.10/site-packages/scipy/sparse/linalg/tests/propack_test_data.npz filter=lfs diff=lfs merge=lfs -text
|
153 |
+
venv/lib/python3.10/site-packages/scipy/sparse/tests/data/csc_py2.npz filter=lfs diff=lfs merge=lfs -text
|
154 |
+
venv/lib/python3.10/site-packages/scipy/sparse/tests/data/csc_py3.npz filter=lfs diff=lfs merge=lfs -text
|
155 |
+
venv/lib/python3.10/site-packages/scipy/spatial/_ckdtree.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
156 |
+
venv/lib/python3.10/site-packages/scipy/spatial/_qhull.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
157 |
+
venv/lib/python3.10/site-packages/scipy/spatial/tests/data/degenerate_pointset.npz filter=lfs diff=lfs merge=lfs -text
|
158 |
+
venv/lib/python3.10/site-packages/scipy/special/_ufuncs.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
159 |
+
venv/lib/python3.10/site-packages/scipy/special/cython_special.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
160 |
+
venv/lib/python3.10/site-packages/scipy/special/tests/data/boost.npz filter=lfs diff=lfs merge=lfs -text
|
161 |
+
venv/lib/python3.10/site-packages/scipy/special/tests/data/gsl.npz filter=lfs diff=lfs merge=lfs -text
|
162 |
+
venv/lib/python3.10/site-packages/scipy/special/tests/data/local.npz filter=lfs diff=lfs merge=lfs -text
|
163 |
+
venv/lib/python3.10/site-packages/scipy/stats/_sobol_direction_numbers.npz filter=lfs diff=lfs merge=lfs -text
|
164 |
+
venv/lib/python3.10/site-packages/scipy/stats/_unuran/unuran_wrapper.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
165 |
+
venv/lib/python3.10/site-packages/scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy filter=lfs diff=lfs merge=lfs -text
|
166 |
+
venv/lib/python3.10/site-packages/scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy filter=lfs diff=lfs merge=lfs -text
|
167 |
+
venv/lib/python3.10/site-packages/scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy filter=lfs diff=lfs merge=lfs -text
|
168 |
+
venv/lib/python3.10/site-packages/scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy filter=lfs diff=lfs merge=lfs -text
|
169 |
+
venv/lib/python3.10/site-packages/scipy.libs/libgfortran-040039e1.so.5.0.0 filter=lfs diff=lfs merge=lfs -text
|
170 |
+
venv/lib/python3.10/site-packages/scipy.libs/libopenblasp-r0-23e5df77.3.21.dev.so filter=lfs diff=lfs merge=lfs -text
|
171 |
+
venv/lib/python3.10/site-packages/sentencepiece/_sentencepiece.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
172 |
+
venv/lib/python3.10/site-packages/tensorboard/webfiles.zip filter=lfs diff=lfs merge=lfs -text
|
173 |
+
venv/lib/python3.10/site-packages/tensorboard_data_server/bin/server filter=lfs diff=lfs merge=lfs -text
|
174 |
+
venv/lib/python3.10/site-packages/tensorflow/compiler/tf2tensorrt/_pywrap_py_utils.so filter=lfs diff=lfs merge=lfs -text
|
175 |
+
venv/lib/python3.10/site-packages/tensorflow/compiler/tf2xla/ops/_xla_ops.so filter=lfs diff=lfs merge=lfs -text
|
176 |
+
venv/lib/python3.10/site-packages/tensorflow/core/kernels/libtfkernel_sobol_op.so filter=lfs diff=lfs merge=lfs -text
|
177 |
+
venv/lib/python3.10/site-packages/tensorflow/libtensorflow_cc.so.2 filter=lfs diff=lfs merge=lfs -text
|
178 |
+
venv/lib/python3.10/site-packages/tensorflow/libtensorflow_framework.so.2 filter=lfs diff=lfs merge=lfs -text
|
179 |
+
venv/lib/python3.10/site-packages/tensorflow/lite/experimental/microfrontend/python/ops/_audio_microfrontend_op.so filter=lfs diff=lfs merge=lfs -text
|
180 |
+
venv/lib/python3.10/site-packages/tensorflow/lite/python/analyzer_wrapper/_pywrap_analyzer_wrapper.so filter=lfs diff=lfs merge=lfs -text
|
181 |
+
venv/lib/python3.10/site-packages/tensorflow/lite/python/interpreter_wrapper/_pywrap_tensorflow_interpreter_wrapper.so filter=lfs diff=lfs merge=lfs -text
|
182 |
+
venv/lib/python3.10/site-packages/tensorflow/lite/python/metrics/_pywrap_tensorflow_lite_metrics_wrapper.so filter=lfs diff=lfs merge=lfs -text
|
183 |
+
venv/lib/python3.10/site-packages/tensorflow/lite/python/optimize/_pywrap_tensorflow_lite_calibration_wrapper.so filter=lfs diff=lfs merge=lfs -text
|
184 |
+
venv/lib/python3.10/site-packages/tensorflow/python/_pywrap_mlir.so filter=lfs diff=lfs merge=lfs -text
|
185 |
+
venv/lib/python3.10/site-packages/tensorflow/python/_pywrap_parallel_device.so filter=lfs diff=lfs merge=lfs -text
|
186 |
+
venv/lib/python3.10/site-packages/tensorflow/python/_pywrap_py_exception_registry.so filter=lfs diff=lfs merge=lfs -text
|
187 |
+
venv/lib/python3.10/site-packages/tensorflow/python/_pywrap_quantize_training.so filter=lfs diff=lfs merge=lfs -text
|
188 |
+
venv/lib/python3.10/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so filter=lfs diff=lfs merge=lfs -text
|
189 |
+
venv/lib/python3.10/site-packages/tensorflow/python/_pywrap_tfcompile.so filter=lfs diff=lfs merge=lfs -text
|
190 |
+
venv/lib/python3.10/site-packages/tensorflow/python/_pywrap_tfe.so filter=lfs diff=lfs merge=lfs -text
|
191 |
+
venv/lib/python3.10/site-packages/tensorflow/python/autograph/impl/testing/pybind_for_testing.so filter=lfs diff=lfs merge=lfs -text
|
192 |
+
venv/lib/python3.10/site-packages/tensorflow/python/client/_pywrap_debug_events_writer.so filter=lfs diff=lfs merge=lfs -text
|
193 |
+
venv/lib/python3.10/site-packages/tensorflow/python/client/_pywrap_device_lib.so filter=lfs diff=lfs merge=lfs -text
|
194 |
+
venv/lib/python3.10/site-packages/tensorflow/python/client/_pywrap_events_writer.so filter=lfs diff=lfs merge=lfs -text
|
195 |
+
venv/lib/python3.10/site-packages/tensorflow/python/client/_pywrap_tf_session.so filter=lfs diff=lfs merge=lfs -text
|
196 |
+
venv/lib/python3.10/site-packages/tensorflow/python/data/experimental/service/_pywrap_server_lib.so filter=lfs diff=lfs merge=lfs -text
|
197 |
+
venv/lib/python3.10/site-packages/tensorflow/python/data/experimental/service/_pywrap_utils.so filter=lfs diff=lfs merge=lfs -text
|
198 |
+
venv/lib/python3.10/site-packages/tensorflow/python/flags_pybind.so filter=lfs diff=lfs merge=lfs -text
|
199 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_errors_test_helper.so filter=lfs diff=lfs merge=lfs -text
|
200 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_op_def_library_pybind.so filter=lfs diff=lfs merge=lfs -text
|
201 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_op_def_registry.so filter=lfs diff=lfs merge=lfs -text
|
202 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_op_def_util.so filter=lfs diff=lfs merge=lfs -text
|
203 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_proto_comparators.so filter=lfs diff=lfs merge=lfs -text
|
204 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_pywrap_python_api_dispatcher.so filter=lfs diff=lfs merge=lfs -text
|
205 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_pywrap_python_api_info.so filter=lfs diff=lfs merge=lfs -text
|
206 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_pywrap_python_api_parameter_converter.so filter=lfs diff=lfs merge=lfs -text
|
207 |
+
venv/lib/python3.10/site-packages/tensorflow/python/framework/_test_metrics_util.so filter=lfs diff=lfs merge=lfs -text
|
208 |
+
venv/lib/python3.10/site-packages/tensorflow/python/grappler/_pywrap_tf_cluster.so filter=lfs diff=lfs merge=lfs -text
|
209 |
+
venv/lib/python3.10/site-packages/tensorflow/python/grappler/_pywrap_tf_item.so filter=lfs diff=lfs merge=lfs -text
|
210 |
+
venv/lib/python3.10/site-packages/tensorflow/python/grappler/_pywrap_tf_optimizer.so filter=lfs diff=lfs merge=lfs -text
|
211 |
+
venv/lib/python3.10/site-packages/tensorflow/python/lib/io/_pywrap_file_io.so filter=lfs diff=lfs merge=lfs -text
|
212 |
+
venv/lib/python3.10/site-packages/tensorflow/python/lib/io/_pywrap_record_io.so filter=lfs diff=lfs merge=lfs -text
|
213 |
+
venv/lib/python3.10/site-packages/tensorflow/python/platform/_pywrap_tf2.so filter=lfs diff=lfs merge=lfs -text
|
214 |
+
venv/lib/python3.10/site-packages/tensorflow/python/profiler/internal/_pywrap_profiler.so filter=lfs diff=lfs merge=lfs -text
|
215 |
+
venv/lib/python3.10/site-packages/tensorflow/python/saved_model/pywrap_saved_model.so filter=lfs diff=lfs merge=lfs -text
|
216 |
+
venv/lib/python3.10/site-packages/tensorflow/python/util/_pywrap_checkpoint_reader.so filter=lfs diff=lfs merge=lfs -text
|
217 |
+
venv/lib/python3.10/site-packages/tensorflow/python/util/_pywrap_kernel_registry.so filter=lfs diff=lfs merge=lfs -text
|
218 |
+
venv/lib/python3.10/site-packages/tensorflow/python/util/_pywrap_stat_summarizer.so filter=lfs diff=lfs merge=lfs -text
|
219 |
+
venv/lib/python3.10/site-packages/tensorflow/python/util/_pywrap_tfprof.so filter=lfs diff=lfs merge=lfs -text
|
220 |
+
venv/lib/python3.10/site-packages/tensorflow/python/util/_pywrap_transform_graph.so filter=lfs diff=lfs merge=lfs -text
|
221 |
+
venv/lib/python3.10/site-packages/tensorflow/python/util/_pywrap_util_port.so filter=lfs diff=lfs merge=lfs -text
|
222 |
+
venv/lib/python3.10/site-packages/tensorflow/python/util/_pywrap_utils.so filter=lfs diff=lfs merge=lfs -text
|
223 |
+
venv/lib/python3.10/site-packages/tensorflow/python/util/_tf_stack.so filter=lfs diff=lfs merge=lfs -text
|
224 |
+
venv/lib/python3.10/site-packages/tensorflow_io_gcs_filesystem/core/python/ops/libtensorflow_io_gcs_filesystem.so filter=lfs diff=lfs merge=lfs -text
|
225 |
+
venv/lib/python3.10/site-packages/tensorrt_bindings/tensorrt.so filter=lfs diff=lfs merge=lfs -text
|
226 |
+
venv/lib/python3.10/site-packages/tensorrt_libs/libnvinfer.so.8 filter=lfs diff=lfs merge=lfs -text
|
227 |
+
venv/lib/python3.10/site-packages/tensorrt_libs/libnvinfer_builder_resource.so.8.6.1 filter=lfs diff=lfs merge=lfs -text
|
228 |
+
venv/lib/python3.10/site-packages/tensorrt_libs/libnvinfer_plugin.so.8 filter=lfs diff=lfs merge=lfs -text
|
229 |
+
venv/lib/python3.10/site-packages/tensorrt_libs/libnvonnxparser.so.8 filter=lfs diff=lfs merge=lfs -text
|
230 |
+
venv/lib/python3.10/site-packages/tensorrt_libs/libnvparsers.so.8 filter=lfs diff=lfs merge=lfs -text
|
231 |
+
venv/lib/python3.10/site-packages/tokenizers/tokenizers.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
232 |
+
venv/lib/python3.10/site-packages/tokenizers.libs/libcrypto-d3570994.so.1.0.2k filter=lfs diff=lfs merge=lfs -text
|
233 |
+
venv/lib/python3.10/site-packages/tokenizers.libs/libkrb5-fcafa220.so.3.3 filter=lfs diff=lfs merge=lfs -text
|
234 |
+
venv/lib/python3.10/site-packages/torch/bin/nvfuser_tests filter=lfs diff=lfs merge=lfs -text
|
235 |
+
venv/lib/python3.10/site-packages/torch/bin/protoc filter=lfs diff=lfs merge=lfs -text
|
236 |
+
venv/lib/python3.10/site-packages/torch/bin/protoc-3.13.0.0 filter=lfs diff=lfs merge=lfs -text
|
237 |
+
venv/lib/python3.10/site-packages/torch/lib/libc10_cuda.so filter=lfs diff=lfs merge=lfs -text
|
238 |
+
venv/lib/python3.10/site-packages/torch/lib/libcublas.so.11 filter=lfs diff=lfs merge=lfs -text
|
239 |
+
venv/lib/python3.10/site-packages/torch/lib/libcublasLt.so.11 filter=lfs diff=lfs merge=lfs -text
|
240 |
+
venv/lib/python3.10/site-packages/torch/lib/libcudnn_adv_infer.so.8 filter=lfs diff=lfs merge=lfs -text
|
241 |
+
venv/lib/python3.10/site-packages/torch/lib/libcudnn_adv_train.so.8 filter=lfs diff=lfs merge=lfs -text
|
242 |
+
venv/lib/python3.10/site-packages/torch/lib/libcudnn_cnn_infer.so.8 filter=lfs diff=lfs merge=lfs -text
|
243 |
+
venv/lib/python3.10/site-packages/torch/lib/libcudnn_cnn_train.so.8 filter=lfs diff=lfs merge=lfs -text
|
244 |
+
venv/lib/python3.10/site-packages/torch/lib/libcudnn_ops_infer.so.8 filter=lfs diff=lfs merge=lfs -text
|
245 |
+
venv/lib/python3.10/site-packages/torch/lib/libcudnn_ops_train.so.8 filter=lfs diff=lfs merge=lfs -text
|
246 |
+
venv/lib/python3.10/site-packages/torch/lib/libnvfuser_codegen.so filter=lfs diff=lfs merge=lfs -text
|
247 |
+
venv/lib/python3.10/site-packages/torch/lib/libnvrtc-672ee683.so.11.2 filter=lfs diff=lfs merge=lfs -text
|
248 |
+
venv/lib/python3.10/site-packages/torch/lib/libnvrtc-builtins.so.11.8 filter=lfs diff=lfs merge=lfs -text
|
249 |
+
venv/lib/python3.10/site-packages/torch/lib/libtorch_cpu.so filter=lfs diff=lfs merge=lfs -text
|
250 |
+
venv/lib/python3.10/site-packages/torch/lib/libtorch_cuda.so filter=lfs diff=lfs merge=lfs -text
|
251 |
+
venv/lib/python3.10/site-packages/torch/lib/libtorch_cuda_linalg.so filter=lfs diff=lfs merge=lfs -text
|
252 |
+
venv/lib/python3.10/site-packages/torch/lib/libtorch_python.so filter=lfs diff=lfs merge=lfs -text
|
253 |
+
venv/lib/python3.10/site-packages/torchmetrics/functional/image/lpips_models/alex.pth filter=lfs diff=lfs merge=lfs -text
|
254 |
+
venv/lib/python3.10/site-packages/torchmetrics/functional/image/lpips_models/squeeze.pth filter=lfs diff=lfs merge=lfs -text
|
255 |
+
venv/lib/python3.10/site-packages/torchmetrics/functional/image/lpips_models/vgg.pth filter=lfs diff=lfs merge=lfs -text
|
256 |
+
venv/lib/python3.10/site-packages/torchvision/_C.so filter=lfs diff=lfs merge=lfs -text
|
257 |
+
venv/lib/python3.10/site-packages/torchvision.libs/libnvjpeg.70530407.so.11 filter=lfs diff=lfs merge=lfs -text
|
258 |
+
venv/lib/python3.10/site-packages/torchvision.libs/libpng16.7f72a3c5.so.16 filter=lfs diff=lfs merge=lfs -text
|
259 |
+
venv/lib/python3.10/site-packages/triton/_C/libtriton.so filter=lfs diff=lfs merge=lfs -text
|
260 |
+
venv/lib/python3.10/site-packages/triton/third_party/cuda/bin/ptxas filter=lfs diff=lfs merge=lfs -text
|
261 |
+
venv/lib/python3.10/site-packages/xformers/_C.so filter=lfs diff=lfs merge=lfs -text
|
262 |
+
venv/lib/python3.10/site-packages/xformers/_C_flashattention.so filter=lfs diff=lfs merge=lfs -text
|
263 |
+
venv/lib/python3.10/site-packages/yaml/_yaml.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
264 |
+
venv/share/doc/networkx-3.1/examples/drawing/chess_masters_WCC.pgn.bz2 filter=lfs diff=lfs merge=lfs -text
|
265 |
+
venv/share/doc/networkx-3.1/examples/drawing/knuth_miles.txt.gz filter=lfs diff=lfs merge=lfs -text
|
266 |
+
venv/share/doc/networkx-3.1/examples/graph/roget_dat.txt.gz filter=lfs diff=lfs merge=lfs -text
|
267 |
+
venv/share/doc/networkx-3.1/examples/graph/words_dat.txt.gz 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
|
.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/*
|
.ipynb_checkpoints/fine_tune-checkpoint.py
ADDED
@@ -0,0 +1,480 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# training with captions
|
2 |
+
# XXX dropped option: hypernetwork training
|
3 |
+
|
4 |
+
import argparse
|
5 |
+
import gc
|
6 |
+
import math
|
7 |
+
import os
|
8 |
+
from multiprocessing import Value
|
9 |
+
import toml
|
10 |
+
|
11 |
+
from tqdm import tqdm
|
12 |
+
import torch
|
13 |
+
from accelerate.utils import set_seed
|
14 |
+
from diffusers import DDPMScheduler
|
15 |
+
|
16 |
+
import library.train_util as train_util
|
17 |
+
import library.config_util as config_util
|
18 |
+
from library.config_util import (
|
19 |
+
ConfigSanitizer,
|
20 |
+
BlueprintGenerator,
|
21 |
+
)
|
22 |
+
import library.custom_train_functions as custom_train_functions
|
23 |
+
from library.custom_train_functions import (
|
24 |
+
apply_snr_weight,
|
25 |
+
get_weighted_text_embeddings,
|
26 |
+
prepare_scheduler_for_custom_training,
|
27 |
+
scale_v_prediction_loss_like_noise_prediction,
|
28 |
+
)
|
29 |
+
|
30 |
+
|
31 |
+
def train(args):
|
32 |
+
train_util.verify_training_args(args)
|
33 |
+
train_util.prepare_dataset_args(args, True)
|
34 |
+
|
35 |
+
cache_latents = args.cache_latents
|
36 |
+
|
37 |
+
if args.seed is not None:
|
38 |
+
set_seed(args.seed) # 乱数系列を初期化する
|
39 |
+
|
40 |
+
tokenizer = train_util.load_tokenizer(args)
|
41 |
+
|
42 |
+
# データセットを準備する
|
43 |
+
if args.dataset_class is None:
|
44 |
+
blueprint_generator = BlueprintGenerator(ConfigSanitizer(False, True, False, True))
|
45 |
+
if args.dataset_config is not None:
|
46 |
+
print(f"Load dataset config from {args.dataset_config}")
|
47 |
+
user_config = config_util.load_user_config(args.dataset_config)
|
48 |
+
ignored = ["train_data_dir", "in_json"]
|
49 |
+
if any(getattr(args, attr) is not None for attr in ignored):
|
50 |
+
print(
|
51 |
+
"ignore following options because config file is found: {0} / 設定ファイルが利用されるため以下のオプションは無視されます: {0}".format(
|
52 |
+
", ".join(ignored)
|
53 |
+
)
|
54 |
+
)
|
55 |
+
else:
|
56 |
+
user_config = {
|
57 |
+
"datasets": [
|
58 |
+
{
|
59 |
+
"subsets": [
|
60 |
+
{
|
61 |
+
"image_dir": args.train_data_dir,
|
62 |
+
"metadata_file": args.in_json,
|
63 |
+
}
|
64 |
+
]
|
65 |
+
}
|
66 |
+
]
|
67 |
+
}
|
68 |
+
|
69 |
+
blueprint = blueprint_generator.generate(user_config, args, tokenizer=tokenizer)
|
70 |
+
train_dataset_group = config_util.generate_dataset_group_by_blueprint(blueprint.dataset_group)
|
71 |
+
else:
|
72 |
+
train_dataset_group = train_util.load_arbitrary_dataset(args, tokenizer)
|
73 |
+
|
74 |
+
current_epoch = Value("i", 0)
|
75 |
+
current_step = Value("i", 0)
|
76 |
+
ds_for_collater = train_dataset_group if args.max_data_loader_n_workers == 0 else None
|
77 |
+
collater = train_util.collater_class(current_epoch, current_step, ds_for_collater)
|
78 |
+
|
79 |
+
if args.debug_dataset:
|
80 |
+
train_util.debug_dataset(train_dataset_group)
|
81 |
+
return
|
82 |
+
if len(train_dataset_group) == 0:
|
83 |
+
print(
|
84 |
+
"No data found. Please verify the metadata file and train_data_dir option. / 画像がありません。メタデータおよびtrain_data_dirオプションを確認してください。"
|
85 |
+
)
|
86 |
+
return
|
87 |
+
|
88 |
+
if cache_latents:
|
89 |
+
assert (
|
90 |
+
train_dataset_group.is_latent_cacheable()
|
91 |
+
), "when caching latents, either color_aug or random_crop cannot be used / latentをキャッシュするときはcolor_augとrandom_cropは使えません"
|
92 |
+
|
93 |
+
# acceleratorを準備する
|
94 |
+
print("prepare accelerator")
|
95 |
+
accelerator = train_util.prepare_accelerator(args)
|
96 |
+
|
97 |
+
# mixed precisionに対応した型を用意しておき適宜castする
|
98 |
+
weight_dtype, save_dtype = train_util.prepare_dtype(args)
|
99 |
+
|
100 |
+
# モデルを読み込む
|
101 |
+
text_encoder, vae, unet, load_stable_diffusion_format = train_util.load_target_model(args, weight_dtype, accelerator)
|
102 |
+
|
103 |
+
# verify load/save model formats
|
104 |
+
if load_stable_diffusion_format:
|
105 |
+
src_stable_diffusion_ckpt = args.pretrained_model_name_or_path
|
106 |
+
src_diffusers_model_path = None
|
107 |
+
else:
|
108 |
+
src_stable_diffusion_ckpt = None
|
109 |
+
src_diffusers_model_path = args.pretrained_model_name_or_path
|
110 |
+
|
111 |
+
if args.save_model_as is None:
|
112 |
+
save_stable_diffusion_format = load_stable_diffusion_format
|
113 |
+
use_safetensors = args.use_safetensors
|
114 |
+
else:
|
115 |
+
save_stable_diffusion_format = args.save_model_as.lower() == "ckpt" or args.save_model_as.lower() == "safetensors"
|
116 |
+
use_safetensors = args.use_safetensors or ("safetensors" in args.save_model_as.lower())
|
117 |
+
|
118 |
+
# Diffusers版のxformers使用フラグを設定する関数
|
119 |
+
def set_diffusers_xformers_flag(model, valid):
|
120 |
+
# model.set_use_memory_efficient_attention_xformers(valid) # 次のリリースでなくなりそう
|
121 |
+
# pipeが自動で再帰的にset_use_memory_efficient_attention_xformersを探すんだって(;´Д`)
|
122 |
+
# U-Netだけ使う時にはどうすればいいのか……仕方ないからコピって使うか
|
123 |
+
# 0.10.2でなんか巻き戻って個別に指定するようになった(;^ω^)
|
124 |
+
|
125 |
+
# Recursively walk through all the children.
|
126 |
+
# Any children which exposes the set_use_memory_efficient_attention_xformers method
|
127 |
+
# gets the message
|
128 |
+
def fn_recursive_set_mem_eff(module: torch.nn.Module):
|
129 |
+
if hasattr(module, "set_use_memory_efficient_attention_xformers"):
|
130 |
+
module.set_use_memory_efficient_attention_xformers(valid)
|
131 |
+
|
132 |
+
for child in module.children():
|
133 |
+
fn_recursive_set_mem_eff(child)
|
134 |
+
|
135 |
+
fn_recursive_set_mem_eff(model)
|
136 |
+
|
137 |
+
# モデルに xformers とか memory efficient attention を組み込む
|
138 |
+
if args.diffusers_xformers:
|
139 |
+
accelerator.print("Use xformers by Diffusers")
|
140 |
+
set_diffusers_xformers_flag(unet, True)
|
141 |
+
else:
|
142 |
+
# Windows版のxformersはfloatで学習できないのでxformersを使わない設定も可能にしておく必要がある
|
143 |
+
accelerator.print("Disable Diffusers' xformers")
|
144 |
+
set_diffusers_xformers_flag(unet, False)
|
145 |
+
train_util.replace_unet_modules(unet, args.mem_eff_attn, args.xformers, args.sdpa)
|
146 |
+
|
147 |
+
# 学習を準備する
|
148 |
+
if cache_latents:
|
149 |
+
vae.to(accelerator.device, dtype=weight_dtype)
|
150 |
+
vae.requires_grad_(False)
|
151 |
+
vae.eval()
|
152 |
+
with torch.no_grad():
|
153 |
+
train_dataset_group.cache_latents(vae, args.vae_batch_size, args.cache_latents_to_disk, accelerator.is_main_process)
|
154 |
+
vae.to("cpu")
|
155 |
+
if torch.cuda.is_available():
|
156 |
+
torch.cuda.empty_cache()
|
157 |
+
gc.collect()
|
158 |
+
|
159 |
+
accelerator.wait_for_everyone()
|
160 |
+
|
161 |
+
# 学習を準備する:モデルを適切な状態にする
|
162 |
+
training_models = []
|
163 |
+
if args.gradient_checkpointing:
|
164 |
+
unet.enable_gradient_checkpointing()
|
165 |
+
training_models.append(unet)
|
166 |
+
|
167 |
+
if args.train_text_encoder:
|
168 |
+
accelerator.print("enable text encoder training")
|
169 |
+
if args.gradient_checkpointing:
|
170 |
+
text_encoder.gradient_checkpointing_enable()
|
171 |
+
training_models.append(text_encoder)
|
172 |
+
else:
|
173 |
+
text_encoder.to(accelerator.device, dtype=weight_dtype)
|
174 |
+
text_encoder.requires_grad_(False) # text encoderは学習しない
|
175 |
+
if args.gradient_checkpointing:
|
176 |
+
text_encoder.gradient_checkpointing_enable()
|
177 |
+
text_encoder.train() # required for gradient_checkpointing
|
178 |
+
else:
|
179 |
+
text_encoder.eval()
|
180 |
+
|
181 |
+
if not cache_latents:
|
182 |
+
vae.requires_grad_(False)
|
183 |
+
vae.eval()
|
184 |
+
vae.to(accelerator.device, dtype=weight_dtype)
|
185 |
+
|
186 |
+
for m in training_models:
|
187 |
+
m.requires_grad_(True)
|
188 |
+
params = []
|
189 |
+
for m in training_models:
|
190 |
+
params.extend(m.parameters())
|
191 |
+
params_to_optimize = params
|
192 |
+
|
193 |
+
# 学習に必要なクラスを準備する
|
194 |
+
accelerator.print("prepare optimizer, data loader etc.")
|
195 |
+
_, _, optimizer = train_util.get_optimizer(args, trainable_params=params_to_optimize)
|
196 |
+
|
197 |
+
# dataloaderを準備する
|
198 |
+
# DataLoaderのプロセス数:0はメインプロセスになる
|
199 |
+
n_workers = min(args.max_data_loader_n_workers, os.cpu_count() - 1) # cpu_count-1 ただし最大で指定された数まで
|
200 |
+
train_dataloader = torch.utils.data.DataLoader(
|
201 |
+
train_dataset_group,
|
202 |
+
batch_size=1,
|
203 |
+
shuffle=True,
|
204 |
+
collate_fn=collater,
|
205 |
+
num_workers=n_workers,
|
206 |
+
persistent_workers=args.persistent_data_loader_workers,
|
207 |
+
)
|
208 |
+
|
209 |
+
# 学習ステップ数を計算する
|
210 |
+
if args.max_train_epochs is not None:
|
211 |
+
args.max_train_steps = args.max_train_epochs * math.ceil(
|
212 |
+
len(train_dataloader) / accelerator.num_processes / args.gradient_accumulation_steps
|
213 |
+
)
|
214 |
+
accelerator.print(f"override steps. steps for {args.max_train_epochs} epochs is / 指定エポックまでのステップ数: {args.max_train_steps}")
|
215 |
+
|
216 |
+
# データセット側にも学習ステップを送信
|
217 |
+
train_dataset_group.set_max_train_steps(args.max_train_steps)
|
218 |
+
|
219 |
+
# lr schedulerを用意する
|
220 |
+
lr_scheduler = train_util.get_scheduler_fix(args, optimizer, accelerator.num_processes)
|
221 |
+
|
222 |
+
# 実験的機能:勾配も含めたfp16学習を行う モデル全体をfp16にする
|
223 |
+
if args.full_fp16:
|
224 |
+
assert (
|
225 |
+
args.mixed_precision == "fp16"
|
226 |
+
), "full_fp16 requires mixed precision='fp16' / full_fp16を使う場合はmixed_precision='fp16'を指定してください。"
|
227 |
+
accelerator.print("enable full fp16 training.")
|
228 |
+
unet.to(weight_dtype)
|
229 |
+
text_encoder.to(weight_dtype)
|
230 |
+
|
231 |
+
# acceleratorがなんかよろしくやってくれるらしい
|
232 |
+
if args.train_text_encoder:
|
233 |
+
unet, text_encoder, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(
|
234 |
+
unet, text_encoder, optimizer, train_dataloader, lr_scheduler
|
235 |
+
)
|
236 |
+
else:
|
237 |
+
unet, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(unet, optimizer, train_dataloader, lr_scheduler)
|
238 |
+
|
239 |
+
# transform DDP after prepare
|
240 |
+
text_encoder, unet = train_util.transform_if_model_is_DDP(text_encoder, unet)
|
241 |
+
|
242 |
+
# 実験的機能:勾配も含めたfp16学習を行う PyTorchにパッチを当ててfp16でのgrad scaleを有効にする
|
243 |
+
if args.full_fp16:
|
244 |
+
train_util.patch_accelerator_for_fp16_training(accelerator)
|
245 |
+
|
246 |
+
# resumeする
|
247 |
+
train_util.resume_from_local_or_hf_if_specified(accelerator, args)
|
248 |
+
|
249 |
+
# epoch数を計算する
|
250 |
+
num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)
|
251 |
+
num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch)
|
252 |
+
if (args.save_n_epoch_ratio is not None) and (args.save_n_epoch_ratio > 0):
|
253 |
+
args.save_every_n_epochs = math.floor(num_train_epochs / args.save_n_epoch_ratio) or 1
|
254 |
+
|
255 |
+
# 学習する
|
256 |
+
total_batch_size = args.train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps
|
257 |
+
accelerator.print("running training / 学習開始")
|
258 |
+
accelerator.print(f" num examples / サンプル数: {train_dataset_group.num_train_images}")
|
259 |
+
accelerator.print(f" num batches per epoch / 1epochのバッチ数: {len(train_dataloader)}")
|
260 |
+
accelerator.print(f" num epochs / epoch数: {num_train_epochs}")
|
261 |
+
accelerator.print(f" batch size per device / バッチサイズ: {args.train_batch_size}")
|
262 |
+
accelerator.print(
|
263 |
+
f" total train batch size (with parallel & distributed & accumulation) / 総バッチサイズ(並列学習、勾配合計含む): {total_batch_size}"
|
264 |
+
)
|
265 |
+
accelerator.print(f" gradient accumulation steps / 勾配を合計するステップ数 = {args.gradient_accumulation_steps}")
|
266 |
+
accelerator.print(f" total optimization steps / 学習ステップ数: {args.max_train_steps}")
|
267 |
+
|
268 |
+
progress_bar = tqdm(range(args.max_train_steps), smoothing=0, disable=not accelerator.is_local_main_process, desc="steps")
|
269 |
+
global_step = 0
|
270 |
+
|
271 |
+
noise_scheduler = DDPMScheduler(
|
272 |
+
beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000, clip_sample=False
|
273 |
+
)
|
274 |
+
prepare_scheduler_for_custom_training(noise_scheduler, accelerator.device)
|
275 |
+
if args.zero_terminal_snr:
|
276 |
+
custom_train_functions.fix_noise_scheduler_betas_for_zero_terminal_snr(noise_scheduler)
|
277 |
+
|
278 |
+
if accelerator.is_main_process:
|
279 |
+
init_kwargs = {}
|
280 |
+
if args.log_tracker_config is not None:
|
281 |
+
init_kwargs = toml.load(args.log_tracker_config)
|
282 |
+
accelerator.init_trackers("finetuning" if args.log_tracker_name is None else args.log_tracker_name, init_kwargs=init_kwargs)
|
283 |
+
|
284 |
+
for epoch in range(num_train_epochs):
|
285 |
+
accelerator.print(f"\nepoch {epoch+1}/{num_train_epochs}")
|
286 |
+
current_epoch.value = epoch + 1
|
287 |
+
|
288 |
+
for m in training_models:
|
289 |
+
m.train()
|
290 |
+
|
291 |
+
loss_total = 0
|
292 |
+
for step, batch in enumerate(train_dataloader):
|
293 |
+
current_step.value = global_step
|
294 |
+
with accelerator.accumulate(training_models[0]): # 複数モデルに対応していない模様だがとりあえずこうしておく
|
295 |
+
with torch.no_grad():
|
296 |
+
if "latents" in batch and batch["latents"] is not None:
|
297 |
+
latents = batch["latents"].to(accelerator.device) # .to(dtype=weight_dtype)
|
298 |
+
else:
|
299 |
+
# latentに変換
|
300 |
+
latents = vae.encode(batch["images"].to(dtype=weight_dtype)).latent_dist.sample()
|
301 |
+
latents = latents * 0.18215
|
302 |
+
b_size = latents.shape[0]
|
303 |
+
|
304 |
+
with torch.set_grad_enabled(args.train_text_encoder):
|
305 |
+
# Get the text embedding for conditioning
|
306 |
+
if args.weighted_captions:
|
307 |
+
encoder_hidden_states = get_weighted_text_embeddings(
|
308 |
+
tokenizer,
|
309 |
+
text_encoder,
|
310 |
+
batch["captions"],
|
311 |
+
accelerator.device,
|
312 |
+
args.max_token_length // 75 if args.max_token_length else 1,
|
313 |
+
clip_skip=args.clip_skip,
|
314 |
+
)
|
315 |
+
else:
|
316 |
+
input_ids = batch["input_ids"].to(accelerator.device)
|
317 |
+
encoder_hidden_states = train_util.get_hidden_states(
|
318 |
+
args, input_ids, tokenizer, text_encoder, None if not args.full_fp16 else weight_dtype
|
319 |
+
)
|
320 |
+
|
321 |
+
# Sample noise, sample a random timestep for each image, and add noise to the latents,
|
322 |
+
# with noise offset and/or multires noise if specified
|
323 |
+
noise, noisy_latents, timesteps = train_util.get_noise_noisy_latents_and_timesteps(args, noise_scheduler, latents)
|
324 |
+
|
325 |
+
# Predict the noise residual
|
326 |
+
with accelerator.autocast():
|
327 |
+
noise_pred = unet(noisy_latents, timesteps, encoder_hidden_states).sample
|
328 |
+
|
329 |
+
if args.v_parameterization:
|
330 |
+
# v-parameterization training
|
331 |
+
target = noise_scheduler.get_velocity(latents, noise, timesteps)
|
332 |
+
else:
|
333 |
+
target = noise
|
334 |
+
|
335 |
+
if args.min_snr_gamma or args.scale_v_pred_loss_like_noise_pred:
|
336 |
+
# do not mean over batch dimension for snr weight or scale v-pred loss
|
337 |
+
loss = torch.nn.functional.mse_loss(noise_pred.float(), target.float(), reduction="none")
|
338 |
+
loss = loss.mean([1, 2, 3])
|
339 |
+
|
340 |
+
if args.min_snr_gamma:
|
341 |
+
loss = apply_snr_weight(loss, timesteps, noise_scheduler, args.min_snr_gamma)
|
342 |
+
if args.scale_v_pred_loss_like_noise_pred:
|
343 |
+
loss = scale_v_prediction_loss_like_noise_prediction(loss, timesteps, noise_scheduler)
|
344 |
+
|
345 |
+
loss = loss.mean() # mean over batch dimension
|
346 |
+
else:
|
347 |
+
loss = torch.nn.functional.mse_loss(noise_pred.float(), target.float(), reduction="mean")
|
348 |
+
|
349 |
+
accelerator.backward(loss)
|
350 |
+
if accelerator.sync_gradients and args.max_grad_norm != 0.0:
|
351 |
+
params_to_clip = []
|
352 |
+
for m in training_models:
|
353 |
+
params_to_clip.extend(m.parameters())
|
354 |
+
accelerator.clip_grad_norm_(params_to_clip, args.max_grad_norm)
|
355 |
+
|
356 |
+
optimizer.step()
|
357 |
+
lr_scheduler.step()
|
358 |
+
optimizer.zero_grad(set_to_none=True)
|
359 |
+
|
360 |
+
# Checks if the accelerator has performed an optimization step behind the scenes
|
361 |
+
if accelerator.sync_gradients:
|
362 |
+
progress_bar.update(1)
|
363 |
+
global_step += 1
|
364 |
+
|
365 |
+
train_util.sample_images(
|
366 |
+
accelerator, args, None, global_step, accelerator.device, vae, tokenizer, text_encoder, unet
|
367 |
+
)
|
368 |
+
|
369 |
+
# 指定ステップごとにモデルを保存
|
370 |
+
if args.save_every_n_steps is not None and global_step % args.save_every_n_steps == 0:
|
371 |
+
accelerator.wait_for_everyone()
|
372 |
+
if accelerator.is_main_process:
|
373 |
+
src_path = src_stable_diffusion_ckpt if save_stable_diffusion_format else src_diffusers_model_path
|
374 |
+
train_util.save_sd_model_on_epoch_end_or_stepwise(
|
375 |
+
args,
|
376 |
+
False,
|
377 |
+
accelerator,
|
378 |
+
src_path,
|
379 |
+
save_stable_diffusion_format,
|
380 |
+
use_safetensors,
|
381 |
+
save_dtype,
|
382 |
+
epoch,
|
383 |
+
num_train_epochs,
|
384 |
+
global_step,
|
385 |
+
accelerator.unwrap_model(text_encoder),
|
386 |
+
accelerator.unwrap_model(unet),
|
387 |
+
vae,
|
388 |
+
)
|
389 |
+
|
390 |
+
current_loss = loss.detach().item() # 平均なのでbatch sizeは関係ないはず
|
391 |
+
if args.logging_dir is not None:
|
392 |
+
logs = {"loss": current_loss, "lr": float(lr_scheduler.get_last_lr()[0])}
|
393 |
+
if (
|
394 |
+
args.optimizer_type.lower().startswith("DAdapt".lower()) or args.optimizer_type.lower() == "Prodigy".lower()
|
395 |
+
): # tracking d*lr value
|
396 |
+
logs["lr/d*lr"] = (
|
397 |
+
lr_scheduler.optimizers[0].param_groups[0]["d"] * lr_scheduler.optimizers[0].param_groups[0]["lr"]
|
398 |
+
)
|
399 |
+
accelerator.log(logs, step=global_step)
|
400 |
+
|
401 |
+
# TODO moving averageにする
|
402 |
+
loss_total += current_loss
|
403 |
+
avr_loss = loss_total / (step + 1)
|
404 |
+
logs = {"loss": avr_loss} # , "lr": lr_scheduler.get_last_lr()[0]}
|
405 |
+
progress_bar.set_postfix(**logs)
|
406 |
+
|
407 |
+
if global_step >= args.max_train_steps:
|
408 |
+
break
|
409 |
+
|
410 |
+
if args.logging_dir is not None:
|
411 |
+
logs = {"loss/epoch": loss_total / len(train_dataloader)}
|
412 |
+
accelerator.log(logs, step=epoch + 1)
|
413 |
+
|
414 |
+
accelerator.wait_for_everyone()
|
415 |
+
|
416 |
+
if args.save_every_n_epochs is not None:
|
417 |
+
if accelerator.is_main_process:
|
418 |
+
src_path = src_stable_diffusion_ckpt if save_stable_diffusion_format else src_diffusers_model_path
|
419 |
+
train_util.save_sd_model_on_epoch_end_or_stepwise(
|
420 |
+
args,
|
421 |
+
True,
|
422 |
+
accelerator,
|
423 |
+
src_path,
|
424 |
+
save_stable_diffusion_format,
|
425 |
+
use_safetensors,
|
426 |
+
save_dtype,
|
427 |
+
epoch,
|
428 |
+
num_train_epochs,
|
429 |
+
global_step,
|
430 |
+
accelerator.unwrap_model(text_encoder),
|
431 |
+
accelerator.unwrap_model(unet),
|
432 |
+
vae,
|
433 |
+
)
|
434 |
+
|
435 |
+
train_util.sample_images(accelerator, args, epoch + 1, global_step, accelerator.device, vae, tokenizer, text_encoder, unet)
|
436 |
+
|
437 |
+
is_main_process = accelerator.is_main_process
|
438 |
+
if is_main_process:
|
439 |
+
unet = accelerator.unwrap_model(unet)
|
440 |
+
text_encoder = accelerator.unwrap_model(text_encoder)
|
441 |
+
|
442 |
+
accelerator.end_training()
|
443 |
+
|
444 |
+
if args.save_state and is_main_process:
|
445 |
+
train_util.save_state_on_train_end(args, accelerator)
|
446 |
+
|
447 |
+
del accelerator # この後メモリを使うのでこれは消す
|
448 |
+
|
449 |
+
if is_main_process:
|
450 |
+
src_path = src_stable_diffusion_ckpt if save_stable_diffusion_format else src_diffusers_model_path
|
451 |
+
train_util.save_sd_model_on_train_end(
|
452 |
+
args, src_path, save_stable_diffusion_format, use_safetensors, save_dtype, epoch, global_step, text_encoder, unet, vae
|
453 |
+
)
|
454 |
+
print("model saved.")
|
455 |
+
|
456 |
+
|
457 |
+
def setup_parser() -> argparse.ArgumentParser:
|
458 |
+
parser = argparse.ArgumentParser()
|
459 |
+
|
460 |
+
train_util.add_sd_models_arguments(parser)
|
461 |
+
train_util.add_dataset_arguments(parser, False, True, True)
|
462 |
+
train_util.add_training_arguments(parser, False)
|
463 |
+
train_util.add_sd_saving_arguments(parser)
|
464 |
+
train_util.add_optimizer_arguments(parser)
|
465 |
+
config_util.add_config_arguments(parser)
|
466 |
+
custom_train_functions.add_custom_train_arguments(parser)
|
467 |
+
|
468 |
+
parser.add_argument("--diffusers_xformers", action="store_true", help="use xformers by diffusers / Diffusersでxformersを使用する")
|
469 |
+
parser.add_argument("--train_text_encoder", action="store_true", help="train text encoder / text encoderも学習する")
|
470 |
+
|
471 |
+
return parser
|
472 |
+
|
473 |
+
|
474 |
+
if __name__ == "__main__":
|
475 |
+
parser = setup_parser()
|
476 |
+
|
477 |
+
args = parser.parse_args()
|
478 |
+
args = train_util.read_config_from_file(args, parser)
|
479 |
+
|
480 |
+
train(args)
|
.ipynb_checkpoints/finetune_gui-checkpoint.py
ADDED
@@ -0,0 +1,1061 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import json
|
3 |
+
import math
|
4 |
+
import os
|
5 |
+
import subprocess
|
6 |
+
import pathlib
|
7 |
+
import argparse
|
8 |
+
from datetime import datetime
|
9 |
+
from library.common_gui import (
|
10 |
+
get_folder_path,
|
11 |
+
get_file_path,
|
12 |
+
get_saveasfile_path,
|
13 |
+
save_inference_file,
|
14 |
+
run_cmd_advanced_training,
|
15 |
+
color_aug_changed,
|
16 |
+
run_cmd_training,
|
17 |
+
update_my_data,
|
18 |
+
check_if_model_exist,
|
19 |
+
SaveConfigFile,
|
20 |
+
save_to_file
|
21 |
+
)
|
22 |
+
from library.class_configuration_file import ConfigurationFile
|
23 |
+
from library.class_source_model import SourceModel
|
24 |
+
from library.class_basic_training import BasicTraining
|
25 |
+
from library.class_advanced_training import AdvancedTraining
|
26 |
+
from library.class_sdxl_parameters import SDXLParameters
|
27 |
+
from library.class_command_executor import CommandExecutor
|
28 |
+
from library.tensorboard_gui import (
|
29 |
+
gradio_tensorboard,
|
30 |
+
start_tensorboard,
|
31 |
+
stop_tensorboard,
|
32 |
+
)
|
33 |
+
from library.utilities import utilities_tab
|
34 |
+
from library.class_sample_images import SampleImages, run_cmd_sample
|
35 |
+
|
36 |
+
from library.custom_logging import setup_logging
|
37 |
+
|
38 |
+
# Set up logging
|
39 |
+
log = setup_logging()
|
40 |
+
|
41 |
+
# Setup command executor
|
42 |
+
executor = CommandExecutor()
|
43 |
+
|
44 |
+
# from easygui import msgbox
|
45 |
+
|
46 |
+
folder_symbol = '\U0001f4c2' # 📂
|
47 |
+
refresh_symbol = '\U0001f504' # 🔄
|
48 |
+
save_style_symbol = '\U0001f4be' # 💾
|
49 |
+
document_symbol = '\U0001F4C4' # 📄
|
50 |
+
|
51 |
+
PYTHON = 'python3' if os.name == 'posix' else './venv/Scripts/python.exe'
|
52 |
+
|
53 |
+
|
54 |
+
def save_configuration(
|
55 |
+
save_as,
|
56 |
+
file_path,
|
57 |
+
pretrained_model_name_or_path,
|
58 |
+
v2,
|
59 |
+
v_parameterization,
|
60 |
+
sdxl_checkbox,
|
61 |
+
train_dir,
|
62 |
+
image_folder,
|
63 |
+
output_dir,
|
64 |
+
logging_dir,
|
65 |
+
max_resolution,
|
66 |
+
min_bucket_reso,
|
67 |
+
max_bucket_reso,
|
68 |
+
batch_size,
|
69 |
+
flip_aug,
|
70 |
+
caption_metadata_filename,
|
71 |
+
latent_metadata_filename,
|
72 |
+
full_path,
|
73 |
+
learning_rate,
|
74 |
+
lr_scheduler,
|
75 |
+
lr_warmup,
|
76 |
+
dataset_repeats,
|
77 |
+
train_batch_size,
|
78 |
+
epoch,
|
79 |
+
save_every_n_epochs,
|
80 |
+
mixed_precision,
|
81 |
+
save_precision,
|
82 |
+
seed,
|
83 |
+
num_cpu_threads_per_process,
|
84 |
+
train_text_encoder,
|
85 |
+
full_bf16,
|
86 |
+
create_caption,
|
87 |
+
create_buckets,
|
88 |
+
save_model_as,
|
89 |
+
caption_extension,
|
90 |
+
# use_8bit_adam,
|
91 |
+
xformers,
|
92 |
+
clip_skip,
|
93 |
+
save_state,
|
94 |
+
resume,
|
95 |
+
gradient_checkpointing,
|
96 |
+
gradient_accumulation_steps,
|
97 |
+
mem_eff_attn,
|
98 |
+
shuffle_caption,
|
99 |
+
output_name,
|
100 |
+
max_token_length,
|
101 |
+
max_train_epochs,
|
102 |
+
max_data_loader_n_workers,
|
103 |
+
full_fp16,
|
104 |
+
color_aug,
|
105 |
+
model_list,
|
106 |
+
cache_latents,
|
107 |
+
cache_latents_to_disk,
|
108 |
+
use_latent_files,
|
109 |
+
keep_tokens,
|
110 |
+
persistent_data_loader_workers,
|
111 |
+
bucket_no_upscale,
|
112 |
+
random_crop,
|
113 |
+
bucket_reso_steps,
|
114 |
+
caption_dropout_every_n_epochs,
|
115 |
+
caption_dropout_rate,
|
116 |
+
optimizer,
|
117 |
+
optimizer_args,
|
118 |
+
noise_offset_type,
|
119 |
+
noise_offset,
|
120 |
+
adaptive_noise_scale,
|
121 |
+
multires_noise_iterations,
|
122 |
+
multires_noise_discount,
|
123 |
+
sample_every_n_steps,
|
124 |
+
sample_every_n_epochs,
|
125 |
+
sample_sampler,
|
126 |
+
sample_prompts,
|
127 |
+
additional_parameters,
|
128 |
+
vae_batch_size,
|
129 |
+
min_snr_gamma,
|
130 |
+
weighted_captions,
|
131 |
+
save_every_n_steps,
|
132 |
+
save_last_n_steps,
|
133 |
+
save_last_n_steps_state,
|
134 |
+
use_wandb,
|
135 |
+
wandb_api_key,
|
136 |
+
scale_v_pred_loss_like_noise_pred,
|
137 |
+
sdxl_cache_text_encoder_outputs,
|
138 |
+
sdxl_no_half_vae,
|
139 |
+
min_timestep,
|
140 |
+
max_timestep,
|
141 |
+
):
|
142 |
+
# Get list of function parameters and values
|
143 |
+
parameters = list(locals().items())
|
144 |
+
|
145 |
+
original_file_path = file_path
|
146 |
+
|
147 |
+
save_as_bool = True if save_as.get('label') == 'True' else False
|
148 |
+
|
149 |
+
if save_as_bool:
|
150 |
+
log.info('Save as...')
|
151 |
+
file_path = get_saveasfile_path(file_path)
|
152 |
+
else:
|
153 |
+
log.info('Save...')
|
154 |
+
if file_path == None or file_path == '':
|
155 |
+
file_path = get_saveasfile_path(file_path)
|
156 |
+
|
157 |
+
# log.info(file_path)
|
158 |
+
|
159 |
+
if file_path == None or file_path == '':
|
160 |
+
return original_file_path # In case a file_path was provided and the user decide to cancel the open action
|
161 |
+
|
162 |
+
# Extract the destination directory from the file path
|
163 |
+
destination_directory = os.path.dirname(file_path)
|
164 |
+
|
165 |
+
# Create the destination directory if it doesn't exist
|
166 |
+
if not os.path.exists(destination_directory):
|
167 |
+
os.makedirs(destination_directory)
|
168 |
+
|
169 |
+
SaveConfigFile(parameters=parameters, file_path=file_path, exclusion=['file_path', 'save_as'])
|
170 |
+
|
171 |
+
return file_path
|
172 |
+
|
173 |
+
|
174 |
+
def open_configuration(
|
175 |
+
ask_for_file,
|
176 |
+
file_path,
|
177 |
+
pretrained_model_name_or_path,
|
178 |
+
v2,
|
179 |
+
v_parameterization,
|
180 |
+
sdxl_checkbox,
|
181 |
+
train_dir,
|
182 |
+
image_folder,
|
183 |
+
output_dir,
|
184 |
+
logging_dir,
|
185 |
+
max_resolution,
|
186 |
+
min_bucket_reso,
|
187 |
+
max_bucket_reso,
|
188 |
+
batch_size,
|
189 |
+
flip_aug,
|
190 |
+
caption_metadata_filename,
|
191 |
+
latent_metadata_filename,
|
192 |
+
full_path,
|
193 |
+
learning_rate,
|
194 |
+
lr_scheduler,
|
195 |
+
lr_warmup,
|
196 |
+
dataset_repeats,
|
197 |
+
train_batch_size,
|
198 |
+
epoch,
|
199 |
+
save_every_n_epochs,
|
200 |
+
mixed_precision,
|
201 |
+
save_precision,
|
202 |
+
seed,
|
203 |
+
num_cpu_threads_per_process,
|
204 |
+
train_text_encoder,
|
205 |
+
full_bf16,
|
206 |
+
create_caption,
|
207 |
+
create_buckets,
|
208 |
+
save_model_as,
|
209 |
+
caption_extension,
|
210 |
+
# use_8bit_adam,
|
211 |
+
xformers,
|
212 |
+
clip_skip,
|
213 |
+
save_state,
|
214 |
+
resume,
|
215 |
+
gradient_checkpointing,
|
216 |
+
gradient_accumulation_steps,
|
217 |
+
mem_eff_attn,
|
218 |
+
shuffle_caption,
|
219 |
+
output_name,
|
220 |
+
max_token_length,
|
221 |
+
max_train_epochs,
|
222 |
+
max_data_loader_n_workers,
|
223 |
+
full_fp16,
|
224 |
+
color_aug,
|
225 |
+
model_list,
|
226 |
+
cache_latents,
|
227 |
+
cache_latents_to_disk,
|
228 |
+
use_latent_files,
|
229 |
+
keep_tokens,
|
230 |
+
persistent_data_loader_workers,
|
231 |
+
bucket_no_upscale,
|
232 |
+
random_crop,
|
233 |
+
bucket_reso_steps,
|
234 |
+
caption_dropout_every_n_epochs,
|
235 |
+
caption_dropout_rate,
|
236 |
+
optimizer,
|
237 |
+
optimizer_args,
|
238 |
+
noise_offset_type,
|
239 |
+
noise_offset,
|
240 |
+
adaptive_noise_scale,
|
241 |
+
multires_noise_iterations,
|
242 |
+
multires_noise_discount,
|
243 |
+
sample_every_n_steps,
|
244 |
+
sample_every_n_epochs,
|
245 |
+
sample_sampler,
|
246 |
+
sample_prompts,
|
247 |
+
additional_parameters,
|
248 |
+
vae_batch_size,
|
249 |
+
min_snr_gamma,
|
250 |
+
weighted_captions,
|
251 |
+
save_every_n_steps,
|
252 |
+
save_last_n_steps,
|
253 |
+
save_last_n_steps_state,
|
254 |
+
use_wandb,
|
255 |
+
wandb_api_key,
|
256 |
+
scale_v_pred_loss_like_noise_pred,
|
257 |
+
sdxl_cache_text_encoder_outputs,
|
258 |
+
sdxl_no_half_vae,
|
259 |
+
min_timestep,
|
260 |
+
max_timestep,
|
261 |
+
):
|
262 |
+
# Get list of function parameters and values
|
263 |
+
parameters = list(locals().items())
|
264 |
+
|
265 |
+
ask_for_file = True if ask_for_file.get('label') == 'True' else False
|
266 |
+
|
267 |
+
original_file_path = file_path
|
268 |
+
|
269 |
+
if ask_for_file:
|
270 |
+
file_path = get_file_path(file_path)
|
271 |
+
|
272 |
+
if not file_path == '' and not file_path == None:
|
273 |
+
# load variables from JSON file
|
274 |
+
with open(file_path, 'r') as f:
|
275 |
+
my_data = json.load(f)
|
276 |
+
log.info('Loading config...')
|
277 |
+
# Update values to fix deprecated use_8bit_adam checkbox and set appropriate optimizer if it is set to True
|
278 |
+
my_data = update_my_data(my_data)
|
279 |
+
else:
|
280 |
+
file_path = original_file_path # In case a file_path was provided and the user decide to cancel the open action
|
281 |
+
my_data = {}
|
282 |
+
|
283 |
+
values = [file_path]
|
284 |
+
for key, value in parameters:
|
285 |
+
# Set the value in the dictionary to the corresponding value in `my_data`, or the default value if not found
|
286 |
+
if not key in ['ask_for_file', 'file_path']:
|
287 |
+
values.append(my_data.get(key, value))
|
288 |
+
return tuple(values)
|
289 |
+
|
290 |
+
|
291 |
+
def train_model(
|
292 |
+
headless,
|
293 |
+
print_only,
|
294 |
+
pretrained_model_name_or_path,
|
295 |
+
v2,
|
296 |
+
v_parameterization,
|
297 |
+
sdxl_checkbox,
|
298 |
+
train_dir,
|
299 |
+
image_folder,
|
300 |
+
output_dir,
|
301 |
+
logging_dir,
|
302 |
+
max_resolution,
|
303 |
+
min_bucket_reso,
|
304 |
+
max_bucket_reso,
|
305 |
+
batch_size,
|
306 |
+
flip_aug,
|
307 |
+
caption_metadata_filename,
|
308 |
+
latent_metadata_filename,
|
309 |
+
full_path,
|
310 |
+
learning_rate,
|
311 |
+
lr_scheduler,
|
312 |
+
lr_warmup,
|
313 |
+
dataset_repeats,
|
314 |
+
train_batch_size,
|
315 |
+
epoch,
|
316 |
+
save_every_n_epochs,
|
317 |
+
mixed_precision,
|
318 |
+
save_precision,
|
319 |
+
seed,
|
320 |
+
num_cpu_threads_per_process,
|
321 |
+
train_text_encoder,
|
322 |
+
full_bf16,
|
323 |
+
generate_caption_database,
|
324 |
+
generate_image_buckets,
|
325 |
+
save_model_as,
|
326 |
+
caption_extension,
|
327 |
+
# use_8bit_adam,
|
328 |
+
xformers,
|
329 |
+
clip_skip,
|
330 |
+
save_state,
|
331 |
+
resume,
|
332 |
+
gradient_checkpointing,
|
333 |
+
gradient_accumulation_steps,
|
334 |
+
mem_eff_attn,
|
335 |
+
shuffle_caption,
|
336 |
+
output_name,
|
337 |
+
max_token_length,
|
338 |
+
max_train_epochs,
|
339 |
+
max_data_loader_n_workers,
|
340 |
+
full_fp16,
|
341 |
+
color_aug,
|
342 |
+
model_list, # Keep this. Yes, it is unused here but required given the common list used
|
343 |
+
cache_latents,
|
344 |
+
cache_latents_to_disk,
|
345 |
+
use_latent_files,
|
346 |
+
keep_tokens,
|
347 |
+
persistent_data_loader_workers,
|
348 |
+
bucket_no_upscale,
|
349 |
+
random_crop,
|
350 |
+
bucket_reso_steps,
|
351 |
+
caption_dropout_every_n_epochs,
|
352 |
+
caption_dropout_rate,
|
353 |
+
optimizer,
|
354 |
+
optimizer_args,
|
355 |
+
noise_offset_type,
|
356 |
+
noise_offset,
|
357 |
+
adaptive_noise_scale,
|
358 |
+
multires_noise_iterations,
|
359 |
+
multires_noise_discount,
|
360 |
+
sample_every_n_steps,
|
361 |
+
sample_every_n_epochs,
|
362 |
+
sample_sampler,
|
363 |
+
sample_prompts,
|
364 |
+
additional_parameters,
|
365 |
+
vae_batch_size,
|
366 |
+
min_snr_gamma,
|
367 |
+
weighted_captions,
|
368 |
+
save_every_n_steps,
|
369 |
+
save_last_n_steps,
|
370 |
+
save_last_n_steps_state,
|
371 |
+
use_wandb,
|
372 |
+
wandb_api_key,
|
373 |
+
scale_v_pred_loss_like_noise_pred,
|
374 |
+
sdxl_cache_text_encoder_outputs,
|
375 |
+
sdxl_no_half_vae,
|
376 |
+
min_timestep,
|
377 |
+
max_timestep,
|
378 |
+
):
|
379 |
+
# Get list of function parameters and values
|
380 |
+
parameters = list(locals().items())
|
381 |
+
|
382 |
+
print_only_bool = True if print_only.get('label') == 'True' else False
|
383 |
+
log.info(f'Start Finetuning...')
|
384 |
+
|
385 |
+
headless_bool = True if headless.get('label') == 'True' else False
|
386 |
+
|
387 |
+
if check_if_model_exist(
|
388 |
+
output_name, output_dir, save_model_as, headless_bool
|
389 |
+
):
|
390 |
+
return
|
391 |
+
|
392 |
+
# if float(noise_offset) > 0 and (
|
393 |
+
# multires_noise_iterations > 0 or multires_noise_discount > 0
|
394 |
+
# ):
|
395 |
+
# output_message(
|
396 |
+
# msg="noise offset and multires_noise can't be set at the same time. Only use one or the other.",
|
397 |
+
# title='Error',
|
398 |
+
# headless=headless_bool,
|
399 |
+
# )
|
400 |
+
# return
|
401 |
+
|
402 |
+
# if optimizer == 'Adafactor' and lr_warmup != '0':
|
403 |
+
# output_message(
|
404 |
+
# msg="Warning: lr_scheduler is set to 'Adafactor', so 'LR warmup (% of steps)' will be considered 0.",
|
405 |
+
# title='Warning',
|
406 |
+
# headless=headless_bool,
|
407 |
+
# )
|
408 |
+
# lr_warmup = '0'
|
409 |
+
|
410 |
+
# create caption json file
|
411 |
+
if generate_caption_database:
|
412 |
+
if not os.path.exists(train_dir):
|
413 |
+
os.mkdir(train_dir)
|
414 |
+
|
415 |
+
run_cmd = f'{PYTHON} finetune/merge_captions_to_metadata.py'
|
416 |
+
if caption_extension == '':
|
417 |
+
run_cmd += f' --caption_extension=".caption"'
|
418 |
+
else:
|
419 |
+
run_cmd += f' --caption_extension={caption_extension}'
|
420 |
+
run_cmd += f' "{image_folder}"'
|
421 |
+
run_cmd += f' "{train_dir}/{caption_metadata_filename}"'
|
422 |
+
if full_path:
|
423 |
+
run_cmd += f' --full_path'
|
424 |
+
|
425 |
+
log.info(run_cmd)
|
426 |
+
|
427 |
+
if not print_only_bool:
|
428 |
+
# Run the command
|
429 |
+
if os.name == 'posix':
|
430 |
+
os.system(run_cmd)
|
431 |
+
else:
|
432 |
+
subprocess.run(run_cmd)
|
433 |
+
|
434 |
+
# create images buckets
|
435 |
+
if generate_image_buckets:
|
436 |
+
run_cmd = f'{PYTHON} finetune/prepare_buckets_latents.py'
|
437 |
+
run_cmd += f' "{image_folder}"'
|
438 |
+
run_cmd += f' "{train_dir}/{caption_metadata_filename}"'
|
439 |
+
run_cmd += f' "{train_dir}/{latent_metadata_filename}"'
|
440 |
+
run_cmd += f' "{pretrained_model_name_or_path}"'
|
441 |
+
run_cmd += f' --batch_size={batch_size}'
|
442 |
+
run_cmd += f' --max_resolution={max_resolution}'
|
443 |
+
run_cmd += f' --min_bucket_reso={min_bucket_reso}'
|
444 |
+
run_cmd += f' --max_bucket_reso={max_bucket_reso}'
|
445 |
+
run_cmd += f' --mixed_precision={mixed_precision}'
|
446 |
+
# if flip_aug:
|
447 |
+
# run_cmd += f' --flip_aug'
|
448 |
+
if full_path:
|
449 |
+
run_cmd += f' --full_path'
|
450 |
+
if sdxl_no_half_vae:
|
451 |
+
log.info('Using mixed_precision = no because no half vae is selected...')
|
452 |
+
run_cmd += f' --mixed_precision="no"'
|
453 |
+
|
454 |
+
log.info(run_cmd)
|
455 |
+
|
456 |
+
if not print_only_bool:
|
457 |
+
# Run the command
|
458 |
+
if os.name == 'posix':
|
459 |
+
os.system(run_cmd)
|
460 |
+
else:
|
461 |
+
subprocess.run(run_cmd)
|
462 |
+
|
463 |
+
image_num = len(
|
464 |
+
[
|
465 |
+
f
|
466 |
+
for f, lower_f in (
|
467 |
+
(file, file.lower()) for file in os.listdir(image_folder)
|
468 |
+
)
|
469 |
+
if lower_f.endswith(('.jpg', '.jpeg', '.png', '.webp'))
|
470 |
+
]
|
471 |
+
)
|
472 |
+
log.info(f'image_num = {image_num}')
|
473 |
+
|
474 |
+
repeats = int(image_num) * int(dataset_repeats)
|
475 |
+
log.info(f'repeats = {str(repeats)}')
|
476 |
+
|
477 |
+
# calculate max_train_steps
|
478 |
+
max_train_steps = int(
|
479 |
+
math.ceil(
|
480 |
+
float(repeats)
|
481 |
+
/ int(train_batch_size)
|
482 |
+
/ int(gradient_accumulation_steps)
|
483 |
+
* int(epoch)
|
484 |
+
)
|
485 |
+
)
|
486 |
+
|
487 |
+
# Divide by two because flip augmentation create two copied of the source images
|
488 |
+
if flip_aug:
|
489 |
+
max_train_steps = int(math.ceil(float(max_train_steps) / 2))
|
490 |
+
|
491 |
+
log.info(f'max_train_steps = {max_train_steps}')
|
492 |
+
|
493 |
+
lr_warmup_steps = round(float(int(lr_warmup) * int(max_train_steps) / 100))
|
494 |
+
log.info(f'lr_warmup_steps = {lr_warmup_steps}')
|
495 |
+
|
496 |
+
run_cmd = f'accelerate launch --num_cpu_threads_per_process={num_cpu_threads_per_process}'
|
497 |
+
if sdxl_checkbox:
|
498 |
+
run_cmd += f' "./sdxl_train.py"'
|
499 |
+
else:
|
500 |
+
run_cmd += f' "./fine_tune.py"'
|
501 |
+
|
502 |
+
if v2:
|
503 |
+
run_cmd += ' --v2'
|
504 |
+
if v_parameterization:
|
505 |
+
run_cmd += ' --v_parameterization'
|
506 |
+
if train_text_encoder:
|
507 |
+
run_cmd += ' --train_text_encoder'
|
508 |
+
if full_bf16:
|
509 |
+
run_cmd += ' --full_bf16'
|
510 |
+
if weighted_captions:
|
511 |
+
run_cmd += ' --weighted_captions'
|
512 |
+
run_cmd += (
|
513 |
+
f' --pretrained_model_name_or_path="{pretrained_model_name_or_path}"'
|
514 |
+
)
|
515 |
+
if use_latent_files == 'Yes':
|
516 |
+
run_cmd += f' --in_json="{train_dir}/{latent_metadata_filename}"'
|
517 |
+
else:
|
518 |
+
run_cmd += f' --in_json="{train_dir}/{caption_metadata_filename}"'
|
519 |
+
run_cmd += f' --train_data_dir="{image_folder}"'
|
520 |
+
run_cmd += f' --output_dir="{output_dir}"'
|
521 |
+
if not logging_dir == '':
|
522 |
+
run_cmd += f' --logging_dir="{logging_dir}"'
|
523 |
+
run_cmd += f' --dataset_repeats={dataset_repeats}'
|
524 |
+
run_cmd += f' --learning_rate={learning_rate}'
|
525 |
+
|
526 |
+
run_cmd += ' --enable_bucket'
|
527 |
+
run_cmd += f' --resolution="{max_resolution}"'
|
528 |
+
run_cmd += f' --min_bucket_reso={min_bucket_reso}'
|
529 |
+
run_cmd += f' --max_bucket_reso={max_bucket_reso}'
|
530 |
+
|
531 |
+
if not save_model_as == 'same as source model':
|
532 |
+
run_cmd += f' --save_model_as={save_model_as}'
|
533 |
+
if int(gradient_accumulation_steps) > 1:
|
534 |
+
run_cmd += f' --gradient_accumulation_steps={int(gradient_accumulation_steps)}'
|
535 |
+
# if save_state:
|
536 |
+
# run_cmd += ' --save_state'
|
537 |
+
# if not resume == '':
|
538 |
+
# run_cmd += f' --resume={resume}'
|
539 |
+
if not output_name == '':
|
540 |
+
run_cmd += f' --output_name="{output_name}"'
|
541 |
+
if int(max_token_length) > 75:
|
542 |
+
run_cmd += f' --max_token_length={max_token_length}'
|
543 |
+
|
544 |
+
if sdxl_cache_text_encoder_outputs:
|
545 |
+
run_cmd += f' --cache_text_encoder_outputs'
|
546 |
+
|
547 |
+
if sdxl_no_half_vae:
|
548 |
+
run_cmd += f' --no_half_vae'
|
549 |
+
|
550 |
+
run_cmd += run_cmd_training(
|
551 |
+
learning_rate=learning_rate,
|
552 |
+
lr_scheduler=lr_scheduler,
|
553 |
+
lr_warmup_steps=lr_warmup_steps,
|
554 |
+
train_batch_size=train_batch_size,
|
555 |
+
max_train_steps=max_train_steps,
|
556 |
+
save_every_n_epochs=save_every_n_epochs,
|
557 |
+
mixed_precision=mixed_precision,
|
558 |
+
save_precision=save_precision,
|
559 |
+
seed=seed,
|
560 |
+
caption_extension=caption_extension,
|
561 |
+
cache_latents=cache_latents,
|
562 |
+
cache_latents_to_disk=cache_latents_to_disk,
|
563 |
+
optimizer=optimizer,
|
564 |
+
optimizer_args=optimizer_args,
|
565 |
+
)
|
566 |
+
|
567 |
+
run_cmd += run_cmd_advanced_training(
|
568 |
+
max_train_epochs=max_train_epochs,
|
569 |
+
max_data_loader_n_workers=max_data_loader_n_workers,
|
570 |
+
max_token_length=max_token_length,
|
571 |
+
resume=resume,
|
572 |
+
save_state=save_state,
|
573 |
+
mem_eff_attn=mem_eff_attn,
|
574 |
+
clip_skip=clip_skip,
|
575 |
+
flip_aug=flip_aug,
|
576 |
+
color_aug=color_aug,
|
577 |
+
shuffle_caption=shuffle_caption,
|
578 |
+
gradient_checkpointing=gradient_checkpointing,
|
579 |
+
full_fp16=full_fp16,
|
580 |
+
xformers=xformers,
|
581 |
+
# use_8bit_adam=use_8bit_adam,
|
582 |
+
keep_tokens=keep_tokens,
|
583 |
+
persistent_data_loader_workers=persistent_data_loader_workers,
|
584 |
+
bucket_no_upscale=bucket_no_upscale,
|
585 |
+
random_crop=random_crop,
|
586 |
+
bucket_reso_steps=bucket_reso_steps,
|
587 |
+
caption_dropout_every_n_epochs=caption_dropout_every_n_epochs,
|
588 |
+
caption_dropout_rate=caption_dropout_rate,
|
589 |
+
noise_offset_type=noise_offset_type,
|
590 |
+
noise_offset=noise_offset,
|
591 |
+
adaptive_noise_scale=adaptive_noise_scale,
|
592 |
+
multires_noise_iterations=multires_noise_iterations,
|
593 |
+
multires_noise_discount=multires_noise_discount,
|
594 |
+
additional_parameters=additional_parameters,
|
595 |
+
vae_batch_size=vae_batch_size,
|
596 |
+
min_snr_gamma=min_snr_gamma,
|
597 |
+
save_every_n_steps=save_every_n_steps,
|
598 |
+
save_last_n_steps=save_last_n_steps,
|
599 |
+
save_last_n_steps_state=save_last_n_steps_state,
|
600 |
+
use_wandb=use_wandb,
|
601 |
+
wandb_api_key=wandb_api_key,
|
602 |
+
scale_v_pred_loss_like_noise_pred=scale_v_pred_loss_like_noise_pred,
|
603 |
+
min_timestep=min_timestep,
|
604 |
+
max_timestep=max_timestep,
|
605 |
+
)
|
606 |
+
|
607 |
+
run_cmd += run_cmd_sample(
|
608 |
+
sample_every_n_steps,
|
609 |
+
sample_every_n_epochs,
|
610 |
+
sample_sampler,
|
611 |
+
sample_prompts,
|
612 |
+
output_dir,
|
613 |
+
)
|
614 |
+
|
615 |
+
if print_only_bool:
|
616 |
+
log.warning(
|
617 |
+
'Here is the trainer command as a reference. It will not be executed:\n'
|
618 |
+
)
|
619 |
+
print(run_cmd)
|
620 |
+
|
621 |
+
save_to_file(run_cmd)
|
622 |
+
else:
|
623 |
+
# Saving config file for model
|
624 |
+
current_datetime = datetime.now()
|
625 |
+
formatted_datetime = current_datetime.strftime("%Y%m%d-%H%M%S")
|
626 |
+
file_path = os.path.join(output_dir, f'{output_name}_{formatted_datetime}.json')
|
627 |
+
|
628 |
+
log.info(f'Saving training config to {file_path}...')
|
629 |
+
|
630 |
+
SaveConfigFile(parameters=parameters, file_path=file_path, exclusion=['file_path', 'save_as', 'headless', 'print_only'])
|
631 |
+
|
632 |
+
log.info(run_cmd)
|
633 |
+
|
634 |
+
# Run the command
|
635 |
+
executor.execute_command(run_cmd=run_cmd)
|
636 |
+
|
637 |
+
# check if output_dir/last is a folder... therefore it is a diffuser model
|
638 |
+
last_dir = pathlib.Path(f'{output_dir}/{output_name}')
|
639 |
+
|
640 |
+
if not last_dir.is_dir():
|
641 |
+
# Copy inference model for v2 if required
|
642 |
+
save_inference_file(
|
643 |
+
output_dir, v2, v_parameterization, output_name
|
644 |
+
)
|
645 |
+
|
646 |
+
|
647 |
+
def remove_doublequote(file_path):
|
648 |
+
if file_path != None:
|
649 |
+
file_path = file_path.replace('"', '')
|
650 |
+
|
651 |
+
return file_path
|
652 |
+
|
653 |
+
|
654 |
+
def finetune_tab(headless=False):
|
655 |
+
dummy_db_true = gr.Label(value=True, visible=False)
|
656 |
+
dummy_db_false = gr.Label(value=False, visible=False)
|
657 |
+
dummy_headless = gr.Label(value=headless, visible=False)
|
658 |
+
with gr.Tab('Training'):
|
659 |
+
gr.Markdown('Train a custom model using kohya finetune python code...')
|
660 |
+
|
661 |
+
# Setup Configuration Files Gradio
|
662 |
+
config = ConfigurationFile(headless)
|
663 |
+
|
664 |
+
source_model = SourceModel(headless=headless)
|
665 |
+
|
666 |
+
with gr.Tab('Folders'):
|
667 |
+
with gr.Row():
|
668 |
+
train_dir = gr.Textbox(
|
669 |
+
label='Training config folder',
|
670 |
+
placeholder='folder where the training configuration files will be saved',
|
671 |
+
)
|
672 |
+
train_dir_folder = gr.Button(
|
673 |
+
folder_symbol,
|
674 |
+
elem_id='open_folder_small',
|
675 |
+
visible=(not headless),
|
676 |
+
)
|
677 |
+
train_dir_folder.click(
|
678 |
+
get_folder_path,
|
679 |
+
outputs=train_dir,
|
680 |
+
show_progress=False,
|
681 |
+
)
|
682 |
+
|
683 |
+
image_folder = gr.Textbox(
|
684 |
+
label='Training Image folder',
|
685 |
+
placeholder='folder where the training images are located',
|
686 |
+
)
|
687 |
+
image_folder_input_folder = gr.Button(
|
688 |
+
folder_symbol,
|
689 |
+
elem_id='open_folder_small',
|
690 |
+
visible=(not headless),
|
691 |
+
)
|
692 |
+
image_folder_input_folder.click(
|
693 |
+
get_folder_path,
|
694 |
+
outputs=image_folder,
|
695 |
+
show_progress=False,
|
696 |
+
)
|
697 |
+
with gr.Row():
|
698 |
+
output_dir = gr.Textbox(
|
699 |
+
label='Model output folder',
|
700 |
+
placeholder='folder where the model will be saved',
|
701 |
+
)
|
702 |
+
output_dir_input_folder = gr.Button(
|
703 |
+
folder_symbol,
|
704 |
+
elem_id='open_folder_small',
|
705 |
+
visible=(not headless),
|
706 |
+
)
|
707 |
+
output_dir_input_folder.click(
|
708 |
+
get_folder_path,
|
709 |
+
outputs=output_dir,
|
710 |
+
show_progress=False,
|
711 |
+
)
|
712 |
+
|
713 |
+
logging_dir = gr.Textbox(
|
714 |
+
label='Logging folder',
|
715 |
+
placeholder='Optional: enable logging and output TensorBoard log to this folder',
|
716 |
+
)
|
717 |
+
logging_dir_input_folder = gr.Button(
|
718 |
+
folder_symbol,
|
719 |
+
elem_id='open_folder_small',
|
720 |
+
visible=(not headless),
|
721 |
+
)
|
722 |
+
logging_dir_input_folder.click(
|
723 |
+
get_folder_path,
|
724 |
+
outputs=logging_dir,
|
725 |
+
show_progress=False,
|
726 |
+
)
|
727 |
+
with gr.Row():
|
728 |
+
output_name = gr.Textbox(
|
729 |
+
label='Model output name',
|
730 |
+
placeholder='Name of the model to output',
|
731 |
+
value='last',
|
732 |
+
interactive=True,
|
733 |
+
)
|
734 |
+
train_dir.change(
|
735 |
+
remove_doublequote,
|
736 |
+
inputs=[train_dir],
|
737 |
+
outputs=[train_dir],
|
738 |
+
)
|
739 |
+
image_folder.change(
|
740 |
+
remove_doublequote,
|
741 |
+
inputs=[image_folder],
|
742 |
+
outputs=[image_folder],
|
743 |
+
)
|
744 |
+
output_dir.change(
|
745 |
+
remove_doublequote,
|
746 |
+
inputs=[output_dir],
|
747 |
+
outputs=[output_dir],
|
748 |
+
)
|
749 |
+
with gr.Tab('Dataset preparation'):
|
750 |
+
with gr.Row():
|
751 |
+
max_resolution = gr.Textbox(
|
752 |
+
label='Resolution (width,height)', value='512,512'
|
753 |
+
)
|
754 |
+
min_bucket_reso = gr.Textbox(
|
755 |
+
label='Min bucket resolution', value='256'
|
756 |
+
)
|
757 |
+
max_bucket_reso = gr.Textbox(
|
758 |
+
label='Max bucket resolution', value='1024'
|
759 |
+
)
|
760 |
+
batch_size = gr.Textbox(label='Batch size', value='1')
|
761 |
+
with gr.Row():
|
762 |
+
create_caption = gr.Checkbox(
|
763 |
+
label='Generate caption metadata', value=True
|
764 |
+
)
|
765 |
+
create_buckets = gr.Checkbox(
|
766 |
+
label='Generate image buckets metadata', value=True
|
767 |
+
)
|
768 |
+
use_latent_files = gr.Dropdown(
|
769 |
+
label='Use latent files',
|
770 |
+
choices=[
|
771 |
+
'No',
|
772 |
+
'Yes',
|
773 |
+
],
|
774 |
+
value='Yes',
|
775 |
+
)
|
776 |
+
with gr.Accordion('Advanced parameters', open=False):
|
777 |
+
with gr.Row():
|
778 |
+
caption_metadata_filename = gr.Textbox(
|
779 |
+
label='Caption metadata filename', value='meta_cap.json'
|
780 |
+
)
|
781 |
+
latent_metadata_filename = gr.Textbox(
|
782 |
+
label='Latent metadata filename', value='meta_lat.json'
|
783 |
+
)
|
784 |
+
with gr.Row():
|
785 |
+
full_path = gr.Checkbox(label='Use full path', value=True)
|
786 |
+
weighted_captions = gr.Checkbox(
|
787 |
+
label='Weighted captions', value=False
|
788 |
+
)
|
789 |
+
with gr.Tab('Parameters'):
|
790 |
+
with gr.Tab('Basic', elem_id='basic_tab'):
|
791 |
+
basic_training = BasicTraining(learning_rate_value='1e-5', finetuning=True)
|
792 |
+
|
793 |
+
# Add SDXL Parameters
|
794 |
+
sdxl_params = SDXLParameters(source_model.sdxl_checkbox)
|
795 |
+
|
796 |
+
with gr.Row():
|
797 |
+
dataset_repeats = gr.Textbox(label='Dataset repeats', value=40)
|
798 |
+
train_text_encoder = gr.Checkbox(
|
799 |
+
label='Train text encoder', value=True
|
800 |
+
)
|
801 |
+
|
802 |
+
with gr.Tab('Advanced', elem_id='advanced_tab'):
|
803 |
+
with gr.Row():
|
804 |
+
gradient_accumulation_steps = gr.Number(
|
805 |
+
label='Gradient accumulate steps', value='1'
|
806 |
+
)
|
807 |
+
advanced_training = AdvancedTraining(headless=headless, finetuning=True)
|
808 |
+
advanced_training.color_aug.change(
|
809 |
+
color_aug_changed,
|
810 |
+
inputs=[advanced_training.color_aug],
|
811 |
+
outputs=[basic_training.cache_latents], # Not applicable to fine_tune.py
|
812 |
+
)
|
813 |
+
|
814 |
+
with gr.Tab('Samples', elem_id='samples_tab'):
|
815 |
+
sample = SampleImages()
|
816 |
+
|
817 |
+
with gr.Row():
|
818 |
+
button_run = gr.Button('Start training', variant='primary')
|
819 |
+
|
820 |
+
button_stop_training = gr.Button('Stop training')
|
821 |
+
|
822 |
+
button_print = gr.Button('Print training command')
|
823 |
+
|
824 |
+
# Setup gradio tensorboard buttons
|
825 |
+
button_start_tensorboard, button_stop_tensorboard = gradio_tensorboard()
|
826 |
+
|
827 |
+
button_start_tensorboard.click(
|
828 |
+
start_tensorboard,
|
829 |
+
inputs=logging_dir,
|
830 |
+
)
|
831 |
+
|
832 |
+
button_stop_tensorboard.click(
|
833 |
+
stop_tensorboard,
|
834 |
+
show_progress=False,
|
835 |
+
)
|
836 |
+
|
837 |
+
settings_list = [
|
838 |
+
source_model.pretrained_model_name_or_path,
|
839 |
+
source_model.v2,
|
840 |
+
source_model.v_parameterization,
|
841 |
+
source_model.sdxl_checkbox,
|
842 |
+
train_dir,
|
843 |
+
image_folder,
|
844 |
+
output_dir,
|
845 |
+
logging_dir,
|
846 |
+
max_resolution,
|
847 |
+
min_bucket_reso,
|
848 |
+
max_bucket_reso,
|
849 |
+
batch_size,
|
850 |
+
advanced_training.flip_aug,
|
851 |
+
caption_metadata_filename,
|
852 |
+
latent_metadata_filename,
|
853 |
+
full_path,
|
854 |
+
basic_training.learning_rate,
|
855 |
+
basic_training.lr_scheduler,
|
856 |
+
basic_training.lr_warmup,
|
857 |
+
dataset_repeats,
|
858 |
+
basic_training.train_batch_size,
|
859 |
+
basic_training.epoch,
|
860 |
+
basic_training.save_every_n_epochs,
|
861 |
+
basic_training.mixed_precision,
|
862 |
+
basic_training.save_precision,
|
863 |
+
basic_training.seed,
|
864 |
+
basic_training.num_cpu_threads_per_process,
|
865 |
+
train_text_encoder,
|
866 |
+
advanced_training.full_bf16,
|
867 |
+
create_caption,
|
868 |
+
create_buckets,
|
869 |
+
source_model.save_model_as,
|
870 |
+
basic_training.caption_extension,
|
871 |
+
advanced_training.xformers,
|
872 |
+
advanced_training.clip_skip,
|
873 |
+
advanced_training.save_state,
|
874 |
+
advanced_training.resume,
|
875 |
+
advanced_training.gradient_checkpointing,
|
876 |
+
gradient_accumulation_steps,
|
877 |
+
advanced_training.mem_eff_attn,
|
878 |
+
advanced_training.shuffle_caption,
|
879 |
+
output_name,
|
880 |
+
advanced_training.max_token_length,
|
881 |
+
basic_training.max_train_epochs,
|
882 |
+
advanced_training.max_data_loader_n_workers,
|
883 |
+
advanced_training.full_fp16,
|
884 |
+
advanced_training.color_aug,
|
885 |
+
source_model.model_list,
|
886 |
+
basic_training.cache_latents,
|
887 |
+
basic_training.cache_latents_to_disk,
|
888 |
+
use_latent_files,
|
889 |
+
advanced_training.keep_tokens,
|
890 |
+
advanced_training.persistent_data_loader_workers,
|
891 |
+
advanced_training.bucket_no_upscale,
|
892 |
+
advanced_training.random_crop,
|
893 |
+
advanced_training.bucket_reso_steps,
|
894 |
+
advanced_training.caption_dropout_every_n_epochs,
|
895 |
+
advanced_training.caption_dropout_rate,
|
896 |
+
basic_training.optimizer,
|
897 |
+
basic_training.optimizer_args,
|
898 |
+
advanced_training.noise_offset_type,
|
899 |
+
advanced_training.noise_offset,
|
900 |
+
advanced_training.adaptive_noise_scale,
|
901 |
+
advanced_training.multires_noise_iterations,
|
902 |
+
advanced_training.multires_noise_discount,
|
903 |
+
sample.sample_every_n_steps,
|
904 |
+
sample.sample_every_n_epochs,
|
905 |
+
sample.sample_sampler,
|
906 |
+
sample.sample_prompts,
|
907 |
+
advanced_training.additional_parameters,
|
908 |
+
advanced_training.vae_batch_size,
|
909 |
+
advanced_training.min_snr_gamma,
|
910 |
+
weighted_captions,
|
911 |
+
advanced_training.save_every_n_steps,
|
912 |
+
advanced_training.save_last_n_steps,
|
913 |
+
advanced_training.save_last_n_steps_state,
|
914 |
+
advanced_training.use_wandb,
|
915 |
+
advanced_training.wandb_api_key,
|
916 |
+
advanced_training.scale_v_pred_loss_like_noise_pred,
|
917 |
+
sdxl_params.sdxl_cache_text_encoder_outputs,
|
918 |
+
sdxl_params.sdxl_no_half_vae,
|
919 |
+
advanced_training.min_timestep,
|
920 |
+
advanced_training.max_timestep,
|
921 |
+
]
|
922 |
+
|
923 |
+
button_run.click(
|
924 |
+
train_model,
|
925 |
+
inputs=[dummy_headless] + [dummy_db_false] + settings_list,
|
926 |
+
show_progress=False,
|
927 |
+
)
|
928 |
+
|
929 |
+
button_stop_training.click(
|
930 |
+
executor.kill_command
|
931 |
+
)
|
932 |
+
|
933 |
+
button_print.click(
|
934 |
+
train_model,
|
935 |
+
inputs=[dummy_headless] + [dummy_db_true] + settings_list,
|
936 |
+
show_progress=False,
|
937 |
+
)
|
938 |
+
|
939 |
+
config.button_open_config.click(
|
940 |
+
open_configuration,
|
941 |
+
inputs=[dummy_db_true, config.config_file_name] + settings_list,
|
942 |
+
outputs=[config.config_file_name] + settings_list,
|
943 |
+
show_progress=False,
|
944 |
+
)
|
945 |
+
|
946 |
+
config.button_load_config.click(
|
947 |
+
open_configuration,
|
948 |
+
inputs=[dummy_db_false, config.config_file_name] + settings_list,
|
949 |
+
outputs=[config.config_file_name] + settings_list,
|
950 |
+
show_progress=False,
|
951 |
+
)
|
952 |
+
|
953 |
+
config.button_save_config.click(
|
954 |
+
save_configuration,
|
955 |
+
inputs=[dummy_db_false, config.config_file_name] + settings_list,
|
956 |
+
outputs=[config.config_file_name],
|
957 |
+
show_progress=False,
|
958 |
+
)
|
959 |
+
|
960 |
+
config.button_save_as_config.click(
|
961 |
+
save_configuration,
|
962 |
+
inputs=[dummy_db_true, config.config_file_name] + settings_list,
|
963 |
+
outputs=[config.config_file_name],
|
964 |
+
show_progress=False,
|
965 |
+
)
|
966 |
+
|
967 |
+
with gr.Tab('Guides'):
|
968 |
+
gr.Markdown(
|
969 |
+
'This section provide Various Finetuning guides and information...'
|
970 |
+
)
|
971 |
+
top_level_path = './docs/Finetuning/top_level.md'
|
972 |
+
if os.path.exists(top_level_path):
|
973 |
+
with open(os.path.join(top_level_path), 'r', encoding='utf8') as file:
|
974 |
+
guides_top_level = file.read() + '\n'
|
975 |
+
gr.Markdown(guides_top_level)
|
976 |
+
|
977 |
+
|
978 |
+
def UI(**kwargs):
|
979 |
+
css = ''
|
980 |
+
|
981 |
+
headless = kwargs.get('headless', False)
|
982 |
+
log.info(f'headless: {headless}')
|
983 |
+
|
984 |
+
if os.path.exists('./style.css'):
|
985 |
+
with open(os.path.join('./style.css'), 'r', encoding='utf8') as file:
|
986 |
+
log.info('Load CSS...')
|
987 |
+
css += file.read() + '\n'
|
988 |
+
|
989 |
+
interface = gr.Blocks(
|
990 |
+
css=css, title='Kohya_ss GUI', theme=gr.themes.Default()
|
991 |
+
)
|
992 |
+
|
993 |
+
with interface:
|
994 |
+
with gr.Tab('Finetune'):
|
995 |
+
finetune_tab(headless=headless)
|
996 |
+
with gr.Tab('Utilities'):
|
997 |
+
utilities_tab(enable_dreambooth_tab=False, headless=headless)
|
998 |
+
|
999 |
+
# Show the interface
|
1000 |
+
launch_kwargs = {}
|
1001 |
+
username = kwargs.get('username')
|
1002 |
+
password = kwargs.get('password')
|
1003 |
+
server_port = kwargs.get('server_port', 0)
|
1004 |
+
inbrowser = kwargs.get('inbrowser', False)
|
1005 |
+
share = kwargs.get('share', False)
|
1006 |
+
server_name = kwargs.get('listen')
|
1007 |
+
|
1008 |
+
launch_kwargs['server_name'] = server_name
|
1009 |
+
if username and password:
|
1010 |
+
launch_kwargs['auth'] = (username, password)
|
1011 |
+
if server_port > 0:
|
1012 |
+
launch_kwargs['server_port'] = server_port
|
1013 |
+
if inbrowser:
|
1014 |
+
launch_kwargs['inbrowser'] = inbrowser
|
1015 |
+
if share:
|
1016 |
+
launch_kwargs['share'] = share
|
1017 |
+
interface.launch(**launch_kwargs)
|
1018 |
+
|
1019 |
+
|
1020 |
+
if __name__ == '__main__':
|
1021 |
+
# torch.cuda.set_per_process_memory_fraction(0.48)
|
1022 |
+
parser = argparse.ArgumentParser()
|
1023 |
+
parser.add_argument(
|
1024 |
+
'--listen',
|
1025 |
+
type=str,
|
1026 |
+
default='127.0.0.1',
|
1027 |
+
help='IP to listen on for connections to Gradio',
|
1028 |
+
)
|
1029 |
+
parser.add_argument(
|
1030 |
+
'--username', type=str, default='', help='Username for authentication'
|
1031 |
+
)
|
1032 |
+
parser.add_argument(
|
1033 |
+
'--password', type=str, default='', help='Password for authentication'
|
1034 |
+
)
|
1035 |
+
parser.add_argument(
|
1036 |
+
'--server_port',
|
1037 |
+
type=int,
|
1038 |
+
default=0,
|
1039 |
+
help='Port to run the server listener on',
|
1040 |
+
)
|
1041 |
+
parser.add_argument(
|
1042 |
+
'--inbrowser', action='store_true', help='Open in browser'
|
1043 |
+
)
|
1044 |
+
parser.add_argument(
|
1045 |
+
'--share', action='store_true', help='Share the gradio UI'
|
1046 |
+
)
|
1047 |
+
parser.add_argument(
|
1048 |
+
'--headless', action='store_true', help='Is the server headless'
|
1049 |
+
)
|
1050 |
+
|
1051 |
+
args = parser.parse_args()
|
1052 |
+
|
1053 |
+
UI(
|
1054 |
+
username=args.username,
|
1055 |
+
password=args.password,
|
1056 |
+
inbrowser=args.inbrowser,
|
1057 |
+
server_port=args.server_port,
|
1058 |
+
share=args.share,
|
1059 |
+
listen=args.listen,
|
1060 |
+
headless=args.headless,
|
1061 |
+
)
|
.ipynb_checkpoints/gui-checkpoint.sh
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env bash
|
2 |
+
|
3 |
+
# Checks to see if variable is set and non-empty.
|
4 |
+
# This is defined first, so we can use the function for some default variable values
|
5 |
+
env_var_exists() {
|
6 |
+
if [[ -n "${!1}" ]]; then
|
7 |
+
return 0
|
8 |
+
else
|
9 |
+
return 1
|
10 |
+
fi
|
11 |
+
}
|
12 |
+
|
13 |
+
# Need RUNPOD to have a default value before first access
|
14 |
+
RUNPOD=false
|
15 |
+
if env_var_exists RUNPOD_POD_ID || env_var_exists RUNPOD_API_KEY; then
|
16 |
+
RUNPOD=true
|
17 |
+
fi
|
18 |
+
|
19 |
+
# If it is run with the sudo command, get the complete LD_LIBRARY_PATH environment variable of the system and assign it to the current environment,
|
20 |
+
# because it will be used later.
|
21 |
+
if [ -n "$SUDO_USER" ] || [ -n "$SUDO_COMMAND" ]; then
|
22 |
+
echo "The sudo command resets the non-essential environment variables, we keep the LD_LIBRARY_PATH variable."
|
23 |
+
export LD_LIBRARY_PATH=$(sudo -i printenv LD_LIBRARY_PATH)
|
24 |
+
fi
|
25 |
+
|
26 |
+
# This gets the directory the script is run from so pathing can work relative to the script where needed.
|
27 |
+
SCRIPT_DIR=$(cd -- "$(dirname -- "$0")" && pwd)
|
28 |
+
|
29 |
+
# Step into GUI local directory
|
30 |
+
cd "$SCRIPT_DIR" || exit 1
|
31 |
+
|
32 |
+
if [ -d "$SCRIPT_DIR/venv" ]; then
|
33 |
+
source "$SCRIPT_DIR/venv/bin/activate" || exit 1
|
34 |
+
else
|
35 |
+
echo "venv folder does not exist. Not activating..."
|
36 |
+
fi
|
37 |
+
|
38 |
+
# Check if LD_LIBRARY_PATH environment variable exists
|
39 |
+
if [[ -z "${LD_LIBRARY_PATH}" ]]; then
|
40 |
+
# Set the ANSI escape sequence for yellow text
|
41 |
+
YELLOW='\033[0;33m'
|
42 |
+
# Set the ANSI escape sequence to reset text color
|
43 |
+
RESET='\033[0m'
|
44 |
+
|
45 |
+
echo -e "${YELLOW}Warning: LD_LIBRARY_PATH environment variable is not set.${RESET}"
|
46 |
+
echo -e "${YELLOW}Certain functionalities may not work correctly.${RESET}"
|
47 |
+
echo -e "${YELLOW}Please ensure that the required libraries are properly configured.${RESET}"
|
48 |
+
echo -e " "
|
49 |
+
echo -e "${YELLOW}If you use WSL2 you may want to: export LD_LIBRARY_PATH=/usr/lib/wsl/lib/${RESET}"
|
50 |
+
echo -e " "
|
51 |
+
fi
|
52 |
+
|
53 |
+
# Determine the requirements file based on the system
|
54 |
+
if [[ "$OSTYPE" == "darwin"* ]]; then
|
55 |
+
if [[ "$(uname -m)" == "arm64" ]]; then
|
56 |
+
REQUIREMENTS_FILE="$SCRIPT_DIR/requirements_macos_arm64.txt"
|
57 |
+
else
|
58 |
+
REQUIREMENTS_FILE="$SCRIPT_DIR/requirements_macos_amd64.txt"
|
59 |
+
fi
|
60 |
+
else
|
61 |
+
if [ "$RUNPOD" = false ]; then
|
62 |
+
REQUIREMENTS_FILE="$SCRIPT_DIR/requirements_linux.txt"
|
63 |
+
else
|
64 |
+
REQUIREMENTS_FILE="$SCRIPT_DIR/requirements_runpod.txt"
|
65 |
+
fi
|
66 |
+
fi
|
67 |
+
|
68 |
+
# Validate the requirements and run the script if successful
|
69 |
+
if python "$SCRIPT_DIR/setup/validate_requirements.py" -r "$REQUIREMENTS_FILE"; then
|
70 |
+
python "$SCRIPT_DIR/kohya_gui.py" "$@"
|
71 |
+
fi
|
.ipynb_checkpoints/kohya_gui-checkpoint.py
ADDED
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import os
|
3 |
+
import argparse
|
4 |
+
from dreambooth_gui import dreambooth_tab
|
5 |
+
from finetune_gui import finetune_tab
|
6 |
+
from textual_inversion_gui import ti_tab
|
7 |
+
from library.utilities import utilities_tab
|
8 |
+
from lora_gui import lora_tab
|
9 |
+
from library.class_lora_tab import LoRATools
|
10 |
+
|
11 |
+
import os
|
12 |
+
from library.custom_logging import setup_logging
|
13 |
+
|
14 |
+
# Set up logging
|
15 |
+
log = setup_logging()
|
16 |
+
|
17 |
+
|
18 |
+
def UI(**kwargs):
|
19 |
+
css = ''
|
20 |
+
|
21 |
+
headless = kwargs.get('headless', False)
|
22 |
+
log.info(f'headless: {headless}')
|
23 |
+
|
24 |
+
if os.path.exists('./style.css'):
|
25 |
+
with open(os.path.join('./style.css'), 'r', encoding='utf8') as file:
|
26 |
+
log.info('Load CSS...')
|
27 |
+
css += file.read() + '\n'
|
28 |
+
|
29 |
+
if os.path.exists('./.release'):
|
30 |
+
with open(os.path.join('./.release'), 'r', encoding='utf8') as file:
|
31 |
+
release = file.read()
|
32 |
+
|
33 |
+
if os.path.exists('./README.md'):
|
34 |
+
with open(os.path.join('./README.md'), 'r', encoding='utf8') as file:
|
35 |
+
README = file.read()
|
36 |
+
|
37 |
+
interface = gr.Blocks(
|
38 |
+
css=css, title=f'Kohya_ss GUI {release}', theme=gr.themes.Default()
|
39 |
+
)
|
40 |
+
|
41 |
+
with interface:
|
42 |
+
with gr.Tab('Dreambooth'):
|
43 |
+
(
|
44 |
+
train_data_dir_input,
|
45 |
+
reg_data_dir_input,
|
46 |
+
output_dir_input,
|
47 |
+
logging_dir_input,
|
48 |
+
) = dreambooth_tab(headless=headless)
|
49 |
+
with gr.Tab('LoRA'):
|
50 |
+
lora_tab(headless=headless)
|
51 |
+
with gr.Tab('Textual Inversion'):
|
52 |
+
ti_tab(headless=headless)
|
53 |
+
with gr.Tab('Finetuning'):
|
54 |
+
finetune_tab(headless=headless)
|
55 |
+
with gr.Tab('Utilities'):
|
56 |
+
utilities_tab(
|
57 |
+
train_data_dir_input=train_data_dir_input,
|
58 |
+
reg_data_dir_input=reg_data_dir_input,
|
59 |
+
output_dir_input=output_dir_input,
|
60 |
+
logging_dir_input=logging_dir_input,
|
61 |
+
enable_copy_info_button=True,
|
62 |
+
headless=headless,
|
63 |
+
)
|
64 |
+
with gr.Tab('LoRA'):
|
65 |
+
_ = LoRATools(headless=headless)
|
66 |
+
with gr.Tab('About'):
|
67 |
+
gr.Markdown(f'kohya_ss GUI release {release}')
|
68 |
+
with gr.Tab('README'):
|
69 |
+
gr.Markdown(README)
|
70 |
+
|
71 |
+
htmlStr = f"""
|
72 |
+
<html>
|
73 |
+
<body>
|
74 |
+
<div class="ver-class">{release}</div>
|
75 |
+
</body>
|
76 |
+
</html>
|
77 |
+
"""
|
78 |
+
gr.HTML(htmlStr)
|
79 |
+
# Show the interface
|
80 |
+
launch_kwargs = {}
|
81 |
+
username = kwargs.get('username')
|
82 |
+
password = kwargs.get('password')
|
83 |
+
server_port = kwargs.get('server_port', 0)
|
84 |
+
inbrowser = kwargs.get('inbrowser', False)
|
85 |
+
share = kwargs.get('share', False)
|
86 |
+
server_name = kwargs.get('listen')
|
87 |
+
|
88 |
+
launch_kwargs['server_name'] = server_name
|
89 |
+
if username and password:
|
90 |
+
launch_kwargs['auth'] = (username, password)
|
91 |
+
if server_port > 0:
|
92 |
+
launch_kwargs['server_port'] = server_port
|
93 |
+
if inbrowser:
|
94 |
+
launch_kwargs['inbrowser'] = inbrowser
|
95 |
+
if share:
|
96 |
+
launch_kwargs['share'] = share
|
97 |
+
interface.launch(**launch_kwargs)
|
98 |
+
|
99 |
+
|
100 |
+
if __name__ == '__main__':
|
101 |
+
# torch.cuda.set_per_process_memory_fraction(0.48)
|
102 |
+
parser = argparse.ArgumentParser()
|
103 |
+
parser.add_argument(
|
104 |
+
'--listen',
|
105 |
+
type=str,
|
106 |
+
default='127.0.0.1',
|
107 |
+
help='IP to listen on for connections to Gradio',
|
108 |
+
)
|
109 |
+
parser.add_argument(
|
110 |
+
'--username', type=str, default='', help='Username for authentication'
|
111 |
+
)
|
112 |
+
parser.add_argument(
|
113 |
+
'--password', type=str, default='', help='Password for authentication'
|
114 |
+
)
|
115 |
+
parser.add_argument(
|
116 |
+
'--server_port',
|
117 |
+
type=int,
|
118 |
+
default=0,
|
119 |
+
help='Port to run the server listener on',
|
120 |
+
)
|
121 |
+
parser.add_argument(
|
122 |
+
'--inbrowser', action='store_true', help='Open in browser'
|
123 |
+
)
|
124 |
+
parser.add_argument(
|
125 |
+
'--share', action='store_true', help='Share the gradio UI'
|
126 |
+
)
|
127 |
+
parser.add_argument(
|
128 |
+
'--headless', action='store_true', help='Is the server headless'
|
129 |
+
)
|
130 |
+
|
131 |
+
args = parser.parse_args()
|
132 |
+
|
133 |
+
UI(
|
134 |
+
username=args.username,
|
135 |
+
password=args.password,
|
136 |
+
inbrowser=args.inbrowser,
|
137 |
+
server_port=args.server_port,
|
138 |
+
share=args.share,
|
139 |
+
listen=args.listen,
|
140 |
+
headless=args.headless,
|
141 |
+
)
|
.release
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
v21.8.7
|
.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,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
### オプション:PagedAdamW8bitとPagedLion8bitを使う
|
129 |
+
|
130 |
+
PagedAdamW8bitとPagedLion8bitを使う場合には`bitsandbytes`を0.39.0以降にアップグレードする必要があります。`bitsandbytes`をアンインストールし、Windows環境では例えば[こちら](https://github.com/jllllll/bitsandbytes-windows-webui)などからWindows版のwhlファイルをインストールしてください。たとえば以下のような手順になります。
|
131 |
+
|
132 |
+
```powershell
|
133 |
+
pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.39.1-py3-none-win_amd64.whl
|
134 |
+
```
|
135 |
+
|
136 |
+
アップグレード時には`pip install .`でこのリポジトリを更新し、必要に応じて他のパッケージもアップグレードしてください。
|
137 |
+
|
138 |
+
## アップグレード
|
139 |
+
|
140 |
+
新しいリリースがあった場合、以下のコマンドで更新できます。
|
141 |
+
|
142 |
+
```powershell
|
143 |
+
cd sd-scripts
|
144 |
+
git pull
|
145 |
+
.\venv\Scripts\activate
|
146 |
+
pip install --use-pep517 --upgrade -r requirements.txt
|
147 |
+
```
|
148 |
+
|
149 |
+
コマンドが成功すれば新しいバージョンが使用できます。
|
150 |
+
|
151 |
+
## 謝意
|
152 |
+
|
153 |
+
LoRAの実装は[cloneofsimo氏のリポジトリ](https://github.com/cloneofsimo/lora)を基にしたものです。感謝申し上げます。
|
154 |
+
|
155 |
+
Conv2d 3x3への拡大は [cloneofsimo氏](https://github.com/cloneofsimo/lora) が最初にリリースし、KohakuBlueleaf氏が [LoCon](https://github.com/KohakuBlueleaf/LoCon) でその有効性を明らかにしたものです。KohakuBlueleaf氏に深く感謝します。
|
156 |
+
|
157 |
+
## ライセンス
|
158 |
+
|
159 |
+
スクリプトのライセンスはASL 2.0ですが(Diffusersおよびcloneofsimo氏のリポジトリ由来のものも同様)、一部他のライセンスのコードを含みます。
|
160 |
+
|
161 |
+
[Memory Efficient Attention Pytorch](https://github.com/lucidrains/memory-efficient-attention-pytorch): MIT
|
162 |
+
|
163 |
+
[bitsandbytes](https://github.com/TimDettmers/bitsandbytes): MIT
|
164 |
+
|
165 |
+
[BLIP](https://github.com/salesforce/BLIP): BSD-3-Clause
|
166 |
+
|
167 |
+
|
README.md
CHANGED
@@ -1,12 +1,517 @@
|
|
1 |
---
|
2 |
-
title:
|
3 |
-
|
4 |
-
colorFrom: pink
|
5 |
-
colorTo: gray
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 3.
|
8 |
-
app_file: app.py
|
9 |
-
pinned: false
|
10 |
---
|
|
|
11 |
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
title: ll-create
|
3 |
+
app_file: dreambooth_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 |
+
- [Kohya's GUI](#kohyas-gui)
|
16 |
+
- [Table of Contents](#table-of-contents)
|
17 |
+
- [Tutorials](#tutorials)
|
18 |
+
- [About SDXL training](#about-sdxl-training)
|
19 |
+
- [Tips for SDXL training](#tips-for-sdxl-training)
|
20 |
+
- [🦒 Colab](#-colab)
|
21 |
+
- [Installation](#installation)
|
22 |
+
- [Windows](#windows)
|
23 |
+
- [Windows Pre-requirements](#windows-pre-requirements)
|
24 |
+
- [Setup](#setup)
|
25 |
+
- [Optional: CUDNN 8.6](#optional-cudnn-86)
|
26 |
+
- [Linux and macOS](#linux-and-macos)
|
27 |
+
- [Linux Pre-requirements](#linux-pre-requirements)
|
28 |
+
- [Setup](#setup-1)
|
29 |
+
- [Install Location](#install-location)
|
30 |
+
- [Runpod](#runpod)
|
31 |
+
- [Manual installation](#manual-installation)
|
32 |
+
- [Pre-built Runpod template](#pre-built-runpod-template)
|
33 |
+
- [Docker](#docker)
|
34 |
+
- [Local docker build](#local-docker-build)
|
35 |
+
- [ashleykleynhans runpod docker builds](#ashleykleynhans-runpod-docker-builds)
|
36 |
+
- [Upgrading](#upgrading)
|
37 |
+
- [Windows Upgrade](#windows-upgrade)
|
38 |
+
- [Linux and macOS Upgrade](#linux-and-macos-upgrade)
|
39 |
+
- [Starting GUI Service](#starting-gui-service)
|
40 |
+
- [Launching the GUI on Windows](#launching-the-gui-on-windows)
|
41 |
+
- [Launching the GUI on Linux and macOS](#launching-the-gui-on-linux-and-macos)
|
42 |
+
- [Dreambooth](#dreambooth)
|
43 |
+
- [Finetune](#finetune)
|
44 |
+
- [Train Network](#train-network)
|
45 |
+
- [LoRA](#lora)
|
46 |
+
- [Sample image generation during training](#sample-image-generation-during-training)
|
47 |
+
- [Troubleshooting](#troubleshooting)
|
48 |
+
- [Page File Limit](#page-file-limit)
|
49 |
+
- [No module called tkinter](#no-module-called-tkinter)
|
50 |
+
- [FileNotFoundError](#filenotfounderror)
|
51 |
+
- [Change History](#change-history)
|
52 |
+
|
53 |
+
|
54 |
+
## Tutorials
|
55 |
+
|
56 |
+
[How to Create a LoRA Part 1: Dataset Preparation](https://www.youtube.com/watch?v=N4_-fB62Hwk):
|
57 |
+
|
58 |
+
[![LoRA Part 1 Tutorial](https://img.youtube.com/vi/N4_-fB62Hwk/0.jpg)](https://www.youtube.com/watch?v=N4_-fB62Hwk)
|
59 |
+
|
60 |
+
[How to Create a LoRA Part 2: Training the Model](https://www.youtube.com/watch?v=k5imq01uvUY):
|
61 |
+
|
62 |
+
[![LoRA Part 2 Tutorial](https://img.youtube.com/vi/k5imq01uvUY/0.jpg)](https://www.youtube.com/watch?v=k5imq01uvUY)
|
63 |
+
|
64 |
+
Newer Tutorial: [Generate Studio Quality Realistic Photos By Kohya LoRA Stable Diffusion Training](https://www.youtube.com/watch?v=TpuDOsuKIBo):
|
65 |
+
The scripts are tested with PyTorch 1.12.1 and 2.0.1, Diffusers 0.17.1.
|
66 |
+
|
67 |
+
[![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)
|
68 |
+
|
69 |
+
Newer Tutorial: [How To Install And Use Kohya LoRA GUI / Web UI on RunPod IO](https://www.youtube.com/watch?v=3uzCNrQao3o):
|
70 |
+
|
71 |
+
[![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)
|
72 |
+
|
73 |
+
First SDXL Tutorial: [First Ever SDXL Training With Kohya LoRA - Stable Diffusion XL Training Will Replace Older Models](https://youtu.be/AY6DMBCIZ3A):
|
74 |
+
|
75 |
+
[![First Ever SDXL Training With Kohya LoRA - Stable Diffusion XL Training Will Replace Older Models](https://cdn-uploads.huggingface.co/production/uploads/6345bd89fe134dfd7a0dba40/mG0CvKAzb8o29nr5ye0Br.png)](https://youtu.be/AY6DMBCIZ3A)
|
76 |
+
|
77 |
+
### About SDXL training
|
78 |
+
|
79 |
+
The feature of SDXL training is now available in sdxl branch as an experimental feature.
|
80 |
+
|
81 |
+
Aug 6, 2023: The feature will be merged into the main branch soon. Following are the changes from the previous version.
|
82 |
+
|
83 |
+
- [SAI Model Spec](https://github.com/Stability-AI/ModelSpec) metadata is now supported partially. `hash_sha256` is not supported yet.
|
84 |
+
- The main items are set automatically.
|
85 |
+
- You can set title, author, description, license and tags with `--metadata_xxx` options in each training script.
|
86 |
+
- Merging scripts also support minimum SAI Model Spec metadata. See the help message for the usage.
|
87 |
+
- Metadata editor will be available soon.
|
88 |
+
- SDXL LoRA has `sdxl_base_v1-0` now for `ss_base_model_version` metadata item, instead of `v0-9`.
|
89 |
+
|
90 |
+
Aug 4, 2023:
|
91 |
+
|
92 |
+
- `bitsandbytes` is now optional. Please install it if you want to use it. The insructions are in the later section.
|
93 |
+
- `albumentations` is not required anymore.
|
94 |
+
- An issue for pooled output for Textual Inversion training is fixed.
|
95 |
+
- `--v_pred_like_loss ratio` option is added. This option adds the loss like v-prediction loss in SDXL training. `0.1` means that the loss is added 10% of the v-prediction loss. The default value is None (disabled).
|
96 |
+
- In v-prediction, the loss is higher in the early timesteps (near the noise). This option can be used to increase the loss in the early timesteps.
|
97 |
+
- Arbitrary options can be used for Diffusers' schedulers. For example `--lr_scheduler_args "lr_end=1e-8"`.
|
98 |
+
- `sdxl_gen_imgs.py` supports batch size > 1.
|
99 |
+
- Fix ControlNet to work with attention couple and reginal LoRA in `gen_img_diffusers.py`.
|
100 |
+
|
101 |
+
Summary of the feature:
|
102 |
+
|
103 |
+
- `tools/cache_latents.py` is added. This script can be used to cache the latents to disk in advance.
|
104 |
+
- The options are almost the same as `sdxl_train.py'. See the help message for the usage.
|
105 |
+
- Please launch the script as follows:
|
106 |
+
`accelerate launch --num_cpu_threads_per_process 1 tools/cache_latents.py ...`
|
107 |
+
- This script should work with multi-GPU, but it is not tested in my environment.
|
108 |
+
|
109 |
+
- `tools/cache_text_encoder_outputs.py` is added. This script can be used to cache the text encoder outputs to disk in advance.
|
110 |
+
- The options are almost the same as `cache_latents.py' and `sdxl_train.py'. See the help message for the usage.
|
111 |
+
|
112 |
+
- `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.
|
113 |
+
- `--full_bf16` option is added. Thanks to KohakuBlueleaf!
|
114 |
+
- This option enables the full bfloat16 training (includes gradients). This option is useful to reduce the GPU memory usage.
|
115 |
+
- However, bitsandbytes==0.35 doesn't seem to support this. Please use a newer version of bitsandbytes or another optimizer.
|
116 |
+
- I cannot find bitsandbytes>0.35.0 that works correctly on Windows.
|
117 |
+
- In addition, the full bfloat16 training might be unstable. Please use it at your own risk.
|
118 |
+
- `prepare_buckets_latents.py` now supports SDXL fine-tuning.
|
119 |
+
- `sdxl_train_network.py` is a script for LoRA training for SDXL. The usage is almost the same as `train_network.py`.
|
120 |
+
- Both scripts has following additional options:
|
121 |
+
- `--cache_text_encoder_outputs` and `--cache_text_encoder_outputs_to_disk`: 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.
|
122 |
+
- `--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.
|
123 |
+
- The image generation during training is now available. `--no_half_vae` option also works to avoid black images.
|
124 |
+
|
125 |
+
- `--weighted_captions` option is not supported yet for both scripts.
|
126 |
+
- `--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.
|
127 |
+
|
128 |
+
- `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`.
|
129 |
+
- `--cache_text_encoder_outputs` is not supported.
|
130 |
+
- `token_string` must be alphabet only currently, due to the limitation of the open-clip tokenizer.
|
131 |
+
- There are two options for captions:
|
132 |
+
1. Training with captions. All captions must include the token string. The token string is replaced with multiple tokens.
|
133 |
+
2. Use `--use_object_template` or `--use_style_template` option. The captions are generated from the template. The existing captions are ignored.
|
134 |
+
- See below for the format of the embeddings.
|
135 |
+
|
136 |
+
- `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.
|
137 |
+
- 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`.
|
138 |
+
|
139 |
+
`requirements.txt` is updated to support SDXL training.
|
140 |
+
|
141 |
+
#### Tips for SDXL training
|
142 |
+
|
143 |
+
- The default resolution of SDXL is 1024x1024.
|
144 |
+
- The fine-tuning can be done with 24GB GPU memory with the batch size of 1. For 24GB GPU, the following options are recommended __for the fine-tuning with 24GB GPU memory__:
|
145 |
+
- Train U-Net only.
|
146 |
+
- Use gradient checkpointing.
|
147 |
+
- Use `--cache_text_encoder_outputs` option and caching latents.
|
148 |
+
- Use Adafactor optimizer. RMSprop 8bit or Adagrad 8bit may work. AdamW 8bit doesn't seem to work.
|
149 |
+
- The LoRA training can be done with 8GB GPU memory (10GB recommended). For reducing the GPU memory usage, the following options are recommended:
|
150 |
+
- Train U-Net only.
|
151 |
+
- Use gradient checkpointing.
|
152 |
+
- Use `--cache_text_encoder_outputs` option and caching latents.
|
153 |
+
- Use one of 8bit optimizers or Adafactor optimizer.
|
154 |
+
- Use lower dim (-8 for 8GB GPU).
|
155 |
+
- `--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.
|
156 |
+
- PyTorch 2 seems to use slightly less GPU memory than PyTorch 1.
|
157 |
+
- `--bucket_reso_steps` can be set to 32 instead of the default value 64. Smaller values than 32 will not work for SDXL training.
|
158 |
+
|
159 |
+
Example of the optimizer settings for Adafactor with the fixed learning rate:
|
160 |
+
```toml
|
161 |
+
optimizer_type = "adafactor"
|
162 |
+
optimizer_args = [ "scale_parameter=False", "relative_step=False", "warmup_init=False" ]
|
163 |
+
lr_scheduler = "constant_with_warmup"
|
164 |
+
lr_warmup_steps = 100
|
165 |
+
learning_rate = 4e-7 # SDXL original learning rate
|
166 |
+
```
|
167 |
+
|
168 |
+
## 🦒 Colab
|
169 |
+
|
170 |
+
🚦 WIP 🚦
|
171 |
+
|
172 |
+
This Colab notebook was not created or maintained by me; however, it appears to function effectively. The source can be found at: https://github.com/camenduru/kohya_ss-colab.
|
173 |
+
|
174 |
+
I would like to express my gratitude to camendutu for their valuable contribution. If you encounter any issues with the Colab notebook, please report them on their repository.
|
175 |
+
|
176 |
+
| Colab | Info |
|
177 |
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------- |
|
178 |
+
| [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/camenduru/kohya_ss-colab/blob/main/kohya_ss_colab.ipynb) | kohya_ss_gui_colab |
|
179 |
+
|
180 |
+
|
181 |
+
## Installation
|
182 |
+
|
183 |
+
### Windows
|
184 |
+
|
185 |
+
#### Windows Pre-requirements
|
186 |
+
|
187 |
+
To install the necessary dependencies on a Windows system, follow these steps:
|
188 |
+
|
189 |
+
1. Install [Python 3.10](https://www.python.org/ftp/python/3.10.9/python-3.10.9-amd64.exe).
|
190 |
+
- During the installation process, ensure that you select the option to add Python to the 'PATH' environment variable.
|
191 |
+
|
192 |
+
2. Install [Git](https://git-scm.com/download/win).
|
193 |
+
|
194 |
+
3. Install the [Visual Studio 2015, 2017, 2019, and 2022 redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe).
|
195 |
+
|
196 |
+
#### Setup
|
197 |
+
|
198 |
+
To set up the project, follow these steps:
|
199 |
+
|
200 |
+
1. Open a terminal and navigate to the desired installation directory.
|
201 |
+
|
202 |
+
2. Clone the repository by running the following command:
|
203 |
+
```
|
204 |
+
git clone https://github.com/bmaltais/kohya_ss.git
|
205 |
+
```
|
206 |
+
|
207 |
+
3. Change into the `kohya_ss` directory:
|
208 |
+
```
|
209 |
+
cd kohya_ss
|
210 |
+
```
|
211 |
+
|
212 |
+
4. Run the setup script by executing the following command:
|
213 |
+
```
|
214 |
+
.\setup.bat
|
215 |
+
```
|
216 |
+
|
217 |
+
During the accelerate config step use the default values as proposed during the configuration unless you know your hardware demand otherwise. Tfe amount of VRAM on your GPU does not have an impact on the values used.
|
218 |
+
|
219 |
+
#### Optional: CUDNN 8.6
|
220 |
+
|
221 |
+
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.
|
222 |
+
|
223 |
+
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:
|
224 |
+
|
225 |
+
1. Unzip the downloaded file and place the `cudnn_windows` folder in the root directory of the `kohya_ss` repository.
|
226 |
+
|
227 |
+
2. Run .\setup.bat and select the option to install cudann.
|
228 |
+
|
229 |
+
### Linux and macOS
|
230 |
+
|
231 |
+
#### Linux Pre-requirements
|
232 |
+
|
233 |
+
To install the necessary dependencies on a Linux system, ensure that you fulfill the following requirements:
|
234 |
+
|
235 |
+
- Ensure that `venv` support is pre-installed. You can install it on Ubuntu 22.04 using the command:
|
236 |
+
```
|
237 |
+
apt install python3.10-venv
|
238 |
+
```
|
239 |
+
|
240 |
+
- 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).
|
241 |
+
|
242 |
+
- Make sure you have Python version 3.10.6 or higher (but lower than 3.11.0) installed on your system.
|
243 |
+
|
244 |
+
- If you are using WSL2, set the `LD_LIBRARY_PATH` environment variable by executing the following command:
|
245 |
+
```
|
246 |
+
export LD_LIBRARY_PATH=/usr/lib/wsl/lib/
|
247 |
+
```
|
248 |
+
|
249 |
+
#### Setup
|
250 |
+
|
251 |
+
To set up the project on Linux or macOS, perform the following steps:
|
252 |
+
|
253 |
+
1. Open a terminal and navigate to the desired installation directory.
|
254 |
+
|
255 |
+
2. Clone the repository by running the following command:
|
256 |
+
```
|
257 |
+
git clone https://github.com/bmaltais/kohya_ss.git
|
258 |
+
```
|
259 |
+
|
260 |
+
3. Change into the `kohya_ss` directory:
|
261 |
+
```
|
262 |
+
cd kohya_ss
|
263 |
+
```
|
264 |
+
|
265 |
+
4. If you encounter permission issues, make the `setup.sh` script executable by running the following command:
|
266 |
+
```
|
267 |
+
chmod +x ./setup.sh
|
268 |
+
```
|
269 |
+
|
270 |
+
5. Run the setup script by executing the following command:
|
271 |
+
```
|
272 |
+
./setup.sh
|
273 |
+
```
|
274 |
+
|
275 |
+
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.
|
276 |
+
|
277 |
+
#### Install Location
|
278 |
+
|
279 |
+
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.
|
280 |
+
|
281 |
+
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.
|
282 |
+
|
283 |
+
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.
|
284 |
+
|
285 |
+
### Runpod
|
286 |
+
#### Manual installation
|
287 |
+
|
288 |
+
To install the necessary components for Runpod and run kohya_ss, follow these steps:
|
289 |
+
|
290 |
+
1. Select the Runpod pytorch 2.0.1 template. This is important. Other templates may not work.
|
291 |
+
|
292 |
+
2. SSH into the Runpod.
|
293 |
+
|
294 |
+
3. Clone the repository by running the following command:
|
295 |
+
```
|
296 |
+
cd /workspace
|
297 |
+
git clone https://github.com/bmaltais/kohya_ss.git
|
298 |
+
```
|
299 |
+
|
300 |
+
4. Run the setup script:
|
301 |
+
```
|
302 |
+
cd kohya_ss
|
303 |
+
./setup-runpod.sh
|
304 |
+
```
|
305 |
+
|
306 |
+
5. Run the gui with:
|
307 |
+
```
|
308 |
+
./gui.sh --share --headless
|
309 |
+
```
|
310 |
+
|
311 |
+
or with this if you expose 7860 directly via the runpod configuration
|
312 |
+
|
313 |
+
```
|
314 |
+
./gui.sh --listen=0.0.0.0 --headless
|
315 |
+
```
|
316 |
+
|
317 |
+
6. Connect to the public URL displayed after the installation process is completed.
|
318 |
+
|
319 |
+
#### Pre-built Runpod template
|
320 |
+
|
321 |
+
To run from a pre-built Runpod template you can:
|
322 |
+
|
323 |
+
1. Open the Runpod template by clicking on https://runpod.io/gsc?template=ya6013lj5a&ref=w18gds2n
|
324 |
+
|
325 |
+
2. Deploy the template on the desired host
|
326 |
+
|
327 |
+
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.
|
328 |
+
|
329 |
+
|
330 |
+
### Docker
|
331 |
+
#### Local docker build
|
332 |
+
|
333 |
+
If you prefer to use Docker, follow the instructions below:
|
334 |
+
|
335 |
+
1. Ensure that you have Git and Docker installed on your Windows or Linux system.
|
336 |
+
|
337 |
+
2. Open your OS shell (Command Prompt or Terminal) and run the following commands:
|
338 |
+
|
339 |
+
```bash
|
340 |
+
git clone https://github.com/bmaltais/kohya_ss.git
|
341 |
+
cd kohya_ss
|
342 |
+
docker compose build
|
343 |
+
docker compose run --service-ports kohya-ss-gui
|
344 |
+
```
|
345 |
+
|
346 |
+
Note: The initial run may take up to 20 minutes to complete.
|
347 |
+
|
348 |
+
Please be aware of the following limitations when using Docker:
|
349 |
+
|
350 |
+
- All training data must be placed in the `dataset` subdirectory, as the Docker container cannot access files from other directories.
|
351 |
+
- The file picker feature is not functional. You need to manually set the folder path and config file path.
|
352 |
+
- Dialogs may not work as expected, and it is recommended to use unique file names to avoid conflicts.
|
353 |
+
- 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`.
|
354 |
+
|
355 |
+
If you are running Linux, an alternative Docker container port with fewer limitations is available [here](https://github.com/P2Enjoy/kohya_ss-docker).
|
356 |
+
|
357 |
+
#### ashleykleynhans runpod docker builds
|
358 |
+
|
359 |
+
You may want to use the following Dockerfile repos to build the images:
|
360 |
+
|
361 |
+
- Standalone Kohya_ss template: https://github.com/ashleykleynhans/kohya-docker
|
362 |
+
- Auto1111 + Kohya_ss GUI template: https://github.com/ashleykleynhans/stable-diffusion-docker
|
363 |
+
|
364 |
+
## Upgrading
|
365 |
+
|
366 |
+
To upgrade your installation to a new version, follow the instructions below.
|
367 |
+
|
368 |
+
### Windows Upgrade
|
369 |
+
|
370 |
+
If a new release becomes available, you can upgrade your repository by running the following commands from the root directory of the project:
|
371 |
+
|
372 |
+
1. Pull the latest changes from the repository:
|
373 |
+
```powershell
|
374 |
+
git pull
|
375 |
+
```
|
376 |
+
|
377 |
+
2. Run the setup script:
|
378 |
+
```powershell
|
379 |
+
.\setup.bat
|
380 |
+
```
|
381 |
+
|
382 |
+
### Linux and macOS Upgrade
|
383 |
+
|
384 |
+
To upgrade your installation on Linux or macOS, follow these steps:
|
385 |
+
|
386 |
+
1. Open a terminal and navigate to the root
|
387 |
+
|
388 |
+
directory of the project.
|
389 |
+
|
390 |
+
2. Pull the latest changes from the repository:
|
391 |
+
```bash
|
392 |
+
git pull
|
393 |
+
```
|
394 |
+
|
395 |
+
3. Refresh and update everything:
|
396 |
+
```bash
|
397 |
+
./setup.sh
|
398 |
+
```
|
399 |
+
|
400 |
+
## Starting GUI Service
|
401 |
+
|
402 |
+
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.
|
403 |
+
|
404 |
+
```text
|
405 |
+
--listen: Specify the IP address to listen on for connections to Gradio.
|
406 |
+
--username: Set a username for authentication.
|
407 |
+
--password: Set a password for authentication.
|
408 |
+
--server_port: Define the port to run the server listener on.
|
409 |
+
--inbrowser: Open the Gradio UI in a web browser.
|
410 |
+
--share: Share the Gradio UI.
|
411 |
+
```
|
412 |
+
|
413 |
+
### Launching the GUI on Windows
|
414 |
+
|
415 |
+
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:
|
416 |
+
|
417 |
+
```powershell
|
418 |
+
gui.ps1 --listen 127.0.0.1 --server_port 7860 --inbrowser --share
|
419 |
+
```
|
420 |
+
|
421 |
+
or
|
422 |
+
|
423 |
+
```powershell
|
424 |
+
gui.bat --listen 127.0.0.1 --server_port 7860 --inbrowser --share
|
425 |
+
```
|
426 |
+
|
427 |
+
### Launching the GUI on Linux and macOS
|
428 |
+
|
429 |
+
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:
|
430 |
+
|
431 |
+
```bash
|
432 |
+
gui.sh --listen 127.0.0.1 --server_port 7860 --inbrowser --share
|
433 |
+
```
|
434 |
+
|
435 |
+
## Dreambooth
|
436 |
+
|
437 |
+
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).
|
438 |
+
|
439 |
+
## Finetune
|
440 |
+
|
441 |
+
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).
|
442 |
+
|
443 |
+
## Train Network
|
444 |
+
|
445 |
+
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).
|
446 |
+
|
447 |
+
## LoRA
|
448 |
+
|
449 |
+
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.
|
450 |
+
|
451 |
+
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).
|
452 |
+
|
453 |
+
The following are the names of LoRA types used in this repository:
|
454 |
+
|
455 |
+
1. LoRA-LierLa: LoRA for Linear layers and Conv2d layers with a 1x1 kernel.
|
456 |
+
|
457 |
+
2. LoRA-C3Lier: LoRA for Conv2d layers with a 3x3 kernel, in addition to LoRA-LierLa.
|
458 |
+
|
459 |
+
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.
|
460 |
+
|
461 |
+
To use LoRA-C3Lier with the Web UI, please use our extension.
|
462 |
+
|
463 |
+
## Sample image generation during training
|
464 |
+
|
465 |
+
A prompt file might look like this, for example:
|
466 |
+
|
467 |
+
```
|
468 |
+
# prompt 1
|
469 |
+
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
|
470 |
+
|
471 |
+
# prompt 2
|
472 |
+
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
|
473 |
+
```
|
474 |
+
|
475 |
+
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:
|
476 |
+
|
477 |
+
- `--n`: Negative prompt up to the next option.
|
478 |
+
- `--w`: Specifies the width of the generated image.
|
479 |
+
- `--h`: Specifies the height of the generated image.
|
480 |
+
- `--d`: Specifies the seed of the generated image.
|
481 |
+
- `--l`: Specifies the CFG scale of the generated image.
|
482 |
+
- `--s`: Specifies the number of steps in the generation.
|
483 |
+
|
484 |
+
The prompt weighting such as `( )` and `[ ]` are working.
|
485 |
+
|
486 |
+
## Troubleshooting
|
487 |
+
|
488 |
+
If you encounter any issues, refer to the troubleshooting steps below.
|
489 |
+
|
490 |
+
### Page File Limit
|
491 |
+
|
492 |
+
If you encounter an X error related to the page file, you may need to increase the page file size limit in Windows.
|
493 |
+
|
494 |
+
### No module called tkinter
|
495 |
+
|
496 |
+
If you encounter an error indicating that the module `tkinter` is not found, try reinstalling Python 3.10 on your system.
|
497 |
+
|
498 |
+
### FileNotFoundError
|
499 |
+
|
500 |
+
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:
|
501 |
+
|
502 |
+
1. Open a new PowerShell terminal and ensure that no virtual environment is active.
|
503 |
+
|
504 |
+
2. Run the following commands to create a backup file of your locally installed pip packages and then uninstall them:
|
505 |
+
```powershell
|
506 |
+
pip freeze > uninstall.txt
|
507 |
+
pip uninstall -r uninstall.txt
|
508 |
+
```
|
509 |
+
|
510 |
+
After uninstalling the local packages, redo the installation steps within the `kohya_ss` virtual environment.
|
511 |
+
|
512 |
+
## Change History
|
513 |
+
|
514 |
+
* 2023/08/05 (v21.8.7)
|
515 |
+
- Merge latest sd-scripts updates.
|
516 |
+
- Updated layout? This is up for debate... but I think it make things easier to find. Tab instead of endless scrolling...
|
517 |
+
- Fix issue with LoRA merge GUI
|
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 (15.3 kB). View file
|
|
__pycache__/finetune_gui.cpython-310.pyc
ADDED
Binary file (17.1 kB). View file
|
|
__pycache__/lora_gui.cpython-310.pyc
ADDED
Binary file (26.7 kB). View file
|
|
__pycache__/textual_inversion_gui.cpython-310.pyc
ADDED
Binary file (16.3 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/libbitsandbytes_cuda118.dll
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:4dc34709b8dcb078cbcdd65e5684f116cb395644d12b9c9fb144af5455bb1c18
|
3 |
+
size 14026752
|
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
|
converted_markdown.md
ADDED
The diff for this file is too large to render.
See raw diff
|
|
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/options.md
ADDED
@@ -0,0 +1,788 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Explaining LoRA Learning Settings Using Kohya_ss for Stable Diffusion Understanding by Anyone
|
2 |
+
|
3 |
+
To understand the meaning of each setting in kohya_ss, it is necessary to know how LoRA performs additional learning.
|
4 |
+
|
5 |
+
We will also explain what the "model," which is the target of additional learning, is.
|
6 |
+
|
7 |
+
## What is a "model"
|
8 |
+
|
9 |
+
Stable Diffusion loads and uses modules called " models ". A model is, so to speak, a "brain", and its true identity is " weight information of a neural network ".
|
10 |
+
|
11 |
+
A neural network is made up of many " neurons ", and the clusters of neurons form many layers of " layers ". Neurons in one layer are connected to neurons in another layer by lines, and the strength of the connection is " weight ". It is this "weight" that holds a huge amount of picture information.
|
12 |
+
|
13 |
+
### LoRA adds a small neural net
|
14 |
+
|
15 |
+
LoRA is a kind of "additional learning", but additional learning is to upgrade the neural network.
|
16 |
+
|
17 |
+
An additional learning method called "DreamBooth" uses this method.
|
18 |
+
|
19 |
+
With this method, if you want to publish the additional training data, you need to distribute the whole model that has been updated with additional training.
|
20 |
+
|
21 |
+
Models are typically 2G to 5G bytes in size, making them difficult to distribute.
|
22 |
+
|
23 |
+
In contrast, LoRA learning leaves the model alone and creates a new “small neural net ” for each position you want to learn. Additional training is done on this small neural net .
|
24 |
+
|
25 |
+
When you want to distribute LoRA, you only need to distribute this small neural network , so the data size is small.
|
26 |
+
|
27 |
+
### Structure of a small neural net
|
28 |
+
|
29 |
+
LoRA's small neural net consists of three layers. The number of neurons in the "input layer" on the left and the "output layer" on the right is the same as the number of neurons in the "input layer" and "output layer" of the target neural network . The number of neurons in the middle layer (middle layer) is called the "rank number" (or the number of dimensions), and this number can be freely determined when learning.
|
30 |
+
|
31 |
+
### LoRA Learning Target 1: U-Net
|
32 |
+
|
33 |
+
U-Net is divided into "Down" (left half), "Mid" (bottom) and "Up" (right half).
|
34 |
+
|
35 |
+
And it consists of 25 blocks in total: Down12 block, Mid1 block, and Up12 block. The neural net added here is simply called "UNet" in Kohya_ss.
|
36 |
+
|
37 |
+
### RoLA Learning Object 2: Text Encoder
|
38 |
+
|
39 |
+
This isn't the only time LoRA adds neural nets .
|
40 |
+
|
41 |
+
The block called "Cross Attention" in the figure above receives text information from a module called "Text Encoder ". This "text encoder " has the role of converting the prompt, which is text data, into a string of numbers (vector).
|
42 |
+
|
43 |
+
There is only one text encoder , which is shared by all Attention Blocks in U-Net. This text encoder is originally treated as a "finished product" within Stable Diffusion and is not subject to model learning, but it is also subject to additional learning by LoRA.
|
44 |
+
|
45 |
+
The LoRA updated text encoder is used in all Attention blocks, so any neural nets added here will have a huge impact on the final image.
|
46 |
+
|
47 |
+
The neural network added here is called "Text Encoder" in Kohya_ss.
|
48 |
+
|
49 |
+
## Basic training parameters
|
50 |
+
### LoRA type
|
51 |
+
|
52 |
+
Specifies the type of LoRA learning. The LoRA explained above is the "standard" type. "DyLoRA" learns multiple ranks below the specified rank at the same time, so it is convenient when you want to select the optimum rank. LoHa is highly efficient LoRA, and LoCon extends learning to U-Net's Res block.
|
53 |
+
|
54 |
+
There is no problem with the Standard type at first. If you are having trouble learning, try another type.
|
55 |
+
|
56 |
+
### LoRA network weights
|
57 |
+
|
58 |
+
If you want to use the already learned LoRA file for additional learning, specify the LoRA file here.
|
59 |
+
|
60 |
+
The LoRA specified here will be read at the start of learning, and learning will start from this LoRA state. LoRA after learning is saved as another file, so the LoRA file specified here will not be overwritten.
|
61 |
+
|
62 |
+
### DIM from weights
|
63 |
+
|
64 |
+
This is an option only when doing additional training with LoRA network weights.
|
65 |
+
|
66 |
+
As shown in the figure above, LoRA adds a small neural network , but the number of neurons (number of ranks) in the middle layer can be freely set with Network Rank (described later).
|
67 |
+
|
68 |
+
However, turning this option on will set the number of ranks of the created LoRA to the same number of ranks as the LoRA specified in LoRA network weights. When this is turned on, the specification of Network Rank is ignored.
|
69 |
+
|
70 |
+
For example, when the number of LoRA ranks used for additional learning is 32, the number of LoRA ranks to be created will also be set to 32.
|
71 |
+
|
72 |
+
Default is off.
|
73 |
+
|
74 |
+
### Train batch size
|
75 |
+
|
76 |
+
Specify a batch size. A batch is "the number of images to read at once". A batch size of 2 will train two images at a time simultaneously. If multiple different pictures are learned at the same time, the tuning accuracy for each picture will drop, but since it will be learning that comprehensively captures the characteristics of multiple pictures, the final result may instead be better.
|
77 |
+
|
78 |
+
(If you tune too much to a specific picture, it will become LoRA that is not applicable.)
|
79 |
+
|
80 |
+
Since multiple pictures are learned at once, the higher the batch size, the shorter the learning time. However, the tuning accuracy decreases and the number of weight changes decreases, so there is a possibility that the learning may be insufficient in some cases.
|
81 |
+
|
82 |
+
(There is also a report that when increasing the batch size, it is better to increase the learning rate (described later). For example, if the batch size is 2, the learning rate should be doubled.)
|
83 |
+
|
84 |
+
Also, the higher the batch size, the more memory is consumed. Let's decide according to the size of VRAM of your PC.
|
85 |
+
|
86 |
+
With 6GB of VRAM, a batch size of 2 would be barely possible.
|
87 |
+
|
88 |
+
Default is 1.
|
89 |
+
|
90 |
+
*Since all the images read at the same time for each batch must be the same size, if the sizes of the training images are different, the number of images that are processed simultaneously may be less than the number of batches specified here.
|
91 |
+
|
92 |
+
### Epoch
|
93 |
+
|
94 |
+
One epoch is "one set of learning".
|
95 |
+
|
96 |
+
For example, let's say you want to learn by reading 50 images each 10 times. In this case, 1 epoch is 50x10 = 500 trainings. If it is 2 epochs, this will be repeated twice, so it will be 500x2 = 1000 times of learning.
|
97 |
+
|
98 |
+
After training for the specified number of epochs, a LoRA file will be created and saved to the specified location.
|
99 |
+
|
100 |
+
For LoRA, 2-3 epochs of learning is sufficient.
|
101 |
+
|
102 |
+
### Save every N epochs
|
103 |
+
|
104 |
+
You can save the progress as a LoRA file for each epoch number specified here.
|
105 |
+
|
106 |
+
For example, if you specify 10 in "Epoch" and specify 2 in "Save every N epochs", the LoRA file will be saved in the specified folder every 2 epochs (at the end of 2, 4, 6, 8 epochs).
|
107 |
+
|
108 |
+
If you don't need to create an intermediate LoRA, set the value here to the same value as "Epoch".
|
109 |
+
|
110 |
+
### Caption Extension
|
111 |
+
|
112 |
+
If you have prepared a caption file for each image, specify the extension of the caption file here.
|
113 |
+
|
114 |
+
If this is blank, the extension will be ".caption". If the extension of the caption file is ".txt", specify ".txt" here.
|
115 |
+
|
116 |
+
If you don't have a caption file, you can ignore it.
|
117 |
+
|
118 |
+
### Mixed precision
|
119 |
+
|
120 |
+
Specifies the type of mixed precision for the weight data during training.
|
121 |
+
|
122 |
+
The weight data is originally in 32-bit units (when no is selected), but if necessary, learning by mixing 16-bit unit data will lead to considerable memory savings and speedup. fp16 is a data format with half the precision , and bf16 is a data format devised to handle the same numerical width as 32-bit data .
|
123 |
+
|
124 |
+
You can get LoRA with a sufficiently high accuracy at fp16.
|
125 |
+
|
126 |
+
### Save precision
|
127 |
+
|
128 |
+
|
129 |
+
Specifies the type of weight data to save in the LoRA file.
|
130 |
+
|
131 |
+
float is 32-bit, fp16 and bf16 are 16-bit units. The two below have smaller file sizes.
|
132 |
+
|
133 |
+
The default is fp16.
|
134 |
+
|
135 |
+
### Number of CPU threads per core
|
136 |
+
|
137 |
+
The number of threads per CPU core during training. Basically, the higher the number, the higher the efficiency, but it is necessary to adjust the settings according to the specifications.
|
138 |
+
|
139 |
+
Default is 2.
|
140 |
+
|
141 |
+
### Seeds
|
142 |
+
During learning, there are a number of random processes such as ``in what order to read the images'' and ``how much noise to put on the training images (details omitted)''.
|
143 |
+
|
144 |
+
Seed is like an ID for determining the random processing procedure, and if the same Seed is specified, the same random procedure will be used each time, making it easier to reproduce the learning results.
|
145 |
+
|
146 |
+
However, there are random processes that do not use this seed (such as randomly cropping images), so specifying the same seed does not always give the same learning results.
|
147 |
+
|
148 |
+
Default is blank. If not specified, Seed will be set appropriately when training is executed.
|
149 |
+
|
150 |
+
If you want to reproduce the result as much as possible, there is no loss by setting a number (such as 1234) appropriately.
|
151 |
+
|
152 |
+
### Cache latents
|
153 |
+
|
154 |
+
The training image is read into VRAM, "compressed" to a state called Latent before entering U-Net, and is trained in VRAM in this state. Normally, images are "compressed" each time they are loaded, but you can specify that "compressed" images are kept in main memory by checking Cache latents.
|
155 |
+
|
156 |
+
Keeping it in the main memory saves VRAM space and speeds up, but you can't process the image before "compression", so you can't use augmentation (described later) other than flip_aug. Also, random crop (described later), which crops the image in a random range each time, cannot be used.
|
157 |
+
|
158 |
+
Default is on.
|
159 |
+
|
160 |
+
### Cache latents to disk
|
161 |
+
|
162 |
+
Similar to the Cache latents option, but checking this allows you to specify that compressed image data be saved to disk as temporary files.
|
163 |
+
|
164 |
+
This temporary file can be reused even after restarting kohya_ss, so if you want to do LoRA learning with the same data many times, turning on this option will increase learning efficiency.
|
165 |
+
|
166 |
+
However, if you turn this on, you will not be able to use augmentation and random crop other than flip_aug.
|
167 |
+
|
168 |
+
Default is off.
|
169 |
+
|
170 |
+
### Learning rate:
|
171 |
+
|
172 |
+
Specify the learning rate. " Learning" is to change the thickness (weight) of the wiring in the neural network so that a picture that looks exactly like the given picture can be made, but every time a picture is given, the wiring is changed. If you tune too much only to the given picture, you will not be able to draw other pictures at all.
|
173 |
+
|
174 |
+
To avoid this, we change the weights slightly each time to incorporate a little bit more of the given picture. The "learning rate" determines the amount of this "just a little".
|
175 |
+
|
176 |
+
The default value is 0.0001.
|
177 |
+
|
178 |
+
### LR Scheduler:
|
179 |
+
|
180 |
+
You can change the learning rate in the middle of learning. A scheduler is a setting for how to change the learning rate.
|
181 |
+
|
182 |
+
adafactor: Select this to set the optimizer (described later) to Adafactor . Learn while automatically adjusting the learning rate according to the situation to save VRAM
|
183 |
+
constant: the learning rate does not change from beginning to end
|
184 |
+
constant_with_warmup: Start with a learning rate of 0 and gradually increase it toward the set value of Learning rate during warm-up, and use the set value of Learning rate during main learning.
|
185 |
+
cosine : Gradually decrease the learning rate toward 0 while drawing a wave (cosine curve)
|
186 |
+
cosine _with_restarts: repeat cosine many times (see also description of LR number of cycles)
|
187 |
+
linear: Start at the Learning rate setting and decrease linearly towards 0
|
188 |
+
polynomial: Same behavior as linear, but a bit more complicated to reduce (see also LR power description)
|
189 |
+
Set to constant if you want the learning rate to be fixed at the Learning rate setting.
|
190 |
+
|
191 |
+
Default is cosine
|
192 |
+
|
193 |
+
### LR warmup
|
194 |
+
|
195 |
+
If you have selected constant_with_warmup in the scheduler, set here how many times to warm up.
|
196 |
+
|
197 |
+
The number specified here is a percentage of the total number of steps.
|
198 |
+
|
199 |
+
For example, if you train 50 images 10 times with a batch size of 1 and do this for 2 epochs, the total number of steps is 50x10x2=1000. If you set LR warmup to 10, the first 10% of the 1000 total steps, or 100 steps, will be the warmup.
|
200 |
+
|
201 |
+
You can ignore this if your scheduler is not constant_with_warmup.
|
202 |
+
|
203 |
+
Default is 10.
|
204 |
+
|
205 |
+
### Optimizer
|
206 |
+
|
207 |
+
The optimizer is a setting for "how to update the neural net weights during training ". Various methods have been proposed for smart learning, but the most commonly used in LoRA learning is ``AdamW'' (32-bit) or ``AdamW8bit''. AdamW8bit uses less VRAM and has enough accuracy, so if you get lost, use this.
|
208 |
+
|
209 |
+
In addition, "Adafactor", which adjusts the learning rate appropriately according to the progress of learning while incorporating Adam's method, is also often used (Learning rate setting is ignored when using Adafactor).
|
210 |
+
|
211 |
+
``DAdapt'' is an optimizer that adjusts the learning rate , and ``Lion'' is a relatively new optimizer , but it has not been fully verified yet. There is a report that "SGDNesterov" has good learning accuracy but slows down.
|
212 |
+
|
213 |
+
The default is AdamW8bit. There is no problem basically as it is.
|
214 |
+
|
215 |
+
### Optimizer extra arguments
|
216 |
+
|
217 |
+
If you want more granularity for a given optimizer , write the command here.
|
218 |
+
|
219 |
+
You can usually leave this field blank.
|
220 |
+
|
221 |
+
### Text Encoder learning rate
|
222 |
+
Sets the learning rate for the text encoder . As I wrote earlier, the effect of additional training on text encoders affects the entire U-Net.
|
223 |
+
|
224 |
+
Therefore, it is usually set lower than the learning rate (Unet learning rate) for each block of U-Net.
|
225 |
+
|
226 |
+
The default value is 0.00005(5e-5).
|
227 |
+
|
228 |
+
If you specify a number here, it takes precedence over the Learning rate value.
|
229 |
+
|
230 |
+
### Unet learning rate
|
231 |
+
|
232 |
+
Sets the learning rate for U-Net. This is the learning rate when performing additional learning on each attention block (and other blocks depending on the setting) in U-Net.
|
233 |
+
|
234 |
+
The default value is 0.0001.
|
235 |
+
|
236 |
+
If you specify a number here, it takes precedence over the Learning rate value.
|
237 |
+
|
238 |
+
### Network Rank (Dimension)
|
239 |
+
|
240 |
+
Specifies the number of neurons in the hidden layer of the "additional small neural net " described earlier in the article (see the figure above for details).
|
241 |
+
|
242 |
+
The larger the number of neurons , the more learning information can be stored, but the possibility of learning unnecessary information other than the learning target increases, and the LoRA file size also increases.
|
243 |
+
|
244 |
+
Generally, it is often set to a maximum of about 128, but there are reports that 32 is sufficient.
|
245 |
+
|
246 |
+
When making LoRA on a trial basis, it may be better to start from around 2 to 8.
|
247 |
+
|
248 |
+
Default is 8.
|
249 |
+
|
250 |
+
### Network alpha
|
251 |
+
|
252 |
+
This was introduced as a convenience measure to prevent weights from being rounded to 0 when saving LoRA.
|
253 |
+
|
254 |
+
Due to the structure of LoRA, the weight value of the neural network tends to be small, and if it becomes too small, it may become indistinguishable from zero (that is, the same as not learning anything). Therefore, a technique was proposed in which the actual (stored) weight value is kept large, but the weight is always weakened at a constant rate during learning to make the weight value appear smaller. Network alpha determines this "weight weakening rate".
|
255 |
+
|
256 |
+
The smaller the Network alpha value, the larger the stored LoRA neural net weights.
|
257 |
+
|
258 |
+
How much the weight weakens when used (usage strength) is calculated by "Network_Alpha/Network_Rank" (roughly a value between 0 and 1) and is closely related to the Network Rank number.
|
259 |
+
|
260 |
+
If the accuracy of LoRA after learning is not good enough, the weight data may be too small and collapsed to 0. In such a case, try lowering the Network Alpha value (=increasing the save weight value).
|
261 |
+
|
262 |
+
The default is 1 (that is, maximize the stored weight value).
|
263 |
+
|
264 |
+
If Network Alpha and Network Rank have the same value, the effect will be turned off.
|
265 |
+
|
266 |
+
*Network Alpha value must not exceed Network Rank value. It is possible to specify a higher number, but there is a high probability that it will result in an unintended LoRA.
|
267 |
+
|
268 |
+
Also, when setting the Network Alpha, you should consider the effect on the learning rate.
|
269 |
+
|
270 |
+
For example, with an Alpha of 16 and a Rank of 32, the strength of the weight used is 16/32 = 0.5, meaning that the learning rate is only half as powerful as the Learning Rate setting.
|
271 |
+
|
272 |
+
If Alpha and Rank are the same number, the strength used will be 1 and will have no effect on the learning rate.
|
273 |
+
|
274 |
+
### Max resolution
|
275 |
+
|
276 |
+
Specify the maximum resolution of training images in the order of "width, height". If the training images exceed the resolution specified here, they will be scaled down to this resolution.
|
277 |
+
|
278 |
+
The default is "512,512". Many models use images of this size, so it is safe to use images of this size when learning LoRA.
|
279 |
+
|
280 |
+
### Stop text encoder training
|
281 |
+
|
282 |
+
You can stop learning the text encoder in the middle. As I wrote above, updating the text encoder has a big impact on the whole, so it is easy to fall into overfitting (tuning too much to the training image and other images can not be drawn), and it is also overfitting to stop learning at a moderate point is one way to prevent
|
283 |
+
|
284 |
+
The number specified here is a percentage of the total training step. Once learning reaches this percentage, the text encoder stops learning.
|
285 |
+
|
286 |
+
For example, if the total number of steps is 1000 and you specify 80 here, the text encoder will finish training when the learning progress is 80%, i.e. 1000x0.8=800 steps.
|
287 |
+
|
288 |
+
Training of U-Net continues with 200 remaining steps.
|
289 |
+
|
290 |
+
If this is 0, the text encoder training will not stop until the end.
|
291 |
+
|
292 |
+
### Enable buckets
|
293 |
+
|
294 |
+
" bucket " is a "bucket" (container) as the name suggests. The training images used in LoRA do not have to be of the same size, but images of different sizes cannot be trained at the same time. Therefore, it is necessary to sort the images into "buckets" according to their size before training. Put similar sized images in the same bucket and different sized images in different buckets.
|
295 |
+
|
296 |
+
Default is on.
|
297 |
+
|
298 |
+
If your training images are all the same size, you can turn this option off, but leaving it on has no effect.
|
299 |
+
|
300 |
+
*If you turn off Enable buckets when the size of the training images is not unified, the training images will be enlarged or reduced to have the same size.
|
301 |
+
|
302 |
+
Enlargement and reduction are performed while maintaining the aspect ratio of the image. If the aspect ratio is not the same as the standard size, the vertical or horizontal size of the image after scaling may exceed the standard size. For example, if the base size is 512x512 ( 1 aspect ratio ) and the image size is 1536x1024 ( 1.5 aspect ratio ), the image will be scaled down to 768x512 ( 1.5 aspect ratio remains).
|
303 |
+
|
304 |
+
## Advanced Configuration
|
305 |
+
After this are the options in the Advanced Configuration section.
|
306 |
+
|
307 |
+
### Weights, Blocks, Conv
|
308 |
+
|
309 |
+
These are the "learning weight" and "rank" settings for each block in U-Net. Selecting each tab will bring up the corresponding configuration screen.
|
310 |
+
|
311 |
+
*These settings are for advanced users. If you have no preference, you can leave all fields blank.
|
312 |
+
|
313 |
+
|
314 |
+
#### Weights: Down LR weights/Mid LR weights/Up LR weights
|
315 |
+
As you can see from the U-Net structure diagram, U-Net consists of 12 IN blocks, 1 MID block, and 12 OUT blocks, a total of 25 blocks.
|
316 |
+
|
317 |
+
If you want different learning rate weights for each block, you can set them here individually.
|
318 |
+
|
319 |
+
The weight here is the "strength of learning" represented by a numerical value of 0 to 1. If it is 0, it is "not learning at all", and if it is 1, it is "learning at the learning rate set in Learning rate". can vary the intensity of learning.
|
320 |
+
|
321 |
+
A weight of 0.5 means half the learning rate.
|
322 |
+
|
323 |
+
"Down LR weights" specify the weights for each of the 12 IN blocks.
|
324 |
+
|
325 |
+
"Mid LR weights" specifies the weights of the MID block.
|
326 |
+
|
327 |
+
"Up LR weights" specify the weight of each of the 12 OUT blocks.
|
328 |
+
|
329 |
+
|
330 |
+
|
331 |
+
#### Weights: Blocks LR zero threshold
|
332 |
+
I explained that "LoRA adds neural nets ", but it doesn't make sense to add neural nets with too small weights (i.e. barely learned). Therefore, you can set "Do not add neural nets to blocks with too small weights ".
|
333 |
+
|
334 |
+
Blocks that do not exceed the weight value set here will not be added to the neural net . For example, if you specify 0.1 here, the neural net will not be added to blocks with weights less than or equal to 0.1 (note that exclusions also include the specified value!).
|
335 |
+
|
336 |
+
The default is blank, which is 0 (do nothing).
|
337 |
+
|
338 |
+
|
339 |
+
|
340 |
+
#### Blocks: Block dims, Block alphas
|
341 |
+
Here you can set different rank (dim) and alpha values for each of the 25 blocks IN0~11, MID, OUT0~11.
|
342 |
+
|
343 |
+
See Network Rank, Network alpha for rank and alpha values.
|
344 |
+
|
345 |
+
Blocks with higher rank are expected to hold more information.
|
346 |
+
|
347 |
+
You must always specify 25 numbers for this parameter value, but since LoRA targets attention blocks, IN0, IN3, IN6, IN9, IN10, IN11, IN11, OUT0, and IN1 do not have attention blocks. , IN2 settings (1st, 4th, 7th, 11th, 12th, 14th, 15th, 16th digits) are ignored during learning.
|
348 |
+
|
349 |
+
*This is a setting for advanced users. If you don't care, you can leave it blank. If not specified here, "Network Rank(Dimension)" value and "Network Alpha" value will be applied to all blocks.
|
350 |
+
|
351 |
+
|
352 |
+
|
353 |
+
#### Conv: Conv dims, Conv, alphas
|
354 |
+
The attention block that LoRA learns from has a neural network called "Conv ", which is also updated by additional learning (see the diagram of the attention layer structure at the top of the article). This is a process called "convolution", and the size of the "filter" used there is 1x1 square.
|
355 |
+
|
356 |
+
Read this article about convolutions .
|
357 |
+
|
358 |
+
On the other hand, some of the blocks other than Attention (Res, Down blocks) and some of the Attention blocks in OUT are convoluted using a 3x3 square filter. Originally, that is not the learning target of LoRA, but by specifying it with this parameter, the 3x3 convolution of the Res block can also be the learning target.
|
359 |
+
|
360 |
+
Since there are more learning targets, there is a possibility that more precise LoRA learning can be performed.
|
361 |
+
|
362 |
+
The setting method is the same as "Blocks: Blocks dims, Blocks alphas".
|
363 |
+
|
364 |
+
A 3x3 conv exists on all 25 layers.
|
365 |
+
|
366 |
+
*This is a setting for advanced users. If you don't care, you can leave it blank.
|
367 |
+
|
368 |
+
### No token padding
|
369 |
+
Captions attached to training images are processed every 75 tokens tokens " can basically be regarded as "words").
|
370 |
+
|
371 |
+
If the caption length is less than 75 tokens align to 75 tokens This is called "padding".
|
372 |
+
|
373 |
+
Here you can specify not to pad tokens
|
374 |
+
|
375 |
+
Default is off. You can basically leave it off.
|
376 |
+
|
377 |
+
|
378 |
+
|
379 |
+
### Gradient accumulation steps
|
380 |
+
Changing the weights (that is, "learning") is usually done for each batch read, but it is also possible to do multiple batches of training at once. This option specifies how many batches to learn at once.
|
381 |
+
|
382 |
+
This has a similar effect (not the "same effect"!) as increasing the number of batches.
|
383 |
+
|
384 |
+
For example, if the batch size is 4, the number of images read simultaneously in one batch is 4. In other words, one learning is performed every four readings. If we set the Gradient accumulation steps to 2, training will be performed once every 2 batches, resulting in 1 learning per 8 reads. This works similarly (but not the same!) as batch number 8.
|
385 |
+
|
386 |
+
If you increase this value, the number of times of learning will decrease, so the processing will be faster, but it will consume more memory.
|
387 |
+
|
388 |
+
Default is 1.
|
389 |
+
|
390 |
+
|
391 |
+
|
392 |
+
### Weighted captions
|
393 |
+
Currently, the most popular Stable Diffusion usage environment is "Stable Diffusion WebUI", which has a unique prompt description method. For example, if you want to emphasize "Black" very strongly when specifying " black cat " at the prompt, put the word you want to emphasize in parentheses like "(black:1.2) cat" and put ": number" after the word , Words are emphasized by multiples of that number.
|
394 |
+
|
395 |
+
This option allows this notation to be used in the training image captions as well.
|
396 |
+
|
397 |
+
If you want to write complex captions, it's a good idea to give it a try.
|
398 |
+
|
399 |
+
Default is off.
|
400 |
+
|
401 |
+
|
402 |
+
|
403 |
+
### Prior loss weight
|
404 |
+
The prior loss weight determines how much importance is given to the " regularization images" (see the description of the Regularization folder above for details) during training .
|
405 |
+
|
406 |
+
If this value is low, the regularization images are considered less important, and LoRA is generated that is more characteristic of the training images.
|
407 |
+
|
408 |
+
This setting has no meaning if you are not using a regularized image.
|
409 |
+
|
410 |
+
This is a value between 0 and 1, and defaults to 1 ( also respects regularized images).
|
411 |
+
|
412 |
+
### LR number of cycles
|
413 |
+
If you select " Cosine with restart" or "Polynomial" for the scheduler, this option specifies how many cycles the scheduler runs during training.
|
414 |
+
|
415 |
+
If the number of this option is 2 or greater, the scheduler will run multiple times during a single training run.
|
416 |
+
|
417 |
+
In both Cosine with restart and Polynomial, the learning rate gradually decreases to 0 as learning progresses, but if the number of cycles is 2 or more, the learning rate is reset and restarted when the learning rate reaches 0.
|
418 |
+
|
419 |
+
The figure below (source) is an example of the change in learning rate for Cosine with restart (purple) and Polynomial (light green).
|
420 |
+
|
421 |
+
The purple example has the number of cycles set to 4. The light green example has a cycle number of 1.
|
422 |
+
|
423 |
+
Since the specified number of cycles is executed within the determined learning step, the more the number of cycles increases, the more the learning rate changes.
|
424 |
+
|
425 |
+
Default is blank, leaving blank equals 1.
|
426 |
+
|
427 |
+
|
428 |
+
|
429 |
+
Example of learning rate movement
|
430 |
+
Cosine with restart "LR number of cycle = 4" (purple)
|
431 |
+
Polynomial "LR power = 2" (light green)
|
432 |
+
|
433 |
+
|
434 |
+
### LR power
|
435 |
+
This is an option when the scheduler is set to Polynomial. The higher this number, the steeper the initial learning rate drops. (The slope of the light green line in the image above becomes steeper).
|
436 |
+
|
437 |
+
When power is 1, it has the same shape as the linear scheduler.
|
438 |
+
|
439 |
+
If the number is too large, the learning rate will stick close to 0, resulting in insufficient learning, so be careful.
|
440 |
+
|
441 |
+
Defaults to blank, leaving blank equals 1 (that is, the same as the linear scheduler).
|
442 |
+
|
443 |
+
|
444 |
+
|
445 |
+
### Additional parameters
|
446 |
+
If you want to tweak learning setting parameters that are not displayed in the kohya_ss GUI , enter them here as commands.
|
447 |
+
|
448 |
+
You can usually leave this field blank.
|
449 |
+
|
450 |
+
|
451 |
+
|
452 |
+
### Save every N steps
|
453 |
+
A LoRA file is created and saved each time the number of steps specified here is completed.
|
454 |
+
|
455 |
+
For example, when the total number of learning steps is 1000, if you specify 200 here, LoRA files will be saved at the end of 200, 400, 600, and 800 steps.
|
456 |
+
|
457 |
+
See also "Save every N epochs" for saving intermediate LoRA.
|
458 |
+
|
459 |
+
Default is 0 (do not save intermediate LoRA).
|
460 |
+
|
461 |
+
|
462 |
+
|
463 |
+
### Save last N steps
|
464 |
+
This is an option when Save every N steps is specified to save LoRA during learning.
|
465 |
+
|
466 |
+
If you want to keep only recent LoRA files and discard old LoRA files, you can set "how many recent steps of LoRA files to keep" here.
|
467 |
+
|
468 |
+
For example, if the total number of training steps is 600 and the Save every N steps option is specified to save every 100 steps. Then LoRA files will be saved at the 100th, 200th, 300th, 400th, and 500th steps, but if Save every N steps is set to 300, only the last 300 steps of LoRA files will be saved. In other words, at the 500th step, LoRA older than the 200th (=500-300) step (that is, LoRA at the 100th step) is deleted.
|
469 |
+
|
470 |
+
Default is 0.
|
471 |
+
|
472 |
+
|
473 |
+
|
474 |
+
### Keep n tokens
|
475 |
+
If your training images have captions, you can randomly shuffle the comma-separated words in the captions (see Shuffle caption option for details). However, if you have words that you want to keep at the beginning, you can use this option to specify "Keep the first 0 words at the beginning".
|
476 |
+
|
477 |
+
The number of first words specified here will always be fixed at the beginning.
|
478 |
+
|
479 |
+
Default is 0. This option does nothing if the shuffle caption option is off.
|
480 |
+
|
481 |
+
* A "word" here is a piece of text separated by commas. No matter how many words the delimited text contains, it counts as "one word".
|
482 |
+
|
483 |
+
In the case of " black cat , eating, sitting", " black cat " is one word.
|
484 |
+
|
485 |
+
### Clip skip
|
486 |
+
The text encoder uses a mechanism called "CLIP", which is made up of 12 similar layers.
|
487 |
+
|
488 |
+
Texts ( tokens ) are originally converted to numeric sequences (vectors) through these 12 layers, and the vectors coming out of the last layer are sent to the U-Net Attention block.
|
489 |
+
|
490 |
+
However, the model developed independently by the service "Novel AI", commonly known as "Novel AI model", adopted a unique specification that uses the vector output by the second to last layer instead of the last layer. The same is true for models derived from Novel AI models. Therefore, it is necessary to specify "Which layer of CLIP is the vector from which the base model used for learning is used?"
|
491 |
+
|
492 |
+
"Clip skip" specifies the layer number of this "Xth from the end".
|
493 |
+
|
494 |
+
Setting this to 2 sends the penultimate layer's output vector to the Attention block. If 1, the output vector of the last layer is used.
|
495 |
+
|
496 |
+
If the base model is a Novel AI model (or a mix of them), 2 should be fine. In other cases, 1 is fine.
|
497 |
+
|
498 |
+
|
499 |
+
|
500 |
+
### Max Token Length
|
501 |
+
|
502 |
+
|
503 |
+
Specifies the length of the maximum token included in the caption .
|
504 |
+
|
505 |
+
The "tokens" here are not the number of words, but the number of tokens Note that commas also count as one token.
|
506 |
+
|
507 |
+
It's unlikely that you'll use more than 75 tokens in your caption, but if you find your caption to be too long, specify a higher number here.
|
508 |
+
|
509 |
+
|
510 |
+
|
511 |
+
### Full fp16 training (experimental)
|
512 |
+
When the option "Mixed precision" described above is turned on (fp16 or bf16), a mixture of 32-bit and 16-bit data is used during training, but when this option is turned on, all weight data is 16-bit (fp16 format). Although it saves memory, the accuracy of some data is halved, so there is a possibility that the learning accuracy will also drop.
|
513 |
+
|
514 |
+
Default is off. You should leave it off unless you really want to save memory.
|
515 |
+
|
516 |
+
|
517 |
+
|
518 |
+
### Gradient checkpointing
|
519 |
+
Normally, during training, we modify and update the weights of a large number of neural nets all at once each time an image is loaded. By fixing this "gradually" rather than "all at once," you can save memory by reducing computation.
|
520 |
+
|
521 |
+
This option specifies that the weight calculation should be done incrementally. Turning this on or off will have no effect on LoRA's learning results.
|
522 |
+
|
523 |
+
Default is off.
|
524 |
+
|
525 |
+
|
526 |
+
|
527 |
+
### Shuffle caption
|
528 |
+
If the training images have captions, most of the captions are written in the form of words separated by commas, such as " black cat , eating, sitting". The Shuffle caption option randomly changes the order of these comma-separated words each time.
|
529 |
+
|
530 |
+
Words in captions are generally given more weight the closer they are to the beginning. Therefore, if the word order is fixed, backward words may not be learned well, and forward words may have unintended associations with training images. It is hoped that this bias can be corrected by reordering the words each time the image is loaded.
|
531 |
+
|
532 |
+
This option has no meaning if the caption is written in sentences instead of comma separated.
|
533 |
+
|
534 |
+
Default is off.
|
535 |
+
|
536 |
+
* A "word" here is a piece of text separated by commas. No matter how many words the delimited text contains, it counts as "one word".
|
537 |
+
|
538 |
+
In the case of " black cat , eating, sitting", " black cat " is one word.
|
539 |
+
|
540 |
+
|
541 |
+
|
542 |
+
### Persistent data loaders
|
543 |
+
The data required for training is discarded and reloaded after each epoch. This is an option to keep it instead of throwing it away. Turning this option on speeds up the start of training for new epochs, but uses more memory to hold the data.
|
544 |
+
|
545 |
+
Default is off.
|
546 |
+
|
547 |
+
|
548 |
+
|
549 |
+
### Memory efficient attention
|
550 |
+
If this is checked, VRAM usage is suppressed and attention block processing is performed. It's slower than the next option "xformers". Turn it on if you don't have enough VRAM.
|
551 |
+
|
552 |
+
Default is off.
|
553 |
+
|
554 |
+
### Use xformers
|
555 |
+
Using a Python library called "xformers" will trade attention blocking for less VRAM usage at the cost of some speed. Turn it on if you don't have enough VRAM.
|
556 |
+
|
557 |
+
Default is on.
|
558 |
+
|
559 |
+
|
560 |
+
|
561 |
+
### Color augmentation
|
562 |
+
"augmentation" means "padded image". By slightly processing the training images each time, we artificially increase the number of types of training images.
|
563 |
+
|
564 |
+
When Color Augmentation is turned on, the Hue of the image is changed randomly each time. LoRA learned from this is expected to have a slight range in color tone.
|
565 |
+
|
566 |
+
Not available if the Cache latents option is on.
|
567 |
+
|
568 |
+
Default is off.
|
569 |
+
|
570 |
+
|
571 |
+
|
572 |
+
### Flip augmentation
|
573 |
+
If this option is turned on, the image will be horizontally flipped randomly. It can learn left and right angles, which is useful when you want to learn symmetrical people and objects .
|
574 |
+
|
575 |
+
Default is off.
|
576 |
+
|
577 |
+
|
578 |
+
|
579 |
+
### Min SNR gamma
|
580 |
+
In LoRA learning, learning is performed by putting noise of various strengths on the training image (details about this are omitted), but depending on the difference in strength of the noise on which it is placed, learning will be stable by moving closer to or farther from the learning target. not, and the Min SNR gamma was introduced to compensate for that. Especially when learning images with little noise on them, it may deviate greatly from the target, so try to suppress this jump.
|
581 |
+
|
582 |
+
I won't go into details because it's confusing, but you can set this value from 0 to 20, and the default is 0.
|
583 |
+
|
584 |
+
According to the paper that proposed this method, the optimal value is 5.
|
585 |
+
|
586 |
+
I don't know how effective it is, but if you're unsatisfied with the learning results, try different values.
|
587 |
+
|
588 |
+
|
589 |
+
|
590 |
+
### Don't upscale bucket resolution
|
591 |
+
The Bucket size defaults to 256-1024 pixels (or a maximum resolution if specified with the Max resolution option, which takes precedence). Images that fall outside this size range, either vertically or horizontally, will be scaled (preserving the aspect ratio ) to fit within the specified range.
|
592 |
+
|
593 |
+
However, when this option is turned on, the bucket size range setting is ignored and the buckets are automatically prepared according to the size of the training images, so all training images are loaded unscaled. . However, even at this time, some parts of the image may be cropped to fit the Bucket resolution steps (described later).
|
594 |
+
|
595 |
+
Default is on.
|
596 |
+
|
597 |
+
|
598 |
+
|
599 |
+
### Bucket resolution steps
|
600 |
+
If using buckets , specify the resolution interval for each bucket here.
|
601 |
+
|
602 |
+
For example, if you specify 64 here, each training image will be sorted into separate buckets by 64 pixels according to their size. This sorting is done for each vertical and horizontal.
|
603 |
+
|
604 |
+
If the image size does not fit the specified size of the bucket, the protruding part will be cut off.
|
605 |
+
|
606 |
+
For example, if the maximum resolution is 512 pixels and the bucket step size is every 64 pixels , then the buckets will be 512, 448, 384... but a 500 pixel image will be put into a 448 pixel bucket, with an extra 52 pixels are clipped.
|
607 |
+
|
608 |
+
Default is 64 pixels .
|
609 |
+
|
610 |
+
* If this number is too small, the buckets will be divided too finely, and in the worst case, it will be like "one bucket for each image".
|
611 |
+
|
612 |
+
Note that we always load images from the same bucket for each batch, so having too few images in a bucket will unintentionally reduce the number of batches.
|
613 |
+
|
614 |
+
|
615 |
+
|
616 |
+
### Random crop instead of center crop
|
617 |
+
As mentioned above, half-sized images are sorted into buckets and then partly cropped to align the size, but usually it is cropped so as to keep the center of the image.
|
618 |
+
|
619 |
+
When this option is on, it randomly determines which part of the picture is cut. Turn on this option if you want to extend the learning range beyond the center of the image.
|
620 |
+
|
621 |
+
*This option cannot be used when the cache latents option is on.
|
622 |
+
|
623 |
+
|
624 |
+
|
625 |
+
### Noise offset type
|
626 |
+
This is an option to specify which method to use when adding additional noise to training images. At the time of learning, we always add noise to the image (details are omitted here), but it is preferable that this noise is "hard to predict" noise, so adding more noise makes it more "predictable". "hard" noise.
|
627 |
+
|
628 |
+
Default is Original. Multires adds noise in a slightly more complicated way.
|
629 |
+
|
630 |
+
|
631 |
+
|
632 |
+
#### Noise offset
|
633 |
+
This is an option when "Original" is selected for Noise offset type. If you enter a value greater than 0 here, additional noise will be added. Values range from 0 to 1, where 0 adds no noise at all. A value of 1 adds strong noise.
|
634 |
+
|
635 |
+
It has been reported that adding about 0.1 noise makes LoRA's colors more vivid (brighter and darker). Default is 0.
|
636 |
+
|
637 |
+
|
638 |
+
|
639 |
+
####A daptive noise scale
|
640 |
+
Used in combination with the Noise offset option. Specifying a number here will further adjust the amount of additional noise specified by Noise offset to be amplified or attenuated. The amount of amplification (or attenuation) is automatically adjusted depending on how noisy the image is currently. Values range from -1 to 1, with positive values increasing the amount of added noise and negative values decreasing the amount of added noise.
|
641 |
+
|
642 |
+
Default is 0.
|
643 |
+
|
644 |
+
|
645 |
+
|
646 |
+
#### Multires noise iterations
|
647 |
+
This is an option when "Multires" is selected for Noise offset type. If you enter a value greater than 0 here, additional noise will be added.
|
648 |
+
|
649 |
+
Multires creates noise of various resolutions and adds them together to create the final additive noise. Here you specify how many "various resolutions" to create.
|
650 |
+
|
651 |
+
Default is 0, when 0 there is no additional noise. It is recommended to set it to 6 if you want to use it.
|
652 |
+
|
653 |
+
|
654 |
+
|
655 |
+
#### Multires noise discount
|
656 |
+
Pair with the Multires noise iterations option. It is a numerical value for weakening the noise amount of each resolution to some extent. A value between 0 and 1, the lower the number, the weaker the noise. By the way, the amount of attenuation differs depending on the resolution, and noise with low resolution is attenuated a lot.
|
657 |
+
|
658 |
+
Default is 0, if 0 it will be set to 0.3 when used. 0.8 is usually recommended. If the number of training images is relatively small, it seems to be good to lower it to about 0.3.
|
659 |
+
|
660 |
+
|
661 |
+
|
662 |
+
### Dropout caption every n epochs
|
663 |
+
Normally, images and captions are trained in pairs, but it is possible to train only "images without captions" without using captions for each specific epoch.
|
664 |
+
|
665 |
+
This option allows you to specify "Don't use captions every 0 epochs ( Dropout )".
|
666 |
+
|
667 |
+
For example, if you specify 2 here, image learning without captions will be performed every 2 epochs (2nd epoch, 4th epoch, 6th epoch...).
|
668 |
+
|
669 |
+
When learning images without captions, LoRA is expected to learn more comprehensive image features. It can also be expected to have the effect of not associating too many image features with specific words. However, if you don't use too many captions, the LoRA may become a LoRA without prompts, so be careful.
|
670 |
+
|
671 |
+
The default is 0, which means no caption dropout .
|
672 |
+
|
673 |
+
### Rate of caption dropout
|
674 |
+
It is similar to Dropout caption every n epochs above, but you can learn as "images without captions" without using captions for a certain percentage of the entire learning process.
|
675 |
+
|
676 |
+
Here you can set the percentage of images without captions. 0 is the setting for "always use captions during learning", and 1 is the setting for "never use captions during learning".
|
677 |
+
|
678 |
+
It is random which images are learned as "images without captions".
|
679 |
+
|
680 |
+
For example, if 20 images are read 50 times each and LoRA learning is performed for only 1 epoch, the total number of image learning is 20 images x 50 times x 1 epoch = 1000 times. At this time, if the Rate of caption dropout is set to 0.1, 1000 times x 0.1 = 100 times will be learned as "images without captions".
|
681 |
+
|
682 |
+
Default is 0, which trains all images with captions.
|
683 |
+
|
684 |
+
|
685 |
+
|
686 |
+
### VAE batch size
|
687 |
+
If you turn on the Cache latents option, you can keep the "compressed" image data in the main memory. size. Since the number of images specified by batch size is learned at once, it is normal to match the VAE batch size with this.
|
688 |
+
|
689 |
+
Default is 0, in which case it is set to the same number as Batch size.
|
690 |
+
|
691 |
+
|
692 |
+
|
693 |
+
### Save training state
|
694 |
+
LoRA will take a long time to train if there are many training images, number of iterations, and number of epochs.
|
695 |
+
|
696 |
+
If you turn on this option, you can interrupt the study in the middle and resume the study from where you left off at a later date.
|
697 |
+
|
698 |
+
Intermediate learning data is saved in a folder called "last-state".
|
699 |
+
|
700 |
+
|
701 |
+
|
702 |
+
### Resume from saved training state
|
703 |
+
Specify the location of the "last-state" folder here if you want to resume learning that has been interrupted.
|
704 |
+
|
705 |
+
In order to resume learning, the intermediate progress data of learning must be saved.
|
706 |
+
|
707 |
+
|
708 |
+
|
709 |
+
### Max train epoch
|
710 |
+
Specify the maximum number of epochs for training. It is basic to specify the number of epochs with the Epoch option, but learning will always end when the number of epochs specified here is reached.
|
711 |
+
|
712 |
+
Default is blank. You can leave this field blank.
|
713 |
+
|
714 |
+
|
715 |
+
|
716 |
+
### Max num workers for DataLoader
|
717 |
+
This option specifies the number of CPU processes to use when reading data for training. Increasing this number will enable subprocesses and increase the speed of reading data, but increasing the number too much may actually result in inefficiency.
|
718 |
+
|
719 |
+
Note that no matter how large the number is specified, it will not exceed the number of concurrently executing threads of the CPU used.
|
720 |
+
|
721 |
+
The default is 0, which loads data only in the CPU's main process.
|
722 |
+
|
723 |
+
|
724 |
+
|
725 |
+
### WANDB API Key
|
726 |
+
There is a machine learning service called " WandB " (Weights&Biases) . This is a service that displays the progress of learning in graphs to find the optimal settings, records and shares learning logs online, and kohya_ss can now use this service.
|
727 |
+
|
728 |
+
However, you will need an account for this service. After creating an account, you can get an " API key" from https://app.wandb.ai/authorize . If you enter the acquired API key here, you will be automatically logged in when learning and you will be able to link with WandB services.
|
729 |
+
|
730 |
+
I won't go into details about WandB, but if you want to become a "LoRA craftsman", give it a try.
|
731 |
+
|
732 |
+
|
733 |
+
|
734 |
+
### WANDB Logging
|
735 |
+
Here you can specify whether or not to record learning progress logs using the WandB service.
|
736 |
+
|
737 |
+
The default is off, and when off, it logs in the form of a tool called 'tensorboard'.
|
738 |
+
|
739 |
+
## Sample images config
|
740 |
+
If you want to check what image generation with LoRA looks like while learning, enter the image generation prompt here.
|
741 |
+
|
742 |
+
However, since LoRA has a relatively short learning time, there may not be much need for image generation tests.
|
743 |
+
|
744 |
+
|
745 |
+
|
746 |
+
### Sample every n steps
|
747 |
+
Specify at what step you want to generate an image during learning. For example, specifying 100 will generate an image every 100 steps.
|
748 |
+
|
749 |
+
Default is 0, if 0 no image is generated.
|
750 |
+
|
751 |
+
|
752 |
+
|
753 |
+
### Sample every n epochs
|
754 |
+
Specifies the number of epochs to generate images during training. For example, 2 will generate an image every 2 epochs.
|
755 |
+
|
756 |
+
Default is 0, if 0 no image is generated.
|
757 |
+
|
758 |
+
|
759 |
+
|
760 |
+
### Sample sampler
|
761 |
+
Specifies the sampler to use for image generation . Many of the samplers specified here are the same as the samplers provided in the Stable Diffusion Web UI , so please refer to the web UI explanation site for details.
|
762 |
+
|
763 |
+
The default is euler_a.
|
764 |
+
|
765 |
+
|
766 |
+
|
767 |
+
### Sample prompts
|
768 |
+
Enter the prompt here.
|
769 |
+
|
770 |
+
However, you can enter other settings here than just prompts. If you want to enter other settings, specify the setting by combining two minus letters and alphabets like "--n". For example, if you want to put "white, dog" in the negative prompt, write "--n white, dog".
|
771 |
+
|
772 |
+
Here are some commonly used settings:
|
773 |
+
|
774 |
+
--n: negative prompt
|
775 |
+
|
776 |
+
--w: image width
|
777 |
+
|
778 |
+
--h: image height
|
779 |
+
|
780 |
+
--d: Seeds
|
781 |
+
|
782 |
+
--l: CFG Scale
|
783 |
+
|
784 |
+
--s: number of steps
|
785 |
+
|
786 |
+
Default is blank. When the field is blank, the description example is displayed in faint color, so please refer to it.
|
787 |
+
|
788 |
+
|
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,1004 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
+
- PagedAdamW8bit : 引数は同上
|
613 |
+
- 過去のバージョンの--use_8bit_adam指定時と同じ
|
614 |
+
- Lion : https://github.com/lucidrains/lion-pytorch
|
615 |
+
- 過去のバージョンの--use_lion_optimizer指定時と同じ
|
616 |
+
- Lion8bit : 引数は同上
|
617 |
+
- PagedLion8bit : 引数は同上
|
618 |
+
- SGDNesterov : [torch.optim.SGD](https://pytorch.org/docs/stable/generated/torch.optim.SGD.html), nesterov=True
|
619 |
+
- SGDNesterov8bit : 引数は同上
|
620 |
+
- DAdaptation(DAdaptAdamPreprint) : https://github.com/facebookresearch/dadaptation
|
621 |
+
- DAdaptAdam : 引数は同上
|
622 |
+
- DAdaptAdaGrad : 引数は同上
|
623 |
+
- DAdaptAdan : 引数は同上
|
624 |
+
- DAdaptAdanIP : 引数は同上
|
625 |
+
- DAdaptLion : 引数は同上
|
626 |
+
- DAdaptSGD : 引数は同上
|
627 |
+
- Prodigy : https://github.com/konstmish/prodigy
|
628 |
+
- AdaFactor : [Transformers AdaFactor](https://huggingface.co/docs/transformers/main_classes/optimizer_schedules)
|
629 |
+
- 任意のオプティマイザ
|
630 |
+
|
631 |
+
- `--learning_rate`
|
632 |
+
|
633 |
+
学習率を指定します。適切な学習率は学習スクリプトにより異なりますので、それぞれの説明を参照してください。
|
634 |
+
|
635 |
+
- `--lr_scheduler` / `--lr_warmup_steps` / `--lr_scheduler_num_cycles` / `--lr_scheduler_power`
|
636 |
+
|
637 |
+
学習率のスケジューラ関連の指定です。
|
638 |
+
|
639 |
+
lr_schedulerオプションで学習率のスケジューラをlinear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup, 任意のスケジューラから選べます。デフォルトはconstantです。
|
640 |
+
|
641 |
+
lr_warmup_stepsでスケジューラのウォームアップ(だんだん学習率を変えていく)ステップ数を指定できます。
|
642 |
+
|
643 |
+
lr_scheduler_num_cycles は cosine with restartsスケジューラでのリスタート回数、lr_scheduler_power は polynomialスケジューラでのpolynomial power です。
|
644 |
+
|
645 |
+
詳細については各自お調べください。
|
646 |
+
|
647 |
+
任意のスケジューラを使う場合、任意のオプティマイザと同様に、`--scheduler_args`でオプション引数を指定してください。
|
648 |
+
|
649 |
+
### オプティマイザの指定について
|
650 |
+
|
651 |
+
オプティマイザのオプション引数は--optimizer_argsオプションで指定してください。key=valueの形式で、複数の値が指定できます。また、valueはカンマ区切りで複数の値が指定できます。たとえばAdamWオプティマイザに引数を指定する場合は、``--optimizer_args weight_decay=0.01 betas=.9,.999``のようになります。
|
652 |
+
|
653 |
+
オプション引数を指定する場合は、それぞれのオプティマイザの仕様をご確認ください。
|
654 |
+
|
655 |
+
一部のオプティマイザでは必須の引数があり、省略すると自動的に追加されます(SGDNesterovのmomentumなど)。コンソールの出力を確認してください。
|
656 |
+
|
657 |
+
D-Adaptationオプティマイザは学習率を自動調整します。学習率のオプションに指定した値は学習率そのものではなくD-Adaptationが決定した学習率の適用率になりますので、通常は1.0を指定してください。Text EncoderにU-Netの半分の学習率を指定したい場合は、``--text_encoder_lr=0.5 --unet_lr=1.0``と指定します。
|
658 |
+
|
659 |
+
AdaFactorオプティマイザはrelative_step=Trueを指定すると学習率を自動調整できます(省略時はデフォルトで追加されます)。自動調整する場合は学習率のスケジ��ーラにはadafactor_schedulerが強制的に使用されます。またscale_parameterとwarmup_initを指定するとよいようです。
|
660 |
+
|
661 |
+
自動調整する場合のオプション指定はたとえば ``--optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True"`` のようになります。
|
662 |
+
|
663 |
+
学習率を自動調整しない場合はオプション引数 ``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`` のようになります。
|
664 |
+
|
665 |
+
### 任意のオプティマイザを使う
|
666 |
+
|
667 |
+
``torch.optim`` のオプティマイザを使う場合にはクラス名のみを(``--optimizer_type=RMSprop``など)、他のモジュールのオプティマイザを使う時は「モジュール名.クラス名」を指定してください(``--optimizer_type=bitsandbytes.optim.lamb.LAMB``など)。
|
668 |
+
|
669 |
+
(内部でimportlibしているだけで動作は未確認です。必要ならパッケージをインストールしてください。)
|
670 |
+
|
671 |
+
|
672 |
+
<!--
|
673 |
+
## 任意サイズの画像での学習 --resolution
|
674 |
+
正方形以外で学習できます。resolutionに「448,640」のように「幅,高さ」で指定してください。幅と高さは64で割り切れる必要があります。学習用画像、正則化画像のサイズを合わせてください。
|
675 |
+
|
676 |
+
個人的には縦長の画像を生成することが多いため「448,640」などで学習することもあります。
|
677 |
+
|
678 |
+
## Aspect Ratio Bucketing --enable_bucket / --min_bucket_reso / --max_bucket_reso
|
679 |
+
enable_bucketオプションを指定すると有効になります。Stable Diffusionは512x512で学習されていますが、それに加えて256x768や384x640といった解像度でも学習します。
|
680 |
+
|
681 |
+
このオプションを指定した場合は、学習用画像、正則化画像を特定の解像度に統一する必要はありません。いくつかの解像度(アスペクト比)から最適なものを選び、その解像度で学習します。
|
682 |
+
解像度は64ピクセル単位のため、元画像とアスペクト比が完全に一致しない場合がありますが、その場合は、はみ出した部分がわずかにトリミングされます。
|
683 |
+
|
684 |
+
解像度の最小サイズをmin_bucket_resoオプションで、最大サイズをmax_bucket_resoで指定できます。デフォルトはそれぞれ256、1024です。
|
685 |
+
たとえば最小サイズに384を指定すると、256x1024や320x768などの解像度は使わなくなります。
|
686 |
+
解像度を768x768のように大きくした場合、最大サイズに1280などを指定しても良いかもしれません。
|
687 |
+
|
688 |
+
なおAspect Ratio Bucketingを有効にするときには、正則化画像についても、学習用画像と似た傾向の様々な解像度を用意した方がいいかもしれません。
|
689 |
+
|
690 |
+
(ひとつのバッチ内の画像が学習用画像、正則化画像に偏らなくなるため。そこまで大きな影響はないと思いますが……。)
|
691 |
+
|
692 |
+
## augmentation --color_aug / --flip_aug
|
693 |
+
augmentationは学習時に動的にデータを変化させることで、モデルの性能を上げる手法です。color_augで色合いを微妙に変えつつ、flip_augで左右反転をしつつ、学習します。
|
694 |
+
|
695 |
+
動的にデータを変化させるため、cache_latentsオプションと同時に指定できません。
|
696 |
+
|
697 |
+
|
698 |
+
## 勾配をfp16とした学習(実験的機能) --full_fp16
|
699 |
+
full_fp16オプションを指定すると勾配を通常のfloat32からfloat16(fp16)に変更して学習します(mixed precisionではなく完全なfp16学習になるようです)。
|
700 |
+
これによりSD1.xの512x512サイズでは8GB未満、SD2.xの512x512サイズで12GB未満のVRAM使用量で学習できるようです。
|
701 |
+
|
702 |
+
あらかじめaccelerate configでfp16を指定し、オプションで ``mixed_precision="fp16"`` としてください(bf16では動作しません)。
|
703 |
+
|
704 |
+
メモリ使用量を最小化するためには、xformers、use_8bit_adam、cache_latents、gradient_checkpointingの各オプションを指定し、train_batch_sizeを1としてください。
|
705 |
+
|
706 |
+
(余裕があるようならtrain_batch_sizeを段階的に増やすと若干精度が上がるはずです。)
|
707 |
+
|
708 |
+
PyTorchのソースにパッチを当てて無理やり実現しています(PyTorch 1.12.1と1.13.0で確認)。精度はかなり落ちますし、途中で学習失敗する確率も高くなります。
|
709 |
+
学習率やステップ数の設定もシビアなようです。それらを認識したうえで自己責任でお使いください。
|
710 |
+
|
711 |
+
-->
|
712 |
+
|
713 |
+
# メタデータファイルの作成
|
714 |
+
|
715 |
+
## 教師データの用意
|
716 |
+
|
717 |
+
前述のように学習させたい画像データを用意し、任意のフォルダ���入れてください。
|
718 |
+
|
719 |
+
たとえば以下のように画像を格納します。
|
720 |
+
|
721 |
+
![教師データフォルダのスクショ](https://user-images.githubusercontent.com/52813779/208907739-8e89d5fa-6ca8-4b60-8927-f484d2a9ae04.png)
|
722 |
+
|
723 |
+
## 自動キャプショニング
|
724 |
+
|
725 |
+
キャプションを使わずタグだけで学習する場合はスキップしてください。
|
726 |
+
|
727 |
+
また手動でキャプションを用意する場合、キャプションは教師データ画像と同じディレクトリに、同じファイル名、拡張子.caption等で用意してください。各ファイルは1行のみのテキストファイルとします。
|
728 |
+
|
729 |
+
### BLIPによるキャプショニング
|
730 |
+
|
731 |
+
最新版ではBLIPのダウンロード、重みのダウンロード、仮想環境の追加は不要になりました。そのままで動作します。
|
732 |
+
|
733 |
+
finetuneフォルダ内のmake_captions.pyを実行します。
|
734 |
+
|
735 |
+
```
|
736 |
+
python finetune\make_captions.py --batch_size <バッチサイズ> <教師データフォルダ>
|
737 |
+
```
|
738 |
+
|
739 |
+
バッチサイズ8、教師データを親フォルダのtrain_dataに置いた場合、以下のようになります。
|
740 |
+
|
741 |
+
```
|
742 |
+
python finetune\make_captions.py --batch_size 8 ..\train_data
|
743 |
+
```
|
744 |
+
|
745 |
+
キャプションファイルが教師データ画像と同じディレクトリに、同じファイル名、拡張子.captionで作成されます。
|
746 |
+
|
747 |
+
batch_sizeはGPUのVRAM容量に応じて増減してください。大きいほうが速くなります(VRAM 12GBでももう少し増やせると思います)。
|
748 |
+
max_lengthオプションでキャプションの最大長を指定できます。デフォルトは75です。モデルをトークン長225で学習する場合には長くしても良いかもしれません。
|
749 |
+
caption_extensionオプションでキャプションの拡張子を変更できます。デフォルトは.captionです(.txtにすると後述のDeepDanbooruと競合します)。
|
750 |
+
|
751 |
+
複数の教師データフォルダがある場合には、それぞれのフォルダに対して実行してください。
|
752 |
+
|
753 |
+
なお、推論にランダム性があるため、実行するたびに結果が変わります。固定する場合には--seedオプションで `--seed 42` のように乱数seedを指定してください。
|
754 |
+
|
755 |
+
その他のオプションは `--help` でヘルプをご参照ください(パラメータの意味についてはドキュメントがまとまっていないようで、ソースを見るしかないようです)。
|
756 |
+
|
757 |
+
デフォルトでは拡張子.captionでキャプションファイルが生成されます。
|
758 |
+
|
759 |
+
![captionが生成されたフォルダ](https://user-images.githubusercontent.com/52813779/208908845-48a9d36c-f6ee-4dae-af71-9ab462d1459e.png)
|
760 |
+
|
761 |
+
たとえば以下のようなキャプションが付きます。
|
762 |
+
|
763 |
+
![キャプションと画像](https://user-images.githubusercontent.com/52813779/208908947-af936957-5d73-4339-b6c8-945a52857373.png)
|
764 |
+
|
765 |
+
## DeepDanbooruによるタグ付け
|
766 |
+
|
767 |
+
danbooruタグのタグ付け自体を行わない場合は「キャプションとタグ情報の前処理」に進んでください。
|
768 |
+
|
769 |
+
タグ付けはDeepDanbooruまたはWD14Taggerで行います。WD14Taggerのほうが精度が良いようです。WD14Taggerでタグ付けする場合は、次の章へ進んでください。
|
770 |
+
|
771 |
+
### 環境整備
|
772 |
+
|
773 |
+
DeepDanbooru https://github.com/KichangKim/DeepDanbooru を作業フォルダにcloneしてくるか、zipをダウンロードして展開します。私はzipで展開しました。
|
774 |
+
またDeepDanbooruのReleasesのページ https://github.com/KichangKim/DeepDanbooru/releases の「DeepDanbooru Pretrained Model v3-20211112-sgd-e28」のAssetsから、deepdanbooru-v3-20211112-sgd-e28.zipをダウンロードしてきてDeepDanbooruのフォルダに展開します。
|
775 |
+
|
776 |
+
以下からダウンロードします。Assetsをクリックして開き、そこからダウンロードします。
|
777 |
+
|
778 |
+
![DeepDanbooruダウンロードページ](https://user-images.githubusercontent.com/52813779/208909417-10e597df-7085-41ee-bd06-3e856a1339df.png)
|
779 |
+
|
780 |
+
以下のようなこういうディレクトリ構造にしてください
|
781 |
+
|
782 |
+
![DeepDanbooruのディレクトリ構造](https://user-images.githubusercontent.com/52813779/208909486-38935d8b-8dc6-43f1-84d3-fef99bc471aa.png)
|
783 |
+
|
784 |
+
Diffusersの環境に必要なライブラリをインストールします。DeepDanbooruのフォルダに移動してインストールします(実質的にはtensorflow-ioが追加されるだけだと思います)。
|
785 |
+
|
786 |
+
```
|
787 |
+
pip install -r requirements.txt
|
788 |
+
```
|
789 |
+
|
790 |
+
続いてDeepDanbooru自体をインストールします。
|
791 |
+
|
792 |
+
```
|
793 |
+
pip install .
|
794 |
+
```
|
795 |
+
|
796 |
+
以上でタグ付けの環境整備は完了です。
|
797 |
+
|
798 |
+
### タグ付けの実施
|
799 |
+
DeepDanbooruのフォルダに移動し、deepdanbooruを実行してタグ付けを行います。
|
800 |
+
|
801 |
+
```
|
802 |
+
deepdanbooru evaluate <教師データフォルダ> --project-path deepdanbooru-v3-20211112-sgd-e28 --allow-folder --save-txt
|
803 |
+
```
|
804 |
+
|
805 |
+
教師データを親フォルダのtrain_dataに置いた場合、以下のようになります。
|
806 |
+
|
807 |
+
```
|
808 |
+
deepdanbooru evaluate ../train_data --project-path deepdanbooru-v3-20211112-sgd-e28 --allow-folder --save-txt
|
809 |
+
```
|
810 |
+
|
811 |
+
タグファイルが教師データ画像と同じディレクトリに、同じファイル名、拡張子.txtで作成されます。1件ずつ処理されるためわりと遅いです。
|
812 |
+
|
813 |
+
複数の教師データフォルダがある場合には、それぞれのフォルダに対して実行してください。
|
814 |
+
|
815 |
+
以下のように生成されます。
|
816 |
+
|
817 |
+
![DeepDanbooruの生成ファイル](https://user-images.githubusercontent.com/52813779/208909855-d21b9c98-f2d3-4283-8238-5b0e5aad6691.png)
|
818 |
+
|
819 |
+
こんな感じにタグが付きます(すごい情報量……)。
|
820 |
+
|
821 |
+
![DeepDanbooruタグと画像](https://user-images.githubusercontent.com/52813779/208909908-a7920174-266e-48d5-aaef-940aba709519.png)
|
822 |
+
|
823 |
+
## WD14Taggerによるタグ付け
|
824 |
+
|
825 |
+
DeepDanbooruの代わりにWD14Taggerを用いる手順です。
|
826 |
+
|
827 |
+
Automatic1111氏のWebUIで使用しているtaggerを利用します。こちらのgithubページ(https://github.com/toriato/stable-diffusion-webui-wd14-tagger#mrsmilingwolfs-model-aka-waifu-diffusion-14-tagger )の情報を参考にさせていただきました。
|
828 |
+
|
829 |
+
最初の環境整備で必要なモジュールはインストール済みです。また重みはHugging Faceから自動的にダウンロードしてきます。
|
830 |
+
|
831 |
+
### タグ付けの実施
|
832 |
+
|
833 |
+
スクリプトを実行してタグ付けを行います。
|
834 |
+
```
|
835 |
+
python tag_images_by_wd14_tagger.py --batch_size <バッチサイズ> <教師データフォルダ>
|
836 |
+
```
|
837 |
+
|
838 |
+
教師データを親フォルダのtrain_dataに置いた場合、以下のようになります。
|
839 |
+
```
|
840 |
+
python tag_images_by_wd14_tagger.py --batch_size 4 ..\train_data
|
841 |
+
```
|
842 |
+
|
843 |
+
初回起動時にはモデルファイルがwd14_tagger_modelフォルダに自動的にダウンロードされます(フォルダはオプションで変えられます)。以下のようになります。
|
844 |
+
|
845 |
+
![ダウンロードされたファイル](https://user-images.githubusercontent.com/52813779/208910447-f7eb0582-90d6-49d3-a666-2b508c7d1842.png)
|
846 |
+
|
847 |
+
タグファイルが教師データ画像と同じディレクトリに、同じファイル名、拡張子.txtで作成されます。
|
848 |
+
|
849 |
+
![生成されたタグファイル](https://user-images.githubusercontent.com/52813779/208910534-ea514373-1185-4b7d-9ae3-61eb50bc294e.png)
|
850 |
+
|
851 |
+
![タグと画像](https://user-images.githubusercontent.com/52813779/208910599-29070c15-7639-474f-b3e4-06bd5a3df29e.png)
|
852 |
+
|
853 |
+
threshオプションで、判定されたタグのconfidence(確信度)がいくつ以上でタグをつけるかが指定できます。デフォルトはWD14Taggerのサンプルと同じ0.35です。値を下げるとより多くのタグが付与されますが、精度は下がります。
|
854 |
+
|
855 |
+
batch_sizeはGPUのVRAM容量に応じて増減してください。大きいほうが速くなります(VRAM 12GBでももう少し増やせると思います)。caption_extensionオプションでタグファイルの拡張子を変更できます。デフォルトは.txtです。
|
856 |
+
|
857 |
+
model_dirオプションでモデルの保存先フォルダを指定できます。
|
858 |
+
|
859 |
+
またforce_downloadオプションを指定すると保存先フォルダがあってもモデルを再ダウンロードします。
|
860 |
+
|
861 |
+
複数の教師データフォルダがある場合には、それぞれのフォルダに対して実行してください。
|
862 |
+
|
863 |
+
## キャプションとタグ情報の前処理
|
864 |
+
|
865 |
+
スクリプトから処理しやすいようにキャプションとタグをメタデータとしてひとつのファイルにまとめます。
|
866 |
+
|
867 |
+
### キャプションの前処理
|
868 |
+
|
869 |
+
キャプションをメタデータに入れるには、作業フォルダ内で以下を実行してください(キャプションを学習に使わない場合は実行不要です)(実際は1行で記述します、以下同様)。`--full_path` オプションを指定してメタデータに画像ファイルの場所をフルパスで格納します。このオプションを省略すると相対パスで記録されますが、フォルダ指定が `.toml` ファイル内で別途必要になります。
|
870 |
+
|
871 |
+
```
|
872 |
+
python merge_captions_to_metadata.py --full_path <教師データフォルダ>
|
873 |
+
--in_json <読み込むメタデータファイル名> <メタデータファイル名>
|
874 |
+
```
|
875 |
+
|
876 |
+
メタデータファイル名は任意の名前です。
|
877 |
+
教師データがtrain_data、読み込むメタデータファイルなし、メタデータファイルがmeta_cap.jsonの場合、以下のようになります。
|
878 |
+
|
879 |
+
```
|
880 |
+
python merge_captions_to_metadata.py --full_path train_data meta_cap.json
|
881 |
+
```
|
882 |
+
|
883 |
+
caption_extensionオプションでキャプションの拡張子を指定できます。
|
884 |
+
|
885 |
+
複数の教師データフォルダがある場合には、full_path引数を指定しつつ、それぞれのフォルダに対して実行してください。
|
886 |
+
|
887 |
+
```
|
888 |
+
python merge_captions_to_metadata.py --full_path
|
889 |
+
train_data1 meta_cap1.json
|
890 |
+
python merge_captions_to_metadata.py --full_path --in_json meta_cap1.json
|
891 |
+
train_data2 meta_cap2.json
|
892 |
+
```
|
893 |
+
|
894 |
+
in_jsonを省略すると書き込み先メタデータファイルがあるとそこから読み込み、そこに上書きします。
|
895 |
+
|
896 |
+
__※in_jsonオプションと書き込み先を都度書き換えて、別のメタデータファイルへ書き出すようにすると安全です。__
|
897 |
+
|
898 |
+
### タグの前処理
|
899 |
+
|
900 |
+
同様にタグもメタデータにまとめます(タグを学習に使わない場合は実行不要です)。
|
901 |
+
```
|
902 |
+
python merge_dd_tags_to_metadata.py --full_path <教師データフォルダ>
|
903 |
+
--in_json <読み込むメタデータファイル名> <書き込むメタデータファイル名>
|
904 |
+
```
|
905 |
+
|
906 |
+
先と同じディレクトリ構成で、meta_cap.jsonを読み、meta_cap_dd.jsonに書きだす場合、以下となります。
|
907 |
+
```
|
908 |
+
python merge_dd_tags_to_metadata.py --full_path train_data --in_json meta_cap.json meta_cap_dd.json
|
909 |
+
```
|
910 |
+
|
911 |
+
複数の教師データフォルダがある場合には、full_path引数を指定しつつ、それぞれのフォルダに対して実行してください。
|
912 |
+
|
913 |
+
```
|
914 |
+
python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap2.json
|
915 |
+
train_data1 meta_cap_dd1.json
|
916 |
+
python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap_dd1.json
|
917 |
+
train_data2 meta_cap_dd2.json
|
918 |
+
```
|
919 |
+
|
920 |
+
in_jsonを省略すると書き込み先メタデータファイルがあるとそこから読み込み、そこに上書きします。
|
921 |
+
|
922 |
+
__※in_jsonオプションと書き込み先を都度書き換えて、別のメタデータファイルへ書き出すようにすると安全です。__
|
923 |
+
|
924 |
+
### キャプションとタグのクリーニング
|
925 |
+
|
926 |
+
ここまででメタデータファイルにキャプションとDeepDanbooruのタグがまとめられています。ただ自動キャプショニングにしたキャプションは表記ゆれなどがあり微妙(※)ですし、タグにはアンダースコアが含まれていたりratingが付いていたりしますので(DeepDanbooruの場合)、エディタの置換機能などを用いてキャプションとタグのクリーニングをしたほうがいいでしょう。
|
927 |
+
|
928 |
+
※たとえばアニメ絵の少女を学習する場合、キャプションにはgirl/girls/woman/womenなどのばらつきがあります。また「anime girl」なども単に「girl」としたほうが適切かもしれません。
|
929 |
+
|
930 |
+
クリーニング用のスクリプトが用意してありますので、スクリプトの内容を状況に応じて編集してお使いください。
|
931 |
+
|
932 |
+
(教師データフォルダの指定は不要になりました。メタデータ内の全データをクリーニングします。)
|
933 |
+
|
934 |
+
```
|
935 |
+
python clean_captions_and_tags.py <読み込むメタデータファイル名> <書き込むメタデータファイル名>
|
936 |
+
```
|
937 |
+
|
938 |
+
--in_jsonは付きませんのでご注意ください。たとえば次のようになります。
|
939 |
+
|
940 |
+
```
|
941 |
+
python clean_captions_and_tags.py meta_cap_dd.json meta_clean.json
|
942 |
+
```
|
943 |
+
|
944 |
+
以上でキャプションとタグの前処理は完了です。
|
945 |
+
|
946 |
+
## latentsの事前取得
|
947 |
+
|
948 |
+
※ このステップは必須ではありません。省略しても学習時にlatentsを取得しながら学習できます。
|
949 |
+
また学習時に `random_crop` や `color_aug` などを行う場合にはlatentsの事前取得はできません(画像を毎回変えながら学習するため)。事前取得をしない場合、ここまでのメタデータで学習できます。
|
950 |
+
|
951 |
+
あらかじめ画像の潜在表現を取得しディスクに保存しておきます。それにより、学習を高速に進めることができます。あわせてbucketing(教師データをアスペクト比に応じて分類する)を行います。
|
952 |
+
|
953 |
+
作業フォルダで以下のように入力してください。
|
954 |
+
```
|
955 |
+
python prepare_buckets_latents.py --full_path <教師データフォルダ>
|
956 |
+
<読み込むメタデータファイル名> <書き込むメタデータファイル名>
|
957 |
+
<fine tuningするモデル名またはcheckpoint>
|
958 |
+
--batch_size <バッチサイズ>
|
959 |
+
--max_resolution <解像度 幅,高さ>
|
960 |
+
--mixed_precision <精度>
|
961 |
+
```
|
962 |
+
|
963 |
+
モデルがmodel.ckpt、バッチサイズ4、学習解像度は512\*512、精度no(float32)で、meta_clean.jsonからメタデータを読み込み、meta_lat.jsonに書き込む場合、以下のようになります。
|
964 |
+
|
965 |
+
```
|
966 |
+
python prepare_buckets_latents.py --full_path
|
967 |
+
train_data meta_clean.json meta_lat.json model.ckpt
|
968 |
+
--batch_size 4 --max_resolution 512,512 --mixed_precision no
|
969 |
+
```
|
970 |
+
|
971 |
+
教師データフォルダにnumpyのnpz形式でlatentsが保存されます。
|
972 |
+
|
973 |
+
解像度の最小サイズを--min_bucket_resoオプションで、最大サイズを--max_bucket_resoで指定できます。デフォルトはそれぞれ256、1024です。たとえば最小サイズに384を指定すると、256\*1024や320\*768などの解像度は使わなくなります。
|
974 |
+
解像度を768\*768のように大きくした場合、最大サイズに1280などを指定すると良いでしょう。
|
975 |
+
|
976 |
+
--flip_augオプションを指定すると左右反転のaugmentation(データ拡張)を行います。疑似的にデータ量を二倍に増やすことができますが、データが左右対称でない場合に指定すると(例えばキャラクタの外見、髪型など)学習がうまく行かなくなります。
|
977 |
+
|
978 |
+
|
979 |
+
(反転した画像についてもlatentsを取得し、\*\_flip.npzファイルを保存する単純な実装です。fline_tune.pyには特にオプション指定は必要ありません。\_flip付きのファイルがある場合、flip付き・なしのファイルを、ランダムに読み込みます。)
|
980 |
+
|
981 |
+
バッチサイズはVRAM 12GBでももう少し増やせるかもしれません。
|
982 |
+
解像度は64で割り切れる数字で、"幅,高さ"で指定します。解像度はfine tuning時のメモリサイズに直結します。VRAM 12GBでは512,512が限界と思われます(※)。16GBなら512,704や512,768まで上げられるかもしれません。なお256,256等にしてもVRAM 8GBでは厳しいようです(パラメータやoptimizerなどは解像度に関係せず一定のメモリが必要なため)。
|
983 |
+
|
984 |
+
※batch size 1の学習で12GB VRAM、640,640で動いたとの報告もありました。
|
985 |
+
|
986 |
+
以下のようにbucketingの結果が表示されます。
|
987 |
+
|
988 |
+
![bucketingの結果](https://user-images.githubusercontent.com/52813779/208911419-71c00fbb-2ce6-49d5-89b5-b78d7715e441.png)
|
989 |
+
|
990 |
+
複数の教師データフォルダがある場合には、full_path引数を指定しつつ、それぞれのフォルダに対して実行してください。
|
991 |
+
```
|
992 |
+
python prepare_buckets_latents.py --full_path
|
993 |
+
train_data1 meta_clean.json meta_lat1.json model.ckpt
|
994 |
+
--batch_size 4 --max_resolution 512,512 --mixed_precision no
|
995 |
+
|
996 |
+
python prepare_buckets_latents.py --full_path
|
997 |
+
train_data2 meta_lat1.json meta_lat2.json model.ckpt
|
998 |
+
--batch_size 4 --max_resolution 512,512 --mixed_precision no
|
999 |
+
|
1000 |
+
```
|
1001 |
+
読み込み元と書き込み先を同じにすることも可能ですが別々の方が安全です。
|
1002 |
+
|
1003 |
+
__※引数を都度書き換えて、別のメタデータファイルに書き込むと安全です。__
|
1004 |
+
|
docs/train_README-zh.md
ADDED
@@ -0,0 +1,911 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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方式。
|
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 |
+
|
108 |
+
|
109 |
+
## step 2. 设置文件的描述
|
110 |
+
|
111 |
+
创建一个文本文件,并将其扩展名更改为`.toml`。例如,您可以按以下方式进行描述:
|
112 |
+
|
113 |
+
(以`#`开头的部分是注释,因此您可以直接复制粘贴,或者将其删除。)
|
114 |
+
|
115 |
+
```toml
|
116 |
+
[general]
|
117 |
+
enable_bucket = true # 是否使用Aspect Ratio Bucketing
|
118 |
+
|
119 |
+
[[datasets]]
|
120 |
+
resolution = 512 # 学习分辨率
|
121 |
+
batch_size = 4 # 批次大小
|
122 |
+
|
123 |
+
[[datasets.subsets]]
|
124 |
+
image_dir = 'C:\hoge' # 指定包含训练图像的文件夹
|
125 |
+
class_tokens = 'hoge girl' # 指定标识符类
|
126 |
+
num_repeats = 10 # 训练图像的重复次数
|
127 |
+
|
128 |
+
# 以下仅在使用正则化图像时进行描述。不使用则删除
|
129 |
+
[[datasets.subsets]]
|
130 |
+
is_reg = true
|
131 |
+
image_dir = 'C:\reg' # 指定包含正则化图像的文件夹
|
132 |
+
class_tokens = 'girl' # 指定class
|
133 |
+
num_repeats = 1 # 正则化图像的重复次数,基本上1就可以了
|
134 |
+
```
|
135 |
+
|
136 |
+
基本上只需更改以下几个地方即可进行学习。
|
137 |
+
|
138 |
+
1. 学习分辨率
|
139 |
+
|
140 |
+
指定一个数字表示正方形(如果是 `512`,则为 512x512),如果使用方括号和逗号分隔的两个数字,则表示横向×纵向(如果是`[512,768]`,则为 512x768)。在SD1.x系列中,原始学习分辨率为512。指定较大的分辨率,如 `[512,768]` 可能会减少纵向和横向图像生成时的错误。在SD2.x 768系列中,分辨率为 `768`。
|
141 |
+
|
142 |
+
1. 批次大小
|
143 |
+
|
144 |
+
指定同时学习多少个数据。这取决于GPU的VRAM大小和学习分辨率。详细信息将在后面说明。此外,fine tuning/DreamBooth/LoRA等也会影响批次大小,请查看各个脚本的说明。
|
145 |
+
|
146 |
+
1. 文件夹指定
|
147 |
+
|
148 |
+
指定用于学习的图像和正则化图像(仅在使用时)的文件夹。指定包含图像数据的文件夹。
|
149 |
+
|
150 |
+
1. identifier 和 class 的指定
|
151 |
+
|
152 |
+
如前所述,与示例相同。
|
153 |
+
|
154 |
+
1. 重复次数
|
155 |
+
|
156 |
+
将在后面说明。
|
157 |
+
|
158 |
+
### 关于重复次数
|
159 |
+
|
160 |
+
重复次数用于调整正则化图像和训练用图像的数量。由于正则化图像的数量多于训练用图像,因此需要重复使用训练用图像来达到一对一的比例,从而实现训练。
|
161 |
+
|
162 |
+
请将重复次数指定为“ __训练用图像的重复次数×训练用图像的数量≥正则化图像的重复次数×正则化图像的数量__ ”。
|
163 |
+
|
164 |
+
(1个epoch(数据一周一次)的数据量为“训练用图像的重复次数×训练用图像的数量”。如果正则化图像的数量多于这个值,则剩余的正则化图像将不会被使用。)
|
165 |
+
|
166 |
+
## 步骤 3. 学习
|
167 |
+
|
168 |
+
详情请参考相关文档进行学习。
|
169 |
+
|
170 |
+
# DreamBooth,标题方式(可使用正则化图像)
|
171 |
+
|
172 |
+
在此方式中,每个图像都将通过标题进行学习。
|
173 |
+
|
174 |
+
## 步骤 1. 准备标题文件
|
175 |
+
|
176 |
+
请将与图像具有相同文件名且扩展名为 `.caption`(可以在设置中更改)的文件放置在用于训练图像的文件夹中。每个文件应该只有一行。编码为 `UTF-8`。
|
177 |
+
|
178 |
+
## 步骤 2. 决定是否使用正则化图像,并在使用时生成正则化图像
|
179 |
+
|
180 |
+
与class+identifier格式相同。可以在规范化图像上附加标���,但通常不需要。
|
181 |
+
|
182 |
+
## 步骤 2. 编写设置文件
|
183 |
+
|
184 |
+
创建一个文本文件并将扩展名更改为 `.toml`。例如,您可以按以下方式进行描述:
|
185 |
+
|
186 |
+
```toml
|
187 |
+
[general]
|
188 |
+
enable_bucket = true # 是否使用Aspect Ratio Bucketing
|
189 |
+
|
190 |
+
[[datasets]]
|
191 |
+
resolution = 512 # 学习分辨率
|
192 |
+
batch_size = 4 # 批次大小
|
193 |
+
|
194 |
+
[[datasets.subsets]]
|
195 |
+
image_dir = 'C:\hoge' # 指定包含训练图像的文件夹
|
196 |
+
caption_extension = '.caption' # 若使用txt文件,更改此项
|
197 |
+
num_repeats = 10 # 训练图像的重复次数
|
198 |
+
|
199 |
+
# 以下仅在使用正则化图像时进行描述。不使用则删除
|
200 |
+
[[datasets.subsets]]
|
201 |
+
is_reg = true
|
202 |
+
image_dir = 'C:\reg' # 指定包含正则化图像的文件夹
|
203 |
+
class_tokens = 'girl' # 指定class
|
204 |
+
num_repeats = 1 # 正则化图像的重复次数,基本上1就可以了
|
205 |
+
```
|
206 |
+
|
207 |
+
基本上只需更改以下几个地方来学习。除非另有说明,否则与class+identifier方法相同。
|
208 |
+
|
209 |
+
1. 学习分辨率
|
210 |
+
2. 批次大小
|
211 |
+
3. 文件夹指定
|
212 |
+
4. 标题文件的扩展名
|
213 |
+
|
214 |
+
可以指定任意的扩展名。
|
215 |
+
5. 重复次数
|
216 |
+
|
217 |
+
## 步骤 3. 学习
|
218 |
+
|
219 |
+
详情请参考相关文档进行学习。
|
220 |
+
|
221 |
+
# 微调方法(fine tuning)
|
222 |
+
|
223 |
+
## 步骤 1. 准备元数据
|
224 |
+
|
225 |
+
将标题和标签整合到管理文件中称为元数据。它的扩展名为 `.json`,格式为json。由于创建方法较长,因此在本文档的末尾进行描述。
|
226 |
+
|
227 |
+
## 步骤 2. 编写设置文件
|
228 |
+
|
229 |
+
创建一个文本文件,将扩展名设置为 `.toml`。例如,可以按以下方式编写:
|
230 |
+
```toml
|
231 |
+
[general]
|
232 |
+
shuffle_caption = true
|
233 |
+
keep_tokens = 1
|
234 |
+
|
235 |
+
[[datasets]]
|
236 |
+
resolution = 512 # 图像分辨率
|
237 |
+
batch_size = 4 # 批次大小
|
238 |
+
|
239 |
+
[[datasets.subsets]]
|
240 |
+
image_dir = 'C:\piyo' # 指定包含训练图像的文件夹
|
241 |
+
metadata_file = 'C:\piyo\piyo_md.json' # 元数据文件名
|
242 |
+
```
|
243 |
+
|
244 |
+
基本上只需更改以下几个地方来学习。除非另有说明,否则与DreamBooth, class+identifier方法相同。
|
245 |
+
|
246 |
+
1. 学习分辨率
|
247 |
+
2. 批次大小
|
248 |
+
3. 指定文件夹
|
249 |
+
4. 元数据文件名
|
250 |
+
|
251 |
+
指定使用后面所述方法创建的元数据文件。
|
252 |
+
|
253 |
+
|
254 |
+
## 第三步:学习
|
255 |
+
|
256 |
+
详情请参考相关文档进行学习。
|
257 |
+
|
258 |
+
# 学习中使用的术语简单解释
|
259 |
+
|
260 |
+
由于省略了细节并且我自己也没有完全理解,因此请自行查阅详细信息。
|
261 |
+
|
262 |
+
## 微调(fine tuning)
|
263 |
+
|
264 |
+
指训练模型并微调其性能。具体含义因用法而异,但在 Stable Diffusion 中,狭义的微调是指使用图像和标题进行训练模型。DreamBooth 可视为狭义微调的一种特殊方法。广义的微调包括 LoRA、Textual Inversion、Hypernetworks 等,包括训练模型的所有内容。
|
265 |
+
|
266 |
+
## 步骤(step)
|
267 |
+
|
268 |
+
粗略地说,每次在训练数据上进行一次计算即为一步。具体来说,“将训练数据的标题传递给当前模型,将生成的图像与训练数据的图像进行比较,稍微更改模型,以使其更接近训练数据”即为一步。
|
269 |
+
|
270 |
+
## 批次大小(batch size)
|
271 |
+
|
272 |
+
批次大小指定每个步骤要计算多少数据。批次计算可以提高速度。一般来说,批次大小越大,精度也越高。
|
273 |
+
|
274 |
+
“批次大小×步数”是用于训练的数据数量。因此,建议减少步数以增加批次大小。
|
275 |
+
|
276 |
+
(但是,例如,“批次大小为 1,步数为 1600”和“批次大小为 4,步数为 400”将不会产生相同的结果。如果使用相同的学习速率,通常后者会导致模型欠拟合。请尝试增加学习率(例如 `2e-6`),将步数设置为 500 等。)
|
277 |
+
|
278 |
+
批次大小越大,GPU 内存消耗就越大。如果内存不足,将导致错误,或者在边缘时将导致训练速度降低。建议在任务管理器或 `nvidia-smi` 命令中检查使用的内存量进行调整。
|
279 |
+
|
280 |
+
注意,一个批次是指“一个数据单位”。
|
281 |
+
|
282 |
+
## 学习率
|
283 |
+
|
284 |
+
学习率指的是每个步骤中改变的程度。如果指定一个大的值,学习速度就会加快,但是可能会出现变化太大导致模型崩溃或无法达到最佳状态的情况。如果指定一个小的值,学习速度会变慢,同时可能无法达到最佳状态。
|
285 |
+
|
286 |
+
在fine tuning、DreamBooth、LoRA等过程中,学习率会有很大的差异,并且也会受到训练数据、所需训练的模型、批次大小和步骤数等因素的影响。建议从通常值开始,观察训练状态并逐渐调整。
|
287 |
+
|
288 |
+
默认情况下,整个训练过程中学习率是固定的。但是可以通过调度程序指定学习率如何变化,因此结果也会有所不同。
|
289 |
+
|
290 |
+
## 时期(epoch)
|
291 |
+
|
292 |
+
Epoch指的是训练数据被完整训练一遍(即数据已经迭代一轮)。如果指定了重复次数,则在重复后的数据迭代一轮后,为1个epoch。
|
293 |
+
|
294 |
+
1个epoch的���骤数通常为“数据量÷批次大小”,但如果使用Aspect Ratio Bucketing,则略微增加(由于不同bucket的数据不能在同一个批次中,因此步骤数会增加)。
|
295 |
+
|
296 |
+
## 长宽比分桶(Aspect Ratio Bucketing)
|
297 |
+
|
298 |
+
Stable Diffusion 的 v1 是以 512\*512 的分辨率进行训练的,但同时也可以在其他分辨率下进行训练,例如 256\*1024 和 384\*640。这样可以减少裁剪的部分,希望更准确地学习图像和标题之间的关系。
|
299 |
+
|
300 |
+
此外,由于可以在任意分辨率下进行训练,因此不再需要事先统一图像数据的长宽比。
|
301 |
+
|
302 |
+
此值可以被设定,其在此之前的配置文件示例中已被启用(设置为 `true`)。
|
303 |
+
|
304 |
+
只要不超过作为参数给出的分辨率区域(= 内存使用量),就可以按 64 像素的增量(默认值,可更改)在垂直和水平方向上调整和创建训练分辨率。
|
305 |
+
|
306 |
+
在机器学习中,通常需要将所有输入大小统一,但实际上只要在同一批次中统一即可。 NovelAI 所说的分桶(bucketing) 指的是,预先将训练数据按照长宽比分类到每个学习分辨率下,并通过使用每个 bucket 内的图像创建批次来统一批次图像大小。
|
307 |
+
|
308 |
+
# 以前的指定格式(不使用 .toml 文件,而是使用命令行选项指定)
|
309 |
+
|
310 |
+
这是一种通过命令行选项而不是指定 .toml 文件的方法。有 DreamBooth 类+标识符方法、DreamBooth 标题方法、微调方法三种方式。
|
311 |
+
|
312 |
+
## DreamBooth、类+标识符方式
|
313 |
+
|
314 |
+
指定文件夹名称以指定迭代次数。还要使用 `train_data_dir` 和 `reg_data_dir` 选项。
|
315 |
+
|
316 |
+
### 第1步。准备用于训练的图像
|
317 |
+
|
318 |
+
创建一个用于存储训练图像的文件夹。__此外__,按以下名称创建目录。
|
319 |
+
|
320 |
+
```
|
321 |
+
<迭代次数>_<标识符> <类别>
|
322 |
+
```
|
323 |
+
|
324 |
+
不要忘记下划线``_``。
|
325 |
+
|
326 |
+
例如,如果在名为“sls frog”的提示下重复数据 20 次,则为“20_sls frog”。如下所示:
|
327 |
+
|
328 |
+
![image](https://user-images.githubusercontent.com/52813779/210770636-1c851377-5936-4c15-90b7-8ac8ad6c2074.png)
|
329 |
+
|
330 |
+
### 多个类别、多个标识符的学习
|
331 |
+
|
332 |
+
该方法很简单,在用于训练的图像文件夹中,需要准备多个文件夹,每个文件夹都是以“重复次数_<标识符> <类别>”命名的,同样,在正则化图像文件夹中,也需要准备多个文件夹,每个文件夹都是以“重复次数_<类别>”命名的。
|
333 |
+
|
334 |
+
例如,如果要同时训练“sls青蛙”和“cpc兔子”,则应按以下方式准备文件夹。
|
335 |
+
|
336 |
+
![image](https://user-images.githubusercontent.com/52813779/210777933-a22229db-b219-4cd8-83ca-e87320fc4192.png)
|
337 |
+
|
338 |
+
如果一个类别包含多个对象,可以只使用一个正则化图像文件夹。例如,如果在1girl类别中有角色A和角色B,则可以按照以下方式处理:
|
339 |
+
|
340 |
+
- train_girls
|
341 |
+
- 10_sls 1girl
|
342 |
+
- 10_cpc 1girl
|
343 |
+
- reg_girls
|
344 |
+
- 1_1girl
|
345 |
+
|
346 |
+
### step 2. 准备正规化图像
|
347 |
+
|
348 |
+
这是使用规则化图像时的过程。
|
349 |
+
|
350 |
+
创建一个文件夹来存储规则化的图像。 __此外,__ 创建一个名为``<repeat count>_<class>`` 的目录。
|
351 |
+
|
352 |
+
例如,使用提示“frog”并且不重复数据(仅一次):
|
353 |
+
![image](https://user-images.githubusercontent.com/52813779/210770897-329758e5-3675-49f1-b345-c135f1725832.png)
|
354 |
+
|
355 |
+
|
356 |
+
步骤3. 执行学习
|
357 |
+
|
358 |
+
执行每个学习脚本。使用 `--train_data_dir` 选项指定包含训练数据文件夹的父文件夹(不是包含图像的文件夹),使用 `--reg_data_dir` 选项指定包含正则化图像的父文件夹(不是包含图像的文件夹)。
|
359 |
+
|
360 |
+
## DreamBooth,带标题方式
|
361 |
+
|
362 |
+
在包含训练图像和正则化图像的文件夹中,将与图像具有相同文件名的文件.caption(可以使用选项进行更改)放置在该文件夹中,然后从该文件中加载标题作为提示进行学习。
|
363 |
+
|
364 |
+
※文件夹名称(标识符类)不再用于这些图像的训练。
|
365 |
+
|
366 |
+
默认的标题文件扩展名为.caption。可以使用学习脚本的 `--caption_extension` 选项进行更改。 使用 `--shuffle_caption` 选项,同时对每个逗号分隔的部分进行学习时会对学习时的标题进行混洗。
|
367 |
+
|
368 |
+
## 微调方式
|
369 |
+
|
370 |
+
创建元数据的方式与使用配置文件相同。 使用 `in_json` 选项指定元数据文件。
|
371 |
+
|
372 |
+
# 学习过程中的样本输出
|
373 |
+
|
374 |
+
通过在训练中使用模型生成图像,可以检查学习进度。将以下选项指定为学习脚本。
|
375 |
+
|
376 |
+
- `--sample_every_n_steps` / `--sample_every_n_epochs`
|
377 |
+
|
378 |
+
指定要采样的步数或纪元数。为这些数字中的每一个输出样本。如果两者都指定,则 epoch 数优先。
|
379 |
+
- `--sample_prompts`
|
380 |
+
|
381 |
+
指定示例输出的提示文件。
|
382 |
+
|
383 |
+
- `--sample_sampler`
|
384 |
+
|
385 |
+
指定用于采样输出的采样器。
|
386 |
+
`'ddim', 'pndm', 'heun', 'dpmsolver', 'dpmsolver++', 'dpmsingle', 'k_lms', 'k_euler', 'k_euler_a', 'k_dpm_2', 'k_dpm_2_a'`が選べます。
|
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` 指定生成图像的种子。
|
404 |
+
- `--l` 指定生成图像的 CFG 比例。
|
405 |
+
- `--s` 指定生成过程中的步骤数。
|
406 |
+
|
407 |
+
|
408 |
+
# 每个脚本通用的常用选项
|
409 |
+
|
410 |
+
文档更新可能跟不上脚本更新。在这种情况下,请使用 `--help` 选项检查可用选项。
|
411 |
+
## 学习模型规范
|
412 |
+
|
413 |
+
- `--v2` / `--v_parameterization`
|
414 |
+
|
415 |
+
如果使用 Hugging Face 的 stable-diffusion-2-base 或来自它的微调模型作为学习目标模型(对于在推理时指示使用 `v2-inference.yaml` 的模型),`- 当使用-v2` 选项与 stable-diffusion-2、768-v-ema.ckpt 及其微调模型(对于在推理过程中使用 `v2-inference-v.yaml` 的模型),`- 指定两个 -v2`和 `--v_parameterization` 选项。
|
416 |
+
|
417 |
+
以下几点在 Stable Diffusion 2.0 中发生了显着变化。
|
418 |
+
|
419 |
+
1. 使用分词器
|
420 |
+
2. 使用哪个Text Encoder,使用哪个输出层(2.0使用倒数第二层)
|
421 |
+
3. Text Encoder的输出维度(768->1024)
|
422 |
+
4. U-Net的结构(CrossAttention的头数等)
|
423 |
+
5. v-parameterization(采样方式好像变了)
|
424 |
+
|
425 |
+
其中碱基使用1-4个,非碱基使用1-5个(768-v)。使用 1-4 进行 v2 选择,使用 5 进行 v_parameterization 选择。
|
426 |
+
-`--pretrained_model_name_or_path`
|
427 |
+
|
428 |
+
指定要从中执行额外训练的模型。您可以指定稳定扩散检查点文件(.ckpt 或 .safetensors)、扩散器本地磁盘上的模型目录或扩散器模型 ID(例如“stabilityai/stable-diffusion-2”)。
|
429 |
+
## 学习设置
|
430 |
+
|
431 |
+
- `--output_dir`
|
432 |
+
|
433 |
+
指定训练后保存模型的文件夹。
|
434 |
+
|
435 |
+
- `--output_name`
|
436 |
+
|
437 |
+
指定不带扩展名的模型文件名。
|
438 |
+
|
439 |
+
- `--dataset_config`
|
440 |
+
|
441 |
+
指定描述数据集配置的 .toml 文件。
|
442 |
+
|
443 |
+
- `--max_train_steps` / `--max_train_epochs`
|
444 |
+
|
445 |
+
指定要学习的步数或纪元数。如果两者都指定,则 epoch 数优先。
|
446 |
+
-
|
447 |
+
- `--mixed_precision`
|
448 |
+
|
449 |
+
训练混合精度以节省内存。指定像`--mixed_precision = "fp16"`。与无混合精度(默认)相比,精度可能较低,但训练所需的 GPU 内存明显较少。
|
450 |
+
|
451 |
+
(在RTX30系列以后也可以指定`bf16`,请配合您在搭建环境时做的加速设置)。
|
452 |
+
- `--gradient_checkpointing`
|
453 |
+
|
454 |
+
通过逐步计算权重而不是在训练期间一次计算所有权重来减少训练所需的 GPU 内存量。关闭它不会影响准确性,但打开它允许更大的批次大小,所以那里有影响。
|
455 |
+
|
456 |
+
另外,打开它通常会减慢速度,但可以增加批次大小,因此总的学习时间实际上可能会更快。
|
457 |
+
|
458 |
+
- `--xformers` / `--mem_eff_attn`
|
459 |
+
|
460 |
+
当指定 xformers 选项时,使用 xformers 的 CrossAttention。如果未安装 xformers 或发生错误(取决于环境,例如 `mixed_precision="no"`),请指定 `mem_eff_attn` 选项而不是使用 CrossAttention 的内存节省版本(xformers 比 慢)。
|
461 |
+
- `--save_precision`
|
462 |
+
|
463 |
+
指定保存时的数据精度。为 save_precision 选项指定 float、fp16 或 bf16 将以该格式保存模型(在 DreamBooth 中保存 Diffusers 格式时无效,微调)。当您想缩小模型的尺寸时请使用它。
|
464 |
+
- `--save_every_n_epochs` / `--save_state` / `--resume`
|
465 |
+
为 save_every_n_epochs 选项指定一个数字可以在每个时期的训练期间保存模型。
|
466 |
+
|
467 |
+
如果同时指定save_state选项,学习状态包括优化器的状态等都会一起保存。。保存目的地将是一个文件夹。
|
468 |
+
|
469 |
+
学习状态输出到目标文件夹中名为“<output_name>-??????-state”(??????是纪元数)的文件夹中。长时间学习时请使用。
|
470 |
+
|
471 |
+
使用 resume 选项从保存的训练状态恢复训练。指定学习状态文件夹(其中的状态文件夹,而不是 `output_dir`)。
|
472 |
+
|
473 |
+
请注意,由于 Accelerator 规范,epoch 数和全局步数不会保存,即使恢复时它们也从 1 开始。
|
474 |
+
- `--save_model_as` (DreamBooth, fine tuning 仅有的)
|
475 |
+
|
476 |
+
您可以从 `ckpt, safetensors, diffusers, diffusers_safetensors` 中选择模型保存格式。
|
477 |
+
|
478 |
+
- `--save_model_as=safetensors` 指定喜欢当读取稳定扩散格式(ckpt 或安全张量)并以扩散器格式保存时,缺少的信息通过从 Hugging Face 中删除 v1.5 或 v2.1 信息来补充。
|
479 |
+
|
480 |
+
- `--clip_skip`
|
481 |
+
|
482 |
+
`2` 如果指定,则使用文本编码器 (CLIP) 的倒数第二层的输出。如果���略 1 或选项,则使用最后一层。
|
483 |
+
|
484 |
+
*SD2.0默认使用倒数第二层,学习SD2.0时请不要指定。
|
485 |
+
|
486 |
+
如果被训练的模型最初被训练为使用第二层,则 2 是一个很好的值。
|
487 |
+
|
488 |
+
如果您使用的是最后一层,那么整个模型都会根据该假设进行训练。因此,如果再次使用第二层进行训练,可能需要一定数量的teacher数据和更长时间的学习才能得到想要的学习结果。
|
489 |
+
- `--max_token_length`
|
490 |
+
|
491 |
+
默认值为 75。您可以通过指定“150”或“225”来扩展令牌长度来学习。使用长字幕学习时指定。
|
492 |
+
|
493 |
+
但由于学习时token展开的规范与Automatic1111的web UI(除法等规范)略有不同,如非必要建议用75学习。
|
494 |
+
|
495 |
+
与clip_skip一样,学习与模型学习状态不同的长度可能需要一定量的teacher数据和更长的学习时间。
|
496 |
+
|
497 |
+
- `--persistent_data_loader_workers`
|
498 |
+
|
499 |
+
在 Windows 环境中指定它可以显着减少时期之间的延迟。
|
500 |
+
|
501 |
+
- `--max_data_loader_n_workers`
|
502 |
+
|
503 |
+
指定数据加载的进程数。大量的进程会更快地加载数据并更有效地使用 GPU,但会消耗更多的主内存。默认是"`8`或者`CPU并发执行线程数 - 1`,取小者",所以如果主存没有空间或者GPU使用率大概在90%以上,就看那些数字和 `2` 或将其降低到大约 `1`。
|
504 |
+
- `--logging_dir` / `--log_prefix`
|
505 |
+
|
506 |
+
保存学习日志的选项。在 logging_dir 选项中指定日志保存目标文件夹。以 TensorBoard 格式保存日志。
|
507 |
+
|
508 |
+
例如,如果您指定 --logging_dir=logs,将在您的工作文件夹中创建一个日志文件夹,并将日志保存在日期/时间文件夹中。
|
509 |
+
此外,如果您指定 --log_prefix 选项,则指定的字符串将添加到日期和时间之前。使用“--logging_dir=logs --log_prefix=db_style1_”进行识别。
|
510 |
+
|
511 |
+
要检查 TensorBoard 中的日志,请打开另一个命令提示符并在您的工作文件夹中键入:
|
512 |
+
```
|
513 |
+
tensorboard --logdir=logs
|
514 |
+
```
|
515 |
+
|
516 |
+
我觉得tensorboard会在环境搭建的时候安装,如果没有安装,请用`pip install tensorboard`安装。)
|
517 |
+
|
518 |
+
然后打开浏览器到http://localhost:6006/就可以看到了。
|
519 |
+
- `--noise_offset`
|
520 |
+
本文的实现:https://www.crosslabs.org//blog/diffusion-with-offset-noise
|
521 |
+
|
522 |
+
看起来它可能会为整体更暗和更亮的图像产生更好的结果。它似乎对 LoRA 学习也有效。指定一个大约 0.1 的值似乎很好。
|
523 |
+
|
524 |
+
- `--debug_dataset`
|
525 |
+
|
526 |
+
通过添加此选项,您可以在学习之前检查将学习什么样的图像数据和标题。按 Esc 退出并返回命令行。按 `S` 进入下一步(批次),按 `E` 进入下一个纪元。
|
527 |
+
|
528 |
+
*图片在 Linux 环境(包括 Colab)下不显示。
|
529 |
+
|
530 |
+
- `--vae`
|
531 |
+
|
532 |
+
如果您在 vae 选项中指定稳定扩散检查点、VAE 检查点文件、扩散模型或 VAE(两者都可以指定本地或拥抱面模型 ID),则该 VAE 用于学习(缓存时的潜伏)或在学习过程中获得潜伏)。
|
533 |
+
|
534 |
+
对于 DreamBooth 和微调,保存的模型将包含此 VAE
|
535 |
+
|
536 |
+
- `--cache_latents`
|
537 |
+
|
538 |
+
在主内存中缓存 VAE 输出以减少 VRAM 使用。除 flip_aug 之外的任何增强都将不可用。此外,整体学习速度略快。
|
539 |
+
- `--min_snr_gamma`
|
540 |
+
|
541 |
+
指定最小 SNR 加权策略。细节是[这里](https://github.com/kohya-ss/sd-scripts/pull/308)请参阅。论文中推荐`5`。
|
542 |
+
|
543 |
+
## 优化器相关
|
544 |
+
|
545 |
+
- `--optimizer_type`
|
546 |
+
-- 指定优化器类型。您可以指定
|
547 |
+
- AdamW : [torch.optim.AdamW](https://pytorch.org/docs/stable/generated/torch.optim.AdamW.html)
|
548 |
+
- 与过去版本中未指定选项时相同
|
549 |
+
- AdamW8bit : 参数同上
|
550 |
+
- PagedAdamW8bit : 参数同上
|
551 |
+
- 与过去版本中指定的 --use_8bit_adam 相同
|
552 |
+
- Lion : https://github.com/lucidrains/lion-pytorch
|
553 |
+
- Lion8bit : 参数同上
|
554 |
+
- PagedLion8bit : 参数同上
|
555 |
+
- 与过去版本中指定的 --use_lion_optimizer 相同
|
556 |
+
- SGDNesterov : [torch.optim.SGD](https://pytorch.org/docs/stable/generated/torch.optim.SGD.html), nesterov=True
|
557 |
+
- SGDNesterov8bit : 参数同上
|
558 |
+
- DAdaptation(DAdaptAdamPreprint) : https://github.com/facebookresearch/dadaptation
|
559 |
+
- DAdaptAdam : 参数同上
|
560 |
+
- DAdaptAdaGrad : 参数同上
|
561 |
+
- DAdaptAdan : 参数同上
|
562 |
+
- DAdaptAdanIP : 参数同上
|
563 |
+
- DAdaptLion : 参数同上
|
564 |
+
- DAdaptSGD : 参数同上
|
565 |
+
- Prodigy : https://github.com/konstmish/prodigy
|
566 |
+
- AdaFactor : [Transformers AdaFactor](https://huggingface.co/docs/transformers/main_classes/optimizer_schedules)
|
567 |
+
- 任何优化器
|
568 |
+
|
569 |
+
- `--learning_rate`
|
570 |
+
|
571 |
+
指定学习率。合适的学习率取决于学习脚本,所以请参考每个解释。
|
572 |
+
- `--lr_scheduler` / `--lr_warmup_steps` / `--lr_scheduler_num_cycles` / `--lr_scheduler_power`
|
573 |
+
|
574 |
+
学习率的调度程序相关规范。
|
575 |
+
|
576 |
+
使用 lr_scheduler 选项,您可以从线性、余弦、cosine_with_restarts、多项式、常数、constant_with_warmup 或任何调度程��中选择学习率调度程序。默认值是常量。
|
577 |
+
|
578 |
+
使用 lr_warmup_steps,您可以指定预热调度程序的步数(逐渐改变学习率)。
|
579 |
+
|
580 |
+
lr_scheduler_num_cycles 是 cosine with restarts 调度器中的重启次数,lr_scheduler_power 是多项式调度器中的多项式幂。
|
581 |
+
|
582 |
+
有关详细信息,请自行研究。
|
583 |
+
|
584 |
+
要使用任何调度程序,请像使用任何优化器一样使用“--scheduler_args”指定可选参数。
|
585 |
+
### 关于指定优化器
|
586 |
+
|
587 |
+
使用 --optimizer_args 选项指定优化器选项参数。可以以key=value的格式指定多个值。此外,您可以指定多个值,以逗号分隔。例如,要指定 AdamW 优化器的参数,``--optimizer_args weight_decay=0.01 betas=.9,.999``。
|
588 |
+
|
589 |
+
指定可选参数时,请检查每个优化器的规格。
|
590 |
+
一些优化器有一个必需的参数,如果省略它会自动添加(例如 SGDNesterov 的动量)。检查控制台输出。
|
591 |
+
|
592 |
+
D-Adaptation 优化器自动调整学习率。学习率选项指定的值不是学习率本身,而是D-Adaptation决定的学习率的应用率,所以通常指定1.0。如果您希望 Text Encoder 的学习率是 U-Net 的一半,请指定 ``--text_encoder_lr=0.5 --unet_lr=1.0``。
|
593 |
+
如果指定 relative_step=True,AdaFactor 优化器可以自动调整学习率(如果省略,将默认添加)。自动调整时,学习率调度器被迫使用 adafactor_scheduler。此外,指定 scale_parameter 和 warmup_init 似乎也不错。
|
594 |
+
|
595 |
+
自动调整的选项类似于``--optimizer_args "relative_step=True" "scale_parameter=True" "warmup_init=True"``。
|
596 |
+
|
597 |
+
如果您不想自动调整学习率,请添加可选参数 ``relative_step=False``。在那种情况下,似乎建议将 constant_with_warmup 用于学习率调度程序,而不要为梯度剪裁范数。所以参数就像``--optimizer_type=adafactor --optimizer_args "relative_step=False" --lr_scheduler="constant_with_warmup" --max_grad_norm=0.0``。
|
598 |
+
|
599 |
+
### 使用任何优化器
|
600 |
+
|
601 |
+
使用 ``torch.optim`` 优化器时,仅指定类名(例如 ``--optimizer_type=RMSprop``),使用其他模块的优化器时,指定“模块名.类名”。(例如``--optimizer_type=bitsandbytes.optim.lamb.LAMB``)。
|
602 |
+
|
603 |
+
(内部仅通过 importlib 未确认操作。如果需要,请安装包。)
|
604 |
+
<!--
|
605 |
+
## 使用任意大小的图像进行训练 --resolution
|
606 |
+
你可以在广场外学习。请在分辨率中指定“宽度、高度”,如“448,640”。宽度和高度必须能被 64 整除。匹配训练图像和正则化图像的大小。
|
607 |
+
|
608 |
+
就我个人而言,我经常生成垂直长的图像,所以我有时会用“448、640”来学习。
|
609 |
+
|
610 |
+
## 纵横比分桶 --enable_bucket / --min_bucket_reso / --max_bucket_reso
|
611 |
+
它通过指定 enable_bucket 选项来启用。 Stable Diffusion 在 512x512 分辨率下训练,但也在 256x768 和 384x640 等分辨率下训练。
|
612 |
+
|
613 |
+
如果指定此选项,则不需要将训练图像和正则化图像统一为特定分辨率。从多种分辨率(纵横比)中进行选择,并在该分辨率下学习。
|
614 |
+
由于分辨率为 64 像素,纵横比可能与原始图像不完全相同。
|
615 |
+
|
616 |
+
您可以使用 min_bucket_reso 选项指定分辨率的最小大小,使用 max_bucket_reso 指定最大大小。默认值分别为 256 和 1024。
|
617 |
+
例如,将最小尺寸指定为 384 将不会使用 256x1024 或 320x768 等分辨率。
|
618 |
+
如果将分辨率增加到 768x768,您可能需要将 1280 指定为最大尺寸。
|
619 |
+
|
620 |
+
启用 Aspect Ratio Ratio Bucketing 时,最好准备具有与训练图像相似的各种分辨率的正则化图像。
|
621 |
+
|
622 |
+
(因为一批中的图像不偏向于训练图像和正则化图像。
|
623 |
+
|
624 |
+
## 扩充 --color_aug / --flip_aug
|
625 |
+
增强是一种通过在学习过程中动态改变数据来提高模型性能的方法。在使用 color_aug 巧妙地改变色调并使用 flip_aug 左右翻转的同时学习。
|
626 |
+
|
627 |
+
由于数据是动态变化的,因此不能与 cache_latents 选项一起指定。
|
628 |
+
|
629 |
+
## 使用 fp16 梯度训练(实验特征)--full_fp16
|
630 |
+
如果指定 full_fp16 选项,梯度从普通 float32 变为 float16 (fp16) 并学习(它似乎是 full fp16 学习而不是混合精度)。
|
631 |
+
结果,似乎 SD1.x 512x512 大小可以在 VRAM 使用量小于 8GB 的情况下学习,而 SD2.x 512x512 大小可以在 VRAM 使用量小于 12GB 的情况下学习。
|
632 |
+
|
633 |
+
预先在加速配置中指定 fp16,并可选择设置 ``mixed_precision="fp16"``(bf16 不起作用)。
|
634 |
+
|
635 |
+
为了最大限度地减少内存使用,请使用 xformers、use_8bit_adam、cache_latents、gradient_checkpointing 选项并将 train_batch_size 设置为 1。
|
636 |
+
|
637 |
+
(如果你负担得起,逐步增加 train_batch_size 应该会提高一点精度。)
|
638 |
+
|
639 |
+
它是通过修补 PyTorch 源代码实现的(已通过 PyTorch 1.12.1 和 1.13.0 确认)。准确率会大幅下降,途中学习失败的概率也会增加。
|
640 |
+
学习率和步数的设置似乎很严格。请注意它们并自行承担使用它们的风险。
|
641 |
+
-->
|
642 |
+
|
643 |
+
# 创建元数据文件
|
644 |
+
|
645 |
+
## 准备教师资料
|
646 |
+
|
647 |
+
如上所述准备好你要学习的图像数据,放在任意文件夹中。
|
648 |
+
|
649 |
+
例如,存储这样的图像:
|
650 |
+
|
651 |
+
![教师数据文件夹的屏幕截图](https://user-images.githubusercontent.com/52813779/208907739-8e89d5fa-6ca8-4b60-8927-f484d2a9ae04.png)
|
652 |
+
|
653 |
+
## 自动字幕
|
654 |
+
|
655 |
+
如果您只想学习没有标题的标签,请跳过。
|
656 |
+
|
657 |
+
另外,手动准备字幕时,请准备在与教师数据图像相同的目录下,文件名相同,扩展名.caption等。每个文件应该是只有一行的文本文件。
|
658 |
+
### 使用 BLIP 添加字幕
|
659 |
+
|
660 |
+
最新版本不再需要 BLIP 下载、权重下载和额外的虚拟环境。按原样工作。
|
661 |
+
|
662 |
+
运行 finetune 文件夹中的 make_captions.py。
|
663 |
+
|
664 |
+
```
|
665 |
+
python finetune\make_captions.py --batch_size <バッチサイズ> <教師データフォルダ>
|
666 |
+
```
|
667 |
+
|
668 |
+
如果batch size为8,训练数据放在父文件夹train_data中,则会如下所示
|
669 |
+
```
|
670 |
+
python finetune\make_captions.py --batch_size 8 ..\train_data
|
671 |
+
```
|
672 |
+
|
673 |
+
字幕文件创建在与教师数据图像相同的目录中,具有相同的文件名和扩展名.caption。
|
674 |
+
|
675 |
+
根据 GPU 的 VRAM 容量增加或减少 batch_size。越大越快(我认为 12GB 的 VRAM 可以多一点)。
|
676 |
+
您可以使用 max_length 选项指定标题的最大长度。默认值为 75。如果使用 225 的令牌长度训练模型,它可能会更长。
|
677 |
+
您可以使用 caption_extension 选项更改标题扩展名。默认为 .caption(.txt 与稍后描述的 DeepDanbooru 冲突)。
|
678 |
+
如果有多个教师数据文件夹,则对每个文件夹执行。
|
679 |
+
|
680 |
+
请注意,推理是随机的,因此每次运行时结果都会发生变化。如果要修复它,请使用 --seed 选项指定一个随机数种子,例如 `--seed 42`。
|
681 |
+
|
682 |
+
其他的选项,请参考help with `--help`(好像没有文档说明参数的含义,得看源码)。
|
683 |
+
|
684 |
+
默认情况下,会生成扩展名为 .caption 的字幕文件。
|
685 |
+
|
686 |
+
![caption生成的文件夹](https://user-images.githubusercontent.com/52813779/208908845-48a9d36c-f6ee-4dae-af71-9ab462d1459e.png)
|
687 |
+
|
688 |
+
例如,标题如下:
|
689 |
+
|
690 |
+
![字幕和图像](https://user-images.githubusercontent.com/52813779/208908947-af936957-5d73-4339-b6c8-945a52857373.png)
|
691 |
+
|
692 |
+
## 由 DeepDanbooru 标记
|
693 |
+
|
694 |
+
如果不想给danbooru标签本身打标签,请继续“标题和标签信息的预处理”。
|
695 |
+
|
696 |
+
标记是使用 DeepDanbooru 或 WD14Tagger 完成的。 WD14Tagger 似乎更准确。如果您想使用 WD14Tagger 进行标记,请跳至下一章。
|
697 |
+
### 环境布置
|
698 |
+
|
699 |
+
将 DeepDanbooru https://github.com/KichangKim/DeepDanbooru 克隆到您的工作文件夹中,或下载并展开 zip。我解压缩了它。
|
700 |
+
另外,从 DeepDanbooru 发布页面 https://github.com/KichangKim/DeepDanbooru/releases 上的“DeepDanbooru 预训练模型 v3-20211112-sgd-e28”的资产下载 deepdanbooru-v3-20211112-sgd-e28.zip 并解压到 DeepDanbooru 文件夹。
|
701 |
+
|
702 |
+
从下面下载。单击以打开资产并从那里下载。
|
703 |
+
|
704 |
+
![DeepDanbooru下载页面](https://user-images.githubusercontent.com/52813779/208909417-10e597df-7085-41ee-bd06-3e856a1339df.png)
|
705 |
+
|
706 |
+
做一个这样的目录结构
|
707 |
+
|
708 |
+
![DeepDanbooru的目录结构](https://user-images.githubusercontent.com/52813779/208909486-38935d8b-8dc6-43f1-84d3-fef99bc471aa.png)
|
709 |
+
为扩散器环境安装必要的库。进入 DeepDanbooru 文件夹并安装它(我认为它实际上只是添加了 tensorflow-io)。
|
710 |
+
```
|
711 |
+
pip install -r requirements.txt
|
712 |
+
```
|
713 |
+
|
714 |
+
接下来,安装 DeepDanbooru 本身。
|
715 |
+
|
716 |
+
```
|
717 |
+
pip install .
|
718 |
+
```
|
719 |
+
|
720 |
+
这样就完成了标注环境的准备工作。
|
721 |
+
|
722 |
+
### 实施标记
|
723 |
+
转到 DeepDanbooru 的文件夹并运行 deepdanbooru 进行标记。
|
724 |
+
```
|
725 |
+
deepdanbooru evaluate <教师资料夹> --project-path deepdanbooru-v3-20211112-sgd-e28 --allow-folder --save-txt
|
726 |
+
```
|
727 |
+
|
728 |
+
如果将训练数据放在父文件夹train_data中,则如下所示。
|
729 |
+
```
|
730 |
+
deepdanbooru evaluate ../train_data --project-path deepdanbooru-v3-20211112-sgd-e28 --allow-folder --save-txt
|
731 |
+
```
|
732 |
+
|
733 |
+
在与教师数据图像相同的目录中创建具有相同文件名和扩展名.txt 的标记文件。它很慢,因为它是一个接一个地处理的。
|
734 |
+
|
735 |
+
如果有多个教师数据文件夹,则对每个文件夹执行。
|
736 |
+
|
737 |
+
它生成如下。
|
738 |
+
|
739 |
+
![DeepDanbooru生成的文件](https://user-images.githubusercontent.com/52813779/208909855-d21b9c98-f2d3-4283-8238-5b0e5aad6691.png)
|
740 |
+
|
741 |
+
它会被这样标记(信息量很大...)。
|
742 |
+
|
743 |
+
![DeepDanbooru标签和图片](https://user-images.githubusercontent.com/52813779/208909908-a7920174-266e-48d5-aaef-940aba709519.png)
|
744 |
+
|
745 |
+
## WD14Tagger标记为
|
746 |
+
|
747 |
+
此过程使用 WD14Tagger 而不是 DeepDanbooru。
|
748 |
+
|
749 |
+
使用 Mr. Automatic1111 的 WebUI 中使用的标记器。我参考了这个 github 页面上的信息 (https://github.com/toriato/stable-diffusion-webui-wd14-tagger#mrsmilingwolfs-model-aka-waifu-diffusion-14-tagger)。
|
750 |
+
|
751 |
+
初始环境维护所需的模块已经安装。权重自动从 Hugging Face 下载。
|
752 |
+
### 实施标记
|
753 |
+
|
754 |
+
运行脚本以进行标记。
|
755 |
+
```
|
756 |
+
python tag_images_by_wd14_tagger.py --batch_size <��ッチサイズ> <教師データフォルダ>
|
757 |
+
```
|
758 |
+
|
759 |
+
如果将训练数据放在父文件夹train_data中,则如下所示
|
760 |
+
```
|
761 |
+
python tag_images_by_wd14_tagger.py --batch_size 4 ..\train_data
|
762 |
+
```
|
763 |
+
|
764 |
+
模型文件将在首次启动时自动下载到 wd14_tagger_model 文件夹(文件夹可以在选项中更改)。它将如下所示。
|
765 |
+
![下载文件](https://user-images.githubusercontent.com/52813779/208910447-f7eb0582-90d6-49d3-a666-2b508c7d1842.png)
|
766 |
+
|
767 |
+
在与教师数据图像相同的目录中创建具有相同文件名和扩展名.txt 的标记文件。
|
768 |
+
![生成的标签文件](https://user-images.githubusercontent.com/52813779/208910534-ea514373-1185-4b7d-9ae3-61eb50bc294e.png)
|
769 |
+
|
770 |
+
![标签和图片](https://user-images.githubusercontent.com/52813779/208910599-29070c15-7639-474f-b3e4-06bd5a3df29e.png)
|
771 |
+
|
772 |
+
使用 thresh 选项,您可以指定确定的标签的置信度数以附加标签。默认值为 0.35,与 WD14Tagger 示例相同。较低的值给出更多的标签,但准确性较低。
|
773 |
+
|
774 |
+
根据 GPU 的 VRAM 容量增加或减少 batch_size。越大越快(我认为 12GB 的 VRAM 可以多一点)。您可以使用 caption_extension 选项更改标记文件扩展名。默认为 .txt。
|
775 |
+
|
776 |
+
您可以使用 model_dir 选项指定保存模型的文件夹。
|
777 |
+
|
778 |
+
此外,如果指定 force_download 选项,即使有保存目标文件夹,也会重新下载模型。
|
779 |
+
|
780 |
+
如果有多个教师数据文件夹,则对每个文件夹执行。
|
781 |
+
|
782 |
+
## 预处理字幕和标签信息
|
783 |
+
|
784 |
+
将字幕和标签作为元数据合并到一个文件中,以便从脚本中轻松处理。
|
785 |
+
### 字幕预处理
|
786 |
+
|
787 |
+
要将字幕放入元数据,请在您的工作文件夹中运行以下命令(如果您不使用字幕进行学习,则不需要运行它)(它实际上是一行,依此类推)。指定 `--full_path` 选项以将图像文件的完整路径存储在元数据中。如果省略此选项,则会记录相对路径,但 .toml 文件中需要单独的文件夹规范。
|
788 |
+
```
|
789 |
+
python merge_captions_to_metadata.py --full_path <教师资料夹>
|
790 |
+
--in_json <要读取的元数据文件名> <元数据文件名>
|
791 |
+
```
|
792 |
+
|
793 |
+
元数据文件名是任意名称。
|
794 |
+
如果训练数据为train_data,没有读取元数据文件,元数据文件为meta_cap.json,则会如下。
|
795 |
+
```
|
796 |
+
python merge_captions_to_metadata.py --full_path train_data meta_cap.json
|
797 |
+
```
|
798 |
+
|
799 |
+
您可以使用 caption_extension 选项指定标题扩展。
|
800 |
+
|
801 |
+
如果有多个教师数据文件夹,请指定 full_path 参数并为每个文件夹执行。
|
802 |
+
```
|
803 |
+
python merge_captions_to_metadata.py --full_path
|
804 |
+
train_data1 meta_cap1.json
|
805 |
+
python merge_captions_to_metadata.py --full_path --in_json meta_cap1.json
|
806 |
+
train_data2 meta_cap2.json
|
807 |
+
```
|
808 |
+
如果省略in_json,如果有写入目标元数据文件,将从那里读取并覆盖。
|
809 |
+
|
810 |
+
__* 每次重写 in_json 选项和写入目标并写入单独的元数据文件是安全的。 __
|
811 |
+
### 标签预处理
|
812 |
+
|
813 |
+
同样,标签也收集在元数据中(如果标签不用于学习,则无需这样做)。
|
814 |
+
```
|
815 |
+
python merge_dd_tags_to_metadata.py --full_path <教师资料夹>
|
816 |
+
--in_json <要读取的元数据文件名> <要写入的元数据文件名>
|
817 |
+
```
|
818 |
+
|
819 |
+
同样的目录结构,读取meta_cap.json和写入meta_cap_dd.json时,会是这样的。
|
820 |
+
```
|
821 |
+
python merge_dd_tags_to_metadata.py --full_path train_data --in_json meta_cap.json meta_cap_dd.json
|
822 |
+
```
|
823 |
+
|
824 |
+
如果有多个教师数据文件夹,请指定 full_path 参数并为每个文件夹执行。
|
825 |
+
|
826 |
+
```
|
827 |
+
python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap2.json
|
828 |
+
train_data1 meta_cap_dd1.json
|
829 |
+
python merge_dd_tags_to_metadata.py --full_path --in_json meta_cap_dd1.json
|
830 |
+
train_data2 meta_cap_dd2.json
|
831 |
+
```
|
832 |
+
|
833 |
+
如果省略in_json,如果有写入目标元数据文件,将从那里读取并覆盖。
|
834 |
+
__※ 通过每次重写 in_json 选项和写入目标,写入单独的元数据文件是安全的。 __
|
835 |
+
### 标题和标签清理
|
836 |
+
|
837 |
+
到目前为止,标题和DeepDanbooru标签已经被整理到元数据文件中。然而,自动标题生成的标题存在表达差异等微妙问题(※),而标签中可能包含下划线和评级(DeepDanbooru的情况下)。因此,最好使用编辑器的替换功能清理标题和标签。
|
838 |
+
|
839 |
+
※例如,如果要学习动漫中的女孩,标题可能会包含girl/girls/woman/women等不同的表达方式。另外,将"anime girl"简单地替换为"girl"可能更合适。
|
840 |
+
|
841 |
+
我们提供了用于清理的脚本,请根据情况编辑脚本并使用它。
|
842 |
+
|
843 |
+
(不需要指定教师数据文件夹。将清理元数据中的所有数据。)
|
844 |
+
|
845 |
+
```
|
846 |
+
python clean_captions_and_tags.py <要读取的元数据文件名> <要写入的元数据文件名>
|
847 |
+
```
|
848 |
+
|
849 |
+
--in_json 请注意,不包括在内。例如:
|
850 |
+
|
851 |
+
```
|
852 |
+
python clean_captions_and_tags.py meta_cap_dd.json meta_clean.json
|
853 |
+
```
|
854 |
+
|
855 |
+
标题和标签的预处理现已完成。
|
856 |
+
|
857 |
+
## 预先获取 latents
|
858 |
+
|
859 |
+
※ 这一步骤并非必须。即使省略此步骤,也可以在训练过程中获取 latents。但是,��果在训练时执行 `random_crop` 或 `color_aug` 等操作,则无法预先获取 latents(因为每次图像都会改变)。如果不进行预先获取,则可以使用到目前为止的元数据进行训练。
|
860 |
+
|
861 |
+
提前获取图像的潜在表达并保存到磁盘上。这样可以加速训练过程。同时进行 bucketing(根据宽高比对训练数据进行分类)。
|
862 |
+
|
863 |
+
请在工作文件夹中输入以下内容。
|
864 |
+
|
865 |
+
```
|
866 |
+
python prepare_buckets_latents.py --full_path <教师资料夹>
|
867 |
+
<要读取的元数据文件名> <要写入的元数据文件名>
|
868 |
+
<要微调的模型名称或检查点>
|
869 |
+
--batch_size <批次大小>
|
870 |
+
--max_resolution <分辨率宽、高>
|
871 |
+
--mixed_precision <准确性>
|
872 |
+
```
|
873 |
+
|
874 |
+
如果要从meta_clean.json中读取元数据,并将其写入meta_lat.json,使用模型model.ckpt,批处理大小为4,训练分辨率为512*512,精度为no(float32),则应如下所示。
|
875 |
+
```
|
876 |
+
python prepare_buckets_latents.py --full_path
|
877 |
+
train_data meta_clean.json meta_lat.json model.ckpt
|
878 |
+
--batch_size 4 --max_resolution 512,512 --mixed_precision no
|
879 |
+
```
|
880 |
+
|
881 |
+
教师数据文件夹中,latents以numpy的npz格式保存。
|
882 |
+
|
883 |
+
您可以使用--min_bucket_reso选项指定最小分辨率大小,--max_bucket_reso指定最大大小。默认值分别为256和1024。例如,如果指定最小大小为384,则将不再使用分辨率为256 * 1024或320 * 768等。如果将分辨率增加到768 * 768等较大的值,则最好将最大大小指定为1280等。
|
884 |
+
|
885 |
+
如果指定--flip_aug选项,则进行左右翻转的数据增强。虽然这可以使数据量伪造一倍,但如果数据不是左右对称的(例如角色外观、发型等),则可能会导致训练不成功。
|
886 |
+
|
887 |
+
对于翻转的图像,也会获取latents,并保存名为\ *_flip.npz的文件,这是一个简单的实现。在fline_tune.py中不需要特定的选项。如果有带有\_flip的文件,则会随机加载带有和不带有flip的文件。
|
888 |
+
|
889 |
+
即使VRAM为12GB,批次大小也可以稍微增加。分辨率以“宽度,高度”的形式指定,必须是64的倍数。分辨率直接影响fine tuning时的内存大小。在12GB VRAM中,512,512似乎是极限(*)。如果有16GB,则可以将其提高到512,704或512,768。即使分辨率为256,256等,VRAM 8GB也很难承受(因为参数、优化器等与分辨率无关,需要一定的内存)。
|
890 |
+
|
891 |
+
*有报道称,在batch size为1的训练中,使用12GB VRAM和640,640的分辨率。
|
892 |
+
|
893 |
+
以下是bucketing结果的显示方式。
|
894 |
+
|
895 |
+
![bucketing的結果](https://user-images.githubusercontent.com/52813779/208911419-71c00fbb-2ce6-49d5-89b5-b78d7715e441.png)
|
896 |
+
|
897 |
+
如果有多个教师数据文件夹,请指定 full_path 参数并为每个文件夹执行
|
898 |
+
|
899 |
+
```
|
900 |
+
python prepare_buckets_latents.py --full_path
|
901 |
+
train_data1 meta_clean.json meta_lat1.json model.ckpt
|
902 |
+
--batch_size 4 --max_resolution 512,512 --mixed_precision no
|
903 |
+
|
904 |
+
python prepare_buckets_latents.py --full_path
|
905 |
+
train_data2 meta_lat1.json meta_lat2.json model.ckpt
|
906 |
+
--batch_size 4 --max_resolution 512,512 --mixed_precision no
|
907 |
+
|
908 |
+
```
|
909 |
+
可以将读取源和写入目标设为相同,但分开设定更为安全。
|
910 |
+
|
911 |
+
__※建议每次更改参数并将其写入另一个元数据文件,以确保安全性。__
|
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 |
+
|