★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>
前端时间尝试着玩了一下画画,又折腾了半天才把部署这件事搞定。然后有一个小伙伴说自己也想玩玩,就顺手写了这个教程~

  1. 项目内涵Gradio.py文件。可以fork本项目后,在项目内参考文字说明稍微改动一点点直接发布应用~
  2. 如果你也有模型大小超出2G不方便部署的问题,可以参考DreamBooth部署以及对应的gradio文件的代码
  3. 本项目中训练部分代码和其他项目同质化非常严重,如果你已经有训练方面的经验,可以重点关注部署的gradio.py文件内容~

本流程简单讲述了如何通过PPdiffusers进行DreamBooth(+Lora)的微调训练并部署。基本上点点鼠标,不太需要改动代码就可以运行,并部署了~

需要大家亲自动脑子或动手做的地方一共7条:

  • 点击每个代码块进行运行
  • 准备4到10张图片放到TRAINIMG文件夹
  • 调整训练代码块中的提示词(Prompt)
  • 自行想一些提示词验证模型生成效果
  • 将打包后的模型文件上传AIStudio数据集或者HuggingFace
  • 修改部署文件的就介绍文本
  • 点击部署应用

训练的时候DreamBooth和Lora任取其一就行,个人感觉前者效果更好,但是参数更多,后者可能只生成几兆的参数

获取代码

# 拉取paddlenlp的代码
# ! git clone -b develop https://github.com/PaddlePaddle/PaddleNLP.git

# 为了防止网络不好,本项目直接附带了一个压缩包,第一次运行的时候解压一下就行~
! unzip PaddleNLP.zip

安装库

安装完后import ppdiffusers可能会失败,点击最上面的重启内核即可,不行就重复pip+重启内核几次,总能成功的~

!pip install -U paddlenlp ppdiffusers visualdl safetensors omegaconf --user

数据准备

准备4到9张图片到TRAINIMG里即可,格式为jpg或者png。

这里我们简单地讨论一下,什么样的数据适合用于微调训练,也就是说准备什么样的数据能够让训练结果变好:

  • 数据的尺寸或比例与训练和推理时一致。简单来说,就是推理时生成的图片是512×512,那么训练集里的图片也要是512×512。如果图片的长宽比不是1,可以手动用画图裁剪一下。
  • 数据具有相似的特征。简单来说,数据里都是半身照,并且每张图的半身的范围类似,衣着没有太多变化是没问题的;如果数据集又有半身照又有全身照,衣着各不相同,就不太容易训练出合适的模型。

DreamBooth

DreamBooth在部署上的操作会比Lora费劲一点~但是个人感觉出图效果更好一点。

如果希望用DreamBooth+Lora进行训练和部署,可以直接跳过这段,进入Lora的章节。

训练

更多预训练模型和参数参考PPDiffusers主页,这里简单介绍两个预训练模型:

  • Linaqruf/anything-v3.0 比较适合用于动漫人物的微调训练
  • runwayml/stable-diffusion-v1-5 更一般的场景可以使用v1.5

下面的代码使用了Linaqruf/anything-v3.0进行训练,可以按照自己的需求将第三行中的对应内容修改为runwayml/stable-diffusion-v1-5。第六行的提示词可以根据自己的训练图片内容进行修改。其他内容基本不需要修改,点击运行就行了。

样例数据集是基于以下项目生成的:

在这里我们额外地进行一些讨论,一个简单的微调画画模型究竟适合干什么,以及训练时应该注意什么:

  • 微调画画模型适合干的事情
    • 换色:通过a photo of NAME作为提示词在训练时认识某个人,通过提示词NAME with blue hair在预测时换发色
    • 换型:通过a photo of NAME作为提示词在训练时认识某个人,通过提示词NAME with long hair在预测时换发型
    • 插入物体:通过a photo of NAME作为提示词在训练时认识某个人,通过提示词NAME sit on chair在预测时更换姿态、插入椅子
  • 微调画画模型不适合干的事情
    • 过于细节的操作:通过a photo of NAME作为提示词在训练时认识某个人,通过提示词描述了大量的细节姿态,想让某个人物摆出某个特定的瑜伽姿势
    • 过于特殊的操作:通过a photo of NAME作为提示词在训练时认识某个人,通过提示词让这个人倒立旋转
  • 其他注意点:
    • 微调的核心在于微调。一个本身就用于生成动漫人物的预训练模型不一定能够很好地基于真实世界的物体进行图像生成,因此我们需要根据想要生成的图像内容适当选择微调模型。
    • 迭代次数和训练数据内容不宜过量。对于微调而言,迭代太多,容易放大局部特征从而导致后续希望通过语言调整画面的时候非常困难。训练数据过多会增加模型学习物体信息的难度。
%cd ~/PaddleNLP/ppdiffusers/examples/dreambooth
! python -u train_dreambooth.py \
  --pretrained_model_name_or_path="Linaqruf/anything-v3.0" \
  --instance_data_dir="/home/aistudio/TRAINIMG" \
  --output_dir="/home/aistudio/dream_outputs" \
  --instance_prompt="a photo of CUTEGIRL" \
  --resolution=512 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=1 \
  --learning_rate=5e-6 \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --max_train_steps=1000 \
  --random_flip \
  --train_text_encoder \
  --checkpointing_steps=500

