教程:深入浅出完整解析Stable Diffusion(SD)核心基础知识 - 知乎

教程:深入浅出完整解析Stable Diffusion(SD)核心基础知识 - 知乎

教程:深入浅出完整解析Stable Diffusion(SD)核心基础知识 知乎 教程:深入浅出完整解析Stable Diffusion(SD)核心基础知识 知乎 Modified September 11, 2025 7.4 SD Turbo模型 SD Turbo模型生成的图片 SD Turbo模型是在Stable Diffusion V2.1的基础上,通过蒸馏训练得到的精简版本, 其本质上还是一个Stable Diffusion V2.1模型,其网络架构不变 。 比起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的使用运行了,可以进行文生图和图生图的任务 ,相关代码和操作流程如下所示: Code block Python Copy 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中图生图的整个流程: Code block Python Copy 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 步。 后续马上补充,大家敬请期待! 码字确实不易,希望大家能一键三连,多多点赞! 8. Stable Diffusion性能优化 我们从2022年进入AIGC时代后,Stable Diffusion等AI绘画领域中的大模型未来将面临着传统深度学习时代YOLO模型一样的 轻量化、端侧部署、实时性能 等应用需求,这也是AIGC时代未来10年工业界、竞赛界以及学术界研究实践的重要方向。 Rocky在本章中也会持续补充能够优化Stable Diffusion系列模型性能的实用技术方法,方便大家学习与使用。 8.1 使用TF32精度加速SD模型训练与推理 Code block Python Copy import torch torch.backends.cuda.matmul.allow tf32 = True TF32在性能和精度上实现了平衡。下面是TF32精度的一些作用和优势: 1. 加速训练速度:使用TF32精度可以在保持相对较高的模型精度的同时,加快模型训练的速度。 2. 减少内存需求:TF32精度相对于传统的浮点数计算(如FP32)需要更少的内存存储。这对于训练大规模的深度学习模型尤为重要,可以减少内存的占用。 3. 可接受的模型精度损失:使用TF32精度会导致一定程度的模型精度损失,因为低精度计算可能无法精确表示一些小的数值变化。然而,对于大多数深度学习应用,TF32精度仍然可以提供足够的模型精度。 8.2 使用FP16半精度加速 Code block Python Copy import torch from diffusers import DiffusionPipeline pipe = DiffusionPipeline.from pretrained( "/本地路径/stable diffusion v1 5", torch dtype=torch.float16, ) 使用FP16半精度训练的优势: 减少了一半的内存占用,我们可以进一步将batch大小翻倍,并将训练时间减半。 一些GPU如V100, 2080Ti等针对16位计算进行了优化,能自动加速3 8倍。 8.3 对注意力模块进行切片 当模型中的注意力模块存在多个注意力头时,可以使用切片注意力操作,使得每个注意力头依次计算注意力矩阵,从而大幅减少内存占用,但随之而来的是推理时间增加约10%。 Code block Python Copy import torch from diffusers import DiffusionPipeline pipe = DiffusionPipeline.from pretrained("/本地路径/stable diffusion v1 5", torch dtype=torch.float16, ) pipe = pipe.to("cuda") 切片注意力 pipe.enable attention slicing() 8.4 对VAE进行切片 和注意力模块切片一样,我们也可以对VAE进行切片,让VAE每次处理Batch(32)中的一张图片,从而大幅减少内存占用。 Code block Python Copy import torch from diffusers import StableDiffusionPipeline pipe = StableDiffusionPipeline.from pretrained( "/本地路径/stable diffusion v1 5", torch dtype=torch.float16, ) pipe = pipe.to("cuda") prompt = "a photo of an astronaut riding a horse on mars" 切片VAE pipe.enable vae slicing() images = pipe([prompt] 32).images 8.5 大图像切块 当想要生成4k或者更大的图像,并且内存不充裕时,可以使用图像切块的操作,让VAE的编码器与解码器对切块后的图像逐一处理,最后从容拼接生成大图。 Code block Python Copy import torch from diffusers import StableDiffusionPipeline pipe = StableDiffusionPipeline.from pretrained( "/本地路径/stable diffusion v1 5", torch dtype=torch.float16, ) pipe = pipe.to("cuda") prompt = "a beautiful landscape photograph" 大图像切块 pipe.enable vae tiling() image = pipe([prompt], width=3840, height=2224, num inference steps=20).images[0] 8.6 CPU < GPU切换 可以将整个SD模型或者SD模型的部分模块权重加载到CPU中,只有等推理时再将需要的权重加载到GPU。 下面是再diffusers库中使用CPU < GPU切换的一个例子: Code block Python Copy import torch from diffusers import StableDiffusionPipeline pipe = StableDiffusionPipeline.from pretrained( "/本地路径/stable diffusion v1 5", torch dtype=torch.float16, ) SD模型子模块CPU < GPU切换 pipe.enable sequential cpu offload() 整个SD模型CPU < GPU切换 pipe.enable model cpu offload() 8.7 变换Memory Format 在CV领域,两种比较常见的memory format是channels first(NCHW)和channels last(NHWC)。将channels first转变成为channels last可能会提升推理速度,不过这也需要依AI框架和硬件而定。 在Channels Last内存格式中,张量的维度顺序为:(batch size, height, width, channels)。其中,batch size表示批处理大小,height和width表示图像或特征图的高度和宽度,channels表示通道数。 相比而言,Channels First是另一种内存布局,其中通道维度被放置在张量的第二个维度上。在Channels First内存格式中,张量的维度顺序为:(batch size, channels, height, width)。 选择Channels Last或Channels First内存格式通常取决于硬件和软件平台以及所使用的深度学习框架。不同的平台和框架可能对内存格式有不同的偏好和支持程度。 在一些情况下,Channels Last内存格式可能具有以下优势: 1. 内存访问效率:在一些硬件架构中,如CPU和GPU,Channels Last内存格式能够更好地利用内存的连续性,从而提高数据访问的效率。 2. 硬件加速器支持:一些硬件加速器(如NVIDIA的Tensor Cores)对于Channels Last内存格式具有特定的优化支持,可以提高计算性能。 3. 跨平台兼容性:某些深度学习框架和工具更倾向于支持Channels Last内存格式,使得在不同的平台和框架之间迁移模型更加容易。 需要注意的是,选择内存格式需要根据具体的硬件、软件和深度学习框架来进行评估。某些特定的操作、模型结构或框架要求可能会对内存格式有特定的要求或限制。因此,建议在特定环境和需求下进行测试和选择,以获得最佳的性能和兼容性。 7.4 SD Turbo模型 SD Turbo模型生成的图片 SD Turbo模型是在Stable Diffusion V2.1的基础上,通过蒸馏训练得到的精简版本, 其本质上还是一个Stable Diffusion V2.1模型,其网络架构不变 。 比起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的使用运行了,可以进行文生图和图生图的任务 ,相关代码和操作流程如下所示: 这里要注意的是,SD Turbo模型在diffusers库中进行文生图操作时不需要使用guidance scale和negative prompt参数,所以我们设置guidance scale=0.0。 接下来,Rocky再带大家完成SD Turbo模型在diffusers中图生图的整个流程: 需要注意的是,当在diffusers中使用SD Turbo模型进行图生图操作时,需要确保num inference steps strength大于或等于1。因为前向推理的步数等于int(num inference steps strength)步。比如上面的例子中,我们就使用SD Turbo模型前向推理了0.5 2.0 = 1 步。 后续马上补充,大家敬请期待! 码字确实不易,希望大家能一键三连,多多点赞! 8. Stable Diffusion性能优化 我们从2022年进入AIGC时代后,Stable Diffusion等AI绘画领域中的大模型未来将面临着传统深度学习时代YOLO模型一样的 轻量化、端侧部署、实时性能 等应用需求,这也是AIGC时代未来10年工业界、竞赛界以及学术界研究实践的重要方向。 Rocky在本章中也会持续补充能够优化Stable Diffusion系列模型性能的实用技术方法,方便大家学习与使用。 8.1 使用TF32精度加速SD模型训练与推理 TF32在性能和精度上实现了平衡。下面是TF32精度的一些作用和优势: 1. 加速训练速度:使用TF32精度可以在保持相对较高的模型精度的同时,加快模型训练的速度。 2. 减少内存需求:TF32精度相对于传统的浮点数计算(如FP32)需要更少的内存存储。这对于训练大规模的深度学习模型尤为重要,可以减少内存的占用。 3. 可接受的模型精度损失:使用TF32精度会导致一定程度的模型精度损失,因为低精度计算可能无法精确表示一些小的数值变化。然而,对于大多数深度学习应用,TF32精度仍然可以提供足够的模型精度。 8.2 使用FP16半精度加速 使用FP16半精度训练的优势: 减少了一半的内存占用,我们可以进一步将batch大小翻倍,并将训练时间减半。 一些GPU如V100, 2080Ti等针对16位计算进行了优化,能自动加速3 8倍。 8.3 对注意力模块进行切片 当模型中的注意力模块存在多个注意力头时,可以使用切片注意力操作,使得每个注意力头依次计算注意力矩阵,从而大幅减少内存占用,但随之而来的是推理时间增加约10%。 8.4 对VAE进行切片 和注意力模块切片一样,我们也可以对VAE进行切片,让VAE每次处理Batch(32)中的一张图片,从而大幅减少内存占用。 8.5 大图像切块 当想要生成4k或者更大的图像,并且内存不充裕时,可以使用图像切块的操作,让VAE的编码器与解码器对切块后的图像逐一处理,最后从容拼接生成大图。 8.6 CPU < GPU切换 可以将整个SD模型或者SD模型的部分模块权重加载到CPU中,只有等推理时再将需要的权重加载到GPU。 下面是再diffusers库中使用CPU < GPU切换的一个例子: 8.7 变换Memory Format 在CV领域,两种比较常见的memory format是channels first(NCHW)和channels last(NHWC)。将channels first转变成为channels last可能会提升推理速度,不过这也需要依AI框架和硬件而定。 在Channels Last内存格式中,张量的维度顺序为:(batch size, height, width, channels)。其中,batch size表示批处理大小,height和width表示图像或特征图的高度和宽度,channels表示通道数。 相比而言,Channels First是另一种内存布局,其中通道维度被放置在张量的第二个维度上。在Channels First内存格式中,张量的维度顺序为:(batch size, channels, height, width)。 选择Channels Last或Channels First内存格式通常取决于硬件和软件平台以及所使用的深度学习框架。不同的平台和框架可能对内存格式有不同的偏好和支持程度。 在一些情况下,Channels Last内存格式可能具有以下优势: 1. 内存访问效率:在一些硬件架构中,如CPU和GPU,Channels Last内存格式能够更好地利用内存的连续性,从而提高数据访问的效率。 2. 硬件加速器支持:一些硬件加速器(如NVIDIA的Tensor Cores)对于Channels Last内存格式具有特定的优化支持,可以提高计算性能。 3. 跨平台兼容性:某些深度学习框架和工具更倾向于支持Channels Last内存格式,使得在不同的平台和框架之间迁移模型更加容易。 需要注意的是,选择内存格式需要根据具体的硬件、软件和深度学习框架来进行评估。某些特定的操作、模型结构或框架要求可能会对内存格式有特定的要求或限制。因此,建议在特定环境和需求下进行测试和选择,以获得最佳的性能和兼容性。 8.8 使用xFormers加速SD模型训练与推理 使用xFormers插件能够让注意力模块优化运算,提升20%左右的运算速度。 8.9 使用 tomesd 加速SD模型推理 我们可以在使用xFormers插件的基础上,再使用tomesd插件,在无需额外训练的情况下整体上能够对SD系列模型达到5.4倍左右的提速,同时减少了内存消耗,并且仍能产生高质量的图像,具体效果如下图所示: xFormers插件+tomesd插件的加速效果 tomesd插件中的核心Token Merging(ToMe)技术通过减少SD模型需要处理的tokens数量(Prompt and Negative Prompt)来加速推理过程。在SD模型推理过程中许多tokens是冗余的,对这些冗余的tokens进行合并不会对出图质量产生太多影响。 由于是对tokens进行优化,所以ToMe技术对于Stable Diffusion全系列模型来说都是一个即插即用的高效辅助工具 。 实际操作中,tomesd插件中设置了一个控制参数来调节合并的tokens比例(0% 60%),具体效果如下图所示: ToMe设置不同tokens合并比例的效果 由上图的左半部分可以看到,ToMe技术主要作用在SD模型的CrossAttention模块,从而达到加速与降低显存的效果。 我们可以使用diffusers库来快速搭建SD系列模型的Pipeline,并使用tomesd工具进行加速,具体代码如下所示: 通常我们设置ratio参数为0.5即可获得较好的效果,这时SD模型加速约1.87倍,显存占用降低约3.83倍。 8.10 使用torch.compile加速SD推理速度 我们在SD系列模型准备推理之前,将模型传递给torch.compile函数进行预编译。这样,在实际推理时,SD系列模型就能以更高的效率运行。 torch.compile函数主要进行三方面的优化: 1. 优化模型推理路径: 通过分析SD模型的计算图(computation graph),torch.compile能够合并推理过程中的冗余操作、减少不必要的数据传输等。 2. 减少冗余计算: 在SD模型推理过程中,存在重复和不必要的计算操作,torch.compile通过对SD模型的预编译,有效减少冗余计算成本。 3. 硬件加速: torch.compile针对GPU、TPU等硬件平台进行优化,确保模型能够充分利用硬件资源。 下面是使用diffusers+torch.compile优化SD模型推理的例子: 通过上述优化,SD系列模型的前向推理速度可以提升20% 30%左右。 9. 推荐阅读 Rocky会持续分享AIGC的干货技术教程,经典模型讲解,实用的工具应用以及对AIGC行业的深度思考 ,欢迎大家多多 点赞,喜欢,收藏 ,给Rocky的义务劳动多一些动力吧,谢谢各位! 9.1 深入浅出完整解析Stable Diffusion XL核心基础知识 在此之前,Rocky也对 Stable Diffusion XL 的核心 基础知识 作了比较系统的梳理与总结: 9.2 深入浅出完整解析Stable Diffusion中U Net核心基础知识 同时对Stable Diffusion中 最为关键 的 U Net 结构进行了深入浅出的分析,包括其在传统深度学习中的形态和AIGC中的形态: 9.3 深入浅出完整解析LoRA核心基础知识 对于AIGC时代中的 “ResNet”——LoRA ,Rocky也进行了讲解,大家可以按照Rocky的步骤方便的进行LoRA模型的训练,繁荣整个AIGC生态: 9.4 深入浅出完整解析ControlNet核心基础知识 AI绘画作为AIGC时代的图像内容核心方向,开源社区已经形成以Stable Difffusion为核心,ConrtolNet和LoRA作为首要AI绘画辅助工具的变化万千的AI绘画工作流。 ControlNet正是让AI绘画社区无比繁荣的关键一环, 它让AI绘画生成过程更加的可控,有助于更广泛地将AI绘画应用到各行各业中 。 同时,由于Stable Diffusion + LoRA + ControlNet三巨头的强强联合,形成了一个变化多样的AI绘画“大框架”。 9.5 手把手教你如何成为AIGC算法工程师,斩获AIGC算法offer! 在AIGC时代中,如何快速转身,入局AIGC产业?成为AIGC算法工程师?如何在学校中学习AIGC系统性知识,斩获心仪的AIGC算法offer? Don‘t worry,Rocky为大家总结整理了全维度的AIGC算法工程师成长秘籍,为大家答疑解惑,希望能给大家带来帮助: 9.6 AIGC产业深度思考与分析 2023年3月21日,微软创始人比尔·盖茨在其博客文章《The Age of AI has begun》中表示,自从1980年首次看到图形用户界面(graphical user interface)以来,以OpenAI为代表的科技公司发布的AIGC模型是他所见过的最具革命性的技术进步。 Rocky也认为,AIGC及其生态链,会成为AI行业重大变革的主导力量。AIGC会带来一个全新的红利期,未来随着AIGC的全面落地和深度商用,会深刻改变我们的工作,生活,学习以及交流方式,许多行业都将被重新定义,过程会非常有趣。 2023年的“ 疯狂三月 ”,世界上主要科技公司与研究机构们争先恐后发布关于AIGC的最新进展,让人目不暇接,吃瓜群众们纷纷惊呼不已。那么,在狂欢过后,我们该如何更好的审视AIGC的未来?我们该如何更好地拥抱AIGC引领的革新? 接下来Rocky准备从技术,产品,长期主义等维度分享一些个人的核心思考与观点,希望能帮助各位读者对AIGC有一个全面的了解。 9.7 算法工程师的独孤九剑秘籍 为了 便于大家实习,校招以及社招的面试准备与技术基本面的扩展提升 ,Rocky将符合大厂和潜力独角兽价值的算法高频面试知识点撰写总结成 《三年面试五年模拟之独孤九剑秘籍》 ,并制作成 pdf版本 ,大家可在公众号 WeThinkIn 后台 【精华干货】菜单 或者回复关键词 “三年面试五年模拟” 进行取用。 Rocky一直在运营 技术交流群 (WeThinkIn 技术交流群),这个群的初心主要聚焦于AI行业话题的讨论与研究,包括但不限于算法,开发,竞赛,科研以及工作求职等。群里有很多AI行业的大牛,欢迎大家入群一起交流探讨~(请添加小助手微信Jarvis8866,邀请大家进群~) 编辑于 2024 03 18 17:44 ・IP 属地浙江 「真诚赞赏,手留余香」 赞赏 1 人已赞赏 🔗 原文链接: https://zhuanlan.zhihu.com/p/632809... https://zhuanlan.zhihu.com/p/632809... 目录 1. Stable Diffusion系列资源 2. 零基础深入浅出理解Stable Diffusion核心基础原理 2.1 通俗讲解Stable Diffusion模型工作流程(包含详细图解) 2.2 从0到1读懂Stable Diffusion模型核心基础原理(包含详细图解) 2.3 零基础读懂Stable Diffusion训练全过程(包含详细图解) 2.4 其他主流生成式模型介绍 3. Stable Diffusion核心网络结构解析(全网最详细) 3.1 SD模型整体架构初识 3.2 VAE模型 3.3 U Net模型 3.4 CLIP Text Encoder模型 3.5 SD官方训练细节解析 4. 从0到1搭建使用Stable Diffusion模型进行AI绘画(全网最详细讲解) 4.1 零基础使用ComfyUI搭建Stable Diffusion推理流程 4.2 零基础使用SD.Next搭建Stable Diffusion推理流程 4.3 零基础使用Stable Diffusion WebUI搭建Stable Diffusion推理流程 4.4 零基础使用diffusers搭建Stable Diffusion推理流程 4.5 Stable Diffusion生成示例 5. Stable Diffusion经典应用场景 5.1 文本生成图像 5.2 图片生成图片 5.3 图像inpainting 5.4 使用controlnet辅助生成图片 5.5 超分辨率重建 6. 从0到1上手使用Stable Diffusion训练自己的AI绘画模型(全网最详细讲解) 6.0 Stable Diffusion训练资源分享 6.1 Stable Diffusion模型训练初识 6.2 配置训练环境与训练文件 6.3 SD训练数据集制作 6.4 Stable Diffusion微调(finetune)训练 6.5 基于Stable Diffusion训练LoRA模型 6.6 SD训练结果测试评估 7. Stable Diffusion不同版本模型的对比 7.1 Stable Diffusion 2.0系列模型 7.2 Stable Diffusion 2.1系列模型 7.3 Stable Diffusion 1.6系列模型 7.4 SD Turbo模型 8. Stable Diffusion性能优化 8.1 使用TF32精度加速SD模型训练与推理 8.2 使用FP16半精度加速 8.3 对注意力模块进行切片 8.4 对VAE进行切片 8.5 大图像切块 8.6 CPU < GPU切换 8.7 变换Memory Format 8.8 使用xFormers加速SD模型训练与推理 8.9 使用tomesd加速SD模型推理 8.10 使用torch.compile加速S

在 小宇宙note 阅读完整内容