实时AI绘画模型SDXL Turbo核心基础知识详解

Rocky Ding

公众号:WeThinkIn

写在前面

【算法兵器谱】栏目专注分享AI行业中的前沿/经典/必备的模型&论文,并对具备划时代意义的模型&论文进行全方位系统的解析。也欢迎大家提出宝贵的优化建议,一起交流学习💪

大家好,我是Rocky。

如果说2022年,Stable Diffusion横空出世,成为AI行业从传统深度学习时代过渡至AIGC时代的标志模型,并为工业界和投资界注入了新的活力,让AI再次性感

那么2023年1129日,StabilityAI官方发布的最新的快速文生图模型SDXL Turbo/SD Turbo,则让AI绘画领域进入了“实时生成”时代

SDXL Turbo模型生成图片效果(分辨率512x512)

那么在本文中,Rocky就深入浅出的讲解SDXL Turbo/SD Turbo模型的核心知识,一起看看这个关键AI绘画模型的价值。

本文节选自Rocky知乎上的两篇文章:Stable Diffusion XL全方位的解析文章:**https://zhuanlan.zhihu.com/p/643420260**,以及Stable Diffusion全方位的解析文章:https://zhuanlan.zhihu.com/p/632809634**。这两篇文章目前在持续完善中,也希望大家给这两篇文章多多点赞,让Rocky有更多的动力!(也欢迎大家关注Rocky的知乎号:**Rocky Ding

话不多说,在Rocky毫无保留的分享下,让我们开始学习吧!

关于作者

Rocky在校招期间拿到了北上广深杭等地的约10个算法offer,现在是一名算法研究员,目前专注于AIGC创新产品的落地应用以及AI算法解决方案的商用。

在研究生期间,Rocky曾在京东研究院,星环科技,联想研究院,北大方正信产集团研究院,百融云创,中科院软件所等公司做算法实习生,对不同性质公司的商业闭环逻辑比较了解。

Rocky多次获得CVPR,AAAI,Kaggle等顶级平台的算法竞赛冠军和Top成绩。

Rocky相信人工智能,数据科学,商业逻辑,金融工具,终身成长,以及顺应时代的潮流会赋予我们超能力。

Rocky是自媒体WeThinkIn的创始人,积极在业余时间进行创业实践与基本面扩展。

Rocky喜欢分享和交流,秉持着“也要学习也要酷”的生活态度,希望能和大家多多交流。AI算法,面试,简历,求职等问题都可直接和我交流~

So,enjoy(与本文的BGM一起食用更佳哦):

正文开始

----【目录先行】----

  1. SDXL Turbo整体架构初识

  2. SDXL Turbo核心原理详解

  3. SDXL Turbo效果测试

  4. SD Turbo模型介绍

SDXL Turbo整体架构初识

SDXL Turbo模型是在SDXL 1.0模型的基础上设计了全新的蒸馏训练方案(Adversarial Diffusion Distillation,ADD),经过蒸馏训练得到的。SDXL Turbo模型只需要1-4步就能够生成高质量图像,这接近实时的性能,无异让AI绘画领域的发展更具爆炸性,同时也为未来AI视频的爆发奠定坚实的基础。

SDXL Turbo模型本质上依旧是SDXL模型,其网络架构与SDXL一致,可以理解为一种经过蒸馏训练后的SDXL模型。

不过SDXL Turbo模型并不包含Refiner部分,只包含U-Net(Base)、VAE和CLIP Text Encoder三个模块。在FP16精度下SDXL Turbo模型大小6.94G(FP32:13.88G),其中U-Net(Base)大小5.14G,VAE模型大小167M以及两个CLIP Text Encoder一大一小分别是1.39G和246M。

SDXL Turbo核心原理详解

既然我们已经知道SDXL Turbo模型结构本质上是和SDXL一致,那么其接近实时的生图性能主要还是得益于最新的Adversarial Diffusion Distillation(ADD)蒸馏方案

模型蒸馏技术在传统深度学习时代就应用广泛,只是传统深度学习的落地场景只局限于ToB,任务范围不大且目标定义明确,大家往往人工设计轻量型的目标检测、分割、分类小模型来满足实际应用需求,所以当时模型蒸馏技术显得有些尴尬。

