当前位置: 首页 > news >正文

分布式推理框架 xDit

1. xDiT 简介

xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers(DiTs)设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术,以满足实时推理需求。

1.1 DiT 和 LLM

DiT(Diffusion Transformers)文生图与文生视频的核心网络结构。

DiT 和 LLM 推理任务特点不一样,这导致二者软件设计哲学也有差异:

1. LLM 有 Prefill 和 Decode 两阶段,分别是计算密集和访存密集的;而 DiT 的计算和 Prefill 相似是计算密集的。所以 Batching、Paged Attention 等为了增加 Decode 阶段计算密度的设计在 DiT 中不需要,其实也没有 KVCache 不断 Append 增长的现象。

2. LLM 模型很大,而序列长度有限,比如 ShareGPT 的任务生成顶多几百个 token。而 DiT 正好反过来,模型不大,推理时序列长度很长,甚至 Million 级别。这导致张量并行这种 vLLM 中第一优先级的并行方法,在 DiT 中性能很低。

3. LLM 模型大多收敛到微调 Llama 架构,而 DiT 架构则呈现出较大的差异性。例如,SD3、Latte 等网络与 Meta DiT 论文中的 DiT Block 在算子设计上存在显著差异,且 DiT Block 之间的连接方式也各不相同,常采用类似 U-Net 的 U 型结构进行链接。因此,DiT 模型的代码相对 LLM 不够简洁,往往涉及很多文件和函数,对其进行模型层面的改造也更具挑战性。

1.2 背景与挑战

DiT 模型在生成长视觉序列时的推理延迟显著增加,例如,Sora 模型的推理延迟可达数分钟,单个 GPU 无法满足实际应用的延迟要求。因此,DiT 模型的部署必然是多卡并行处理。Attention 机制导致的计算时间与序列长度呈二次增长,为了达到同样延迟指标,GPU 数应该随着序列长度平方项增长的,所有部署 Sore 很大概率需要多机多卡大集群执行单个视频生成,DiT 的并行推理扩展性至关重要。尽管大语言模型(LLMs)中常用的并行化技术,如张量并行序列并行,通信量和激活参数正相关,在扩散模型中由于大激活小参数特点,这些技术效率不高。通信成本往往超过了并行计算的好处。因此,DiT 模型的部署仍然需要配备高带宽互连(如 NVLink+RDMA)的 GPU 集群。

随着 DiTs 中输入上下文长度的增加,Attention 机制的计算需求呈二次方增长,因此多 GPU 和多机器部署对于满足在线服务的实时需求至关重要。

1.3 Diffusion Model 推理原理和特性

尽管 DiT 和 LLM 的结构相似都是 Transformers 架构,看起来工程挑战类似。

扩散模型的训练过程:给一个图片,经过很多步骤,每一步加噪声最后变成一个全是噪音的图片。训练过程就是预测一个 Noise Predictor 的监督学习任务,输入是中间状态图片、输入指令和 timestep 来 ground truth 就是该 timestep 的噪声。

扩散模型的推理过程:给一个噪声,通过 Noise Predictor 来通过多次去噪,最后变成一个有意义的图片。每一次去噪就是一个 Diffusion Step。

通过描述可知,扩散模型推理和 LLM 的有一个很大的差异点,就是扩散模型是重复计算很多相同的 Diffusion Step,而且连续的 Diffusion Step 之间输入数据和激活状态之间存在的高度相似性,称之为输入时间冗余(Input Temporal Redundancy)。这种冗余性表明,在进行相邻时间 Diffusion Step 去噪时,可以利用前一步骤的过期 Activation 来顶替当前步骤生成的 Activation 做一些计算,可能结果也不会差太多。

在 DiT 推理中,鉴于结构的相似性,可以用 LLM 中非常成熟的张量并行(TP)序列并行(SP),也可以使用一些利用扩散模型 Input Temporal Redundancy 特性的并行方法,比如 DistriFusion PipeFusion

1.4 xDiT Overview

正如 vLLM 让 transformers 具备 Batching 的能力xDiT 让 diffusers 有并行的能力。考虑到 DiT 的特点,首先提出了一系列创新的并行方式,并可以相互混合。更重要的是,xDiT 提供了一套优雅的开发接口,针对性解决了 DiT 模型更改难度高的问题,这套开发接口尽可能可能复用 diffusers 的现有逻辑,开发者通过一些 wrapper 实现复杂的混合并行,实现高效地扩展方法。将之前的 PipeFusion 项目升级成了通用的 DiT 推理引擎,命名为 xDiT。(向 vLLM 致敬,X表示Scalable,希望 xDiT 成为 DiT 推理领域的 vLLM)

vLLM=huggingface transformers+Batching,xDiT=huggingface diffusers+Parallel

xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers(DiTs)设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术,以满足实时推理需求。

xDiT 有如下核心能力:

