您好,欢迎访问一九零五行业门户网

适配Diffusers框架的全套教程来了!从T2I-Adapter到大热ControlNet

在 chatgpt 出圈不久,controlnet 的横空出世很快在英文和中文互联网收获了众多开发者和普通用户,甚至有用户宣传 controlnet 的出现将 ai 创作带入了直立行走的时代。不夸张地说,包括 controlnet 在内,同期的 t2i-adapter、composer, 以及 lora 训练技巧,可控生成作为 ai 创作最后一道高墙,极有可能在可预见的时间内有进一步突破,从而极大地降低用户的创作成本,提高创作的可玩性。距离 controlnet 开源仅仅过去两周,其官方 star 就已经超过 1 万,这种热度无疑是空前的。
与此同时,开源社区也极大地降低了用户的使用门槛,如 hugging face 平台提供了基础模型权重以及通用的模型训练框架 diffusers,stable-diffusion-webui 开发了完善的一套 demo 平台,civitai 贡献了海量风格化 lora 权重。
尽管 webui 作为目前最受欢迎的可视化工具,已经快速地支持了近期推出的各种生成模型,并且支持众多选项供用户设置。由于其重点考虑了前端界面的易用性,背后代码结构其实十分复杂,对于开发者而言不够友好。比如 webui 尽管支持了多种类型的加载和推理,但却无法支持不同框架下的转换,也无法支持模型的灵活训练。我们在社区讨论中发现了许多现有开源代码暂未解决的痛点。
首先,代码框架不兼容,目前热门的模型,如 controlnet、t2i-adapter,与主流的 stable diffusion 训练库 diffusers 不兼容,controlnet 预训练的模型无法直接在 diffusers 框架中被使用。
其次,模型加载受限,目前模型保存格式多样,如.bin、.ckpt、.pth、.satetensors 等,除了 webui 外,目前 diffusers 框架对于这些模型格式的支持还有限,考虑到 lora 大部分模型以 safetensors 保存为主,用户很难直接将 lora 的模型加载到已有的基于 diffusers 框架训练的模型中。
第三,基础模型受限,目前 controlnet、t2i-adapter 均基于 stable-diffusion-1.5 进行训练,且仅开源了 sd1.5 下的模型权重,考虑到特定场景,已经存在诸如 anything-v4、chilloutmix 等优质动漫模型,即使引入了可控信息,最终生成结果仍然受限于 sd1.5 中 unet 的能力。
最后,模型训练受限,目前 lora 已经被广泛验证是风格迁移、保持特定形象 ip 最有效的方法之一,但 diffusers 框架目前仅支持 unet 的 lora 嵌入,无法支持 text encoder 的嵌入,会限制 lora 的训练。
我们和开源社区讨论后,了解到 diffusers 框架作为通用代码库,正计划同时适配近期不断推出的生成模型;由于涉及较多底层接口重写,仍然需要一段时间更新。为此,我们从以上实际存在的问题出发,率先提出了对于每一个问题的自研解决方案,快速帮助开发者更容易地开发。
lora、controlnet、t2i-adapter 到 diffusers 的全适配方案lora for diffusers
本方案是为了在 diffusers 框架,即基于 diffusers 训练保存的模型中,灵活嵌入各种格式的 lora 权重。由于 lora 的训练通常冻结 base model,因此可以作为可插拔模块轻松嵌入已有模型,作为风格或 ip 条件约束。lora 本身是一种通用的训练技巧,它的基本原理是,通过低秩分解,可以极大地减少模块的参数量,目前在图像生成中,一般用于训练独立于 base model 外的可插拔模块,实际使用是以残差形式与 base model 的输出合并。
首先是 lora 权重的嵌入,目前 civitai 平台上提供的权重主要以 ckpt 或 safetensors 格式存储,分以下两种情况。
(1)full model(base model + lora 模块)
如果 full model 是 safetensors 格式,可以通过以下 diffusers 脚本转换
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.safetensors--dump_path save_dir --from_safetensors
如果 full model 是 ckpt 格式,可以通过以下 diffusers 脚本转换
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.ckpt--dump_path save_dir
转换完成后,可直接利用 diffusers 的 api 进行模型加载
from diffusers import stablediffusionpipeline pipeline = stablediffusionpipeline.from_pretrained (save_dir,torch_dtype=torch.float32)
(2)lora only (仅包含 lora 模块)
目前 diffusers 官方无法支持仅加载 lora 权重,而开源平台上的 lora 权重基本以这种形式存储。本质上是完成 lora 权重中 key-value 的重新映射,使其适配到 diffusers 模型中。为此,我们自行支持这个功能,提供了转换脚本。
pipeline = stablediffusionpipeline.from_pretrained (model_id,torch_dtype=torch.float32) model_path = onepiecewanosagastyle_v2offset.safetensors state_dict = load_file (model_path)
只需要指定 diffusers 格式的模型,以及存储为 safetensors 格式的 lora 权重。我们提供了一个转换示例。
# the default mergering ratio is 0.75, you can manually set it python convert_lora_safetensor_to_diffusers.py
此外,lora 本身由于其轻量化,可以在小数据情况下快速完成训练,并能够嵌入到其他网络中。为了不局限于已有 lora 权重,我们在 diffusers 框架中支持了 lora 的多模块(unet+text encoder)训练,并已经在官方代码库提交 pr(https://github.com/huggingface/diffusers/pull/2479),并支持了 colossalai 中训练 lora。
代码开源在:https://github.com/haofanwang/lora-for-diffusers
controlnet for diffusers
本方案是为了支持在 diffusers 框架中,使用 controlnet。基于开源社区的部分尝试,我们提供了完整的 controlnet+anything-v3 使用用例,支持将 base model 从原本 sd1.5 的替换到 anything-v3 模型,使 controlnet 具备较好动漫生成的能力。
此外,我们也支持 controlnet+inpainting,并提供了适配 diffusers 的 pipeline,
以及多条件控制的 multi-controlnet。
代码开源在:https://github.com/haofanwang/controlnet-for-diffusers
t2i-adapter for diffusers
与 controlnet 相似,我们也同时支持了同期开源的 t2i-adapter 到 diffusers 的适配。
代码开源在:https://github.com/haofanwang/t2i-adapter-for-diffusers
目前以上三种适配方案均已经向社区开源,并在 controlnet、t2i-adapter 中被官方分别致谢,也收到了来自 stable-diffusion-webui-colab 作者的感谢。我们正在与 diffusers 官方保持讨论,会在近期完成以上方案向官方代码库的集成工作。也欢迎大家提前尝试我们的工作,有任何问题均可以直接提 issue,我们会尽快回复。
以上就是适配diffusers框架的全套教程来了!从t2i-adapter到大热controlnet的详细内容。
其它类似信息

推荐信息