LoRA 模型的全新玩法——AutoLoRA 带你体验 LoRA 检索与融合的魔法
论文:
https://arxiv.org/abs/2508.02107
模型:
https://www.modelscope.cn/models/DiffSynth-Studio/LoRAFusion-preview-FLUX.1-dev
代码:
https://github.com/modelscope/DiffSynth-Studio/blob/main/examples/flux/model_inference/FLUX.1-dev-LoRA-Fusion.py
01.引言
为了充分挖掘魔搭社区 Diffusion LoRA 模型的潜力,我们开发了一个自动 LoRA 检索与融合框架:AutoLoRA。他可以根据输入的文本提示,从 LoRA 候选池中检索到 个与提示词相关的LoRA,然后通过集成一个门控融合模块在生成图片的时候促进多个 LoRA 协同工作,充分发挥各个 LoRA 的能力。
02.效果展示
检索+融合:社区赋能基模
在 FLUX.1-dev 上进行实验,对每个输入检索1-3个 LoRA,并使用融合模块把她们融合在一起进行生图。可以看到检索到的 LoRA 可以提升原图的细节和整体的美观程度。
物体+风格:多元功能融合
单独测试融合模块的物体和风格LoRA融合,即保持了物体的一致性也融合了风格样式。
风格+风格:实现奇思妙想
"a cat" |
LoRA 1 |
LoRA 2 |
LoRA 3 |
LoRA 4 |
LoRA 1 |
|
|
|
|
LoRA 2 |
|
|
|
|
LoRA 3 |
|
|
|
|
LoRA 4 |
|
|
|
|
更多 LoRA 融合
3 个 LoRA 融合也能发挥作用,一个冰雪材质,加皮影戏,加一个背景 LoRA:
03.技术亮点
如图所示,AutoLoRA 包括两个关键组件:1)基于权重编码的 LoRA 检索器 和 2)细粒度的门控融合模块。
我们先介绍 LoRA 检索器。要实现通过文本检索 LoRA 的功能,我们需要 LoRA 模型转化为一个embedding,但是面对一个模型权重参数,我们难以使用常规的方法对齐进行特征提取。为了解决这个问题,我们利用了一个权重编码器来对 LoRA 进行编码。具体来说就是把LoRA的每一层视为一个 token,首先通过一些可学习的查询和矩阵把 token 转化成 token embedding:.
把所有的层转换成embedding之后,我们可以得到一个 embedding 序列:,最后把用 Transformer Blocks 对其进行全局的特征提取,得到最终的 LoRA embedding: 。
LoRA 编码器的训练目标:使用对比损失进行训练,虽然我们拿不到 LoRA 模型的训练数据,但是在社区中 每个 LoRA 通常会带有几张封面图,我们利用这些极其有限的数据构造一个数据集。首先使用 Qwen VL 为每张图片生成三段长度不同的描述来作为每个 LoRA 的文本标签,数据集格式如下:。
训练完之后我们就可以通过计算文本 embedding 与 LoRA embedding 之间的余弦相似度来在候选池检索最想关的LoRA,并且有新增的 LoRA 也不需要对模型重新训练。
接下来介绍我们的 LoRA 融合模块。之前的一些 LoRA 融合方法只能在少数且数量固定的 LoRA 上生效,为了进行可以把检索到的任意数量 LoRA 进行融合,我们提出了一个细粒度的门控融合机制,在线性层中利用可学习的门控模块感知扩散过程中原始模型和 LoRA 各个中间层的隐状态特征,动态计算不同维度的 LoRA 权重。
具体来说,在一个线性层中原始模型的输出为 , 个 LoRA 的输出为 。首先对其进行归一化:
随后,通过三个专门的门控组件的协同计算每个 LoRA 的特定维度贡献权重:
其中 表示 Base Feature Gate,用于建模原始输出的表示重要性; 表示 LoRA-Specific Gate,用于感知每个 LoRA 适配器的差异化贡献; 表示 ,用于捕获原始输出和 LoRA 输出之间的高阶交互特征。他们都是可学习的权重向量 。 表示 sigmoid 激活函数;\odot 表示逐元素乘法。门控矩阵 中的 用于确定第 个 LoRA 在维度上的贡献。最后,该模块通过幅度校准将原始输出与加权后的 LoRA 输出进行集成:
其中 是一个可学习的融合缩放参数,进一步确保融合的数值稳定性 。
LoRA 融合模块的训练目标:我们使用一个抗干扰训练策略,即在训练的时候同时加载两个 LoRA,但是只用其中一个LoRA的图文进行训练,损失函数使用标准的 flow matching 损失。
04.本地推理
LoRA 融合模型可直接在 DiffSynth-Studio 中进行推理。
安装:
git clone https://github.com/modelscope/DiffSynth-Studio.git
cd DiffSynth-Studio
pip install -e .
推理:
import torch
from diffsynth.pipelines.flux_image_new import FluxImagePipeline, ModelConfig
pipe = FluxImagePipeline.from_pretrained(
torch_dtype=torch.bfloat16,
device="cuda",
model_configs=[
ModelConfig(model_id="black-forest-labs/FLUX.1-dev", origin_file_pattern="flux1-dev.safetensors"),
ModelConfig(model_id="black-forest-labs/FLUX.1-dev", origin_file_pattern="text_encoder/model.safetensors"),
ModelConfig(model_id="black-forest-labs/FLUX.1-dev", origin_file_pattern="text_encoder_2/"),
ModelConfig(model_id="black-forest-labs/FLUX.1-dev", origin_file_pattern="ae.safetensors"),
ModelConfig(model_id="DiffSynth-Studio/LoRAFusion-preview-FLUX.1-dev", origin_file_pattern="model.safetensors"),
],
)
pipe.enable_lora_magic()
pipe.load_lora(
pipe.dit,
ModelConfig(model_id="cancel13/cxsk", origin_file_pattern="30.safetensors"),
hotload=True,
)
pipe.load_lora(
pipe.dit,
ModelConfig(model_id="DiffSynth-Studio/ArtAug-lora-FLUX.1dev-v1", origin_file_pattern="merged_lora.safetensors"),
hotload=True,
)
image = pipe(prompt="a cat", seed=0)
image.save("image_fused.jpg")
05.写在最后
近期随着 Qwen-Image 的开源,开源社区中 Qwen-Image 的 LoRA 模型生态蓬勃发展,我们将会继续优化模型效果,将这项技术应用到 Qwen-Image 的 LoRA 生态中,和广大开发者一起,共建繁荣的开源社区生态!
点击链接阅读原文,即可跳转链接~
更多推荐
所有评论(0)