多机多卡训练SD系列模型(二)

多机多卡训练SD系列模型(二)

前言

尝试使用Dreambooth的方式,所以迁到了kohya-trainer这个项目

Dreambooth

论文链接

https://arxiv.org/abs/2208.12242

代码链接

https://github.com/XavierXiao/Dreambooth-Stable-Diffusion

Dreambooth主要能用来训练一个特定对象的物体,比如一个叫TOM的猫,或者是个特定的动漫人物,通过搭配图片,tag,prompt,让特定的词与特殊的图像做绑定,来生成特定的物体。

Dreambooth既可以用来直接对底模微调,也可以作为一种方式来训练LoRA模型,通常会与正则化数据一起使用(非必需)。
相关内容在这里有中文文档

https://github.com/bmaltais/kohya_ss/tree/master

运行脚本

accelerate launch --num_cpu_threads_per_process 1 train_db.py 
    --pretrained_model_name_or_path=<.ckpt或.safetensord或Diffusers版模型的目录>
    --dataset_config=<数据准备时创建的.toml文件>
    --output_dir=<训练模型的输出目录>
    --output_name=<训练模型输出时的文件名>
    --save_model_as=safetensors 
    --prior_loss_weight=1.0 
    --max_train_steps=1600 
    --learning_rate=1e-6 
    --optimizer_type="AdamW8bit" 
    --xformers 
    --mixed_precision="fp16" 
    --cache_latents 
    --gradient_checkpointing

其中accelerate库可以指定各种训练配置,将在后续用作多级多卡训练
--num_cpu_threads_per_process 1是其中一个参数,
在这里插入图片描述
原文档中提到的prior_loss_weight个人认为比较看正则化数据的数量和质量,1.5上下也是不错的。

正则化数据是作为特定名称的后的类数据,比如:
训练一只叫lucky的狗,这个文件名可以取10_lucky dog,这里的10是图像重复次数,lucky是特定名称,而dog就是这个类,这个数据中就lucky的图像。

10_lucky dog
1_dog

1_dog就是正则化图像,数据就是全部不同种类的狗的数据,而前面的数字取值要大致为一张lucky,一张其他的狗也就是

训练数据重复次数*训练数据集图像 == 正则化数据重复次数*正则化数据集图像

比如12张lucky的图像,重复十次就有120张,如果正则化图像有60张,就重复两次。
注意尽量正则化图像不要包含训练图像,如果要训练的是一个大类,而且数据量很大,可以均分,然后一半做训练集,一半做正则集(具体会在kohya-trainer部分)

一般dreambooth微调出来的模型效果会很明显,并且过拟合很快,判断过拟合可以用生成图片质量如何,噪声含量来判断,如果微调后的底模质量骤降,就是过拟合了。

数据准备

dreambooth的数据准备主要分两部分,一个部分是数据集准备,一部分是文件命名,kohya_ss中提到了三种图文训练方式
在这里插入图片描述
这里首先是用到了class+identifiercaption的方法

数据集

首先按照要求训练的数据集和正则数据集依照NUM_NAME CLASS 这样的命名方式来取名后,(这里我才知道linux除了用单引号来使用含空格的文件名,比如/'a dog'还可以用/a\ dog反斜杠加空格来使用文件0.o)
然后就是对数据打标,其实建议用Deepbooru来给能明显形容的打标,这样也好check,不然就是一句一句看,正则化数据也是可以打标的,虽然会稍微增加训练时间,并且会对数据集要求更高,但是效果会好一些。
有些打标是默认以txt文件储存的,所以需要在配置文件中加上

--caption_extension = ".txt"

或者是在处理的时候以.caption格式

结果

最后储存的模型是依照.ckpt的格式来储存模型,可以用webui
在这里插入图片描述
选择需要测试的模型来测试,最好在达标的时候添加一些特定的触发词,可以用-来连接或者其他,比如a dog name lucky,触发词和txt2image的原理还没有过多了解。

总结

这次训练主要是因为环境中本身就已经用了lora-script的项目,很多环境是通用的,就直接从kohya_ss中拉下来train_db.py的文件直接跑了,上面还是有很多比如打标,剪裁,命名的步骤,这些在后面的项目中其实都可以省略了。后面会研究用dreambooth来训练lora,以免污染到底模。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用PyTorch的`DataParallel`来实现单机多卡训练模型。`DataParallel`会自动将模型复制到每个可用的GPU并行计算,并在反向传播时进行梯度的累积和同步。 下面是一个简单的示例代码,展示了如何使用`DataParallel`来进行单机多卡训练模型: ```python import torch import torch.nn as nn from torch.utils.data import DataLoader # 定义模型 class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.fc = nn.Linear(10, 1) def forward(self, x): return self.fc(x) # 创建模型实例 model = MyModel() # 设置设备 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = model.to(device) # 多卡训练 if torch.cuda.device_count() > 1: model = nn.DataParallel(model) # 使用DataParallel包装模型 # 定义数据集和数据加载器 dataset = YourDataset() # 自定义数据集 dataloader = DataLoader(dataset, batch_size=64, shuffle=True) # 定义优化器和损失函数 optimizer = torch.optim.SGD(model.parameters(), lr=0.001) criterion = nn.MSELoss() # 训练过程 for epoch in range(num_epochs): for inputs, labels in dataloader: inputs = inputs.to(device) labels = labels.to(device) # 前向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}") # 保存模型 torch.save(model.state_dict(), "model.pth") ``` 在上述示例中,如果有多个可用的GPU,则`DataParallel`会自动将模型复制到每个可用的GPU并行计算。你可以通过`torch.cuda.device_count()`函数来检查可用的GPU数量。在训练过程中,你只需要像单卡训练一样使用模型即可,`DataParallel`会自动处理数据和梯度的同步。 请确保你的代码在使用`DataParallel`之前将模型移动到正确的设备上,并在训练过程中将数据和标签移动到相同的设备上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值