[sd_scripts]之train

https://github.com/kohya-ss/sd-scripts/blob/main/docs/train_README-zh.mdicon-default.png?t=N7T8https://github.com/kohya-ss/sd-scripts/blob/main/docs/train_README-zh.md

支持模型fine-tune,dreambooth,lora,textual inversion。

1.数据准备

在任意多个文件夹中准备好训练的图像文件,不需要预处理,勿使用极小的图像,不要使用过大的图像如3000x3000以上的。正则化图像:"正则项图像"对应Dreambooth论文中的prior-preservation图像,用来防止模型过拟合。通过自己先生成一些图像,依赖论文中loss的prior-preservation term对训练过程正则化,来解决过拟合与语言漂移问题。

1.1 dreambooth、class+identifier(可使用正则化图像)

将训练目标与特定单词(identifier)相关联进行训练,无需准备caption,要学习特定的角色,但由于训练数据的所有元素斗鱼identifier相关联,因此在生成时可能出现无法更换特定服饰的情况。

1.2 dreambooth、caption(可使用正则化图像)

给每张图片写caption,存放到文本文件中,进行训练,例如,通过将图像详细信息(如穿着白色衣服的角色A、穿着红色衣服的角色B)记录在caption中,可以将角色和其他元素分离,并期望模型更准确的学习角色。

1.3 finetune(不可使用正则化)

将caption收集到元数据中。

如果要想训练lora、textual inversion而不准备caption,则建议使用dreambooth class+identifier,如果能够准备caption,则dreambooth caption更好,如果有大量训练并不使用正则化的话,则考虑fine-tuning。这里就是fine-tune/train_network/train_textual_inversion用fine-tuning,train_db主要用前两类。

2.每种方法的指定方式

2.1 dreambooth,class+identifier方法(可使用正则化图像)

在该方法中,每个图像都被视为与class identifier相同的标题进行训练(shs dog),相当于每张图片都使用shs dog进行训练。

2.1.1 确定identifier和class

class是训练目标的一般类别,例如,要学习特定品种的狗,则class是dog,对于动漫角色,根据模型不同,可能是boy或girl。identifier是用于识别训练目标并进行学习的单词。可以使用任何单词,但根据dreambooth论文,tokenizer生成的3个或更少字符的罕见单词最好。

使用identifier和class,例如 shs dog可以将模型训练为从class中识别学习所需的目标。在图像生成时,使用shs dog将生成所学习的狗的图像,

作为identifier,一些参考是“shs sts scs cpc coc cic msm usu ici lvl cic dii muk ori hru rik koo yos wny”等。

2.1.2 决定是否使用正则化图像,并在使用时生成正则化图像

正则化图像是为防止语言漂移,即整个类别被拉扯成为训练目标而生成的图像。如果不使用正则化图像,例如在 shs 1girl 中学习特定角色时,即使在简单的 1girl 提示下生成,也会越来越像该角色。这是因为 1girl 在训练时的标题中包含了该角色的信息。通过同时学习目标图像和正则化图像,类别仍然保持不变,仅在将标识符附加到提示中时才生成目标图像。

如果只想在LoRA或DreamBooth中使用特定的角色,则可以不使用正则化图像。在Textual Inversion中也不需要使用(如果要学习的token string不包含在标题中,则不会学习任何内容)。

一般情况下,使用在训练目标模型时只使用类别名称生成的图像作为正则化图像是常见的做法(例如 1girl)。但是,如果生成的图像质量不佳,可以尝试修改提示或使用从网络上另外下载的图像。由于正则化图像也被训练,因此其质量会影响模型。

通常,准备数百张图像是理想的(图像数量太少会导致类别图像无法被归纳,特征也不会被学习)。如果要使用生成的图像,生成图像的大小通常应与训练分辨率(更准确地说,是bucket的分辨率)相匹配。

2.1.3 设置文件的描述

[general]
enable_bucket = true                        # 是否使用Aspect Ratio Bucketing

[[datasets]]
resolution = 512                            # 训练分辨率
batch_size = 4                              # 批次大小

  [[datasets.subsets]]
  image_dir = 'C:\hoge'                     # 指定包含训练图像的文件夹
  class_tokens = 'hoge girl'                # 指定标识符类
  num_repeats = 10                          # 训练图像的重复次数

  # 以下仅在使用正则化图像时进行描述。不使用则删除
  [[datasets.subsets]]
  is_reg = true
  image_dir = 'C:\reg'                      # 指定包含正则化图像的文件夹
  class_tokens = 'girl'                     # 指定class
  num_repeats = 1                           # 正则化图像的重复次数,基本上1就可以了