第一,DiT 主干网络混合并行:xDiT 支持任意混合四种基础并行策略方法。基础并行方法有:

  • Pipefusion Parallel:TeraPipe 方式流水线并行方法,在弱互联,比如 pcie/以太网的网络硬件上有优势,比如以太网互联的多机多卡情境下效率远高于其他方法;

  • Sequence Parallel:混合序列并行,使用 ring & ulysses sequence parallel 混合方式 USP;

  • Data Parallel:在输入多个 prompt 或单个 prompt 生成多张图片时,在 image 间并行处理;

  • CFG Parallel, a.k.a Split Batch:在模型使用 classifier free guidance(CFG)时可以开启,并行度恒定为 2。

xDiT 中这四种并行方式可以以任何形式排列组合,混合策略在通信量和通信拓扑两方面可以取得最佳效果,使 xDiT 可达到近似线性的扩展性。

第二,Parallel VAE:针对扩散模型后处理的解码 VAE 模块在高分辨率图像生成时 OOM 问题,xDiT 实现了 Patch Parallel 版本的 VAE。

第三,简单灵活的开发接口:xDiT 轻松帮助用户支持新的 DiT 模型。它尽可能复用开源社区 diffuser,完成对模型推理的并行化改造。这套接口也是让 xDiT 从之前的不同并行方法集合变成一个灵活开发工具。通过 xDiT 接口,实测 15 分钟可以让 Pixart-Sigma 模型并行起来!

1.5 xDit 并行方法

  • 多GPU并行方法
    • PipeFusion:利用扩散模型的特性,通过位移Patch实现Patch级流水线并行
    • Unified Sequence Parallel (USP):将 DeepSpeed-Ulysses 和 Ring-Attention 结合起来的并行方法
    • Hybrid Parallel:混合并行,可配置多种并行方法以优化通信模式,适应底层网络硬件
    • CFG Parallel:也称为 Split Batch,在使用无分类器指导(CFG)时激活,保持恒定的并行度为2
    • Parallel VAE:并行 VAE
  • 单GPU加速方法:
    • 编译加速:xDiT 提供了 GPU 内核加速,以提高推理速度,torch.compile 和 onediff 这些编译加速与并行化方法结合使用
      • torch.compile:PyTorch 的一个特性,利用自动图优化、操作融合以及内核选择等技术,加速PyTorch模型的执行效率。在 xDiT 中,torch.compile 用于提升 GPU 上的单 GPU 性能
      • onediff:用于 PyTorch 的自动微分编译器,通过优化编译过程来提高模型的执行速度和效率
    • DiTFastAttn:xDiT还为单GPU加速提供了DiTFastAttn,它可以通过利用扩散模型不同步骤之间的冗余来降低注意力层的计算成本

xDiT 支持多种 Diffusion Transformers 模型,包括 CogVideoX、Flux.1、HunyuanDiT、SD3、Pixart、Latte 等。

针对以上不同的模型,xDiT目前实现了不同的方式对它进行并行推理加速。例如,Latte是文生视频模型,xDiT目前实现了USP方式对它进行并行推理加速,PipeFusion还在开发中,使用混合序列并行(ulysses_degree=2, ring_degree=4)可以获得最佳性能。CogVideo 是一个文本到视频的模型,xDiT 目前整合了 USP 技术(包括 Ulysses 注意力和 Ring 注意力)和 CFG 并行来提高推理速度,同时 PipeFusion 的工作正在开发中。

在使用不同GPU数目时,最佳的并行方案都是不同的,这说明了多种并行和混合并行的重要性。 例如,HunyuanDiT最佳的并行策略在不同GPU规模时分别是:在2个GPU上,使用ulysses_degree=2;在4个GPU上,使用cfg_parallel=2, ulysses_degree=2;在8个GPU上,使用cfg_parallel=2, pipefusion_parallel=4。torch.compile带来的加速效果也很可观。stable-diffusion-3最佳的并行策略在不同GPU规模时分别是:在2个GPU上,使用cfg_parallel=2;在4个GPU上,使用cfg_parallel=2, pipefusion_parallel=2;在8个GPU上,使用cfg_parallel=2, pipefusion_parallel=4。

2. Parallel Methods

2.1 PipeFusion

流水线并行

流水线并行属于层间并行,对模型不同的 Transformer 层间进行分割,模型被分割并分布不同的设备上,每一个设备只保存模型的一部分参数,在各层之间进行并行计算。

模型的不同层放置到不同的计算设备,可以降低单个计算设备的显存消耗。 如下图所示,例如把模型分成四个模型层,分别放置到四个不同的计算设备,即第 1 层放置到GPU 0,第 2 层放置到GPU 1,第 3 层放置到GPU 2,第 4 层放置到GPU 3。

前向计算过程中,输入数据首先在GPU 0 上通过第 1 层的计算得到中间结果,并将中间结果传输到GPU 1,然后在GPU 1 上计算得到第 2 层的输出,并将模型第 2 层的输出结果传输到GPU 2,在GPU 2 上计算得到第 3 层的输出,将模型第 3 层的输出结果传输到GPU 3,GPU 3 经由最后一层的计算最后得到前向计算结果。反向传播过程类似。

以上是训练过程,推理过程中没有反向传播,只有前向传播,最后一层的输出结果即为整个模型的推理输出。

流水线并行训练的一个明显缺点是训练设备容易出现空闲状态(因为后一个阶段需要等待前一个阶段执行完毕),导致计算资源的浪费。

