LyCORIS - 超越传统方法的Lora,其他排名调整实现用于Stable Diffusion。(ICLR'24)
一个为Stable Diffusion实现不同参数高效微调算法的项目。
此项目起源于LoCon(见archive分支)。
如果您有兴趣讨论更多细节,可以加入我们的Discord服务器
如果您想查看更多深入的实验结果和讨论,可以查看我们的论文
算法概述
LyCORIS目前包含LoRA (LoCon)、LoHa、LoKr、(IA)^3、DyLoRA、本地微调(即dreambooth)。 GLoRA和GLoKr即将推出。 请查阅已实现算法列表和指南以了解更多详情。
以下提供了一些这些方法的简单比较(需谨慎对待)
完整 | LoRA | LoHa | LoKr低因子 | LoKr高因子 $^+$ | |
---|---|---|---|---|---|
保真度 | ★ | ● | ▲ | ◉ | ▲ |
灵活性 $^*$ | ★ | ● | ◉ | ▲ | ● $^†$ |
多样性 | ▲ | ◉ | ★ | ● | ★ |
尺寸 | ▲ | ● | ● | ● | ★ |
训练速度线性 | ★ | ● | ● | ★ | ★ |
训练速度卷积 | ● | ★ | ▲ | ● | ● |
★ > ◉ > ● > ▲ [> 表示更好且尺寸更小更好]
$^+$ 通常我们将因子 <= 0.5 * sqrt(dim)
视为低因子,并将因子 >= sqrt(dim)
视为高因子。 例如,对于SD1.x/SD2.x/SDXL,因子<=8可视为低因子,因子>=16可视为高因子。
$^*$ 灵活性指任何与生成与训练集不相似的图像相关的内容,以及多个概念的组合,无论它们是否一起训练
$^†$ 在这种情况下,切换基础模型或结合多个概念可能会变得更加困难
实际性能可能会因所用数据集、任务和超参数的不同而有所差异。建议在不同设置下进行实验以获得最佳结果。
使用方法
图像生成
a1111/sd-webui
在sd-webui 1.5.0之后,LyCORIS模型已由内置的LoRA系统正式支持。你可以将它们放在models/Lora
或models/LyCORIS
中,并使用默认语法<lora:filename:multiplier>
来触发生效。
当我们添加新模型类型时,我们将始终确保它们可以与最新版本的sd-webui一起使用。
至于版本低于1.5.0的sd-webui或sd-webui-forge,请查看此扩展。
其他
据我们所知,LyCORIS模型在以下接口/在线生成服务中也受到支持(请帮助我们完善列表!)
然而,较新模型类型可能并不总是得到支持。如果遇到此问题,可以考虑请求相应接口或网站的开发人员添加新类型的支持。
训练
有三种不同的方式来训练LyCORIS模型。
- 使用kohya-ss/sd-scripts(参见本节末端的兼容图形界面和Colab列表)
- 使用Naifu-Diffusion
- 使用您自己的脚本,将LyCORIS作为独立包装器用于任何pytorch模块。
无论哪种方式,请在相应的虚拟环境中安装此包。你可以通过以下方式安装它
-
通过pip
pip install lycoris-lora
-
或从源码安装
git clone https://github.com/KohakuBlueleaf/LyCORIS cd LyCORIS pip install .
详细的网络参数描述在docs/Network-Args.md中提供。
kohya脚本
你可以使用此包的kohya模块来运行kohya的训练脚本来训练SD模型的lycoris模块
-
通过命令行参数
accelerate launch train_network.py \ --network_module lycoris.kohya \ --network_dim "DIM_FOR_LINEAR" --network_alpha "ALPHA_FOR_LINEAR"\ --network_args "conv_dim=DIM_FOR_CONV" "conv_alpha=ALPHA_FOR_CONV" \ "dropout=DROPOUT_RATE" "algo=locon" \
-
通过
toml
文件accelerate launch train_network.py \ --config_file example_configs/training_configs/kohya/loha_config.toml \ --dataset_config example_configs/training_configs/kohya/dataset_config.toml
为方便起见,一些示例
toml
文件用于kohya LyCORIS训练在example/training_configs/kohya中提供。
HCP-Diffusion
在LyCORIS3.0.0中已取消对HCP-Diffusion的支持,我们将等待HCP方完成新包装器的实现
你可以使用此包的hcp模块运行HCP-Diffusion的训练脚本来训练SD模型的lycoris模块
accelerate launch -m hcpdiff.train_ac_single \
--cfg example_configs/training_configs/hcp/hcp_diag_oft.yaml
为方便起见,一些示例yaml
文件用于HCP LyCORIS训练在example/training_configs/hcp中提供。
目前HCP-Diffusion的输出不直接兼容a1111/sdwebui。 你可以使用tools/batch_hcp_convert.py进行转换。
在枢纽微调的情况下,tools/batch_bundle_convert.py可以进一步用于在捆绑格式之间进行转换。 请查阅docs/Conversion-scripts.md了解更多信息。
作为独立的包装器
请参见standalone_example.py获得完整示例。
从lycoris
库中导入create_lycoris
和LycorisNetwork
,将您的预设传入LycorisNetwork
,然后使用create_lycoris
为您的pytorch模块创建LyCORIS模块。
例如:
from lycoris import create_lycoris, LycorisNetwork
LycorisNetwork.apply_preset(
{"target_name": [".*attn.*"]}
)
lycoris_net = create_lycoris(
your_model,
1.0,
linear_dim=16,
linear_alpha=2.0,
algo="lokr"
)
lycoris_net.apply_to()
# 应用apply_to()后,your_model() 将执行带有LyCORIS网络的操作
lycoris_param = lycoris_net.parameters()
forward_with_lyco = your_model(x)
你可以查看我的HakuPhi项目,了解我如何利用LyCORIS微调Phi-1.5模型。
其他方法
在LyCORIS3.0.0之后,添加了Parametrize API和Functional API,这为利用LyCORIS库提供了更多不同的方式。
请查阅API参考文档以获取更多信息。 您也可以将测试套件视为一种示例。
Bitsandbytes支持
参见bnb_example.py了解示例。基本上与独立包装器相同。
图形界面和Colab(通过kohya训练器)
你还可以使用以下图形界面训练LyCORIS
以及Colab(请帮助我们完善列表!)
然而,它们并不保证是最新的。尤其是,较新类型可能不受支持。考虑请求开发人员提供支持,或者在这种情况下直接使用原始kohya脚本。
实用工具
提取 LoCon
您可以从某个 dreambooth 模型中提取 LoCon 及其基础模型。
python3 extract_locon.py <settings> <base_model> <db_model> <output>
使用 --help 获取更多信息
$ python3 extract_locon.py --help
usage: extract_locon.py [-h] [--is_v2] [--is_sdxl] [--device DEVICE] [--mode MODE] [--safetensors] [--linear_dim LINEAR_DIM]
[--conv_dim CONV_DIM] [--linear_threshold LINEAR_THRESHOLD] [--conv_threshold CONV_THRESHOLD]
[--linear_ratio LINEAR_RATIO] [--conv_ratio CONV_RATIO] [--linear_quantile LINEAR_QUANTILE]
[--conv_quantile CONV_QUANTILE] [--use_sparse_bias] [--sparsity SPARSITY] [--disable_cp]
base_model db_model output_name
合并 LyCORIS 回模型
您可以将 LyCORIS 模型合并回您的检查点(基础模型)。
python3 merge.py <settings> <base_model> <lycoris_model> <output>
使用 --help 获取更多信息
$ python3 merge.py --help
usage: merge.py [-h] [--is_v2] [--is_sdxl] [--device DEVICE] [--dtype DTYPE] [--weight WEIGHT] base_model lycoris_model output_name
在 HCP 和 sd-webui 格式之间进行 LoRA、LyCORIS 和完整模型转换
此脚本允许您在 sd-webui 中使用使用 HCP-Diffusion 训练的 LyCORIS 模型。
python3 batch_hcp_convert.py \
--network_path /path/to/ckpts \
--dst_dir /path/to/stable-diffusion-webui/models/Lora \
--output_prefix something \
--auto_scale_alpha --to_webui
更多信息请参见 docs/Conversion-scripts.md。
从和到捆绑格式的转换
此脚本在进行枢纽微调时特别有用。
python3 batch_bundle_convert.py \
--network_path /path/to/sd-webui-ssd/models/Lora \
--emb_path /path/to/ckpts \
--dst_dir /path/to/sd-webui-ssd/models/Lora/bundle \
--to_bundle --verbose 2
更多信息请参见 docs/Conversion-scripts.md。
更新日志
有关完整日志,请参见 Change.md
2024/06/29 更新到 3.0.0 - 全新的功能 API、参数化 API 和模块 API
3.0.0 的原因
我们通过新的类定义和全新的功能 API 系统重构了整个库。
我们还删除了大量冗余/未使用的模块。
由于整个库发生了重大变化。我们决定将其称为3.0.0作为一个新的主要版本。
主要变化
- 新的模块 API
- 添加参数化 API
- 添加功能 API
- 仅限 LoCon/LoHa/LoKr/Diag-OFT/BOFT。
- 从 install_requires 中删除可选依赖项
- 删除大量冗余/已弃用模块
- 更好的测试
- HunYuan DiT 支持 (PR 在 kohya-ss/sd-scripts)
完整的更改日志
新功能
- LyCORIS 现在具有一致的 API 用于不同的算法,如
bypass_forward_diff
或get_diff_weight
方法。其他项目的开发者可以利用这些 API 进行更多技巧或将 LyCORIS 更轻松地集成到他们的框架中。 - LyCORIS 现在具有参数化 API,利用
torch.nn.utils.parametrize.register_parametrization
直接为单个参数打补丁。这对于 MHA 层或其他复杂模块可能很有用。- 目前仅支持 2~5D 张量。LyCORIS 将假装这些权重是 Linear/Conv1,2,3D 的权重然后将其发送到 LyCORIS 模块中。
- 未来将添加更多本地实现或更详细的控制。
- LyCORIS 现在具有功能 API。偏好功能 API 而非模块 API 的开发者可以利用此功能。
- 功能 API 还允许不想引入新依赖的开发者。只需复制粘贴源代码并加以利用(Apache-2 许可证,直接复制粘贴是完全允许的)。
- 添加对 LoCon/LoHa/LoKr/Full/OFT/BOFT/GLoRA 的 Conv1d 和 Conv3d 模块的支持(并非所有 LyCORIS 算法都支持它们,应用不支持的算法时可能会出错),支持继承模块(例如:来自
huggingface/diffusers
的LoRACompatibleConv
或LoRACompatibleLinear
)。 - 支持 HunYuan DiT。
改进、修复、轻微更改
- 删除与 kohya-ss/sd-scripts 相关的依赖项:
- 我们现在将 kohya-ss/sd-scripts 作为可选依赖项
- 这意味着
transformers
、diffusers
和任何与 kohya 相关的东西现在都是可选依赖项。
- 更改了每种算法中 dropout 和 rank_dropout 的定义。由于 kohya-ss/sd-script 中 lora 的原始 rank_dropout 概念难以应用于其他算法,我们只能为每个模块分别设计 dropout。
- 所有
apply_max_norm
问题均已修复。 - DyLoRA, (IA)^3, GLoRA 都已重写,并支持 Linear/Conv1,2,3d。
- (IA)^3, GLoRA, Diag-OFT, BOFT 均在
create_lycoris_from_weights
中得到支持lycoris.kohya.create_network_from_weights
也支持它们。
- 修复了 BOFT 的错误实现。
create_lycoris_from_weights
和create_network_from_weights
现在有正确的日志信息。get_module
和make_module
已移动到模块的 API 中。
待办事项清单
- 根据特定的 rank 要求自动选择算法。
- 针对不同任务进行更多实验,而不仅仅是扩散模型。
- LoKr 和 LoHa 已被证明对大型语言模型有用。
- 探索其他低阶表示或参数高效方法,以微调整个模型或其特定部分。
- 整个库的文档。
引用
@inproceedings{
yeh2024navigating,
title={Navigating Text-To-Image Customization: From Ly{CORIS} Fine-Tuning to Model Evaluation},
author={SHIH-YING YEH and Yu-Guan Hsieh and Zhidong Gao and Bernard B W Yang and Giyeong Oh and Yanmin Gong},
booktitle={The Twelfth International Conference on Learning Representations},
year={2024},
url={https://openreview.net/forum?id=wfzXa8e783}
}