FLUX文生图大模型算法解析与功能体验丨前沿多模态模型开发与应用实战第五期

多模态生成大模型是近年来生成式人工智能领域的研究热点之一,尤其在文本到图像生成任务中展现出强大的表现力。这类模型通常融合语言和视觉两个模态,通过大规模Transformer架构与扩散式生成机制,实现对文本语义的理解与视觉内容的高质量生成。相比传统的图像生成模型,现代多模态生成模型具备更高的图文一致性、更强的风格控制能力以及更灵活的应用范围,广泛应用于AI绘画、智能设计、游戏制作、广告创意等场景。

本文将聚焦解析开源多模态扩散模型 FLUX,这是一款参数规模高达百亿级的文本到图像生成模型,其在生成质量、图文一致性和效率方面均达到当前领先水平。FLUX 采用了大规模双流 Transformer 架构,结合 Flow Matching 推理策略,能够在较少扩散步数内生成高保真图像。本文将以算法原理与代码实现解析为主线,并结合 PaddleMIX 套件进行实操体验。

一、背景

FLUX 模型是由 Black Forest Labs 团队推出的一系列文本生成图像模型,其核心采用了扩散 Transformer架构 。例如,FLUX.1 [dev] 版本包含了约 120 亿参数,是一种校正流(Rectified Flow)Transformer 模型,可以根据文本描述生成高保真图像 。

FLUX生成效果展示

FLUX 模型构建在扩散模型理论基础之上。扩散模型通过对图像逐步添加噪声并训练模型学习如何去除噪声来生成新图像。在训练中,模型接收加入一定噪声的图像,并预测噪声的成分,使得去噪后能还原原始图像 。这一过程可视为从纯噪声(如高斯噪声)逐步扩散到数据分布(真实图像)的反向过程。然而传统扩散模型的生成轨迹并非严格线性,往往需要数十步迭代采样才能得到清晰图像。

为提升生成效率,FLUX 引入了Rectified Flow技术。这一技术旨在拉直数据到噪声的生成路径,使扩散过程尽可能接近直线 。简单来说,Rectified Flow 将从噪声生成数据的流优化为最短路径,从而大幅减少生成所需步骤 。

需要注意的是,FLUX 并非单一模型,而是一个模型家族,包含多个变体以平衡生成速度与效果,常见的版本包括:

  • FLUX.1 [dev]:使用指导蒸馏(Guidance Distillation)技术训练的模型,约120亿参数,生成质量仅次于专业版 。其推理一般需要 ~50 步采样,可支持长文本提示 。
  • FLUX.1 [schnell]:使用时间步蒸馏(Timestep Distillation)技术优化的快速模型。“Schnell”在德语中意为快速。该模型要求 guidance_scale=0(不使用额外引导)并限制文本长度不超过 256 个标记 。由于经过多步合并蒸馏,它能在 4 步左右的极少采样下生成合理图像 。
  • FLUX.1 [pro]:Black Forest Labs 内部高阶模型,参数规模和生成质量进一步提升,是 FLUX 家族中的顶尖模型(目前未公开权重)。

二、模型架构

