Stability AI 最近开源了 SDXL,这是 Stable Diffusion 的最新、最强大的版本。 Replicate 从第一天起就已准备好使用托管版本的 SDXL,你可以从 Web 或使用我们的云 API 运行该版本。
推荐:用 NSDT编辑器 快速搭建可编程3D场景
今天,我们跟进宣布对 SDXL 1.0 的微调支持。 通过微调,你可以针对特定对象或样式训练 SDXL,并创建一个新模型来生成这些对象或样式的图像。 例如,我们对芭比电影和同事 Zeke 的图像进行了 SDXL 微调。 微调 SDXL 的方法有多种,例如 Dreambooth、LoRA 扩散(最初用于LLM)和文本反转。 我们已经为 SDXL 1.0 涵盖了所有这些内容。
在这篇文章中,我们将向你展示如何使用一行代码在自己的图像上微调 SDXL,并将微调结果发布为自己的托管公共或私有模型。 你只需几张图像即可训练模型,训练过程大约需要 10-15 分钟。 你还可以下载经过微调的 LoRA 权重以在其他地方使用。
微调(Fine Tuning)是采用预先训练的模型并使用更多数据对其进行训练以创建更适合特定任务的新模型的过程。 你可以在自己的图像上微调 SDXL 等图像生成模型,以创建更适合生成特定人物、物体或风格的图像的新版本模型。
训练 API 需要一个包含训练图像的 zip 文件。 少量图像 (5-6) 足以对一个人进行 SDXL 微调,但如果你的训练主题更复杂或图像差异很大,你可能需要更多图像。
查看 SDXL 存储库中的示例数据集以获取灵感,下图是示例中的zeke数据集,包含6张图片:
准备训练图像时请记住以下准则:
将你的图像放入文件夹中并将其压缩。 zip 文件的目录结构并不重要:
zip -r data.zip data
在开始训练作业之前,需要从replicate.com/account 获取你的Replicate API 令牌。 在你的 shell 中,将该令牌存储在名为 REPLICATE_API_TOKEN 的环境变量中。
export REPLICATE_API_TOKEN=r8_...
将训练数据的 zip 文件上传到互联网上可公开访问的某个位置,例如 S3 存储桶或 GitHub Pages 站点。
如果你愿意,可以使用我们的 API 来上传文件。 运行这些命令:
RESPONSE=$(curl -s -X POST -H "Authorization: Token $REPLICATE_API_TOKEN" https://dreambooth-api-experimental.replicate.com/v1/upload/data.zip)
curl -X PUT -H "Content-Type: application/zip" --upload-file data.zip "$(jq -r ".upload_url" <<< "$RESPONSE")"
SERVING_URL=$(jq -r ".serving_url" <<< $RESPONSE)
echo $SERVING_URL
这将打印出你上传的 zip 文件的 URL。 复制 URL,以便在开始训练作业时将其用作 input_images 输入参数。
你还需要创建一个Replicate模型,该模型将作为经过训练的 SDXL 版本的目标。 转至replicate.com/create 以创建模型。 在下面的示例中,我们将其称为 my-name/my-model。
可以将模型设为公开或私有。 如果模型是私有的,则只有你才能运行它。 如果模型是公开的,任何人都可以运行它,但只有你才能更新它。
现在已经收集了训练数据并创建了模型,是时候使用 Replicate 的 API 开始训练过程了。
本指南使用Python,但如果想使用其他语言,可以使用客户端库或直接调用HTTP API。
如果你尚未配置 Python 环境,则可以使用 Google Colab 上托管的 Jupyter 笔记本开始训练过程:
首先安装 Replicate Python 包:
pip install replicate
然后创建训练:
import replicate
training = replicate.trainings.create(
version="stability-ai/sdxl:af1a68a271597604546c09c64aabcd7782c114a63539a4a8d14d1eeda5630c33",
input={
"input_images": "https://my-domain/my-input-images.zip",
},
destination="my-name/my-model"
)
print(training)
input_images 输入参数是必需的,但你也可以设置其他输入。 请参阅 SDXL 自述文件中的训练输入以获取完整的输入列表。 请注意,默认情况下我们将使用 LoRA 进行训练,如果你想使用 Dreambooth,可以将 is_lora 设置为 false。 如果你只想执行文本反转,可以将 lora_lr 设置为 0。
如果要对面部进行微调,则默认训练参数会很好地工作,但你也可以使用 use_face_detection_instead 设置。 这将自动使用面部分割,以便训练仅集中在图像中的面部。
import replicate
training = replicate.trainings.create(
version="stability-ai/sdxl:af1a68a271597604546c09c64aabcd7782c114a63539a4a8d14d1eeda5630c33",
input={
"input_images": "https://my-domain/face-images.zip",
"use_face_detection_instead": True,
},
destination="my-name/my-model"
)
为了获得最佳的风格效果,你需要:
import replicate
training = replicate.trainings.create(
version="stability-ai/sdxl:af1a68a271597604546c09c64aabcd7782c114a63539a4a8d14d1eeda5630c33",
input={
"input_images": "https://my-domain/style-images.zip",
"lora_lr": 2e-4,
"caption_prefix": 'In the style of TOK,',
},
destination="my-name/my-model"
)
为了展示可能性,我们根据《芭比娃娃》和《创:战纪》电影制作了一些微调。
访问replicate.com/trainings以跟踪训练作业的进度,或以编程方式检查训练:
training.reload()
print(training.status)
print("\n".join(training.logs.split("\n")[-10:]))
模型完成训练后,可以使用 replicate.com/my-name/my-model 上的 GUI 或通过 API 运行它:
output = replicate.run(
"my-name/my-model:abcde1234...",
input={"prompt": "a photo of TOK riding a rainbow unicorn"},
)
默认情况下,经过训练的概念名为 TOK,但可以通过在训练过程中设置 token_string 和 Caption_prefix 输入来更改它。
在开始微调之前,使用多个模型对输入图像进行预处理:
如果您直接使用diffusers库来构建自定义管道,则可以使用在Replicate上训练的模型中的权重。
训练对象的 .output 字段包含一个指向训练版本的指针和一个指向训练权重的 URL:
print(training.output)
# {
# 'version': 'cloneofsimo/sdxl_mixes:...',
# 'weights': 'https://pbxt.replicate.delivery/.../trained_model.tar'
# }
下载权重字段中的 .tar 文件并将其解压。 现在可以使用diffusers包加载权重。
import torch
from diffusers import DiffusionPipeline
from safetensors import safe_open
from dataset_and_utils import TokenEmbeddingsHandler
from diffusers.models import AutoencoderKL
pipe = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
with safe_open("training_out/unet.safetensors", framework="pt", device="cuda") as f:
for key in f.keys():
tensors[key] = f.get_tensor(key)
pipe.unet.load_state_dict(tensors, strict=False) # should take < 2 seconds
text_encoders = [pipe.text_encoder, pipe.text_encoder_2]
tokenizers = [pipe.tokenizer, pipe.tokenizer_2]
embhandler = TokenEmbeddingsHandler(text_encoders, tokenizers)
embhandler.load_embeddings("training_out/embeddings.pti")
根据 special_params.json提示模型来生成输出。
pipe(prompt="A photo of ").images[0].save("monster.png")
对于大多数用户来说,BLIP 生成的训练标题效果很好。 但是,你可以通过将 captions.csv 文件添加到为训练提供的输入图像的 zip 文件中来提供自己的标题。 每个输入图像都需要有相应的标题。 下面是一个有关格式细节的 csv 示例:
caption | image_file |
---|---|
a TOK on a windowsill | monstertoy (1).jpg |
a photo of smiling TOK in an office | monstertoy (2).jpg |
a photo of TOK sitting by a window | monstertoy (3).jpg |
a photo of TOK on a car | monstertoy (4).jpg |
a photo of TOK smiling on the ground | monstertoy (5).jpg |
原文链接:SDXL微调简明教程 — BimAnt