1.训练分辨率,指定一个数字表示正方形,如果是512,则为512x512,如果使用方括号和逗号分隔的两个数字,则表示横向x纵向([512,768],则为512x768),在sd1.x中,原始训练分辨率为512,在sd2.x 768中,分辨率为768.

2.批量大小。同时训练多少个数据。

3.文件夹,训练和正则化图像的文件夹。

4.num_repeats。重复次数用于调整正则化图像和训练用图像的数量。由于正则化图像的数量多于训练用图像,因此需要重复使用训练用图像来达到一对一的比例,从而实现训练,重复次数指定为训练用图像的重复次数x训练用图像的数量>=正则化图像的重复次数x正则化图像的数量,一般10就可以了。1个epoch,训练数据过一遍,如果正则化数据比训练数据多,则多余的正则化数据不使用。

2.1.4 训练

#!/bin/bash
# Dreambooth train script
script_name="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/tools/sd_lora/sd-scripts/train_db.py"

# 设置训练用模型、数据
is_v2_model=0      # SD2.0 model | SD2.0模型 2.0模型下 clip_skip 默认无效
parameterization=0 # parameterization | 参数化 本参数需要和 V2 参数同步使用 实验性功能
dataset_config="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/tools/sd_lora/config/dreambooth.toml"
pretrained_model_name_or_path="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/stable-diffusion-webui/models/Stable-diffusion/DreamShaper_8_pruned.safetensors"

# 输出设置
output_name="sn_logo" # output model name | 模型保存名称
output_dir="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/outputs/"
save_model_as="safetensors" # model save ext | 模型保存格式 ckpt, pt, safetensors
logging_dir="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/outputs/"

# 网络设置

# 训练相关参数
resolution="512,512"         # image resolution w,h. 图片分辨率,宽,高。支持非正方形,但必须是 64 倍数。
batch_size=1                 # batch size
max_train_epochs=10         # max train epoches | 最大训练 epoch
save_every_n_epochs=2        # save every n epochs | 每 N 个 epoch 保存一次
stop_text_encoder_training=0 # stop text encoder training | 在第N步时停止训练文本编码器
noise_offset="0"             # noise offset | 在训练中添加噪声偏移来改良生成非常暗或者非常亮的图像,如果启用,推荐参数为0.1
keep_tokens=0                # keep heading N tokens when shuffling caption tokens | 在随机打乱 tokens 时,保留前 N 个不变。
min_snr_gamma=0              # minimum signal-to-noise ratio (SNR) value for gamma-ray | 伽马射线事件的最小信噪比(SNR)值  默认为 0

# 学习率
lr="1e-4"                           # learning rate | 学习率,在分别设置下方 U-Net 和 文本编码器 的学习率时,该参数失效
lr_scheduler="cosine_with_restarts" # "linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup", "adafactor"
lr_warmup_steps=0                   # warmup steps | 学习率预热步数,lr_scheduler 为 constant 或 adafactor 时该值需要设为0。
lr_restart_cycles=1                 # cosine_with_restarts restart cycles | 余弦退火重启次数,仅在 lr_scheduler 为 cosine_with_restarts 时起效。

# 优化器
optimizer_type="AdamW" # Optimizer type | 优化器类型 默认为 AdamW8bit,可选:AdamW AdamW8bit Lion Lion8bit SGDNesterov SGDNesterov8bit DAdaptation AdaFactor prodigy

# 恢复训练设置
save_state=0 # save state | 保存训练状态 名称类似于 <output_name>-??????-state ?????? 表示 epoch 数
resume=""    # resume from state | 从某个状态文件夹中恢复训练 需配合上方参数同时使用 由于规范文件限制 epoch 数和全局步数不会保存 即使恢复时它们也从 1 开始 与 network_weights 的具体实现操作并不一致L

# 其他设置
min_bucket_reso=256              # arb min resolution | arb 最小分辨率
max_bucket_reso=1024             # arb max resolution | arb 最大分辨率
persistent_data_loader_workers=1 # persistent dataloader workers | 保留加载训练集的worker,减少每个 epoch 之间的停顿
clip_skip=2                      # clip skip | 玄学 一般用 2
multi_gpu=2                      # multi gpu | 多显卡训练 该参数仅限在显卡数 >= 2 使用
lowram=0                         # lowram mode | 低内存模式 该模式下会将 U-net 文本编码器 VAE 转移到 GPU 显存中 启用该模式可能会对显存有一定影响