FLUX 采用纯 Transformer 架构的扩散模型(Diffusion Transformer),这种架构也称为“Rectified Flow Transformer”,旨在结合 Transformer 全局建模能力和扩散模型的逐步生成过程。与 Stable Diffusion v1.x ~ 2.x 相比,FLUX 在架构上有几大显著创新:

  • 多模态序列建模: 模型同时处理文本和图像两种模态的序列信息。具体而言,FLUX 使用两个文本编码器将输入提示映射为文本特征序列,同时将图像的潜码(latent)表示展开为图像特征序列。与 SD3 等模型类似,FLUX 对图像潜空间特征采用了2×2 Patch 划分:将潜在特征图按 2×2 区块分组,展平后作为一系列图像token 。这样做可以将原本二维的64通道、H×W大小的latent张量,变为长度为 (H/2)(W/2) 的序列,每个序列元素维度为 patch_sizepatch_size*latent_channels。随后,模型通过线性层将图像patch序列和文本序列投影到统一的特征维度,并拼接在一起,送入 Transformer 进行建模 。该设计使得 Transformer 的自注意力机制能够同时关注文本和图像token,实现跨模态的深度交互。
  • 双流注意力机制: 在具体实现上,FLUX Transformer采用了一种双流(Dual-Stream)与单流结合的模块设计。前若干层 Transformer Block 执行双流注意力,即图像序列和文本序列各自经过自注意力和前馈网络,同时通过交叉注意力交互信息。这类似于将文本作为条件,通过交叉注意力影响图像特征,但特别之处在于文本序列本身也被图像特征反向更新。换言之,在双流模块中,图像token和文本token彼此双向注意力,互相影响对方的隐藏状态。这使文本特征能够动态融合图像上下文,而非始终保持静态。经过若干层双流交互后,Transformer 后续层切换为单流模式,主要针对图像序列进行自注意力和特征变换,以细化图像表示 。这种分段式的Transformer结构让模型既能充分利用文本条件指导,又能在后期聚焦图像细节重建。
  • 大规模多头注意力: FLUX Transformer 的隐藏维度和多头注意力规模也远超传统扩散模型。其注意力头数为 24,每头维度 128,总的内部特征维度达到 3072(24×128) 。文本和图像特征都被投影到这个3072维空间中进行融合。相比之下,Stable Diffusion v1的UNet隐藏层约为 320~1280 维,注意力头数 8。更高的维度赋予 FLUX 更强的建模能力,但也增加显存需求。为缓解训练/推理压力,FLUX 在注意力模块中引入了门控(Gating)机制:对每一层的注意力输出和MLP输出,均乘以一个可学习的门控参数后再与残差相加 。这种 gating 技术有助于稳定超深Transformer的训练,控制不同层信息流的强度。此外,FLUX 采用了旋转位置嵌入(RoPE)来为图像patch序列提供位置信息,确保 Transformer 知晓每个token对应的空间位置。模型使用三个轴的 RoPE 编码,涵盖二维空间尺寸和patch内局部坐标,以适配高分辨率生成。
  • 双文本编码器: 为了更好地理解和表示文本提示,FLUX 引入了双文本编码器架构。它同时使用了 CLIP 和 T5 两种预训练文本模型来编码提示信息 。第一编码器为 CLIP 文本编码器(如 OpenAI CLIP ViT-L/14),长于捕获与视觉相关的语义和风格信息;第二编码器为 T5 编码器(如 T5-v1.1-XXL),擅长理解长文本和复杂描述。FLUX 对这两种编码器的输出加以区分利用:CLIP 文本模型输出的池化文本向量(文本语义的全局Embedding)经线性层投影后,将融合进扩散 Transformer的时间步嵌入,用于指导全局图像风格和语义 ;T5 编码器输出的文本序列特征则经过线性变换后,作为扩散 Transformer交叉注意力的文本token序列。这种双模文本嵌入方法类似于 Stable Diffusion XL 的做法,将语言模型和对比学习模型各自的优势结合,使 FLUX 对文本的理解更加全面。尤其在较长或复杂提示下,T5 编码器允许模型处理多达 512 个标记的文本长度 ,显著超过以往基于 CLIP 的77标记限制。同时,CLIP 提供的全局嵌入可作为一种额外条件,帮助模型更好地对齐视觉语义。例如,FLUX Pipeline 默认会获取 CLIP 文本模型的[EOS]输出作为pooled embedding,并结合时间步嵌入形成扩散模型的条件向量,使模型对提示的整体语义有敏锐感知。
  • 扩散指导蒸馏: 在训练技术上,FLUX 引入了 Guidance Distillation(指导蒸馏)和 Timestep Distillation(时间步蒸馏)等新颖策略,以降低推理成本并保持图像质量。其中,指导蒸馏指的是将传统扩散模型依赖的分类器自由引导(CFG)过程融入到单个模型中。通常,扩散模型在推理时需要进行两次前向传递(一次带文本条件,一次不带条件),然后根据 guidance_scale 差异放大关键信号 。通过蒸馏,让模型在训练中直接学习有引导情况下应输出的结果,从而在推理时仅需一次前向传递即可获得接近有引导的效果。简言之,模型本身被训练得更“听话”,减少了对额外引导计算的依赖。这使得 FLUX.1 [dev] 模型在推理时,将 guidance_scale 设为 3.5 这样的中等值即可生成高细节图像 ,同时节省一半计算。时间步蒸馏则进一步针对采样步数进行压缩。通过逐步蒸馏或对抗训练等手段,FLUX.1 [schnell] 模型成功在 4 步迭代内生成清晰图像 (相比原版需要数十步)。 Adversarial Diffusion Distillation 方法即属于此范畴,能将大模型的扩散过程压缩到1~4步内完成,同时输出质量与多步采样相当 。

