某机构近期开源了SDXL,这是迄今为止最新、最强大的Stable Diffusion版本。某平台在发布首日即提供了可通过网页或云API运行的托管版SDXL。
今天,我们进一步宣布支持SDXL 1.0的微调功能。微调允许您针对特定物体或风格训练SDXL,并创建一个能生成对应物体或风格图像的新模型。例如,我们使用某电影和同事Zeke的图像对SDXL进行了微调。微调SDXL有多种方法,例如Dreambooth、LoRA diffusion(最初用于大语言模型)和Textual Inversion。这些方法均已支持SDXL 1.0。
本文将展示如何用一行代码在您的图像上微调SDXL,并将微调结果发布为您自己托管的公开或私有模型。您只需少量图像即可训练模型,训练过程大约需要10-15分钟。您也可以下载微调后的LoRA权重用于其他地方。
🍿 观看YouTube上的微调指南
微调是一个获取预训练模型并使用更多数据进行训练,以创建一个更适合特定任务的新模型的过程。您可以对像SDXL这样的图像生成模型使用自己的图像进行微调,从而创建一个新版本模型,该模型更擅长生成特定人物、物体或风格的图像。
训练API需要一个包含训练图像的zip文件。针对单个人物微调SDXL,少量图像(5-6张)即可,但如果您的训练主体更复杂或图像差异很大,则可能需要更多图像。
可参考SDXL代码库中的示例数据集获取灵感。
准备训练图像时请牢记以下准则:
将您的图像放入一个文件夹并压缩。zip文件的目录结构无关紧要:
zip -r data.zip data在开始训练任务之前,您需要从平台获取您的API令牌。在您的终端中,将该令牌存储在名为REPLICATE_API_TOKEN的环境变量中。
export REPLICATE_API_TOKEN=r8_...将您的训练数据zip文件上传到互联网上可公开访问的某个地方,例如某云存储或代码托管页面。
您还需要在平台上创建一个模型,它将作为训练后SDXL版本的存储目的地。前往平台创建模型。在下面的示例中,我们将其命名为my-name/my-model。
您可以将模型设为公开或私有。如果模型是私有的,只有您可以运行它。如果模型是公开的,任何人都可以运行它,但只有您可以更新它。
现在您已经收集了训练数据并创建了模型,是时候使用平台的API开始训练过程了。
本指南使用Python,但如果您想使用其他语言,可以使用客户端库或直接调用HTTP API。
如果您尚未配置Python环境,可以使用某平台托管的Jupyter笔记本来启动训练过程:
首先安装Python包:
pip install replicate然后创建训练任务:
import replicate
training = replicate.trainings.create(
version="stability-ai/sdxl:39ed52f2a78e934b3ba6e2a89f5b1c712de7dfea535525255b1aa35c5565e08b",
input={
"input_images": "https://my-domain/my-input-images.zip",
},
destination="my-name/my-model"
)
print(training)如果您对人像进行微调,默认训练参数效果很好,但您也可以使用use_face_detection_instead设置。这将自动使用人脸分割,使训练仅集中在图像中的人脸上。
import replicate
training = replicate.trainings.create(
version="stability-ai/sdxl:39ed52f2a78e934b3ba6e2a89f5b1c712de7dfea535525255b1aa35c5565e08b",
input={
"input_images": "https://my-domain/face-images.zip",
"use_face_detection_instead": True,
},
destination="my-name/my-model"
)要为风格获得最佳效果,您需要:
training = replicate.trainings.create(
version="stability-ai/sdxl:39ed52f2a78e934b3ba6e2a89f5b1c712de7dfea535525255b1aa35c5565e08b",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")为了展示可能性,我们基于某电影制作了几个微调示例。
caption_prefix来指代风格。访问平台训练页面以跟踪训练任务的进度,或以编程方式检查训练状态:
training.reload()
print(training.status)
print("\n".join(training.logs.split("\n")[-10:]))当模型训练完成后,您可以在平台页面上通过图形界面运行它,或通过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库构建自定义流程,可以使用您在平台上训练的模型的权重。
训练对象的.output字段既包含指向训练后版本的指针,也包含训练权重的URL:
print(training.output)
# {
# 'version': 'cloneofsimo/sdxl_mixes:...',
# 'weights': 'https://pbxt.replicate.delivery/.../trained_model.tar'
# }下载weights字段中的.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 <s0><s1>").images[0].save("monster.png")对于大多数用户,BLIP为训练生成的描述效果很好。但是,您可以通过在提供的训练输入图像zip文件中添加一个caption.csv文件来提供自己的描述。每个输入图像都需要有一个对应的描述。这是格式细节的示例csv。
我们将在未来几周继续改进SDXL微调。请通过社交平台和社区关注更新。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。