扩散模型尽管能生成高清晰度图像,但也带来巨大的计算要求,这与其他许多深度学习任务不同。这种固有的计算成本是其大规模部署相关工程难题的主要原因。了解这些需求的来源对设计高效且经济的部署策略来说十分重要。扩散过程的核心,特别是在推理(图像生成)阶段,涉及一个迭代精修过程。模型从随机噪声开始,经过一系列时间步(通常表示为 $T$),逐步对数据进行去噪。每个时间步都需要通过一个大型神经网络(通常是U-Net架构的变体)进行一次完整的正向传播。迭代去噪过程扩散模型中的图像生成不是像图像分类那样的单次操作。它通过模拟逆转噪声添加的逆向过程来运行。$$ x_{t-1} = \text{模型}(x_t, t) $$在这里,$x_t$ 表示时间步 $t$ 时的带噪声图像,模型预测一个噪声较小的版本 $x_{t-1}$ (或要减去的噪声本身)。这个预测步骤重复 $T$ 次,从纯噪声 ($x_T$) 开始,直到最终生成的图像 ($x_0$)。步骤数 $T$ 可以从几十到几千不等,具体取决于使用的模型和采样器。由于每个步骤都涉及评估整个神经网络,总计算成本与 $T$ 呈线性关系。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fontcolor="#495057"]; edge [color="#868e96"]; splines=ortho; "开始 (噪声)" [shape=ellipse, style=filled, fillcolor="#ced4da"]; "步骤 T" -> "步骤 T-1" -> "步骤 T-2" -> "..." -> "步骤 1" -> "最终图像 (x0)" [shape=ellipse, style=filled, fillcolor="#96f2d7"]; {rank=same; "步骤 T"; "步骤 T-1"; "步骤 T-2"; "..." ; "步骤 1"} "步骤 T" -> "模型评估 (U-Net)" [style=dashed, arrowhead=open]; "步骤 T-1" -> "模型评估 (U-Net)" [style=dashed, arrowhead=open]; "步骤 T-2" -> "模型评估 (U-Net)" [style=dashed, arrowhead=open]; "步骤 1" -> "模型评估 (U-Net)" [style=dashed, arrowhead=open]; "模型评估 (U-Net)" [shape=component, fillcolor="#a5d8ff"]; }图示说明了扩散模型推理的迭代特性。每个步骤都需要通过基础神经网络(通常是U-Net)进行一次正向传播。大型模型架构 (U-Net)扩散模型中使用的神经网络通常庞大且计算密集。U-Net架构在该方面很常见,具有导致其高成本的几个特性:参数数量: 最新的扩散模型通常包含数亿甚至数十亿参数。将这些参数加载到内存需要大量的GPU显存(通常超过10GB)。计算层: U-Net使用大量的卷积层、残差块,并且常有自注意力机制。卷积操作的计算量随输入分辨率和通道深度而增加。注意力机制: 自注意力层在捕捉长距离依赖方面很有效,但其计算复杂度与序列长度 $N$ 呈平方级 ($O(N^2)$) 关系。在图像方面,$N$ 对应于像素或图像块的数量,使得高分辨率生成特别耗费资源。通过这样一个网络的一次正向传播涉及大量的浮点运算 (FLOPs)。对于典型的512x512图像生成,一个步骤可能需要数百GFLOPs (千兆浮点运算) 甚至TFLOPs (万亿浮点运算)。内存带宽和显存消耗内存访问模式和容量是重要因素:模型权重: 存储大量参数需要大量的GPU显存。量化(在第2章讨论)可以有所帮助,但基准模型 (FP32或FP16) 对内存要求很高。中间激活: 在正向传播过程中,网络生成中间激活图。深度网络和注意力层,特别是在较高分辨率下,会产生大量必须存储在显存中的激活,可能比模型权重本身消耗更多的内存。批处理权衡: 尽管批处理请求可以提高GPU利用率和吞吐量,但它会使激活所需的内存成倍增加。对于对延迟敏感的应用,推理通常以批大小为1进行,限制了通过批处理进行吞吐量优化的效果。分辨率和时间步的影响计算成本对推理步骤数 ($T$) 和输出图像分辨率都非常敏感:分辨率: 增加图像尺寸(例如,从512x512到1024x1024)会大幅增加每步的FLOPs(由于卷积和注意力)以及激活所需的内存。这种增加通常是超线性的。时间步 ($T$): 总推理时间大约是单次模型评估持续时间的 $T$ 倍。早期的扩散模型需要 $T=1000$ 或更多。虽然新的采样器(第2章)可以显著减少 $T$(例如,到20-50),但与单次通过模型相比,总计算量仍然很大。{"layout": {"title": "计算成本:扩散与分类", "xaxis": {"title": "模型类型"}, "yaxis": {"title": "每次推理的大致GFLOPs", "type": "log"}, "font": {"family": "sans-serif", "size": 12, "color": "#495057"}, "paper_bgcolor": "rgba(0,0,0,0)", "plot_bgcolor": "rgba(0,0,0,0)"}, "data": [{"type": "bar", "x": ["ResNet-50 (分类)", "扩散 U-Net (1 步骤)", "扩散 U-Net (50 步骤)"], "y": [8, 500, 25000], "marker": {"color": ["#74c0fc", "#ffa94d", "#f06595"]}}]}单次推理的大致GFLOPs对比(对数刻度)。请注意,一次完整的扩散生成需要许多步骤,大幅增加了每步的成本。数值仅供参考。总而言之,大型神经网络(带有注意力的U-Net)、迭代多步去噪过程以及与权重和激活相关的内存需求的结合,使得扩散模型推理比许多传统深度学习任务明显消耗更多资源。这些因素直接转化为在生产环境中部署这些模型时,与延迟、吞吐量和基础设施成本相关的挑战。随后的章节将探讨通过优化和基础设施设计来减轻这些计算要求的策略。