但是到了AIGC时代,大模型逻辑走通,模型蒸馏技术重新繁荣,应用于各个大模型的性能实时化中,Rocky相信模型蒸馏技术未来在AIGC时代将是一个非常关键的AI技术工具

那么,就让我们一起来解析ADD的蒸馏方案的核心知识吧。首先ADD蒸馏方案的整体架构如下图所示:

SDXL Turbo的Adversarial Diffusion Distillation(ADD)的蒸馏方案

ADD蒸馏方案的主要流程是这样的:将预训练好的SDXL模型作为学生模型(预训练好的网络能显著提高对抗性损失(adversarial loss)的训练效果),它接收经过forward diffusion process后的噪声图片,并输出去噪后的图片,然后用这个去噪后的图片与原图输入判别器中计算adversarial loss以及与教师模型输出的去噪图片计算distillation loss。ADD蒸馏算法中主要通过优化这两个loss来对SDXL Turbo进行训练:

  1. **adversarial loss:**借鉴了GAN的思想,设计了Hinge loss(支持向量机SVM中常用的损失函数)作为SDXL的adversarial loss,通过一个Discriminator来辨别学生模型(SDXL Turbo)生成的图像和真实的图像,以确保即使在一个或两个采样步数的低步数状态下也能确保高图像保真度,同时避免了其他蒸馏方法中常见的失真或模糊问题。

  2. **distillation loss:**经典的蒸馏损失函数,让SDXL 1.0模型作为教师模型并冻结参数,让学生模型(SDXL Turbo)的输出和教师模型的输出尽量一致,具体计算方式使用的是跨周期的L2损失。 最后,ADD蒸馏训练中总的损失函数就是adversarial loss和distillation loss的加权和,如下图所示,其中权重设置2.5:

SDXL Turbo效果测试

目前StabilityAI官网已经上线SDXL Turbo模型,大家可以免费体验:https://clipdrop.co/stable-diffusion-turbo

因为SDXL Turbo网络结构与SDXL一致,所以大家也可以直接在Stable Diffusion WebUI上使用SDXL Turbo模型,我们只需按照本文3.3章中的教程使用Stable Diffusion WebUI即可。

同时ComfyUI上也已经支持SDXL Turbo的使用:https://comfyanonymous.github.io/ComfyUI_examples/sdturbo/,然后我们按照本文3.1章的教程使用ComfyUI工作流即可运行SDXL Turbo。

ComfyUI运行SDXL Turbo模型

当然的,diffusers库也已经支持SDXL Turbo的使用运行了,可以进行文生图和图生图的任务,相关代码和操作流程如下所示:

# 加载diffusers和torch依赖库
from diffusers import AutoPipelineForText2Image
import torch

