FLUX文生图大模型算法解析与功能体验丨前沿多模态模型开发与应用实战第五期
仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
多模态生成大模型是近年来生成式人工智能领域的研究热点之一,尤其在文本到图像生成任务中展现出强大的表现力。这类模型通常融合语言和视觉两个模态,通过大规模Transformer架构与扩散式生成机制,实现对文本语义的理解与视觉内容的高质量生成。相比传统的图像生成模型,现代多模态生成模型具备更高的图文一致性、更强的风格控制能力以及更灵活的应用范围,广泛应用于AI绘画、智能设计、游戏制作、广告创意等场景。
本文将聚焦解析开源多模态扩散模型FLUX,这是一款参数规模高达百亿级的文本到图像生成模型,其在生成质量、图文一致性和效率方面均达到当前领先水平。FLUX采用了大规模双流Transformer架构,结合FlowMatching推理策略,能够在较少扩散步数内生成高保真图像。本文将以算法原理与代码实现解析为主线,并结合PaddleMIX套件进行实操体验。
背景
FLUX生成效果展示
FLUX模型构建在扩散模型理论基础之上。扩散模型通过对图像逐步添加噪声并训练模型学习如何去除噪声来生成新图像。在训练中,模型接收加入一定噪声的图像,并预测噪声的成分,使得去噪后能还原原始图像。这一过程可视为从纯噪声(如高斯噪声)逐步扩散到数据分布(真实图像)的反向过程。然而传统扩散模型的生成轨迹并非严格线性,往往需要数十步迭代采样才能得到清晰图像。
为提升生成效率,FLUX引入了RectifiedFlow技术。这一技术旨在拉直数据到噪声的生成路径,使扩散过程尽可能接近直线。简单来说,RectifiedFlow将从噪声生成数据的流优化为最短路径,从而大幅减少生成所需步骤。
需要注意的是,FLUX并非单一模型,而是一个模型家族,包含多个变体以平衡生成速度与效果,常见的版本包括:
FLUX.1[dev]:使用指导蒸馏(GuidanceDistillation)技术训练的模型,约120亿参数,生成质量仅次于专业版。其推理一般需要~50步采样,可支持长文本提示。
FLUX.1[schnell]:使用时间步蒸馏(TimestepDistillation)技术优化的快速模型。“Schnell”在德语中意为快速。该模型要求guidance_scale=0(不使用额外引导)并限制文本长度不超过256个标记。由于经过多步合并蒸馏,它能在4步左右的极少采样下生成合理图像。
FLUX.1[pro]:BlackForestLabs内部高阶模型,参数规模和生成质量进一步提升,是FLUX家族中的顶尖模型(目前未公开权重。
模型架构
多模态序列建模:模型同时处理文本和图像两种模态的序列信息。具体而言,FLUX使用两个文本编码器将输入提示映射为文本特征序列,同时将图像的潜码(latent)表示展开为图像特征序列。与SD3等模型类似,FLUX对图像潜空间特征采用了2×2Patch划分:将潜在特征图按2×2区块分组,展平后作为一系列图像token。这样做可以将原本二维的64通道、H×W大小的latent张量,变为长度为(H/2)(W/2)的序列,每个序列元素维度为patch_sizepatch_size*latent_channels。随后,模型通过线性层将图像patch序列和文本序列投影到统一的特征维度,并拼接在一起,送入Transformer进行建模。该设计使得Transformer的自注意力机制能够同时关注文本和图像token,实现跨模态的深度交互。
双流注意力机制:在具体实现上,FLUXTransformer采用了一种双流(Dual-Stream)与单流结合的模块设计。前若干层TransformerBlock执行双流注意力,即图像序列和文本序列各自经过自注意力和前馈网络,同时通过交叉注意力交互信息。这类似于将文本作为条件,通过交叉注意力影响图像特征,但特别之处在于文本序列本身也被图像特征反向更新。换言之,在双流模块中,图像token和文本token彼此双向注意力,互相影响对方的隐藏状态。这使文本特征能够动态融合图像上下文,而非始终保持静态。经过若干层双流交互后,Transformer后续层切换为单流模式,主要针对图像序列进行自注意力和特征变换,以细化图像表示。这种分段式的Transformer结构让模型既能充分利用文本条件指导,又能在后期聚焦图像细节重建。
大规模多头注意力:FLUXTransformer的隐藏维度和多头注意力规模也远超传统扩散模型。其注意力头数为24,每头维度128,总的内部特征维度达到3072(24×128)。文本和图像特征都被投影到这个3072维空间中进行融合。相比之下,StableDiffusionv1的UNet隐藏层约为3201280维,注意力头数8。更高的维度赋予FLUX更强的建模能力,但也增加显存需求。为缓解训练/推理压力,FLUX在注意力模块中引入了门控(Gating)机制:对每一层的注意力输出和MLP输出,均乘以一个可学习的门控参数后再与残差相加。这种gating技术有助于稳定超深Transformer的训练,控制不同层信息流的强度。此外,FLUX采用了旋转位置嵌入(RoPE)来为图像patch序列提供位置信息,确保Transformer知晓每个token对应的空间位置。模型使用三个轴的RoPE编码,涵盖二维空间尺寸和patch内局部坐标,以适配高分辨率生成。4步内完成,同时输出质量与多步采样相当。
双文本编码器:为了更好地理解和表示文本提示,FLUX引入了双文本编码器架构。它同时使用了CLIP和T5两种预训练文本模型来编码提示信息。第一编码器为CLIP文本编码器(如OpenAICLIPViT-L/14),长于捕获与视觉相关的语义和风格信息;第二编码器为T5编码器(如T5-v1.1-XXL),擅长理解长文本和复杂描述。FLUX对这两种编码器的输出加以区分利用:CLIP文本模型输出的池化文本向量(文本语义的全局Embedding)经线性层投影后,将融合进扩散Transformer的时间步嵌入,用于指导全局图像风格和语义;T5编码器输出的文本序列特征则经过线性变换后,作为扩散Transformer交叉注意力的文本token序列。这种双模文本嵌入方法类似于StableDiffusionXL的做法,将语言模型和对比学习模型各自的优势结合,使FLUX对文本的理解更加全面。尤其在较长或复杂提示下,T5编码器允许模型处理多达512个标记的文本长度,显著超过以往基于CLIP的77标记限制。同时,CLIP提供的全局嵌入可作为一种额外条件,帮助模型更好地对齐视觉语义。例如,FLUXPipeline默认会获取CLIP文本模型的[EOS]输出作为pooledembedding,并结合时间步嵌入形成扩散模型的条件向量,使模型对提示的整体语义有敏锐感知。
扩散指导蒸馏:在训练技术上,FLUX引入了GuidanceDistillation(指导蒸馏)和TimestepDistillation(时间步蒸馏)等新颖策略,以降低推理成本并保持图像质量。其中,指导蒸馏指的是将传统扩散模型依赖的分类器自由引导(CFG)过程融入到单个模型中。通常,扩散模型在推理时需要进行两次前向传递(一次带文本条件,一次不带条件),然后根据guidance_scale差异放大关键信号。通过蒸馏,让模型在训练中直接学习有引导情况下应输出的结果,从而在推理时仅需一次前向传递即可获得接近有引导的效果。简言之,模型本身被训练得更“听话”,减少了对额外引导计算的依赖。这使得FLUX.1[dev]模型在推理时,将guidance_scale设为3.5这样的中等值即可生成高细节图像,同时节省一半计算。时间步蒸馏则进一步针对采样步数进行压缩。通过逐步蒸馏或对抗训练等手段,FLUX.1[schnell]模型成功在4步迭代内生成清晰图像(相比原版需要数十步)。AdversarialDiffusionDistillation方法即属于此范畴,能将大模型的扩散过程压缩到1
综上,FLUX通过Transformer取代U-Net、融合双文本编码、引入校正流损失和蒸馏训练,达到了生成质量和效率上的新高度。在保持高分辨率细节和复杂场景理解方面,FLUX相比早期稳定扩散模型有显著提升。
代码解读
下面以PaddleMIX中FLUX的实现为例,对关键创新点的代码实现进行讲解。
PART01
FluxTransformer2DModel模块
以上代码展示了模型构造的关键部分:
self.inner_dim是Transformer隐藏维度(例如3072),通常由注意力头数×每头维度计算。
FluxPosEmbed实例用于生成旋转位置嵌入(RotaryPositionalEmbedding),适用于二维图像patch网格的位置编码。
time_text_embed是时间步嵌入与文本全局嵌入的融合模块。
transformer_blocks列表包含num_layers个FluxTransformerBlock,即双流Transformer块。默认19层,用于同时处理图像和文本两个流。
最后,通过norm_out(持续型AdaLN归一化)和proj_out输出线性层,将Transformer输出变换回原始latent形状。
下面我们深入FluxTransformerBlock(双流块)和FluxSingleTransformerBlock(单流块)的实现细节,看看双流和单流块在注意力和前馈层上的差异。
PART02
FluxTransformerBlock模块
双流块承担跨模态融合的任务,每层同时更新图像隐藏状态和文本隐藏状态。FluxTransformerBlock内部包含两套并行的子层:一套针对图像hidden_states,另一套针对文本encoder_hidden_states。每套都包括AdaLayerNorm(带时序嵌入调制的层归一化)、多头注意力、和前馈网络(FeedForward),但注意力层是共享的,实现图像-文本的交互。其构造如下:
双流块初始化时,设置了两套归一化和前馈,但共享一个注意力层:
AdaLayerNormZero是一种可调制的层归一化,初始时scale和bias为0,但在前向过程中将利用时间步嵌入提供的参数对归一化后的张量施加缩放和平移,以及门控系数。这里分别对图像(norm1)和文本(norm1_context)各用一个AdaLN。
FluxTransformerBlock的forward方法更能体现双流机制。关键步骤如下:
这段逻辑实现了图像-文本双流Transformer层的前向计算,流程可总结如下:
AdaLayerNorm调制:使用当前扩散时间步的嵌入,对图像和文本两个输入分别做AdaLN归一化。AdaLayerNormZero不仅返回归一化后的张量,还提取出若干调制参数:对于每个流,产生用于注意力输出的门控系数gate_msa、用于MLP输入的仿射变换参数scale_mlp和shift_mlp、以及MLP输出的门控系数gate_mlp。这些参数形状一般是[batch,dim]或[batch,],后续用来调整该层的输出幅度。
残差连接(注意力层):对注意力结果施加AdaLN提供的门控系数,然后加回各自的残差通道。这样图像特征经过自注意力并融合了文本信息,文本特征也在交互中得到更新(捕获与图像的关联)。
返回结果:最终,该层输出更新后的encoder_hidden_states(文本)和hidden_states(图像)。这两个将作为下一层FluxTransformerBlock的输入,实现逐层交替强化图像和文本的表示。注意在FP16情况下对结果裁剪,以避免数值溢出。
双流Transformer块每层都让图像和文本特征互相融合:图像latent通过交叉注意力“看”文本embedding,文本embedding也被图像特征影响更新。这类似StableDiffusion3的双流Transformer设计。Flux将若干这样的层堆叠,使得高层的图像特征已深度融合文本语义。
PART03
FluxSingleTransformerBlock模块
单流块仍然利用AdaLN(但Simple版)对特征进行归一化和调制,但内部流程相较双流块有几点不同:
AdaLayerNormZeroSingle返回的不是五个参数,而是norm后的hidden和一个门控系数gate。Single版的AdaLN对结构进行了简化,因为此时我们不再需要分别对注意力和MLP输出进行不同门控(它直接把二者concat后一起门控)。
前馈合并简化:Single块中,将注意力输出和MLP输出拼接后一起投射,然后通过proj_out线性层将拼接后的向量映射回dim长度,再乘以AdaLN提供的gate系数,最后加上残差。
这样的设计实质上等效于Transformer中的并行FFN和Attention路径,只是这里不是先后顺序叠加,而是并联后融合。
单流块执行标准Transformer对图像latent的自注意力和前馈,但由于文本信息已嵌入,它不显式处理文本。Single块采用更紧凑的并行融合方式,最终继续细化图像latent。
PART04
PromptEmbedding融合机制
FluxPipeline需要将用户输入的文本提示经过两个文本编码器(CLIP和T5)得到embedding,然后送入FluxTransformer2DModel。该过程涉及两个方面:
FLUX将扩散时间步和上述全局文本embedding融合为一个向量,用于调制Transformer层。这由CombinedTimestepTextProjEmbeddings模块完成。其代码表示如下:
CombinedTimestepTextProjEmbeddings将两种不同来源的embedding简单逐元素相加。这样产生的输出向量既包含当前扩散步骤的信息,也包含了与提示文本内容相关的全局语义。这个temb将在Transformer每层的AdaLayerNorm中使用,从而影响模型中不同层的归一化和门控参数,实现条件控制。
包含两个过程:
CLIP编码:得到pooled_prompt_embeds,即CLIP文本模型的池化输出。
T5编码:得到prompt_embeds,即T5编码器最后一层隐状态序列(长度等于文本token数)。
随后,Pipeline会对这些embedding进行扩展维度,然后调用FluxTransformer2DModel时传入。通过这种双编码器方案,Flux模型结合了丰富的文本上下文(T5大模型提供更长更详细的语义序列)和强语义对齐的句向量(CLIP提供图文对齐的embedding)。前者用于细粒度引导图像生成(通过cross-attention作用于每层latent),后者用于全局风格/内容控制(通过temb影响模型层参数)。这种策略在StableDiffusionXL中也有体现,能提升文本到图像生成的表现。
PART05
FlowMatchEulerDiscreteScheduler采样
时间步与sigma设置
调度器支持动态调整sigma序列,以适应不同图像分辨率或所需风格:
shift(默认1.0)控制sigma时间的平移/形变。如果shift!=1,会对原始sigma值进行非线性挤压或拉伸。当shift>1时,高sigma段被压缩,低sigma段拉长,反之亦然。这样可以控制生成图像的多样性和稳定性(shift大→变化快,细节丰富;shift小→平滑收敛)。
单步Euler更新公式
FlowMatchEulerDiscreteScheduler采用一阶Euler方法求解扩散逆过程的微分方程。每一步的更新逻辑在其step函数中实现,简化过程如下:
我们以FLUX.1-dev为例,在单卡A100上进行效果演示,需要40G显存。
在安装好paddlepaddle-gpu后,执行以下shell脚本安装PPDiffusers:
PART01
文生图
运行以下命令即可根据一段文本生成相应的图片:
图片生成效果如下:
FluxPipeline生成图片
PART02
图生图
运行以下命令即可根据一段文本和一张底图生成相应的图片:
图片生成效果如下:
FluxImg2ImgPipeline输入图片
FluxImg2ImgPipeline生成图片
总结
在跨模态生成技术领域,FLUX引入了全新架构,显著提升了图像生成的质量。百度飞桨团队推出的PaddleMIX套件现已完整实现推理全流程支持。通过深入分析其代码实现,研究人员和开发者能够更清晰地掌握模型的核心技术细节与创新要点。
FLUX是由BlackForestLabs开发的文本到图像生成模型,采用混合多模态和并行扩散Transformer架构,结合流匹配技术,旨在提升生成图像的质量和效率。
活动预告
为了帮助您快速体验多模态扩散模型FLUX在多模态文生图领域展现的强大能力,我们将开展“多模态大模型PaddleMIX产业实战精品课”,通过解析代码来深入理解模型的实现细节和技术创新,4月21日正式开营,报名即可免费获得项目消耗算力(限时一周),名额有限,立即扫描下方二维码预约吧!
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~