PipeFusion

论文地址:https://arxiv.org/pdf/2405.14430 

PipeFusion 将输入图像分割成 M 个不重叠的 Patch,并将 DiT 网络均匀分成 N 个阶段,并按顺序分配到 N 个计算设备上

例如,下图表示在 N = 4 和 M = 4 的情况(将输入图像分割成了4个不重叠的Patch,P0、P1、P2、P3,并且将 DiT 网络均匀分成 4 个阶段,step0、1、2、3),反向扩散过程(推理)的流水线工作流程,横轴分为两个时间步:时间步 T(深灰色)和时间步 T+1(浅灰色),回顾SD的原理可知反向扩散从T+1步开始,纵轴 device 0 到 device 3 表示并行计算的 GPU。

流水线处理的概念是在一个设备完成当前任务并将结果传递给下一个设备时,它可以同时开始处理下一个Patch。例如,GPU0先处理patch P0,完成后将其传递给GPU1,自己开始处理patch P1,此时GPU1继续处理从GPU0接收的Patch0,以此类推。

不同Patch(P0、P1、P2、P3)的计算在不同设备上同时进行,在每个时间步内,不同设备处理不同的任务,整个计算过程是并行化的。



时间冗余与流水线优化:在并行计算的流水线架构中,存在一个流水线初始化阶段,即当开始计算时,设备之间需要传递数据以保持同步。这个过程会引入一些“空隙”或“延迟”,因为每个设备都需要等待上一个设备完成部分计算并传递给它。

为了克服这一延迟,采用了输入时间冗余的策略,即每个设备使用前一个时间步旧输出作为计算的上下文,避免了当前时间步的完全等待。这使得流水线能够尽早开始,而不必等待所有输出完全计算完成。

流水线的有效计算比例:$\frac{M\cdot S}{M\cdot S+N-1}$

  • M:输入图像被划分为的不重叠patches数量

  • N:DiT 网络被划分为的阶段(stages)数量

  • S:扩散时间步的数量(扩散模型通常需要多步迭代来逐渐去噪)

  • M⋅S:表示总的计算量,M⋅S 表示所有Patch在所有时间步中需要计算次数

  • N-1:流水线前面几步需要填补流水线中的空隙

假设 M = N = 4,扩散时间步 S = 50,带入公式:

$\frac{M \cdot S}{M \cdot S + N - 1} = \frac{4 \cdot 50}{4 \cdot 50 + 4 - 1} = \frac{200}{203} \approx 0.985 $

说明流水线的有效计算比例为98.5%,当扩散时间步S增加时,这个空隙占总计算时间的比例变小,整体效率提升。



2.2 USP: Unified Sequence Parallelism

序列并行

注意力机制的基本工作原理:Q 与 K 的转置进行点积计算,生成一个大小为 S×S 的注意力矩阵,注意力矩阵经过softmax操作后与 V 相乘,生成最终输出,这整个过程的内存复杂度是与序列长度呈二次方关系

近年来,随着生成性AI模型上下文长度的不断增长,例如,Claude在大型语言模型(LLMs)中将序列长度扩展到了100K个token,而OpenAI的GPT-4则将上下文长度扩展到了128K个token,为了能够训练超长上下文,通常需要使用一些复杂的并行策略。



序列并行(Sequence Parallelism,SP)是一种将输入张量的序列维度分到多个计算设备上的技术,将输入序列分割成多个子序列,并将每个子序列输入到其相应的设备(即 GPU)中。在序列并行中,模型通常不会被直接切分,而是每个设备都运行同一模型的一个完整副本,但输入数据是不同的序列片段。

上图展示了序列并行(Sequence Parallelism)的工作原理。在这种并行方式中,微批次(Micro Batches)被沿着序列维度均匀地分布到不同设备上,每个设备负责处理不同的序列片段,这样能够减少单个设备的内存开销,同时加速长序列的处理。每层的输出在设备之间同步传递。

上图展示了如何将序列数据划分到不同的设备上,并在每个设备上并行地执行注意力机制:

  • 输入序列被拆分成不同的部分(Qi, Ki, Vi等),Q、K、V分别代表查询(Query)、键(Key)、值(Value),序列中的每个元素的Q、K、V向量被分配到不同的设备上,分别在不同设备上进行计算
  • 图中有多个设备(Device i-1, i, i+1, i+2等),每个设备负责一部分序列的计算
  • 注意力计算:每个设备需要访问其他序列元素的K和V来计算注意力,因此,每个设备都会与相邻设备交换KV信息
  • 每个设备计算其对应序列元素的注意力输出

通过将序列数据分割并行处理,多个设备可以同时处理不同部分的数据,提高模型的性能和效率。



综上,序列并行的关键在于它能够有效地分配和管理大规模输入序列的计算任务,让模型能够处理更长的序列,不会受到单个设备内存限制的束缚。序列并行已成为训练和推理更长序列的一种有效方法。DeepSpeed-Ulysses和Ring-Attention标志着序列并行技术的成熟,这是目前两种最重要的序列并行方法。

DeepSpeed-Ulysses

论文地址:https://arxiv.org/pdf/2309.14509