# 远程记录设置
use_wandb=0         # use_wandb | 启用wandb远程记录功能
wandb_api_key=""    # wandb_api_key | API,通过 https://wandb.ai/authorize 获取
log_tracker_name="" # log_tracker_name | wandb项目名称,留空则为"network_train"

# =======================================================================================================================
extArgs=()
launchArgs=()
if [[ $multi_gpu == 1 ]]; then launchArgs+=("--multi_gpu"); fi

if [[ $is_v2_model == 1 ]]; then
  extArgs+=("--v2")
fi
if [[ $parameterization == 1 ]]; then extArgs+=("--v_parameterization"); fi

if [[ $stop_text_encoder_training -ne 0 ]]; then extArgs+=("--stop_text_encoder_training $stop_text_encoder_training"); fi
if [[ $noise_offset != "0" ]]; then extArgs+=("--noise_offset $noise_offset"); fi
if [[ $min_snr_gamma -ne 0 ]]; then extArgs+=("--min_snr_gamma $min_snr_gamma"); fi

#if [[ $optimizer_type ]]; then extArgs+=("--optimizer_type $optimizer_type"); fi
#if [[ $optimizer_type == "DAdaptation" ]]; then extArgs+=("--optimizer_args decouple=True"); fi

if [[ $save_state == 1 ]]; then extArgs+=("--save_state"); fi
if [[ $resume ]]; then extArgs+=("--resume $resume"); fi

if [[ $persistent_data_loader_workers == 1 ]]; then extArgs+=("--persistent_data_loader_workers"); fi
if [[ $lowram ]]; then extArgs+=("--lowram"); fi

if [[ $use_wandb == 1 ]]; then
  extArgs+=("--log_with=all")
else
  extArgs+=("--log_with=tensorboard")
fi
if [[ $wandb_api_key ]]; then extArgs+=("--wandb_api_key $wandb_api_key"); fi
if [[ $log_tracker_name ]]; then extArgs+=("--log_tracker_name $log_tracker_name"); fi

# =====================================================================================================================
python -m accelerate.commands.launch "${launchArgs[@]}" --num_cpu_threads_per_process=4 "$script_name" \
  --pretrained_model_name_or_path="$pretrained_model_name_or_path" \
  --dataset_config="$dataset_config" \
  --output_dir="$output_dir" \
  --output_name="$output_name" \
  --save_model_as="$save_model_as" \
  --logging_dir="$logging_dir" \
  --log_prefix="$output_name" \
  --prior_loss_weight=1.0 \
  \
  --resolution "$resolution" \
  --max_train_epochs "$max_train_epochs" \
  --train_batch_size "$batch_size" \
  --save_every_n_epochs "$save_every_n_epochs" \
  --keep_tokens "$keep_tokens" \
  \
  --optimizer_type="$optimizer_type" \
  --clip_skip="$clip_skip" \
  \
  --learning_rate="$lr" \
  --lr_scheduler="$lr_scheduler" \
  --lr_warmup_steps="$lr_warmup_steps" \
  --lr_scheduler_num_cycles="$lr_restart_cycles" \
  \
  --min_bucket_reso="$min_bucket_reso" \
  --max_bucket_reso="$max_bucket_reso" \
  \
  --mixed_precision="fp16" \
  --cache_latents \
  --gradient_checkpointing \
  --huggingface_path_in_repo "/root/.cache" "${extArgs[@]}"

2.2 dreambooth、caption方式,可使用正则化

这个意义不大,使用dreambooth,其实就是想有具体的实体被描述。

2.3 fine-tune

fine-tune通常是指sd的全量微调,但它和lora的训练基本是一致的。

2.3.1 准备数据

将caption数据和标签整合到元数据中,.json

1.blip添加caption,也可以使用deepdanbooru、WD14Tagger

2.预处理caption和标签信息,将caption和标签作为元数据合并到一个文件中

3.清洗标签,标签中可能存在下划线等,

#!/bin/bash
# make caption script
script_caption_name="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/tools/sd_lora/sd-scripts/finetune/make_captions.py"
script_merge_name="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/tools/sd_lora/sd-scripts/finetune/merge_captions_to_metadata.py"
script_clean_name="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/tools/sd_lora/sd-scripts/finetune/clean_captions_and_tags.py"

caption=0
train_data_dir="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/data/sn/banner/"
batch_size=8