综上,FLUX 通过Transformer取代U-Net、融合双文本编码、引入校正流损失和蒸馏训练,达到了生成质量和效率上的新高度。在保持高分辨率细节和复杂场景理解方面,FLUX 相比早期稳定扩散模型有显著提升 。

三、代码解读

下面以 PaddleMIX 中FLUX的实现为例,对关键创新点的代码实现进行讲解。

PART 01

FluxTransformer2DModel模块

Flux 的核心模型是 FluxTransformer2DModel,本质上是一个扩散 Transformer。它接收编码后的图像潜空间(通常64通道的latent特征)以及文本嵌入,输出去噪后的图像latent。FluxTransformer2DModel内部堆叠了多层 Transformer 块,其中前几层是双流 Dual-Stream块(同时更新图像和文本流,类似论文中的 MMDiT),后续层是单流 Single-Stream块(仅更新图像流,类似原始 DiT)。以下展示了模型初始化主要组件:

class FluxTransformer2DModel(nn.Layer):
    def __init__(self, ..., num_layers=19, num_single_layers=38, ...):
        super().__init__()
        self.inner_dim = num_attention_heads * attention_head_dim
        self.pos_embed = FluxPosEmbed(theta=10000, axes_dim=(16, 56, 56))
        self.time_text_embed = CombinedTimestepTextProjEmbeddings(
            embedding_dim=self.inner_dim, pooled_projection_dim=768
        )
        # 文本上下文嵌入线性投射:将文本序列embedding降维到inner_dim
        self.context_embedder = nn.Linear(joint_attention_dim, self.inner_dim)
        # 图像latent嵌入线性层:将输入图像通道数投射到inner_dim
        self.x_embedder = nn.Linear(in_channels, self.inner_dim)
        # 双流 Transformer 块列表
        self.transformer_blocks = nn.LayerList([
            FluxTransformerBlock(dim=self.inner_dim, 
                                  num_attention_heads=num_attention_heads,
                                  attention_head_dim=attention_head_dim)
            for _ in range(num_layers)
        ])
        # 单流 Transformer 块列表
        self.single_transformer_blocks = nn.LayerList([
            FluxSingleTransformerBlock(dim=self.inner_dim, 
                                       num_attention_heads=num_attention_heads,
                                       attention_head_dim=attention_head_dim)
            for _ in range(num_single_layers)
        ])
        # 输出层归一化和线性投射,将inner_dim投射回图像patch的像素维度
        self.norm_out = AdaLayerNormContinuous(self.inner_dim, self.inner_dim, ...)
        self.proj_out = nn.Linear(self.inner_dim, patch_size*patch_size*out_channels)

以上代码展示了模型构造的关键部分:

  • self.inner_dim 是 Transformer 隐藏维度(例如 3072),通常由注意力头数 × 每头维度计算。
  • FluxPosEmbed 实例用于生成旋转位置嵌入(Rotary Positional Embedding),适用于二维图像patch网格的位置编码。
  • time_text_embed 是时间步嵌入与文本全局嵌入的融合模块。
  • context_embedder 是一个线性层,用于将文本编码器输出的上下文序列(如T5文本encoder输出,尺寸joint_attention_dim=4096)投射到Transformer内部维度。换言之,文本每个Token的高维embedding将降维为与图像latent相同的维度,以便进入Transformer的注意力计算。
  • x_embedder 是一个线性层,将输入的图像latent通道数 (in_channels,默认64) 转为 inner_dim。FLUX模
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值