@@ -1,9 +1,9 @@
__由于文档正在更新中, 描述可能有错误。__
# 关于本学习文档 ,通用描述
# 关于训练 ,通用描述
本库支持模型微调(fine tuning)、DreamBooth、训练LoRA和文本反转(Textual Inversion)(包括[XTI:P+ ](https://github.com/kohya-ss/sd-scripts/pull/327 )
)
本文档将说明它们通用的学习 数据准备方法和选项等。
本文档将说明它们通用的训练 数据准备方法和选项等。
# 概要
@@ -12,15 +12,15 @@ __由于文档正在更新中, 描述可能有错误。__
以下本节说明。
1. 关于准备学习数据的新形式 (使用设置文件)
1. 对于在学习 中使用的术语的简要解释
1. 准备训练数据 (使用设置文件的新格式 )
1. 训练 中使用的术语的简要解释
1. 先前的指定格式(不使用设置文件,而是从命令行指定)
1. 生成学习 过程中的示例图像
1. 生成训练 过程中的示例图像
1. 各脚本中常用的共同选项
1. 准备 fine tuning 方法的元数据:如说明文字(打标签)等
1. 如果只执行一次,学习 就可以进行(相关内容,请参阅各个脚本的文档)。如果需要,以后可以随时参考。
1. 如果只执行一次,训练 就可以进行(相关内容,请参阅各个脚本的文档)。如果需要,以后可以随时参考。
@@ -28,24 +28,25 @@ __由于文档正在更新中, 描述可能有错误。__
在任意文件夹(也可以是多个文件夹)中准备好训练数据的图像文件。支持 `.png` , `.jpg` , `.jpeg` , `.webp` , `.bmp` 格式的文件。通常不需要进行任何预处理,如调整大小等。
但是请勿使用极小的图像, 其尺寸比训练分辨率( 稍后将提到) 还小, 建议事先使用超分辨率AI等进行放大。另外, 请注意不要使用过大的图像( 约为3000 x 3000像素以上) , 因为这可能会导致错误, 建议事先缩小。
但是请勿使用极小的图像,若 其尺寸比训练分辨率( 稍后将提到) 还小, 建议事先使用超分辨率AI等进行放大。另外, 请注意不要使用过大的图像( 约为3000 x 3000像素以上) , 因为这可能会导致错误, 建议事先缩小。
在训练时,需要整理要用于训练模型的图像数据,并将其指定给脚本。根据训练数据的数量、训练目标和说明(图像描述)是否可用等因素,可以使用几种方法指定训练数据。以下是其中的一些方法(每个名称都不是通用的,而是该存储库自定义的定义)。有关正则化图像的信息将在稍后提供。
1. DreamBooth、class + identifier方式( 可使用正则化图像)
将训练目标与特定单词( identifier) 相关联进行训练。无需准备说明。例如, 当要学习特定角色时, 由于无需准备说明, 因此比较方便, 但由于学习 数据的所有元素都与identifier相关联, 例如发型、服装、背景等, 因此在生成时可能会出现无法更换服装的情况。
将训练目标与特定单词( identifier) 相关联进行训练。无需准备说明。例如, 当要学习特定角色时, 由于无需准备说明, 因此比较方便, 但由于训练 数据的所有元素都与identifier相关联, 例如发型、服装、背景等, 因此在生成时可能会出现无法更换服装的情况。
2. DreamBooth、说明方式( 可使用正则化图像)
准备记录每个图像说明的文本文件 进行训练。例如, 通过将图像详细信息( 如穿着白色衣服的角色A、穿着红色衣服的角色A等) 记录在说明 中,可以将角色和其他元素分离,并期望模型更准确地学习角色。
事先给每个图片写说明( caption) , 存放到文本文件中, 然后 进行训练。例如, 通过将图像详细信息( 如穿着白色衣服的角色A、穿着红色衣服的角色A等) 记录在caption 中,可以将角色和其他元素分离,并期望模型更准确地学习角色。
3. 微调方式(不可使用正则化图像)
先将说明收集到元数据文件中。支持分离标签和说明以及预先缓存latents等功能, 以加速训练( 这些将在另一篇文档中介绍) 。( 虽然名为fine tuning方式, 但不仅限于fine tuning。)
你要学的东西和你可以使用的规范方法的组合如下。
训练对象和你可以使用的规范方法的组合如下。
| 学习 对象或方法 | 脚本 | DB/class+identifier | DB/caption | fine tuning |
| 训练 对象或方法 | 脚本 | DB/class+identifier | DB/caption | fine tuning |
|----------------| ----- | ----- | ----- | ----- |
| fine tuning微调模型 | `fine_tune.py` | x | x | o |
| DreamBooth训练模型 | `train_db.py` | o | o | x |
@@ -54,15 +55,15 @@ __由于文档正在更新中, 描述可能有错误。__
## 选择哪一个
如果您想要学习 LoRA、Textual Inversion而不需要准备简介 文件, 则建议使用DreamBooth class+identifier。如果您能够准备好 , 则DreamBooth Captions方法更好。如果您有大量的训练数据并且不使用规 则化图像, 则请考虑使用fine-tuning方法。
如果您想要训练 LoRA、Textual Inversion而不需要准备说明( caption) 文件, 则建议使用DreamBooth class+identifier。如果您能够准备caption文件 , 则DreamBooth Captions方法更好。如果您有大量的训练数据并且不使用正 则化图像, 则请考虑使用fine-tuning方法。
对于DreamBooth也是一样的, 但不能使用fine-tuning方法。对于fine-tuning方法 , 只能使用fine-tuning方式。
对于DreamBooth也是一样的, 但不能使用fine-tuning方法。若要进行微调 , 只能使用fine-tuning方式。
# 每种方法的指定方式
在这里,我们只介绍每种指定方法的典型模式。有关更详细的指定方法,请参见[数据集设置 ](./config_README-ja.md )。
# DreamBooth, class+identifier方法( 可使用规 则化图像)
# DreamBooth, class+identifier方法( 可使用正 则化图像)
在该方法中,每个图像将被视为使用与 `class identifier` 相同的标题进行训练(例如 `shs dog` )。
@@ -70,15 +71,15 @@ __由于文档正在更新中, 描述可能有错误。__
## step 1.确定identifier和class
要将学习 的目标与identifier和属于该目标的class相关联。
要将训练 的目标与identifier和属于该目标的class相关联。
(虽然有很多称呼,但暂时按照原始论文的说法。)
以下是简要说明(请查阅详细信息)。
class是学习 目标的一般类别。例如, 如果要学习特定品种的狗, 则class将是“dog”。对于动漫角色, 根据模型不同, 可能是“boy”或“girl”, 也可能是“1boy”或“1girl”。
class是训练 目标的一般类别。例如, 如果要学习特定品种的狗, 则class将是“dog”。对于动漫角色, 根据模型不同, 可能是“boy”或“girl”, 也可能是“1boy”或“1girl”。
identifier是用于识别学习 目标并进行学习的单词。可以使用任何单词, 但是根据原始论文, “Tokenizer生成的3个或更少字符的罕见单词”是最好的选择。
identifier是用于识别训练 目标并进行学习的单词。可以使用任何单词, 但是根据原始论文, “Tokenizer生成的3个或更少字符的罕见单词”是最好的选择。
使用identifier和class, 例如, “shs dog”可以将模型训练为从class中识别并学习所需的目标。
@@ -86,9 +87,9 @@ identifier是用于识别学习目标并进行学习的单词。可以使用任
( 作为identifier, 我最近使用的一些参考是“shs sts scs cpc coc cic msm usu ici lvl cic dii muk ori hru rik koo yos wny”等。最好是不包含在Danbooru标签中的单词。)
## step 2. 决定是否使用正则化图像,并生成正则化图像
## step 2. 决定是否使用正则化图像,并在使用时 生成正则化图像
正则化图像是为防止前面提到的语言漂移,即整个类别被拉扯成为学习 目标而生成的图像。如果不使用正则化图像,例如在 `shs 1girl` 中学习特定角色时,即使在简单的 `1girl` 提示下生成,也会越来越像该角色。这是因为 `1girl` 在训练时的标题中包含了该角色的信息。
正则化图像是为防止前面提到的语言漂移,即整个类别被拉扯成为训练 目标而生成的图像。如果不使用正则化图像,例如在 `shs 1girl` 中学习特定角色时,即使在简单的 `1girl` 提示下生成,也会越来越像该角色。这是因为 `1girl` 在训练时的标题中包含了该角色的信息。
通过同时学习目标图像和正则化图像,类别仍然保持不变,仅在将标识符附加到提示中时才生成目标图像。
@@ -100,46 +101,48 @@ identifier是用于识别学习目标并进行学习的单词。可以使用任
(由于正则化图像也被训练,因此其质量会影响模型。)
通常,准备数百张图像是理想的(图像数量太少会导致类别图像无法推广并学习它们的特征 )。
通常,准备数百张图像是理想的(图像数量太少会导致类别图像无法被归纳,特征也不会被学习 )。
如果要使用生成的图像, 生成图像的大小通常应与训练分辨率( 更准确地说, 是bucket的分辨率, 见下文) 相匹配。
如果要使用生成的图像, 请将其大小通常与训练分辨率( 更准确地说是bucket的分辨率) 相适应。
## step 2. 设置文件的描述
创建一个文本文件,并将其扩展名更改为`.toml` 。例如,您可以按以下方式进行描述:
(以`# ` 开头的部分是注释,因此您可以直接复制粘贴,或者将其删除,都没有问题 。)
(以`# ` 开头的部分是注释,因此您可以直接复制粘贴,或者将其删除。)
``` toml
[ general ]
enable_bucket = true # 是否使用Aspect Ratio Bucketing
[ [ datasets ] ]
resolution = 512 # 学习 分辨率
batch_size = 4 # 批量 大小
resolution = 512 # 训练 分辨率
batch_size = 4 # 批次 大小
[ [ datasets . subsets ] ]
image_dir = 'C:\hoge' # 指定包含训练图像的文件夹
class_tokens = 'hoge girl' # 指定标识符类
num_repeats = 10 # 训练图像的迭代 次数
num_repeats = 10 # 训练图像的重复 次数
# 以下仅在使用正则化图像时进行描述。不使用则删除
[ [ datasets . subsets ] ]
is_reg = true
image_dir = 'C:\reg' # 指定包含正则化图像的文件夹
class_tokens = 'girl' # 指定类别
num_repeats = 1 # 正则化图像的迭代 次数, 基本上1就可以了
class_tokens = 'girl' # 指定class
num_repeats = 1 # 正则化图像的重复 次数, 基本上1就可以了
```
基本上只需更改以下位置 即可进行学习 。
基本上只需更改以下几个地方 即可进行训练 。
1. 学习 分辨率
1. 训练 分辨率
指定一个数字表示正方形(如果是 `512` ,则为 512x512) , 如果使用方括号和逗号分隔的两个数字, 则表示横向× 纵向( 如果是`[512,768]` ,则为 512x768) 。在SD1.x系列中, 原始学习 分辨率为512。指定较大的分辨率, 如 `[512,768]` 可能会减少纵向和横向图像生成时的错误。在SD2.x 768系列中, 分辨率为 `768` 。
指定一个数字表示正方形(如果是 `512` ,则为 512x512) , 如果使用方括号和逗号分隔的两个数字, 则表示横向× 纵向( 如果是`[512,768]` ,则为 512x768) 。在SD1.x系列中, 原始训练 分辨率为512。指定较大的分辨率, 如 `[512,768]` 可能会减少纵向和横向图像生成时的错误。在SD2.x 768系列中, 分辨率为 `768` 。
1. 批量 大小
1. 批次 大小
指定同时学习 多少个数据。这取决于GPU的VRAM大小和学习 分辨率。详细信息将在后面说明。此外, fine tuning/DreamBooth/LoRA等也会影响批量 大小,请查看各个脚本的说明。
指定同时训练 多少个数据。这取决于GPU的VRAM大小和训练 分辨率。详细信息将在后面说明。此外, fine tuning/DreamBooth/LoRA等也会影响批次 大小,请查看各个脚本的说明。
1. 文件夹指定
@@ -149,7 +152,7 @@ batch_size = 4 # 批量大小
如前所述,与示例相同。
1. 迭代 次数
1. 重复 次数
将在后面说明。
@@ -159,69 +162,68 @@ batch_size = 4 # 批量大小
请将重复次数指定为“ __训练用图像的重复次数× 训练用图像的数量≥正则化图像的重复次数× 正则化图像的数量 __ ”。
( 1个epoch( 数据一周一次 )的数据量为“训练用图像的重复次数×训练用图像的数量”。如果正则化图像的数量多于这个值,则剩余的正则化图像将不会被使用。)
( 1个epoch( 指训练数据过完一遍 )的数据量为“训练用图像的重复次数×训练用图像的数量”。如果正则化图像的数量多于这个值,则剩余的正则化图像将不会被使用。)
## 步骤 3. 学习
## 步骤 3. 训练
请根据每个文档的参考进行学习 。
详情请参考相关文档进行训练 。
# DreamBooth, 标题 方式(可使用规范 化图像)
# DreamBooth, 文本说明( caption) 方式(可使用正则 化图像)
在此方式中,每个图像都将通过标题进行学习 。
在此方式中,每个图像都将通过caption进行训练 。
## 步骤 1. 准备标题 文件
## 步骤 1. 准备文本说明 文件
请将与图像具有相同文件名且扩展名为 `.caption` (可以在设置中更改)的文件放置在用于训练图像的文件夹中。每个文件应该只有一行。编码为 `UTF-8` 。
## 步骤 2. 决定是否使用规范 化图像,并在使用时生成规范 化图像
## 步骤 2. 决定是否使用正则 化图像,并在使用时生成正则 化图像
与class+identifier格式相同。可以在规范化图像上附加标题 ,但通常不需要。
与class+identifier格式相同。可以在规范化图像上附加caption ,但通常不需要。
## 步骤 2. 编写设置文件
创建一个文本文件并将扩展名更改为 `.toml` 。例如,可以按以下方式进行记录。
创建一个文本文件并将扩展名更改为 `.toml` 。例如,您 可以按以下方式进行描述:
``` toml
[ general ]
enable_bucket = true # Aspect Ratio Bucketingを使うか否か
enable_bucket = true # 是否使用 Aspect Ratio Bucketing
[ [ datasets ] ]
resolution = 512 # 学習解像度
batch_size = 4 # 批量 大小
resolution = 512 # 训练分辨率
batch_size = 4 # 批次 大小
[ [ datasets . subsets ] ]
image_dir = 'C:\hoge' # 指定包含训练图像的文件夹
caption_extension = '.caption' # 使用字幕文件扩展名 .txt 时重写
num_repeats = 10 # 训练图像的迭代 次数
caption_extension = '.caption' # 若 使用txt文件,更改此项
num_repeats = 10 # 训练图像的重复 次数
# 以下仅在使用正则化图像时进行描述。不使用则删除
[ [ datasets . subsets ] ]
is_reg = true
image_dir = 'C:\reg' #指定包含正则化图像的文件夹
class_tokens = 'girl' # class を指定
num_repeats = 1 #
正 则 化 图 像 的 迭 代 次 数 , 基 本 上 1 就 可 以 了
image_dir = 'C:\reg' # 指定包含正则化图像的文件夹
class_tokens = 'girl' # 指定 class
num_repeats = 1 # 正则化图像的重复次数, 基本上1就可以了
```
基本上,您可以通过仅重写以下位置来学习。除非另有说明,否则与类+标识符 方法相同。
基本上只需更改以下几个地方来训练。除非另有说明, 否则与class+identifier 方法相同。
1. 学习 分辨率
2. 批量 大小
1. 训练 分辨率
2. 批次 大小
3. 文件夹指定
4. 标题 文件的扩展名
4. caption 文件的扩展名
可以指定任意的扩展名。
5. 重复次数
## 步骤 3. 学习
## 步骤 3. 训练
请参考每个 文档进行学习 。
详情 请参考相关 文档进行训练 。
# 微调方法
# 微调方法(fine tuning)
## 步骤 1. 准备元数据
将标题 和标签整合到管理文件中称为元数据。它的扩展名为 `.json` , 格式为json。由于创建方法较长, 因此在本文档的末尾进行了 描述。
将caption 和标签整合到管理文件中称为元数据。它的扩展名为 `.json` , 格式为json。由于创建方法较长, 因此在本文档的末尾进行描述。
## 步骤 2. 编写设置文件
@@ -233,16 +235,16 @@ keep_tokens = 1
[ [ datasets ] ]
resolution = 512 # 图像分辨率
batch_size = 4 # 批量 大小
batch_size = 4 # 批次 大小
[ [ datasets . subsets ] ]
image_dir = 'C:\piyo' # 指定包含训练图像的文件夹
metadata_file = 'C:\piyo\piyo_md.json' # 元数据文件名
```
基本上,您可以通过仅重写以下位置来学习。如无特别 说明, 与DreamBooth相同,类+标识符方式 。
基本上只需更改以下几个地方来训练。除非另有 说明,否则 与DreamBooth, class+identifier方法 相同。
1. 学习解像度
1. 训练分辨率
2. 批次大小
3. 指定文件夹
4. 元数据文件名
@@ -250,25 +252,25 @@ batch_size = 4 # 批量大小
指定使用后面所述方法创建的元数据文件。
## 第三步:学习
## 第三步:训练
请参考各个 文档进行学习 。
详情 请参考相关 文档进行训练 。
# 学习 中使用的术语简单解释
# 训练 中使用的术语简单解释
由于省略了细节并且我自己也没有完全理解,因此请自行查阅详细信息。
## 微调( fine tuning)
指训练模型并微调其性能。具体含义因用法而异,但在 Stable Diffusion 中,狭义的微调是指使用图像和标题 进行训练模型。DreamBooth 可视为狭义微调的一种特殊方法。广义的微调包括 LoRA、Textual Inversion、Hypernetworks 等,包括训练模型的所有内容。
指训练模型并微调其性能。具体含义因用法而异,但在 Stable Diffusion 中,狭义的微调是指使用图像和caption 进行训练模型。DreamBooth 可视为狭义微调的一种特殊方法。广义的微调包括 LoRA、Textual Inversion、Hypernetworks 等,包括训练模型的所有内容。
## 步骤( step)
粗略地说,每次在训练数据上进行一次计算即为一步。具体来说,“将训练数据的标题 传递给当前模型,将生成的图像与训练数据的图像进行比较,稍微更改模型,以使其更接近训练数据”即为一步。
粗略地说,每次在训练数据上进行一次计算即为一步。具体来说,“将训练数据的caption 传递给当前模型,将生成的图像与训练数据的图像进行比较,稍微更改模型,以使其更接近训练数据”即为一步。
## 批次大小( batch size)
批次大小指定每个步骤要计算多少数据。批量 计算可以提高速度。一般来说,批次大小越大,精度也越高。
批次大小指定每个步骤要计算多少数据。批次 计算可以提高速度。一般来说,批次大小越大,精度也越高。
“批次大小×步数”是用于训练的数据数量。因此,建议减少步数以增加批次大小。
@@ -276,37 +278,37 @@ batch_size = 4 # 批量大小
批次大小越大, GPU 内存消耗就越大。如果内存不足,将导致错误,或者在边缘时将导致训练速度降低。建议在任务管理器或 `nvidia-smi` 命令中检查使用的内存量进行调整。
另外, 批次是指“一块 数据”的意思 。
注意,一个 批次是指“一个 数据单位 ”。
## 学习率
学习率指的是每个步骤中改变的程度。如果指定一个大的值,学习速度就会加快,但是可能会出现变化太大导致模型崩溃或无法达到最佳状态的情况。如果指定一个小的值,学习速度会变慢,也 可能无法达到最佳状态。
学习率指的是每个步骤中改变的程度。如果指定一个大的值,学习速度就会加快,但是可能会出现变化太大导致模型崩溃或无法达到最佳状态的情况。如果指定一个小的值,学习速度会变慢,同时 可能无法达到最佳状态。
在fine tuning、DreamBooth、LoRA等过程中, 学习率会有很大的差异, 并且也会受到训练数据、所需训练的模型、批量 大小和步骤数等因素的影响。建议从一般的 值开始,观察训练状态并逐渐调整。
在fine tuning、DreamBooth、LoRA等过程中, 学习率会有很大的差异, 并且也会受到训练数据、所需训练的模型、批次 大小和步骤数等因素的影响。建议从通常 值开始,观察训练状态并逐渐调整。
默认情况下,整个训练过程中学习率是固定的。但是可以通过调度程序指定学习率如何变化,因此结果也会有所不同。
## 时代( e poch)
## E poch
Epoch指的是训练数据被完整训练一遍( 即数据一周)的情况 。如果指定了重复次数,则在重复后的数据一周后,就是 1个epoch。
Epoch指的是训练数据被完整训练一遍( 即数据已经迭代一轮) 。如果指定了重复次数,则在重复后的数据迭代一轮后,为 1个epoch。
1个epoch的步骤数通常为“数据量÷批量 大小”, 但如果使用Aspect Ratio Bucketing, 则略微增加( 由于不同bucket的数据不能在同一个批次中, 因此步骤数会增加) 。
1个epoch的步骤数通常为“数据量÷批次 大小”, 但如果使用Aspect Ratio Bucketing, 则略微增加( 由于不同bucket的数据不能在同一个批次中, 因此步骤数会增加) 。
## 纵横 比分桶( Aspect Ratio Bucketing)
## 长宽 比分桶( Aspect Ratio Bucketing)
Stable Diffusion 的 v1 是以 512\*512 的分辨率进行训练的,但同时也可以在其他分辨率下进行训练,例如 256\*1024 和 384\*640。这样可以减少裁剪的部分, 期 望更准确地学习图像和标题之间的关系。
Stable Diffusion 的 v1 是以 512\*512 的分辨率进行训练的,但同时也可以在其他分辨率下进行训练,例如 256\*1024 和 384\*640。这样可以减少裁剪的部分, 希 望更准确地学习图像和标题之间的关系。
此外,由于可以在任意分辨率下进行训练,因此不再需要事先统一图像数据的纵横 比。
此外,由于可以在任意分辨率下进行训练,因此不再需要事先统一图像数据的长宽 比。
该设置在配置中有效,可以切换,但 在此之前的配置文件示例中已启用(设置为 `true` )。
此值可以被设定,其 在此之前的配置文件示例中已被 启用(设置为 `true` )。
学习分辨率将根据参数所提供的分辨率面积(即内存使用量)进行调整,以 64像素为单位 (默认值,可更改)在纵横 方向上进行 调整和创建。
只要不超过作为参数给出的分辨率区域(= 内存使用量),就可以按 64 像素的增量 (默认值,可更改)在垂直和水平 方向上调整和创建训练分辨率 。
在机器学习中,通常需要将所有输入大小统一,但实际上只要在同一批次中统一即可。 NovelAI 所说的分桶(bucketing) 指的是,预先将训练数据按照纵横 比分类到每个学习分辨率下,并通过使用每个 bucket 内的图像创建批次来统一批次图像大小。
在机器学习中,通常需要将所有输入大小统一,但实际上只要在同一批次中统一即可。 NovelAI 所说的分桶(bucketing) 指的是,预先将训练数据按照长宽 比分类到每个学习分辨率下,并通过使用每个 bucket 内的图像创建批次来统一批次图像大小。
# 以前的指定格式(不使用 .toml 文件,而是使用命令行选项指定)
这是一种通过命令行选项而不是指定 .toml 文件的方法。有 DreamBooth 类+标识符方法、DreamBooth 标题 方法、微调方法三种方式。
这是一种通过命令行选项而不是指定 .toml 文件的方法。有 DreamBooth 类+标识符方法、DreamBooth caption 方法、微调方法三种方式。
## DreamBooth、类+标识符方式
@@ -326,7 +328,7 @@ Stable Diffusion 的 v1 是以 512\*512 的分辨率进行训练的,但同时

### 多个类别、多个标识符的学习
### 多个类别、多个标识符的训练
该方法很简单, 在用于训练的图像文件夹中, 需要准备多个文件夹, 每个文件夹都是以“重复次数_<标识符> <类别>”命名的, 同样, 在正则化图像文件夹中, 也需要准备多个文件夹, 每个文件夹都是以“重复次数_<类别>”命名的。
@@ -344,37 +346,37 @@ Stable Diffusion 的 v1 是以 512\*512 的分辨率进行训练的,但同时
### step 2. 准备正规化图像
这是使用规 则化图像时的过程。
这是使用正 则化图像时的过程。
创建一个文件夹来存储规 则化的图像。 __此外, __ 创建一个名为` `<repeat count>_<class>` ` 的目录。
创建一个文件夹来存储正 则化的图像。 __此外, __ 创建一个名为` `<repeat count>_<class>` ` 的目录。
例如, 使用提示“frog”并且不重复数据( 仅一次) :

步骤3. 执行学习
步骤3. 执行训练
执行每个学习 脚本。使用 ` --train_data_dir` 选项指定包含训练数据文件夹的父文件夹(不是包含图像的文件夹),使用 ` --reg_data_dir` 选项指定包含正则化图像的父文件夹(不是包含图像的文件夹)。
执行每个训练 脚本。使用 ` --train_data_dir` 选项指定包含训练数据文件夹的父文件夹(不是包含图像的文件夹),使用 ` --reg_data_dir` 选项指定包含正则化图像的父文件夹(不是包含图像的文件夹)。
## DreamBooth, 带标题 方式
## DreamBooth, 带文本说明( caption) 的 方式
在包含训练图像和正则化图像的文件夹中,将与图像具有相同文件名的文件.caption( 可以使用选项进行更改) 放置在该文件夹中, 然后从该文件中加载标题 作为提示进行学习 。
在包含训练图像和正则化图像的文件夹中,将与图像具有相同文件名的文件.caption( 可以使用选项进行更改) 放置在该文件夹中, 然后从该文件中加载caption所 作为提示进行训练 。
※文件夹名称(标识符类)不再用于这些图像的训练。
默认的标题 文件扩展名为.caption。可以使用学习 脚本的 ` --caption_extension` 选项进行更改。 使用 ` --shuffle_caption` 选项,同时对每个逗号分隔的部分进行学习 时会对学习时的标题 进行混洗。
默认的caption 文件扩展名为.caption。可以使用训练 脚本的 ` --caption_extension` 选项进行更改。 使用 ` --shuffle_caption` 选项,同时对每个逗号分隔的部分进行训练 时会对训练时的caption 进行混洗。
## 微调方式
创建元数据的方式与使用配置文件相同。 使用 ` in_json` 选项指定元数据文件。
# 学习 过程中的样本输出
# 训练 过程中的样本输出
通过在训练中使用模型生成图像,可以检查学习 进度。将以下选项指定为学习 脚本。
通过在训练中使用模型生成图像,可以检查训练 进度。将以下选项指定为训练 脚本。
- ` --sample_every_n_steps` / ` --sample_every_n_epochs`
指定要采样的步数或纪元 数。为这些数字中的每一个输出样本。如果两者都指定,则 epoch 数优先。
指定要采样的步数或epoch 数。为这些数字中的每一个输出样本。如果两者都指定,则 epoch 数优先。
- ` --sample_prompts`
指定示例输出的提示文件。
@@ -421,11 +423,11 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
4. U-Net的结构( CrossAttention的头数等)
5. v-parameterization( 采样方式好像变了)
其中碱基 使用1-4个 ,非碱基 使用1-5个 ( 768-v) 。使用 1-4 进行 v2 选择,使用 5 进行 v_parameterization 选择。
-` --pretrained_model_name_or_path`
其中base 使用1-4, 非base 使用1-5( 768-v) 。使用 1-4 进行 v2 选择,使用 5 进行 v_parameterization 选择。
- ` --pretrained_model_name_or_path`
指定要从中执行额外训练的模型。您可以指定稳定扩散 检查点文件(.ckpt 或 .safetensors) 、扩散器 本地磁盘上的模型目录或扩散器 模型 ID( 例如“stabilityai/stable-diffusion-2”) 。
## 学习 设置
指定要从中执行额外训练的模型。您可以指定Stable Diffusion 检查点文件(.ckpt 或 .safetensors) 、diffusers 本地磁盘上的模型目录或diffusers 模型 ID( 例如“stabilityai/stable-diffusion-2”) 。
## 训练 设置
- ` --output_dir`
@@ -441,7 +443,7 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
- ` --max_train_steps` / ` --max_train_epochs`
指定要学习 的步数或纪元 数。如果两者都指定,则 epoch 数优先。
指定要训练 的步数或epoch 数。如果两者都指定,则 epoch 数优先。
-
- ` --mixed_precision`
@@ -450,9 +452,9 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
( 在RTX30系列以后也可以指定` bf16`,请配合您在搭建环境时做的加速设置)。
- ` --gradient_checkpointing`
通过逐步计算权重而不是在训练期间一次计算所有权重来减少训练所需的 GPU 内存量。关闭它不会影响准确性,但打开它允许更大的批量 大小,所以那里有影响。
通过逐步计算权重而不是在训练期间一次计算所有权重来减少训练所需的 GPU 内存量。关闭它不会影响准确性,但打开它允许更大的批次 大小,所以那里有影响。
另外,打开它通常会减慢速度,但可以增加批量 大小,因此总的学习 时间实际上可能会更快。
另外,打开它通常会减慢速度,但可以增加批次 大小,因此总的训练 时间实际上可能会更快。
- ` --xformers` / ` --mem_eff_attn`
@@ -463,35 +465,35 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
- ` --save_every_n_epochs` / ` --save_state` / ` --resume`
为 save_every_n_epochs 选项指定一个数字可以在每个时期的训练期间保存模型。
如果同时指定save_state选项, 学习 状态包括优化器的状态等都会一起保存。。保存目的地将是一个文件夹。
如果同时指定save_state选项, 训练 状态包括优化器的状态等都会一起保存。。保存目的地将是一个文件夹。
学习 状态输出到目标文件夹中名为“<output_name>-??????-state”( ??????是纪元 数)的文件夹中。长时间学习 时请使用。
训练 状态输出到目标文件夹中名为“<output_name>-??????-state”( ??????是epoch 数)的文件夹中。长时间训练 时请使用。
使用 resume 选项从保存的训练状态恢复训练。指定学习 状态文件夹(其中的状态文件夹,而不是 ` output_dir`)。
使用 resume 选项从保存的训练状态恢复训练。指定训练 状态文件夹(其中的状态文件夹,而不是 ` output_dir`)。
请注意,由于 Accelerator 规范, epoch 数和全局步数不会保存,即使恢复时它们也从 1 开始。
- ` --save_model_as` ( DreamBooth, fine tuning 仅有的)
您可以从 ` ckpt, safetensors, diffusers, diffusers_safetensors` 中选择模型保存格式。
- ` --save_model_as=safetensors` 指定喜欢当读取稳定扩散格式( ckpt 或安全张量)并以扩散器 格式保存时,缺少的信息通过从 Hugging Face 中删除 v1.5 或 v2.1 信息来补充。
- ` --save_model_as=safetensors` 指定喜欢当读取Stable Diffusion格式( ckpt 或safetensors) 并以diffusers 格式保存时,缺少的信息通过从 Hugging Face 中删除 v1.5 或 v2.1 信息来补充。
- ` --clip_skip`
` 2` 如果指定,则使用文本编码器 (CLIP) 的倒数第二层的输出。如果省略 1 或选项,则使用最后一层。
*SD2.0默认使用倒数第二层,学习 SD2.0时请不要指定。
*SD2.0默认使用倒数第二层,训练 SD2.0时请不要指定。
如果被训练的模型最初被训练为使用第二层,则 2 是一个很好的值。
如果您使用的是最后一层, 那么整个模型都会根据该假设进行训练。因此, 如果再次使用第二层进行训练, 可能需要一定数量的teacher数据和更长时间的学习 才能得到想要的学习 结果。
如果您使用的是最后一层, 那么整个模型都会根据该假设进行训练。因此, 如果再次使用第二层进行训练, 可能需要一定数量的teacher数据和更长时间的训练 才能得到想要的训练 结果。
- ` --max_token_length`
默认值为 75。您可以通过指定“150”或“225”来扩展令牌长度来学习 。使用长字幕学习 时指定。
默认值为 75。您可以通过指定“150”或“225”来扩展令牌长度来训练 。使用长字幕训练 时指定。
但由于学习 时token展开的规范与Automatic1111的web UI( 除法等规范) 略有不同, 如非必要建议用75学习 。
但由于训练 时token展开的规范与Automatic1111的web UI( 除法等规范) 略有不同, 如非必要建议用75训练 。
与clip_skip一样, 学习 与模型学习 状态不同的长度可能需要一定量的teacher数据和更长的学习时间。
与clip_skip一样, 训练 与模型训练 状态不同的长度可能需要一定量的teacher数据和更长的学习时间。
- ` --persistent_data_loader_workers`
@@ -502,7 +504,7 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
指定数据加载的进程数。大量的进程会更快地加载数据并更有效地使用 GPU, 但会消耗更多的主内存。默认是"` 8`或者` CPU并发执行线程数 - 1`,取小者", 所以如果主存没有空间或者GPU使用率大概在90%以上,就看那些数字和 ` 2` 或将其降低到大约 ` 1`。
- ` --logging_dir` / ` --log_prefix`
保存学习 日志的选项。在 logging_dir 选项中指定日志保存目标文件夹。以 TensorBoard 格式保存日志。
保存训练 日志的选项。在 logging_dir 选项中指定日志保存目标文件夹。以 TensorBoard 格式保存日志。
例如,如果您指定 --logging_dir=logs, 将在您的工作文件夹中创建一个日志文件夹, 并将日志保存在日期/时间文件夹中。
此外,如果您指定 --log_prefix 选项,则指定的字符串将添加到日期和时间之前。使用“--logging_dir=logs --log_prefix=db_style1_”进行识别。
@@ -518,23 +520,23 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
- ` --noise_offset`
本文的实现: https://www.crosslabs.org//blog/diffusion-with-offset-noise
看起来它可能会为整体更暗和更亮的图像产生更好的结果。它似乎对 LoRA 学习 也有效。指定一个大约 0.1 的值似乎很好。
看起来它可能会为整体更暗和更亮的图像产生更好的结果。它似乎对 LoRA 训练 也有效。指定一个大约 0.1 的值似乎很好。
- ` --debug_dataset`
通过添加此选项,您可以在学习 之前检查将学习 什么样的图像数据和标题。按 Esc 退出并返回命令行。按 ` S` 进入下一步(批次),按 ` E` 进入下一个纪元 。
通过添加此选项,您可以在训练 之前检查将训练 什么样的图像数据和标题。按 Esc 退出并返回命令行。按 ` S` 进入下一步(批次),按 ` E` 进入下一个epoch 。
*图片在 Linux 环境(包括 Colab) 下不显示。
- ` --vae`
如果您在 vae 选项中指定稳定扩散 检查点、VAE 检查点文件、扩散模型或 VAE( 两者都可以指定本地或拥抱面模型 ID) , 则该 VAE 用于学习 (缓存时的潜伏)或在学习 过程中获得潜伏)。
如果您在 vae 选项中指定Stable Diffusion 检查点、VAE 检查点文件、扩散模型或 VAE( 两者都可以指定本地或拥抱面模型 ID) , 则该 VAE 用于训练 (缓存时的潜伏)或在训练 过程中获得潜伏)。
对于 DreamBooth 和微调,保存的模型将包含此 VAE
- ` --cache_latents`
在主内存中缓存 VAE 输出以减少 VRAM 使用。除 flip_aug 之外的任何增强都将不可用。此外,整体学习 速度略快。
在主内存中缓存 VAE 输出以减少 VRAM 使用。除 flip_aug 之外的任何增强都将不可用。此外,整体训练 速度略快。
- ` --min_snr_gamma`
指定最小 SNR 加权策略。细节是[这里](https://github.com/kohya-ss/sd-scripts/pull/308)请参阅。论文中推荐` 5`。
@@ -545,9 +547,12 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
-- 指定优化器类型。您可以指定
- AdamW : [torch.optim.AdamW](https://pytorch.org/docs/stable/generated/torch.optim.AdamW.html)
- 与过去版本中未指定选项时相同
- AdamW8bit : 同上
- AdamW8bit : 参数 同上
- PagedAdamW8bit : 参数同上
- 与过去版本中指定的 --use_8bit_adam 相同
- Lion : https://github.com/lucidrains/lion-pytorch
- Lion8bit : 参数同上
- PagedLion8bit : 参数同上
- 与过去版本中指定的 --use_lion_optimizer 相同
- SGDNesterov : [torch.optim.SGD](https://pytorch.org/docs/stable/generated/torch.optim.SGD.html), nesterov=True
- SGDNesterov8bit : 参数同上
@@ -564,7 +569,7 @@ masterpiece, best quality, 1boy, in business suit, standing at street, looking b
- ` --learning_rate`
指定学习率。合适的学习率取决于学习 脚本,所以请参考每个解释。
指定学习率。合适的学习率取决于训练 脚本,所以请参考每个解释。
- ` --lr_scheduler` / ` --lr_warmup_steps` / ` --lr_scheduler_num_cycles` / ` --lr_scheduler_power`
学习率的调度程序相关规范。
@@ -599,14 +604,14 @@ D-Adaptation 优化器自动调整学习率。学习率选项指定的值不是
(内部仅通过 importlib 未确认操作。如果需要,请安装包。)
<!--
## 使用任意大小的图像进行训练 --resolution
你可以在广场外学习 。请在分辨率中指定“宽度、高度”, 如“448,640”。宽度和高度必须能被 64 整除。匹配训练图像和正则化图像的大小。
你可以在广场外训练 。请在分辨率中指定“宽度、高度”, 如“448,640”。宽度和高度必须能被 64 整除。匹配训练图像和正则化图像的大小。
就我个人而言, 我经常生成垂直长的图像, 所以我有时会用“448、640”来学习 。
就我个人而言, 我经常生成垂直长的图像, 所以我有时会用“448、640”来训练 。
## 纵横比分桶 --enable_bucket / --min_bucket_reso / --max_bucket_reso
它通过指定 enable_bucket 选项来启用。 Stable Diffusion 在 512x512 分辨率下训练,但也在 256x768 和 384x640 等分辨率下训练。
如果指定此选项,则不需要将训练图像和正则化图像统一为特定分辨率。从多种分辨率(纵横比)中进行选择,并在该分辨率下学习 。
如果指定此选项,则不需要将训练图像和正则化图像统一为特定分辨率。从多种分辨率(纵横比)中进行选择,并在该分辨率下训练 。
由于分辨率为 64 像素,纵横比可能与原始图像不完全相同。
您可以使用 min_bucket_reso 选项指定分辨率的最小大小,使用 max_bucket_reso 指定最大大小。默认值分别为 256 和 1024。
@@ -618,13 +623,13 @@ D-Adaptation 优化器自动调整学习率。学习率选项指定的值不是
(因为一批中的图像不偏向于训练图像和正则化图像。
## 扩充 --color_aug / --flip_aug
增强是一种通过在学习 过程中动态改变数据来提高模型性能的方法。在使用 color_aug 巧妙地改变色调并使用 flip_aug 左右翻转的同时学习 。
增强是一种通过在训练 过程中动态改变数据来提高模型性能的方法。在使用 color_aug 巧妙地改变色调并使用 flip_aug 左右翻转的同时训练 。
由于数据是动态变化的,因此不能与 cache_latents 选项一起指定。
## 使用 fp16 梯度训练(实验特征)--full_fp16
如果指定 full_fp16 选项,梯度从普通 float32 变为 float16 (fp16) 并学习 (它似乎是 full fp16 学习 而不是混合精度)。
结果,似乎 SD1.x 512x512 大小可以在 VRAM 使用量小于 8GB 的情况下学习 ,而 SD2.x 512x512 大小可以在 VRAM 使用量小于 12GB 的情况下学习 。
如果指定 full_fp16 选项,梯度从普通 float32 变为 float16 (fp16) 并训练 (它似乎是 full fp16 训练 而不是混合精度)。
结果,似乎 SD1.x 512x512 大小可以在 VRAM 使用量小于 8GB 的情况下训练 ,而 SD2.x 512x512 大小可以在 VRAM 使用量小于 12GB 的情况下训练 。
预先在加速配置中指定 fp16, 并可选择设置 ` `mixed_precision="fp16"` `( bf16 不起作用)。
@@ -638,20 +643,20 @@ D-Adaptation 优化器自动调整学习率。学习率选项指定的值不是
# 创建元数据文件
## 准备教师资料
## 准备训练数据
如上所述准备好你要学习 的图像数据,放在任意文件夹中。
如上所述准备好你要训练 的图像数据,放在任意文件夹中。
例如,存储这样的图像:

## 自动字幕
## 自动captioning
如果您只想学习 没有标题的标签,请跳过。
如果您只想训练 没有标题的标签,请跳过。
另外,手动准备字幕 时,请准备在与教师数据图像相同的目录下,文件名相同,扩展名.caption等。每个文件应该是只有一行的文本文件。
### 使用 BLIP 添加字幕
另外,手动准备caption 时,请准备在与教师数据图像相同的目录下,文件名相同,扩展名.caption等。每个文件应该是只有一行的文本文件。
### 使用 BLIP 添加caption
最新版本不再需要 BLIP 下载、权重下载和额外的虚拟环境。按原样工作。
@@ -666,24 +671,24 @@ python finetune\make_captions.py --batch_size <バッチサイズ> <教師デー
python finetune\make_captions.py --batch_size 8 ..\train_data
` ``
字幕 文件创建在与教师数据图像相同的目录中,具有相同的文件名和扩展名.caption。
caption 文件创建在与教师数据图像相同的目录中,具有相同的文件名和扩展名.caption。
根据 GPU 的 VRAM 容量增加或减少 batch_size。越大越快( 我认为 12GB 的 VRAM 可以多一点)。
您可以使用 max_length 选项指定标题 的最大长度。默认值为 75。如果使用 225 的令牌长度训练模型,它可能会更长。
您可以使用 caption_extension 选项更改标题 扩展名。默认为 .caption( .txt 与稍后描述的 DeepDanbooru 冲突)。
您可以使用 max_length 选项指定caption 的最大长度。默认值为 75。如果使用 225 的令牌长度训练模型,它可能会更长。
您可以使用 caption_extension 选项更改caption 扩展名。默认为 .caption( .txt 与稍后描述的 DeepDanbooru 冲突)。
如果有多个教师数据文件夹,则对每个文件夹执行。
请注意,推理是随机的,因此每次运行时结果都会发生变化。如果要修复它,请使用 --seed 选项指定一个随机数种子,例如 ` --seed 42`。
其他的选项, 请参考help with ` --help`(好像没有文档说明参数的含义,得看源码)。
默认情况下,会生成扩展名为 .caption 的字幕 文件。
默认情况下,会生成扩展名为 .caption 的caption 文件。

例如,标题如下:


## 由 DeepDanbooru 标记
@@ -702,7 +707,7 @@ python finetune\make_captions.py --batch_size 8 ..\train_data
做一个这样的目录结构

为扩散器 环境安装必要的库。进入 DeepDanbooru 文件夹并安装它(我认为它实际上只是添加了 tensorflow-io) 。
为diffusers 环境安装必要的库。进入 DeepDanbooru 文件夹并安装它(我认为它实际上只是添加了 tensorflow-io) 。
` ``
pip install -r requirements.txt
` ``
@@ -775,12 +780,12 @@ python tag_images_by_wd14_tagger.py --batch_size 4 ..\train_data
如果有多个教师数据文件夹,则对每个文件夹执行。
## 预处理字幕 和标签信息
## 预处理caption 和标签信息
将字幕 和标签作为元数据合并到一个文件中,以便从脚本中轻松处理。
### 字幕 预处理
将caption 和标签作为元数据合并到一个文件中,以便从脚本中轻松处理。
### caption 预处理
要将字幕 放入元数据,请在您的工作文件夹中运行以下命令(如果您不使用字幕进行学习 ,则不需要运行它)(它实际上是一行,依此类推)。指定 ` --full_path` 选项以将图像文件的完整路径存储在元数据中。如果省略此选项,则会记录相对路径,但 .toml 文件中需要单独的文件夹规范。
要将caption 放入元数据,请在您的工作文件夹中运行以下命令(如果您不使用caption进行训练 ,则不需要运行它)(它实际上是一行,依此类推)。指定 ` --full_path` 选项以将图像文件的完整路径存储在元数据中。如果省略此选项,则会记录相对路径,但 .toml 文件中需要单独的文件夹规范。
` ``
python merge_captions_to_metadata.py --full_path <教师资料夹>
--in_json <要读取的元数据文件名> <元数据文件名>
@@ -806,7 +811,7 @@ python merge_captions_to_metadata.py --full_path --in_json meta_cap1.json
__* 每次重写 in_json 选项和写入目标并写入单独的元数据文件是安全的。 __
### 标签预处理
同样,标签也收集在元数据中(如果标签不用于学习 ,则无需这样做)。
同样,标签也收集在元数据中(如果标签不用于训练 ,则无需这样做)。
` ``
python merge_dd_tags_to_metadata.py --full_path <教师资料夹>
--in_json <要读取的元数据文件名> <要写入的元数据文件名>
@@ -862,7 +867,7 @@ python clean_captions_and_tags.py meta_cap_dd.json meta_clean.json
python prepare_buckets_latents.py --full_path <教师资料夹>
<要读取的元数据文件名> <要写入的元数据文件名>
<要微调的模型名称或检查点>
--batch_size <批量 大小>
--batch_size <批次 大小>
--max_resolution <分辨率宽、高>
--mixed_precision <准确性>
` ``
@@ -882,7 +887,7 @@ python prepare_buckets_latents.py --full_path
对于翻转的图像, 也会获取latents, 并保存名为\ *_flip.npz的文件, 这是一个简单的实现。在fline_tune.py中不需要特定的选项。如果有带有\_flip的文件, 则会随机加载带有和不带有flip的文件。
即使VRAM为12GB, 批量 大小也可以稍微增加。分辨率以“宽度, 高度”的形式指定, 必须是64的倍数。分辨率直接影响fine tuning时的内存大小。在12GB VRAM中, 512,512似乎是极限( *) 。如果有16GB, 则可以将其提高到512,704或512,768。即使分辨率为256,256等, VRAM 8GB也很难承受( 因为参数、优化器等与分辨率无关, 需要一定的内存) 。
即使VRAM为12GB, 批次 大小也可以稍微增加。分辨率以“宽度, 高度”的形式指定, 必须是64的倍数。分辨率直接影响fine tuning时的内存大小。在12GB VRAM中, 512,512似乎是极限( *) 。如果有16GB, 则可以将其提高到512,704或512,768。即使分辨率为256,256等, VRAM 8GB也很难承受( 因为参数、优化器等与分辨率无关, 需要一定的内存) 。
*有报道称, 在batch size为1的训练中, 使用12GB VRAM和640,640的分辨率。