merge=1
merge_name="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/data/sn/banner/meta_cap.json"

clean=1
clean_name="/home/image_team/image_team_docker_home/lgd/e_commerce_sd/data/sn/banner/meta_clean.json"

if [[ $caption == 1 ]]; then
  python "$script_caption_name" \
    --batch_size "$batch_size" "$train_data_dir"
fi

if [[ $merge == 1 ]]; then
  python "$script_merge_name" \
    --full_path "$train_data_dir" "$merge_name"
fi

if [[ $clean == 1 ]]; then
  python "$script_clean_name" \
    "$merge_name" "$clean_name"
fi
[general]
enable_bucket = true                        # 是否使用Aspect Ratio Bucketing
shuffle_caption = true
keep_tokens = 1

[[datasets]]
resolution = 512                            # 训练分辨率
batch_size = 4                              # 批次大小

  [[datasets.subsets]]
  image_dir = "/home/image_team/image_team_docker_home/lgd/e_commerce_sd/data/sn/banner/"                    # 指定包含训练图像的文件夹
  metadata_file = '/home/image_team/image_team_docker_home/lgd/e_commerce_sd/data/sn/banner/meta_clean.json'

2.3.2 训练

这里的训练可以包括除dreambooth之外的所有的训练方式,主要就是因为数据格式只有两种,包括dreambooth和lora等这两种方式,fine-tune类的都是统一格式,直接调用py即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/145120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zabbix中图形可视化页面中文乱码解决

在window 电脑中的 C:\Windows\Fonts 里面是字体文件&#xff0c;里面有一个 SIMKAI.TTF &#xff08;有的是小写&#xff09; 这个是楷体 将该文件复制到虚拟机中 怎么导入应该不需要我说吧 查看zabbix的字体文件在哪个目录下 [rootlocalhost /]# find / -name fonts /boo…

【java学习—十四】反射获取一个类的父类、接口、构造方法(3)

文章目录 1. 通过反射获取一个类的父类和接口2. 反射获取一个类的构造方法2.1. 获取全部构造器 1. 通过反射获取一个类的父类和接口 使用反射可以取得&#xff1a; 实现的全部接口 public Class<?>[] getInterfaces()&#xff1a;确定此对象所表示的类或接口实现的接口…

MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.创建数据库2.数据库中的编码问题2.1.字符集与校验集2.3.支持的字符…

Antv/G2 折线图 DataSet 数据展开成指定格式

DataSet 文档 G2 3.2 DataSet 文档 Demo&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><m…

Kakaotalk如何注册?常见问题解答

kakaoTalk是一款韩国即时通讯软件&#xff0c;使用程度类似于国内的微信&#xff0c;他还包含叫车服务、食品外送、餐厅预订、支付和游戏等多种功能&#xff0c;几乎每个韩国人都在使用KakaoTalk。 因此&#xff0c;对于要发展韩国市场的独立站人&#xff0c;这款软件必定是营…

加速可编程创新,2023年英特尔FPGA中国技术日披露全矩阵FPGA产品与应用方案

在新场景、新应用海量增长的驱动下&#xff0c;中国本地市场对于FPGA产品的需求也在日益多元化和快速扩展。我们始终致力于以中国客户的实际需求为导向&#xff0c;基于领先的FPGA产品和软件为千行百业提供全场景的解决方案。——叶唯琛 英特尔可编程方案事业部中国总经理 今日…

物理问题中常见的分析问题----什么样的函数性质较好

物理问题中常见的积分符号位置交换问题 重极限与累次极限 高数下的定义 累次极限&#xff1a;求极限时需要遵循一定的顺序重极限&#xff1a;任意方向趋于的极限 两者之间的关系&#xff1a; 两者没啥关系存在累次极限存在而不相等的函数...... 求和符号与积分符号互换--逐项积…

【Axure】axure rp 导入元件库和使用,主流元件库下载使用

vant 元件库下载&#xff1a;Vant4 设计资源 element UI 元件库下载&#xff1a;element ui 设计资源 Andt Design Vue 下载设计资源&#xff1a;Andt Design Vue Andt Design Pro下载设计资源&#xff1a;Andt Design Pro Arco Design 设计资源&#xff1a;Arco Design …

光纤网络排障分析

日常工作中&#xff0c;发现某条光链路连接不稳定&#xff0c;时快时慢、时断时连。 在交换机上直接查看这条链路交换口上的光收发功率&#xff0c;发现异常。 简单说明下&#xff0c;RX Power代表光模块接收功率&#xff0c;TX Power代表发送功率。 引起这种故障的原因很多&a…

