本地部署训练、测试controlnet的完整过程(包括报错和代码)

参考内容

diffusers库提供的官方训练代码
利用到的fill50k数据集

一、训练流程

下载相关文件

① 需要下载的权重文件

因为这里是是基于SD1.5进行训练的,所以我们需要先去huggingface的官方库当中下载SD1.5模型的权重文件:
huggingface提供的SD1.5的权重
注意下载文件时,文件的命名需要与huggingface上的保持一致,很多时候他会自动增加一个前缀

需要下载的内容如下
每个文件里面的json文件,
在这里插入图片描述
而对于权重文件,我们统一下载bin结尾的文件
在这里插入图片描述

② 下载数据集

利用到的fill50k数据集
需要下载数据集
在这里插入图片描述

然后把其中的zip文件解压
然后打开fill50k.py文件,将其中的路径参照如下的,换为你自己的文件名称

在这里插入图片描述
就是将这里的三个路径进行修改

 metadata_path = "/media/dell/DATA/fill50k/train.jsonl"
 images_dir = "/media/dell/DATA/fill50k/"
 conditioning_images_dir = "/media/dell/DATA/fill50k/"

二、训练代码

两种训练方式:

①采用.sh文件

新建一个run.sh文件,然后把我们的参数放进去

python train_controlnet.py \
 --pretrained_model_name_or_path="/media/dell/DATA/models/stable-diffusion-v1-5" \
 --output_dir="outputs" \
 --dataset_name="/media/dell/DATA/fill50k"\
 --resolution=512 \
 --learning_rate=1e-5 \
 --validation_image "./conditioning_image_1.png" "./conditioning_image_2.png" \
 --validation_prompt "red circle with blue background" "cyan circle with brown floral background" \
 --train_batch_size=4 \
 --num_train_epochs=10 \
 --checkpointing_steps=6000

终端授予run.sh文件权限

chmod 777 run.sh

终端输以下命令,即可进行训练,

bash run.sh 

这种训练方式在于可以很好的修改参数,但是不好调试

②常规的训练

在配置中配置参数
在这里插入图片描述
在这里插入图片描述
配置好后run即可,这种方式就是常规的训练方式,可以使用debug模式进行训练

环境配置没什么问题基本就可以开始训练了,如果报错大概率就是包没装,报错没装哪个包就装那个包就OK
在这里插入图片描述

#三、 测试

测试代码

from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler
from diffusers.utils import load_image
import torch

base_model_path = "/media/dell/DATA/models/stable-diffusion-v1-5"
controlnet_path = "/media/dell/DATA/diffusers-main/examples/controlnet/outputs/checkpoint-6000/controlnet"

controlnet = ControlNetModel.from_pretrained(controlnet_path)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    base_model_path, controlnet=controlnet,
)
#controlnet = ControlNetModel.load_from_checkpoint(controlnet_path)


# speed up diffusion process with faster scheduler and memory optimization
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
# remove following line if xformers is not installed or when using Torch 2.0.
#pipe.enable_xformers_memory_efficient_attention()
# memory optimization.
#pipe.enable_model_cpu_offload()

#记得加入这一行
pipe.safety_checker = lambda images, clip_input: (images, None)
#不然会报错


control_image = load_image("./conditioning_image_2.png")
prompt = "pale golden rod circle with old lace background"
pipe.to("cuda")
# generate image
generator = torch.manual_seed(0)
image = pipe(
    prompt, num_inference_steps=40, generator=generator, image=control_image
).images[0]
image.save("./output.png")

生成的结果

文本条件:silver circle with powder blue background

控制的条件图像
在这里插入图片描述
利用训练了6000step的权重,生成的结果图像
在这里插入图片描述

可以看到生成的效果并不好,需要调整学习率和增加训练的步数

训练到达41000step后的效果可以看到已经不错了
文本提示:柠檬雪纺绸圈浅灰色背景
在这里插入图片描述
用另一个轮廓图
在这里插入图片描述
可以看到生成的结果还是很不错的
在这里插入图片描述

四、报错

NVIDIA的驱动太老需要更新

RuntimeError: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading and installing a new version from

这里在python终端看了一下

#python环境下
import torch
print(torch.__version__)

在这里插入图片描述

发现自己的pytorch的版本是2.4.0的,对应的cuda版本要为12.1,太高级了,这里还是选择2.4.0的pytorch,但是cuda版本选择c为11.8的就不会报错了,

torch-2.4.0+cu118-cp38-cp38-linux_x86_64

注意这里不能把pytorch换成2.0.1。因为这里换了之后,后面xformers的相关包会一致报错,因为其要求pytorch的版本要为2.4.0。

然后最后就可以跑通了

生成出全黑图

报错:Potential NSFW content was detected in one or more images. A black image will be returned instead. Try again with a different prompt and/or seed.

** 在代码中加入这个就可以了(我是加入这个就OK了)**
这个不能放在图片生成后,要放在图片生成代码的前面

pipe.safety_checker = lambda images, clip_input: (images, None)
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值