# 构建SDXL Turbo模型的Pipeline,加载SDXL Turbo模型
pipe = AutoPipelineForText2Image.from_pretrained("/本地路径/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
# "本地路径/sdxl-turbo"表示我们需要加载的SDXL Turbo模型,
# 大家可以关注Rocky的公众号WeThinkIn,后台回复:SDXLTurbo模型,即可获得资源链接
# "fp16"代表启动fp16精度。比起fp32,fp16可以使模型显存占用减半。

# 使用GPU进行Pipeline的推理
pipe.to("cuda")

# 输入提示词
prompt = "A cinematic shot of a baby racoon wearing an intricate italian priest robe."

# Pipeline进行推理
image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
# Pipeline生成的images包含在一个list中:[<PIL.Image.Image image mode=RGB size=1024x1024>]
#所以需要使用images[0]来获取list中的PIL图像

完成上面的整个代码流程,我们就能生成一张小浣熊的图片了。这里要注意的是,SDXL Turbo模型在diffusers库中进行文生图操作时不需要使用guidance_scale和negative_prompt参数,所以我们设置guidance_scale=0.0

diffusers库中使用SDXL-Turbo模型进行文生图

接下来,Rocky再带大家完成SDXL Turbo模型在diffusers中图生图的整个流程:

from diffusers import AutoPipelineForImage2Image
from diffusers.utils import load_image

pipe = AutoPipelineForImage2Image.from_pretrained("/本地路径/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")

init_image = load_image("/本地路径/用于图生图的原始图片").resize((913, 512))

prompt = "Miniature model, axis shifting, reality, clarity, details, panoramic view, suburban mountain range, game suburban mountain range, master work, ultra-high quality, bird's-eye view, best picture quality, 8K, higher quality, high details, ultra-high resolution, masterpiece, full of tension, realistic scene, top-level texture, top-level light and shadow, golden ratio point composition, full of creativity, color, future city, technology, smart city, aerial three-dimensional transportation, pedestrian and vehicle separation, green building, macaron color, gorgeous, bright"

image = pipe(prompt, image=init_image, num_inference_steps=2, strength=0.5, guidance_scale=0.0).images[0]

完成上面的整个代码流程,我们就能生成一张新的城郊山脉的图片。需要注意的是,当在diffusers中使用SDXL Turbo模型进行图生图操作时,需要确保num_inference_steps*strength大于或等于1。因为前向推理的步数等于int(num_inference_steps * strength)步。比如上面的例子中,我们就使用SDXL-Turbo模型前向推理了0.5 * 2.0 = 1 步。

diffusers库中使用SDXL-Turbo模型进行图生图

StabilityAI官方发布的报告中表示SDXL Turbo在推理速度上提供了重大改进。在A100上,SDXL Turbo以207ms的速度生成一张512x512的图像(prompt encoding + a single denoising step + decoding, fp16),其中U-Net部分耗时占用了67ms

Rocky也测试了一下SDXL Turbo的图像生成效率,确实非常快,在V100上,4 steps生成512x512尺寸的图像基本可以做到实时响应(1.02秒,平均1 step仅需250ms)

SDXL Turbo与其他模型耗时对比

在我们输入完最后一个prompt后,新生成的图像就能马上显示,推理速度确实超过了Midjourney、DALL·E 3以及之前的Stable Difusion系列模型,可谓是“天下武功,无坚不破,唯快不破”的典范。SDXL Turbo在生成速度快的同时,生成的图像质量也非常高,可以比较精准地还原prompt的描述

为了测试SDXL Turbo的性能,StabilityAI使用相同的文本提示,将SDXL Turbo与SDXL和LCM-XL等不同版本的文生图模型进行了比较。测试结果显示,在图像质量和Prompt对齐方面,SDXL Turbo只用1个step,就击败了LCM-XL的4个steps生成的图像,以及达到SDXL 1.0 Base通过50个steps生成的图像效果

SDXL Turbo 1个step 生成图像效果

接着当我们将采样步数提高到4时,SDXL Turbo在图像质量和Prompt对齐方面都已经略微超过SDXL 1.0 Base:

SDXL Turbo 4个step 生成图像效果

论文里表示目前SDXL Turbo只能生成512x512像素的图片,Rocky推测当前开源的SDXL Turbo只在单一尺寸上进行了蒸馏训练,后续估计会有更多优化版本发布。Rocky也在512x512像素下测试了不同steps(1-8 steps)时SDXL Turbo的出图效果,对比结果如下所示:

SDXL Turbo不同steps效果测试

可以看到当steps为1和4时,效果都非常好,并且4steps比1step效果更好,这是可以理解的。不过当steps大于4之后,生成的图像明显开始出现过拟合现象。总的来说,如果是急速出图的场景,可以选择1 step;如果想要更高质量,推荐选择4 steps

同时Rocky测试了一下SDXL Turbo在不同尺寸(768x768,1024x1024,512x768,768x1024,768x512,1024x768共6中尺寸)下的图像生成质量,可以看到除了1024x1024存在一定的图片特征不完善的情况,其余也具备一定的效果,但是整体上确实不如512x512的效果好。

SDXL Turbo不同尺寸效果测试

SDXL Turbo的一个直接应用,就是与游戏相结合,获得2fps的风格迁移后的游戏画面:

SDXL Turbo发布后,未来AI绘画和AI视频领域有了更多的想象空间。一定程度上再次整合加速了生成领域的各种工作流应用,未来的潜力非常大。不过由于SDXL Turbo模型需要通过蒸馏训练获得,并且其中包含了GAN的对抗损失训练,在开源生态中像训练特定SDXL模型一样的训练出特定SDXL Turbo模型,并且能保证出图的质量,目前来看是有一定难度的

SD Turbo模型介绍

SD Turbo模型是在Stable Diffusion V2.1的基础上,通过蒸馏训练得到的精简版本,其本质上还是一个Stable Diffusion V2.1模型,其网络架构不变。

SD Turbo模型生成的图片

比起SDXL Turbo,SD Turbo模型更小、速度更快,但是生成图像的质量和Prompt对齐方面不如前者。

但是在AI视频领域,SD Turbo模型有很大的想象空间,因为Stable Video Diffusion的基础模型是Stable Diffusion V2.1,所以未来SD Turbo模型在AI视频领域很可能成为AI视频加速生产的有力工具之一。

为了测试SD Turbo的性能,StabilityAI使用相同的文本提示,将SD Turbo与LCM-LoRA 1.5和LCM-LoRA XL等不同版本的文生图模型进行了比较。测试结果显示,在图像质量和Prompt对齐方面,SD Turbo只用1个step,就击败了LCM-LoRA 1.5和LCM-LoRA XL生成的图像。

SD Turbo 1个step 生成图像效果

diffusers库已经支持SDXL Turbo的使用运行了,可以进行文生图和图生图的任务,相关代码和操作流程如下所示:

from diffusers import AutoPipelineForText2Image
import torch

pipe = AutoPipelineForText2Image.from_pretrained("/本地路径/sd-turbo", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")

prompt = "A cinematic shot of a baby racoon wearing an intricate italian priest robe."
image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]

这里要注意的是,SD Turbo模型在diffusers库中进行文生图操作时不需要使用guidance_scale和negative_prompt参数,所以我们设置guidance_scale=0.0

接下来,Rocky再带大家完成SD Turbo模型在diffusers中图生图的整个流程:

from diffusers import AutoPipelineForImage2Image
from diffusers.utils import load_image
import torch

pipe = AutoPipelineForImage2Image.from_pretrained("/本地路径/sd-turbo", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")

init_image = load_image("/本地路径/test.png").resize((512, 512))
prompt = "cat wizard, gandalf, lord of the rings, detailed, fantasy, cute, adorable, Pixar, Disney, 8k"

image = pipe(prompt, image=init_image, num_inference_steps=2, strength=0.5, guidance_scale=0.0).images[0]

需要注意的是,当在diffusers中使用SD Turbo模型进行图生图操作时,需要确保num_inference_steps*strength大于或等于1。因为前向推理的步数等于int(num_inference_steps * strength)步。比如上面的例子中,我们就使用SD Turbo模型前向推理了0.5 * 2.0 = 1 步

推荐阅读

2、GPT-4,ChatGPT Plus稳定使用教程

****************************************

3、Stable Diffusion XL核心基础知识,从0到1搭建使用Stable Diffusion XL进行AI绘画,从0到1上手使用Stable Diffusion XL训练自己的AI绘画模型,AI绘画领域的未来发展等全维度解析文章正式发布

码字不易,欢迎大家多多点赞:

Stable Diffusion XL文章地址:https://zhuanlan.zhihu.com/p/643420260

4、Stable DiffusionV1-V2核心原理,核心基础知识,网络结构,经典应用场景,从0到1搭建使用Stable Diffusion进行AI绘画,从0到1上手使用Stable Diffusion训练自己的AI绘画模型,Stable Diffusion性能优化等全维度解析文章正式发布

码字不易,欢迎大家多多点赞:

Stable Diffusion文章地址:https://zhuanlan.zhihu.com/p/632809634

5、ControlNet核心基础知识、核心网络结构、从0到1在WebUI中使用ControlNet进行AI绘画、从0到1上手构建ControlNet高级应用等全维度解析文章正式发布

码字不易,欢迎大家多多点赞:

ControlNet文章地址:https://zhuanlan.zhihu.com/p/660924126

6、最全面的AIGC面经《手把手教你如何成为AIGC算法工程师,斩获AIGC算法offer!》文章发布

码字不易,欢迎大家多多点赞:

文章地址:https://zhuanlan.zhihu.com/p/651076114

7、10万字大汇总《“三年面试五年模拟”之算法工程师的求职面试“独孤九剑”秘籍》文章发布

码字不易,欢迎大家多多点赞:

文章地址:https://zhuanlan.zhihu.com/p/545374303

alt

#秋招##春招##校招##实习##面经#
全部评论

相关推荐

2 2 评论
分享
牛客网
牛客企业服务