DeepSpeed-Ulysses 是微软提出的简单、易用且高效用于支持具有极长序列长度的高效可扩展LLM训练的方法

多头注意力机制计算过程

  1. 输入向量 X:输入序列,每个元素的维度为 [N, d],其中 N 是序列长度,d 是隐藏层的维度

  2. 线性变换:输入 X 通过三个不同的线性变换(使用权重矩阵$ W_Q, W_K, W_V$)生成查询(Q)、键(K)和值(V),这三个矩阵的维度都是 [N, d]。

  3. 分头处理:生成的 Q, K, V 各自被分成多个“头”(这里的头数 $h_c$ = 4),每个头处理输入数据的一个子集,这可以帮助模型从多个子空间中并行学习信息,每个头的维度是 [N, $h_s$],其中 hs 是每个头的大小,等于 $d/h_c$

  4. 点积注意力

    1. 计算点积:对于每个头,计算查询 Q 和键 K’(K 的转置)的点积

    2. 缩放点积:通常,这个点积还会除以一个缩放因子( $h_s$ 的平方根)

    3. 应用 softmax 函数:对缩放后的点积结果应用 softmax 函数,生成一个注意力权重矩阵 S

  5. 生成输出

    • 加权和:使用注意力权重矩阵 S 对值 V 进行加权求和,得到每个头的输出 $P_h$

    • 连接:将所有头的输出连接起来,形成维度为 [N, d] 的矩阵 P
    • 最终线性变换:P 通过另一个权重矩阵$W_0$ 进行线性变换,得到最终的多头注意力输出

DeepSpeed- Ulysses 计算过程:

  1. 输入向量 X:输入数据 X 的维度为 [N, d],其中 N 是输入序列长度,d 是隐藏层的维度,输入数据被分割成 P 个部分,每部分的维度为 [N/P, d],分别送到 P 个处理器(GPU),这里假设 P = hc = 4,即 GPU 数量等于注意力头数

  2. 线性变换:每个GPU上的数据通过三个不同的[d, d]维度的线性变换矩阵$W_Q, W_K, W_V$生成局部的查询(Q)、键(K)和值(V)

  3. all-to-all 通信

    1. 发送:每个GPU需要将其计算得到的局部 Q、$K^T$和 V 发送到其他所有GPU,每个GPU都有完整的Q、$K^T$和 V

    2. 接收:每个GPU将接收其他GPU发送过来的Q、$K^T$和 V 分片,组合成全局 Q、$K^T$和 V

  4. 计算注意力

    1. 计算点积:每个GPU并行计算不同的注意力头的 Q 和 $K^T$的点积

    2. 缩放点积:除以一个缩放因子( hs 的平方根)

    3. 应用 softmax 函数:对缩放后的点积结果应用 softmax 函数,生成局部的注意力权重矩阵 S

  5. 生成输出

    1. 加权和:使用局部的注意力权重矩阵 S 对局部的值 V 进行加权求和,得到每个头的输出 $P_h$

    2. all-to-all 通信:再次使用 all-to-all 通信,将所有处理器上的$P_h$聚集起来,形成完整的输出 P

    3. 最终线性变换:聚集后的输出 P 通过权重矩阵 $W_0$ 进行线性变换,得到最终的多头注意力输出

对于每一个GPU送入处理的序列长度只是 N/P,这样大大减少了单个GPU的运算量,但同时,因为 All-To-All 通信方式的存在,做 Attention 时还是考虑了整体的长度。DeepSpeed-Ulysses 方法的特点是当序列长度和计算设备成比例增加时,通信量保持不变。

局限性:每个GPU并行计算不同的注意力头,Ulysses的SP并行度受限于注意力头数量(并行度不能超过头的数量)

Ring-Attention

GitHub:https://github.com/gpu-mode/ring-attention

💍Ring Attention,顾名思义,环形注意力,是另一种序列并行方法。

  • 数据块的计算顺序可以任意:在环形结构中,各个数据块(如Q、K、V)的计算顺序可以灵活安排,不必严格按照序列顺序
  • 将QKV序列分割到N个主机上:序列中的查询(Q)、键(K)和值(V)被分割并分配到多个处理单元(图中例为四个GPU)
  • 构成环状结构交换KV数据:每个GPU不仅计算分配到的数据块,各个GPU形成一个环形网络,其中每个GPU会向相邻的GPU发送和接收K和V数据。这样,每个GPU都能够获取到整个序列的K和V信息来计算注意力(所需的K和V块不在本GPU,则使用点对点(P2P)通信从其他GPU获取)
  • 单次循环完成所有KV部分的交换:通过环形网络的一次循环,每个GPU都能看到并处理所有的K和V数据
  • 长序列处理的零开销:同时进行计算和通信,在处理较长序列时,没有额外开销,这意味着随着序列长度的增加,系统的效率不会下降