推理

下面的代码运行失败了,就点一下重启内核

下面一共分为两个部分,分别是

  • 载入模型
  • 根据Prompt生成图片
from ppdiffusers import StableDiffusionPipeline

# 我们所需加载的模型地址,这里我们输入了训练时候使用的 output_dir 地址
model_path = "/home/aistudio/dream_outputs"
pipe = StableDiffusionPipeline.from_pretrained(model_path)
# 设置提示词
# 如果结果和训练集特别接近,需要降低训练批次或者减小学习率
# 如果结果和训练集一点都不像,需要提高训练批次或者提高学习率
prompt = "CUTEGIRL with blue hair"

# 生成
image = pipe(prompt, num_inference_steps=50,guidance_scale=5).images[0]
# 保存
image.save("/home/aistudio/test.jpg")
# 展示图片
image.show()
  0%|          | 0/50 [00:00<?, ?it/s]

在这里插入图片描述

部署应用(创建应用)

部署的好处:可以像部署过的项目一样,打开项目页面,就能直接用训练好的模型进行推理生成图片。

由于DreamBooth产出的模型超过2G,所以需要

  1. 通过下面的代码压缩模型
  2. 下载zip压缩包
  3. 上传到AIStudio,上传完毕通过下载按钮获得链接
  4. 进入Gradio_packages/main.gradio.py
  5. 修改11行中的链接地址为上面的数据集链接,修改40-50行关于模型的介绍文本
  6. Gradio_packages/main.gradio.py编辑页面上的几个按钮中选择应用部署即可,记得选择GPU环境~

之后就可以直接在项目页面进行推理生成图片啦~

如果你想把你的推理页面分享给别人一起玩,记得点一点项目页面上的发布应用~

%cd ~
# 压缩模型文件
! zip -r dream_outputs.zip dream_outputs

DreamBooth+Lora

训练

更多预训练模型和参数参考PPDiffusers主页,这里简单介绍两个预训练模型:

  • Linaqruf/anything-v3.0 比较适合用于动漫人物的微调训练
  • runwayml/stable-diffusion-v1-5 更一般的场景可以使用v1.5

下面的代码使用了Linaqruf/anything-v3.0进行训练,可以按照自己的需求将第三行中的对应内容修改为runwayml/stable-diffusion-v1-5。第六行和第15行的提示词可以根据自己的训练图片内容进行修改。其他内容基本不需要修改,点击运行就行了。需要强调,修改prompt

更多关于模型使用的讨论见DreamBooth的训练章节。

%cd ~/PaddleNLP/ppdiffusers/examples/dreambooth
! python train_dreambooth_lora.py \
  --pretrained_model_name_or_path="Linaqruf/anything-v3.0" \
  --instance_data_dir="/home/aistudio/TRAINIMG" \
  --output_dir="/home/aistudio/dream_lora_outputs" \
  --instance_prompt="a photo of CUTEGIRL" \
  --resolution=512 \
  --train_batch_size=1 \
  --gradient_accumulation_steps=1 \
  --checkpointing_steps=100 \
  --learning_rate=1e-4 \
  --report_to="visualdl" \
  --lr_scheduler="constant" \
  --lr_warmup_steps=0 \
  --max_train_steps=500 \
  --validation_prompt="CUTEGIRL" \
  --validation_epochs=50 \
  --lora_rank=4 \
  --seed=0

推理

下面的代码运行失败了,就点一下重启内核

下面一共分为两个部分,分别是

  • 载入模型
  • 根据Prompt生成图片
from ppdiffusers import DiffusionPipeline, DPMSolverMultistepScheduler
import paddle

# 上面用了什么预训练模型,这里就用什么
pipe = DiffusionPipeline.from_pretrained("Linaqruf/anything-v3.0")
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
# 加载Lora参数
pipe.unet.load_attn_procs("/home/aistudio/dream_lora_outputs/paddle_lora_weights.pdparams", from_hf_hub=False)
# 设置提示词
# 如果结果和训练集特别接近,需要降低训练批次或者减小学习率
# 如果结果和训练集一点都不像,需要提高训练批次或者提高学习率
prompt = "CUTEGIRL with blue hair"

# 生成
image = pipe(prompt, num_inference_steps=50,guidance_scale=5).images[0]
# 保存
image.save("/home/aistudio/test.jpg")
# 展示图片
image.show()
  0%|          | 0/50 [00:00<?, ?it/s]

在这里插入图片描述

部署应用(创建应用)

部署的好处:可以像部署过的项目一样,打开项目页面,就能直接用训练好的模型进行推理生成图片。

Lora的参数比较小,部署只需要

  1. dream_lora_outputs文件夹里的paddle_lora_weights.pdparams拷贝到Gradio_packages文件夹里(右键文件复制粘贴即可)
  2. 进入Gradio_packages/main_lora.gradio.py
  3. 修改14行中的预训练模型为上面使用的模型,修改40-50行关于模型的介绍文本
  4. Gradio_packages/main.gradio.py编辑页面上的几个按钮中选择应用部署即可,记得选择GPU环境~

之后就可以直接在项目页面进行推理生成图片啦~

如果你想把你的推理页面分享给别人一起玩,记得点一点项目页面上的发布应用~

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