SD潜空间插值器
一个小型神经网络,用于提供不同Stable Diffusion模型生成的潜空间之间的互操作性。
我想看看是否可以将新的SDXL模型生成的潜空间直接传递到SDv1.5模型中,而无需先使用VAE解码和重新编码。
安装
要安装它,只需使用以下命令将此仓库克隆到您的custom_nodes文件夹中:
git clone https://github.com/city96/SD-Latent-Interposer custom_nodes/SD-Latent-Interposer
或者,您也可以将comfy_latent_interposer.py文件下载到您的ComfyUI/custom_nodes
文件夹中。您可能需要在venv中使用pip install huggingface-hub
命令安装hfhub。
如果您需要用于其他用途的模型权重,它们以与仓库其余部分相同的Apache2许可证托管在HF上。当前文件位于**"v4.0"**子文件夹中。
使用方法
只需将其放置在通常放置VAE解码后跟VAE编码的位置。适当设置去噪以隐藏任何伪影,同时保持构图。请参见下图。
没有插值器,两个潜空间是不兼容的:
本地模型
默认情况下,节点从huggingface hub拉取所需文件。如果您的连接不稳定或更喜欢完全离线使用,可以创建一个models
文件夹并将模型放在那里。当有本地文件时,自定义节点会优先使用本地文件而不是HF。路径应为:ComfyUI/custom_nodes/SD-Latent-Interposer/models
或者,只需将整个HF仓库克隆到该位置:
git clone https://huggingface.co/city96/SD-Latent-Interposer custom_nodes/SD-Latent-Interposer/models
支持的模型
模型名称:
代码 | 名称 |
---|---|
v1 | Stable Diffusion v1.x |
xl | SDXL |
v3 | Stable Diffusion 3 |
fx | Flux.1 |
ca | Stable Cascade (Stage A/B) |
可用模型:
从 | 到 v1 | 到 xl | 到 v3 | 到 fx | 到 ca |
---|---|---|---|---|---|
v1 | - | v4.0 | v4.0 | 否 | 否 |
xl | v4.0 | - | v4.0 | 否 | 否 |
v3 | v4.0 | v4.0 | - | 否 | 否 |
fx | v4.0 | v4.0 | v4.0 | - | 否 |
ca | v4.0 | v4.0 | v4.0 | 否 | - |
训练
训练代码从提供的配置文件初始化大多数训练参数。数据集应该是使用torch.save
为每个潜空间版本保存的单个.bin文件。格式应为[批次,通道,高度,宽度],其中"批次"应尽可能大,例如88000。
插值器v4.0
当前的训练代码初始化模型的两个副本,一个在目标方向,一个在相反方向。损失函数基于此定义。
p_loss
是主要模型的主要标准。b_loss
是次要模型的主要标准。r_loss
是主要模型的输出通过次要模型后与源潜空间进行比较(基本上是通过两个模型的往返)。h_loss
与r_loss
相同,但适用于次要模型。
所有模型都训练了50000步,批量大小为128(xl/v1)或48(cascade)。 训练在RTX 3080和Tesla V100S上本地完成。
旧版本
插值器v3.1
插值器v3.1
这基本上是一次完全重写。用更像是一个适当的神经网络的东西替换了平庸的一堆conv2d层。没有VGG损失,因为我仍然没有更好的GPU。
训练是在合并的Flickr2K + DIV2K上进行的,每张图像被处理成6个1024x1024的片段。用我的一些随机图像填充,数据集中总共有22,000张源图像。
我认为我已经去除了大部分XL伪影,但颜色/色调/饱和度偏移问题仍然存在。这次我实际上保存了优化器状态,所以我可能能够在我的P40上进行100K步的视觉损失训练。希望它们不会烧坏。
v3.0是以1e-4的恒定学习率进行了500k步,v3.1是使用CosineAnnealingLR在结束时降低学习率,进行了1M步。两者都使用了AdamW。
插值器v1.1
插值器v1.1
这是使用"spaceship"架构的第二个版本。它在Flickr2K数据集上训练,并从v1.0检查点继续训练。 总的来说,它似乎表现得更好,特别是对于真实生活照片。我还调查了奇怪的v1->xl伪影,但最终似乎这是VAE解码器阶段固有的问题。
插值器v1.0
插值器v1.0
不确定为什么训练损失如此不同,可能是由于我用来训练它的1000张来自我的下载文件夹的随机图像组成的"""高度策划的"""数据集。
我可能应该直接使用LAION。
我还训练了一个v1到v2的模式,然后才意识到v1和v2共享相同的潜空间。哎呀。