某机构最近开源了SDXL,这是Stable Diffusion最新且功能最强大的版本。某平台在发布当天就提供了托管版本的SDXL,您可以从网页或使用云API运行。
今天我们宣布对SDXL 1.0的微调支持。微调允许您在特定对象或样式上训练SDXL,并创建生成这些对象或样式图像的新模型。例如,我们在芭比电影图像和同事Zeke的图像上对SDXL进行了微调。有多种微调SDXL的方法,例如Dreambooth、LoRA扩散(最初用于LLMs)和Textual Inversion。某平台已为SDXL 1.0覆盖了所有这些方法。
本文将展示如何用一行代码在您自己的图像上微调SDXL,并将微调结果发布为您自己托管的公共或私有模型。您只需几张图像即可训练模型,训练过程大约需要10-15分钟。您还可以下载微调后的LoRA权重以在其他地方使用。
微调是采用预训练模型并使用更多数据对其进行训练以创建更适合特定任务的新模型的过程。您可以在自己的图像上微调像SDXL这样的图像生成模型,以创建更擅长生成特定人物、对象或样式图像的新版本模型。
训练API需要一个包含训练图像的zip文件。少量图像(5-6张)足以在单个人物上微调SDXL,但如果训练主题更复杂或图像差异很大,则可能需要更多图像。
准备训练图像时请记住以下准则:
将图像放入文件夹并压缩。zip文件的目录结构无关紧要:
zip -r data.zip data在开始训练任务之前,您需要从某平台获取API令牌。在shell中,将该令牌存储在名为REPLICATE_API_TOKEN的环境变量中:
export REPLICATE_API_TOKEN=r8_...将训练数据的zip文件上传到互联网上可公开访问的位置,例如某存储桶或代码托管页面。
您还需要在某平台上创建一个模型,作为训练后SDXL版本的目标位置。转到某平台创建模型。在下面的示例中,我们称其为my-name/my-model。
您可以将模型设为公开或私有。如果模型是私有的,只有您才能运行它。如果模型是公开的,任何人都可以运行它,但只有您才能更新它。
现在您已经收集了训练数据并创建了模型,是时候使用某平台的API开始训练过程了。
本指南使用Python,但如果您想使用其他语言,可以使用客户端库或直接调用HTTP API。
如果您尚未配置Python环境,可以使用某托管笔记本启动训练过程:
首先安装某平台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"
)要为样式获得最佳结果,您需要:
import replicate
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"
)为了展示可能性,我们基于芭比和创:战纪电影组合了几个微调。
访问某平台训练页面以跟踪训练任务的进度,或以编程方式检查训练:
training.reload()
print(training.status)
print("\n".join(training.logs.split("\n")[-10:]))当模型完成训练后,您可以使用某平台上的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库构建自定义管道,可以使用在某平台上训练的模型的权重。
训练对象的.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) # 应该需要不到2秒
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 删除。