🍰 Stable Diffusion的微型自编码器
什么是TAESD?
TAESD是一个非常小的自编码器,它使用与Stable Diffusion的VAE*相同的"潜在API"。TAESD可以以(几乎)零成本将Stable Diffusion的潜在表示解码为全尺寸图像。以下是在我的笔记本电脑上的对比:
TAESD与基于SD1/2的模型兼容(使用taesd_*
权重)。
TAESD也与基于SDXL的模型(使用taesdxl_*
权重)、基于SD3的模型(使用taesd3_*
权重)和基于FLUX.1的模型(使用taef1_*
权重)兼容。
我在哪里可以获得TAESD?
- TAESD已经可在以下项目中使用:
- A1111
- 作为预览器,感谢Sakura-Luna(在设置 > 实时预览中启用)
- 作为编码器/解码器,感谢Kohaku-Blueleaf(在设置 > VAE中尝试)
- vladmandic,感谢vladmandic
- ComfyUI
- 作为预览器,感谢space-nuko(按照"如何显示高质量预览"下的说明操作,然后使用
--preview-method taesd
启动ComfyUI) - 作为独立的VAE(将
taesd_encoder.pth
和taesd_decoder.pth
都下载到models/vae_approx
中,然后添加一个Load VAE
节点并将vae_name
设置为taesd
)
- 作为预览器,感谢space-nuko(按照"如何显示高质量预览"下的说明操作,然后使用
- A1111
- TAESD也可在🧨 Diffusers中以
safetensors
格式使用 - TAESD的原始权重在本仓库中
我可以将TAESD用于什么?
由于TAESD非常快,你可以使用TAESD实时观看Stable Diffusion的图像生成进度。这里有一个最小的示例笔记本,为🧨 Diffusers实现的SD2.1添加了TAESD预览功能。
由于TAESD包含一个编码器,你可以将TAESD用于官方VAE不方便的任何任务。请注意,TAESD使用的缩放约定与官方VAE不同(TAESD期望图像值在[0, 1]范围内,而不是[-1, 1],并且TAESD的潜在表示的"scale_factor"为1,而不是某个长小数)。这里有一个示例笔记本展示了如何使用TAESD进行编码/解码。
TAESD是如何工作的?
TAESD是Stable Diffusion的VAE*的一个微型蒸馏版本,它由一个编码器和一个解码器组成。编码器将全尺寸图像转换为小型"潜在"图像(48倍有损压缩),然后解码器通过创造新细节,基于编码的潜在表示生成新的全尺寸图像。
原始/解码后的图像形状为3xHxW
,值大约在[0, 1]
范围内,潜在表示的形状为4x(H/8)x(W/8)
,值大约在[-3, 3]
范围内。你可以将TAESD潜在表示裁剪并量化为8位PNG,而不会损失太多质量。TAESD潜在表示应该看起来很像Stable Diffusion的潜在表示。
在内部,TAESD是一堆Conv+ReLU残差块和2倍上采样层:
TAESD有什么局限性?
如果你想解码详细、高质量的图像,并且不在意花费多长时间,你应该直接使用原始SD VAE*解码器(或可能使用OpenAI的Consistency Decoder)。TAESD非常小,试图非常快速地工作,所以它倾向于模糊细节。例如:
TAESD以(适度的)质量损失换取(显著的)速度和便利性提升。
对比表
SD VAE* | TAESD | |
---|---|---|
编码器参数 | 34,163,592 | 1,222,532 |
解码器参数 | 49,490,179 | 1,222,531 |
ONNX算子 | Add, Cast, Concat, Constant, ConstantOfShape, Conv, Div, Gather, InstanceNormalization, MatMul, Mul, Pad, Reshape, Resize, Shape, Sigmoid, Slice, Softmax, Transpose, Unsqueeze | Add, Constant, Conv, Div, Mul, Relu, Resize, Tanh |
运行时/内存随潜在表示大小线性缩放 | 否 | 是 |
有界感受野,所以你可以将解码工作分割成瓦片而不会出现奇怪的接缝等问题 | 否 | |
高质量细节 | 是 | 否 |
微型 | 否 | 是 |
* VQGAN?AutoencoderKL?first_stage_model
?就是这个东西。