插入排序详讲:直接插入排序+希尔排序(图解+思路+代码)

文章目录 排序一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 排序 一、 排序的概念 1.排序&#xff1a; 一组数据按递增/递减排序 2.稳定性&#xff1a; 待排序的序列中&#…

【第2章 Docker容器基础入门】 课程介绍 + docker容器介绍

一、课程介绍 1.1、容器运行时 1.2、官网 1.3、私有镜像 二、什么是 Docker &#xff1f; 2.1 Docker 的思想来自于集装箱&#xff0c;集装箱解决了什么问题&#xff1f; 2.2 、K8S 1.25版本之后可能废弃docker&#xff0c;为什么还需要学习docker&#xff1f; 一、课程介…

Golang 发送邮件

Go 有内置好的本地库可以发送邮件&#xff0c;在 GitHub 上也有别人写好的第三方包可以发送邮件。 本文将分别介绍一下这两种发送邮件的方式。 1、内置的net/smtp 为了更好的模拟发送邮件&#xff0c;推荐一个邮件测试工具&#xff1a;MailHog&#xff0c;MailHog 是面向开发…

永磁材料测试系统参考标准

1. 概述 TY1000是一套专用于测量永磁材料磁性能的智能化系统&#xff0c;由励磁与测量主机、电磁铁、磁测量传感器、计算机及测量软件等组成。适用于测量各类型永磁材料的磁性能&#xff0c;并绘制相关磁特性曲线&#xff0c;具有操作便捷、测量快速、重复性好、可靠性高等特点…

【JUC】四、可重入锁、公平锁、非公平锁、死锁现象

文章目录 1、synchronized2、公平锁和非公平锁3、可重入锁4、死锁 1、synchronized 写个demo&#xff0c;具体演示下对象锁与类锁&#xff0c;以及synchronized同步下的几种情况练习分析。demo里有资源类手机Phone&#xff0c;其有三个方法&#xff0c;发短信和发邮件这两个方…

RXMVB2 2RK251 206AN大容量双位置继电器 JOSEF约瑟 DC110V

系列型号&#xff1a; RXMVB2 RK 251 204大容量双位置继电器; RXMVB2 RK 251 205大容量双位置继电器; RXMVB2 RK 251 206大容量双位置继电器; DCS-11大容量双位置继电器; DCS-12大容量双位置继电器; DCS-13大容量双位置继电器; 一、用途 RXMVB2(DCS-10)系列大容量双位置继电器…

【开源】基于Vue和SpringBoot的校园失物招领管理系统

项目编号&#xff1a; S 006 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S006&#xff0c;文末获取源码。} 项目编号&#xff1a;S006&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 招领管理模块2.2 寻物管理模块2.3 系…

HackTheBox-Starting Point--Tier 2---Vaccine

文章目录 一 Vaccine 测试过程1.1 打点1.1.1 FTP匿名登录1.1.2 SQL注入 1.2 权限提升 二 题目 一 Vaccine 测试过程 1.1 打点 1.端口扫描 nmap -sV -sC 10.129.191.631.1.1 FTP匿名登录 2.FTP允许匿名登录&#xff0c;发现backup.zip ftp 10.129.191.63解压backup.zip&#x…

Docker-minio部署

1.创建目录 创建文件目录&#xff0c;用来存放配置和上传文件目录 &#xff08;1&#xff09;Minio 外部挂载的配置文件(/mydata/minio/config) &#xff08;2&#xff09;存储上传文件的目录(/mydata/minio/data) mkdir -p /home/minio/config mkdir -p /home/minio/data2.拉…

黑群晖断电导致存储空间已损毁修复记录

黑群晖断电2次,担心的事情还是发生了,登录后提示存储空间已损毁...... 开干!! 修复方式: 1.使用SSH登录到群晖,查看相关信息 # 登录后先获取最高权限 root@DiskStation:~# sudo -i # 检测存储池状态 root@DiskStation:~# cat /proc/mdstat Personalities : [linear] […

【JavaEE】Servlet API 详解(HttpServletRequest类)

二、HttpServletRequest Tomcat 通过 Socket API 读取 HTTP 请求(字符串), 并且按照 HTTP 协议的格式把字符串解析成 HttpServletRequest 对象&#xff08;内容和HTTP请求报文一样&#xff09; 1.1 HttpServletRequest核心方法 1.2 方法演示 WebServlet("/showRequest&…