Ring Attention Algorithm 详细算法步骤

  1. 输入和初始化

    1. 输入序列 x

    2. 主机数 Nh​:指的是参与计算的设备数量(GPU),这些设备将形成一个环状结构来交换数据

  2. 分割输入序列:输入序列被分割成 Nh​ 个块,每个块由一个GPU处理

  3. 计算查询、键、值(Q, K, V):每个GPU计算其对应块的查询(Q)、键(K)和值(V)

  4. 循环处理每个Transformer层

    对于Transformer中的每一层,执行以下步骤:
    1. 发送和接收K和V:每个GPU将其K和V块发送给下一个GPU,并从上一个GPU接收K和V块,这个过程在所有GPU中并发执行

    2. 计算注意力:每个GPU使用本地的Q、K、V块来计算注意力

  5. 计算前馈网络:使用注意力输出,每个GPU并发地计算feedforword前馈网络

  6. 结束:经过所有Transformer层的处理后,算法结束



USP

论文地址:https://arxiv.org/pdf/2405.07719

GitHub:https://github.com/feifeibear/long-context-attention?tab=readme-ov-file

USP(Unified Sequence Parallel) 结合了DeepSpeed-Ulysses和Ring-Attention两种序列并行方法,提出了“2D混合序列并行”的概念,这种混合并行方式不仅继承了两种方法各自的优点,还克服了它们各自的局限性。通过在序列维度上的混合并行策略,允许在不同的计算设备上分别运行DeepSpeed-Ulysses和Ring-Attention,从而优化了通信模式和计算效率。对比主流的DeepSpeed-Ulysses和Ring-Attention序列并行方式,USP在DiT场景下生图的性能提升到24%,在LLAMA2-7B场景的性能提升2倍以上。

USP方法核心思想是将计算过程分为两个正交的过程组:SP-Ring过程组和SP-Ulysses过程组,形成二维网格结构,它的算法流程包括:

1) 使用DeepSpeed-Ulysses方法的all-to-all交换query、key、value;

2) 各组内进行独立的Ring-Attention计算;

3) all-to-all通信使各组具有完整的Head Output结果

算法流程如下:

对image的切分逻辑如下:

  • 即在外层维度切分ring blocks,在ring block的内部切分ulysses block,每个device持有对应的ulysses block
  • 在进行计算时,同一个ulysses group所属的devices先进行all2all,相当于沿hidden dim方向切分image hidden state,保证每个device上有attention中一部分heads所需要的,属于目前ulysses group的所有kv
  • 随后,属于同一ring group的devices进行ring attention,通过online softmax的特性完成对整个attention结果的计算
  • 值得注意的是,ulysses的通信中需要对query,key,value三者均进行all2all,而ring attention中仅有kv需要进行p2p通信。并且在ring attention中,kv通信和attn技术是可重叠的。因此在低带宽连接的设备中,采用较高的ring degree与较低的ulysses degree通常能取得更好的加速效果



将上述算法展示成图的方式如下图所示:

  1. 输入数据分布:输入数据按序列维度拆分到4个GPU上,每个GPU上都有部分的序列,并且每个GPU上处理的注意力头(head)也是不一样的。比如,GPU0和GPU2负责head0,GPU1和GPU3负责head1(相当于GPU0和GPU1之间进行Ulysess并行,GPU0和GPU2之间进行Ring Attention并行)

  2. AlltoAll q k v:在进行多头自注意力计算之前,需要对query (q)、key (k)、value (v) 进行AlltoAll操作。在这个过程中,GPU0和GPU1之间会交换部分序列数据,GPU2和GPU3之间也会交换。这样,GPU0和GPU1都拥有相同的部分序列,但它们分别处理不同的head,GPU2和GPU3同理

  3. Ring Attention计算:这一阶段的目的是在多个GPU之间计算Attention分数。Ring Attention是通过在GPU0和GPU2之间、GPU1和GPU3之间的通信完成的;从图中可以看出,GPU0和GPU2具有所有数据(GPU0有一半数据,GPU2有另一半数据),相当于它们共享的序列数据是完整的,但是只有head0数据,所以它们会一起计算head0的Attention结果,同样,GPU1和GPU3有完整token数据,但是只有head1的数据,故GPU1和GPU3一起计算head1的attention结果

  4. AlltoAll输出:在完成Ring Attention计算之后,再次执行AlltoAll操作,将不同GPU上的head结果进行交换。GPU0和GPU1交换它们的计算结果,GPU0上就有了完整序列的head0和head1的结果,类似地,GPU2和GPU3也完成结果交换,每张卡上都有完整的head和序列的计算结果。例如,序列0-7拆分成是0-3和4-7,那么GPU0有0-3且head为0的计算结果,GPU1有0-3且head为1的计算结果,GPU2有4-7且head为0的计算结果,GPU3有4-7且head为1的计算结果,此时GPU0和GPU1的结果进行AlltoAll,GPU2和GPU3的结果进行AlltoAll,所以卡均获得完整head的数据,且序列完全拆分



2.3 Parallel VAE

项目代码:https://github.com/xdit-project/DistVAE

在高分辨率图片生成中,最后用于从潜在空间到像素空间转换的VAE开销很大,是整个生成过程的显存尖峰(Memory Spike),在主干网络生成结束后,添加了并行VAE的实现以支持高分辨率图片解码,提出DistVAE,避免OOM,并行高效地处理高分辨率图像

DistVAE 结合了两种关键策略:

  1. 序列并行将潜在空间中的特征映射划分为多个Patch,并在不同设备上执行序列并行VAE解码,将中间激活所需的峰值内存减少到1/N,其中N是所使用的设备数量

  2. Chunked Input Processing,分块输入处理:与MIT patch conv类似,将输入特征图分割成块,并将其顺序输入卷积算子,这种方法最大限度地减少了临时内存消耗

通过协同这两种方法,极大地扩展了VAE解码的能力。成功处理了高达 10240px 的图像分辨率,与默认 VAE 实现相比,提升了 11 倍。



相关文章:

分布式推理框架 xDit

1. xDiT 简介 xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers(DiTs)设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术,以满足实时推理需求。 1.1 DiT 和 LLM DiT(Diffusion Transformers&am…...

《Vue零基础入门教程》第十七课:侦听器

往期内容 《Vue零基础入门教程》第九课:插值语法细节 《Vue零基础入门教程》第十课:属性绑定指令 《Vue零基础入门教程》第十一课:事件绑定指令 《Vue零基础入门教程》第十二课:双向绑定指令 《Vue零基础入门教程》第十三课&…...

【人工智能-基础】SVM中的核函数到底是什么

文章目录 支持向量机(SVM)中的核函数详解1. 什么是核函数?核函数的作用:2. 核技巧:从低维到高维的映射3. 常见的核函数类型3.1 线性核函数3.2 多项式核函数3.3 高斯径向基函数(RBF核)4. 总结支持向量机(SVM)中的核函数详解 支持向量机(SVM,Support Vector Machine)…...

RoBERTa- 稳健优化的 BERT 预训练模型详解

一、引言 自 BERT(Bidirectional Encoder Representations from Transformers)问世,预训练语言模型在自然语言处理(NLP)领域掀起革命浪潮,凭卓越表现大幅刷新诸多任务成绩。RoBERTa 承继 BERT 架构&#x…...

20.(开发工具篇github)Git上次超过100M单文件

1:安装lfs git lfs install 2: 撤销所有更改(包括未暂存的更改) git reset --hard 3:查找大于100M的文件 find ./ -size 100M 4:加入到 track git lfs track “./data/geo_tif_zzjg/2023年_种植结构影像.tif” git lfs track “./data/geo_tif_zz…...

Redis使用场景-缓存-缓存击穿

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题,其中缓存穿透、击穿、雪崩在面试中问的最频繁,本文加了图解,希望帮助你更直观的了解缓存击穿😀 (放出之前写的针对实习面试的关于Redis生产问题的博…...

uniapp Electron打包生成桌面应用exe文件

1.uniapp Electron打包生成桌面应用exe文件 随着跨平台开发的需求日益增长,UniApp 成为了开发者们的首选之一。通过 UniApp,你可以使用 Vue.js 的语法结构和组件系统来构建原生应用、Web 应用甚至是桌面应用。本文将详细介绍如何使用 UniApp 将你的项目打包成 Windows 桌面端…...

【机器学习】Sigmoid函数在深层神经网络中存在梯度消失问题,如何设计一种改进的Sigmoid激活函数,既能保持其概率预测优势,又能避免梯度消失?

为了解决 Sigmoid 函数在深层神经网络中的梯度消失问题,可以设计一种改进的 Sigmoid 激活函数,使其同时具备以下特性: 减缓梯度消失问题:避免在输入值远离零时梯度趋于零的问题。保持概率预测能力:保留 Sigmoid 的单调…...

SpringBoot中实现EasyExcel实现动态表头导入(完整版)

前言 最近在写项目的时候有一个需求,就是实现动态表头的导入,那时候我自己也不知道动态表头导入是什么,查询了大量的网站和资料,终于了解了动态表头导入是什么。 一、准备工作 确保项目中引入了处理 Excel 文件的相关库&#xff…...

前端用到的一些框架

拖拽框架:Vue.Draggable Vue.Draggable是一款基于Sortable.js拖拽插件 官网:https://github.com/SortableJS/Vue.Draggable 分屏插件:fullPage.js fullPage.js 是一个基于 jQuery 的插件,它能够很方便、很轻松的制作出全屏网站…...

“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…...

10个Word自动化办公脚本

在日常工作和学习中,我们常常需要处理Word文档(.docx)。 Python提供了强大的库,如python-docx,使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本,帮助新…...

【青牛科技】D35摄氏温度传感器芯片,低功耗,静态工作电流小于60 μA

概述: D35是基于模拟电路的一种基本摄氏温度传感器,其作用是将感测的环境温度/物体温度精确的以电压的形式输出,且输出电压与摄氏温度成线性正比关系,转换公式为Vo0 10 mV / ℃*T(℃),0C时输出为…...

无分类编址的IPv4地址

/20含义:前20比特位为网络号,后面32-2012为主机号 路由聚合:找共同前缀 所有可分配地址的主机都能接收广播地址,...

LeetCode - #150 逆波兰表达式求值

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…...

如何避免数据丢失:服务器恢复与预防策略

在当今数字时代,数据对于个人和企业来说都至关重要。数据丢失可能会导致严重的财务损失、业务中断甚至法律责任。因此,采取措施防止数据丢失至关重要。本文将讨论服务器数据丢失的常见原因以及如何防止数据丢失的有效策略。 服务器数据丢失的常见原因 服…...

pytorch中model.eval的理解

在复现simsam的过程中,看到在线性评估部分的训练函数中设置了model.eval,不太理解,印象中一直觉得,model.eval会影响梯度的回传,这里来拨乱反正一下。 事实上,model.eval()主要影响 BatchNorm 和 Dropout 层的行为&am…...

【AI+教育】一些记录@2024.11.19-11.25

通向AGI之路:大型语言模型(LLM)技术精要 https://zhuanlan.zhihu.com/p/597586623 在Bert和GPT模型出现之前,NLP领域流行的技术是深度学习模型,而NLP领域的深度学习,主要依托于以下几项关键技术&#xff1…...

CSS变量用法及实践

目录 一、基本用法 1.1、定义变量 1.2、使用变量 1.3 、修改变量的值 二、命名规范 2.1、使用有意义的名称 2.2、使用命名空间 三、变量值类型 3.1、如果变量值是一个字符串,可以与其他字符串拼接,例如: 3.2、 如果变量值是数值&a…...

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档:它可以将复杂的HTML或XML文本转换为易于操作的树形结构…...

STM32 ADC --- 知识点总结

STM32 ADC — 知识点总结 文章目录 STM32 ADC --- 知识点总结cubeMX中配置注解单次转换模式、连续转换模式、扫描模式单通道采样的情况单次转换模式:连续转换模式: 多通道采样的情况禁止扫描模式(单次转换模式或连续转换模式)单次…...

使用PHP脚本实现GitHub API搜索与数据库同步

在现代软件开发中,自动化数据收集和同步是提高效率的关键。今天,我将分享一个我最近开发的PHP脚本,它能够自动从GitHub API搜索特定关键词的仓库,并将这些数据同步到MySQL数据库中。这个过程不仅涉及到API调用和数据处理&#xff…...

使用docker-compese部署SFTPGo详解

官网:SFTP & FTP as a Managed Service (SaaS) and On-premise 一、SFTPGo简介 SFTPGo 是一款功能强大的文件传输服务器软件。它支持多种协议(SFTP、SCP、FTP/S、WebDAV、HTTP/S)和多个存储后端。 借助 SFTPGo,您可以利用本地…...

JavaScript根据数据生成柱形图

分析需求 // 定义一个数组来存储四个季度的数据 dataArray = []// 循环4次,获取用户输入的数据并存储到数组中 for i from 0 to 3// 获取用户输入的数据inputData = 获取用户输入的第(i + 1)季度的数据// 将数据存入数组dataArray[i] = inputData// 遍历数组,根据数据生成柱…...

Android笔记【12】脚手架Scaffold和导航Navigation

一、前言 学习课程时,对于自己不懂的点的记录。 对于cy老师第二节课总结。 二、内容 1、PPT介绍scaffold 2、开始代码实操 先新建一个screen包,写一个Homescreen函数,包括四个页面。 再新建一个compenent包,写一个displayText…...

VirtualBox注册已有虚拟机:未能打开位于虚拟电脑E_INVALIDARG (0X80070057)

错误如下 解决办法1 产生虚拟机的机器,与当前使用机器不兼容。建议在当前机器重新产生虚拟机。比如我家里电脑是WIN7,公司电脑是WIN11。 原来的虚拟机内容,找老机器导出。 解决办法2(存疑) 搜索到一个说法&#xf…...

开发中使用UML的流程_08 PIM-4:定义操作及方法

目录 1、序列图概述 2、序列图调用方式 3、创建消息与销毁消息 4、几项建议 1、序列图概述 在PIM-4中,系统分析员可以用序列图来表达,系统内部一群对象合力完成某一个系统用例时,执行期间的交互情形。之后,序列图可能通过设计…...

软件设计 —— 检测按键单击、多击、长按或组合动作

目 录 按键单一动作识别按键组合动作识别 按键单一动作识别 带有按键的作品设计时,按键动作检测是必不可少的,如何判断按键是单击、双击、三击和长按动作呢? 1、定时器定时一个10ms周期 2、把按键检测函数放到这个周期内执行,即…...

【GPT】主要影响代谢的因素

代谢的快慢受到多种因素的影响,包括遗传、生活习惯和健康状况等。以下是主要影响代谢的因素: 1. 年龄 影响:年龄增长会导致基础代谢率(BMR)逐渐降低,这是因为随着年龄增加,肌肉量减少&#xff…...

LLM Agents can Autonomously Hack Websites 论文阅读

paper:LLM Agents can Autonomously Hack Websites abstract:近年来,大型语言模型(llm)已经变得越来越有能力,现在可以与工具交互(例如,调用函数),读取文档,并递归地调用自己。因此,这些llm现在可以作为代理自主运行。随着这些代理能力的提高,最近的工作推测了LLM代…...

STM32标准库-FLASH

FLASH模仿EEPROM STM32本身没有自带EEPROM,但是自带了FLASH存储器。 STM32F103ZET6自带 1M字节的FLASH空间,和 128K64K的SRAM空间。 STM32F4 的 SPI 功能很强大,SPI 时钟最高可以到 37.5Mhz,支持 DMA,可以配置为 SPI协…...

【机器学习】机器学习的基本分类-监督学习-决策树-ID3 算法

ID3(Iterative Dichotomiser 3)是决策树的一种构造算法,由 Ross Quinlan 在 1986 年提出。它主要用于分类问题,通过信息增益选择特征来构建决策树。ID3 假设数据是离散型特征,且不支持连续型数据。 1. 核心思想 划分标…...

nginx配置http及https

nginx配置http及https 1.动静分离2.负载均衡3.配置https4.请求重定向5.常用参数配置介绍 现在日常工作中的项目大多数都是采用前后端分离,就用到了nginx进行反向代理、处理静态资源等;因此,记录整理了nginx一些常用的配置; 1.动静…...

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段:1.Qfile Pro和2.Qsync Pro,实践使用中存在一些区别,针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…...

柔性数组详解+代码展示

系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…...

【oracle数据库提示oracle initialization or shutdown in process】

问题如下截图: 解决方案: 1.进入sqlplus,下图中红圈即处理方式 备注:redo03.log是数据库路径“E:\app\Administrator\oradata\MKDB3D\”下最新的归档日志文件 2.alter database open resetlogs 3.netmanager测试登录是否成功&am…...

面试题-RocketMQ的基本架构、支持的消息模式、如何保证消息的可靠传输

相关问题 1、RocketMQ的基本架构是怎样的?请简述各组件的作用。 2、RocketMQ支持哪几种消息模式(如点对点、发布/订阅)?请简要说明它们的区别。 3、如何使用Java客户端实现一个简单的消息生产者和消费者? 4、RocketMQ…...

VUE脚手架练习

脚手架安装的问题: 1.安装node.js,配置环境变量,cmd输入node -v和npm -v可以看到版本号(如果显示不是命令,确认环境变量是否配置成功,记得配置环境变量之后重新打开cmd,再去验证) 2.在安装cnmp时&#xf…...

在Scala中栈的认识

package gjhs114import scala.collection.mutableobject fx {队列 // def main(args: Array[String]): Unit { // val q1 mutable.Queue(1) // q1.enqueue(2) // q1.enqueue(3) // q1.enqueue(4) // // println(q1.dequeue())//出队 1 // println(q1.dequ…...

小程序-基于java+SpringBoot+Vue的音乐播放器小程序设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…...

在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)

人无完人,持之以恒,方能见真我!!! 共同进步!! 文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerror和perr…...

oracle to postgresql使用Oracle Golden Gate同步数据

参考 https://www.ktexperts.com/replication-to-gcp-postgresql-using-oracle-goldengate/ https://www.ktexperts.com/how-to-change-remote-trail-file-location-in-oracle-goldengate/...

基于Java Springboot校园导航微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse微信开发…...

【软件安全专题文档】系统安全设计规范,网络与信息系统安全设计规范,信息系统安全架构方案设计规范(Word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件项目全周期文档清单部分文件概览&a…...

【青牛科技】SCU2N60E/SCD2N60E N沟道增强型功率场效应晶体管采用Silicore先进的VDMOS技术生产

描述: 这些N沟道增强型功率场效应晶体管采用Silicore先进的VDMOS技术生产,为设计人员提供了卓越的开关性能、坚固的器件设计、低导通电阻和成本效益。 特点: 在VGS10V时,600V,2.0A,Rdson4.5Ω&#xff08…...

常见限流算法介绍 和 Spring Cloud Sentinel使用方式

sentinel 限流及熔断 为什么要限流呢?对于一些突发流量,如双11大促,甚至恶意攻击,这时系统的访问量远远超出系统的承受能力,如果不做任何保护措施, 服务器资源会耗尽,进而系统不可用。 限流就…...

工业齐套管理虚拟现实仿真模拟软件

工业齐套管理虚拟现实仿真模拟软件是与法国最大的汽车制造商合作开发的一款虚拟现实仿真模拟软件,借助身临其境的虚拟现实环境,无需停止生产线,即可模拟仓库和提货区域。 工业齐套管理虚拟现实仿真模拟软件不仅适用于汽车工业,安全…...

HarmonyOS(60)性能优化之状态管理最佳实践

状态管理最佳实践 1、避免在循环中访问状态变量1.1 反例1.2 正例 2、避免不必要的状态变量的使用3、建议使用临时变量替换状态变量3.1 反例3.2 正例 4、参考资料 1、避免在循环中访问状态变量 在应用开发中,应避免在循环逻辑中频繁读取状态变量,而是应该…...

Qt5语法的connect指定多个重载信号槽函数中的具体某一个

Qt5新语法的connect函数,使用起来更加简洁明了,但如果信号槽有同名的多个重载函数,只用类名和函数名就无法绑定,这时,可以使用qOverload来指定参数类型,例如: connect(ui->comboBox, qOverlo…...

Mysql远程工具Navicat Premium连接报错1130、2003解决方案

这里写自定义目录标题 1130报错:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/107d09a6fc324a46b922bf65cab81c58.png)2003报错: 1130报错: 原因: 连接异常 1130,没有远程登录权限。 解决方案&#xff…...