资讯动态

LlamaGen:自回归模型在图像生成领域挑战扩散模型

发布时间:2026/8/24 20:58:21 来源:尧图企业网站定制
1. 项目概述当Llama遇见图像生成最近在图像生成领域一个名为LlamaGen的项目引起了我的注意。它提出了一个非常大胆且反直觉的观点纯自回归模型AR在图像生成任务上可以超越当前如日中天的扩散模型Diffusion Models。这听起来有点不可思议对吧毕竟过去几年从DALL-E 2到Stable Diffusion扩散模型几乎统治了文生图、图生图等所有高质量图像生成场景。它们通过模拟一个从噪声到清晰图像的“去噪”过程取得了令人惊艳的效果。而自回归模型大家更熟悉的是它在自然语言处理NLP领域的统治地位比如GPT系列、Llama系列其核心是“下一个词预测”。简单来说就是根据已经生成的上文预测序列中的下一个词是什么。把这种“下一个词预测”的思路直接搬到图像生成上会是什么样子LlamaGen团队不仅这么想了还真的做出来了并且用实验数据表明在同等规模下这种“朴素”的自回归方法在ImageNet等基准测试上的FID分数越低越好可以优于扩散模型。这个项目本质上是一个开源工具包它提供了从图像“分词器”VQ-VAE到不同参数规模的自回归生成模型从1.11亿到31亿参数的完整代码和预训练权重。无论是想基于类别标签生成特定物体如“生成一张金毛犬的图片”还是根据文本描述生成复杂场景你都可以用它来尝试。对于研究者、算法工程师或者任何对生成式AI底层技术感兴趣、想亲手复现或深入理解自回归图像生成原理的开发者来说这都是一份不可多得的宝贵资源。2. 核心思路拆解为什么是自回归要理解LlamaGen的价值我们得先抛开对扩散模型的“路径依赖”重新审视图像生成的本质。图像是什么在计算机看来它就是一个巨大的、多维的数值矩阵比如256x256x3。生成图像就是凭空创造出这样一个符合某种约束如类别、文本描述的矩阵。2.1 扩散模型 vs. 自回归模型两种不同的生成哲学扩散模型的思路是“迭代求精”。它从一个完全随机的噪声图开始通过一个训练好的去噪网络一步步地、迭代地去除噪声最终得到清晰的图像。这个过程模拟了热力学中的扩散过程反向进行因此得名。它的优势在于每一步的预测目标相对“简单”预测噪声训练稳定并且天生支持多样化的生成和编辑操作如插值、引导。而自回归模型的思路是“顺序构建”。它把生成图像看作生成一个很长的“视觉词”序列。首先需要一个“图像分词器”如VQ-VAE将图像压缩并离散化成一串离散的编码Token。例如一张256x256的图片经过下采样率为16的分词器会变成16x16256个视觉Token。然后自回归模型如基于Llama架构的GPT的任务就是给定前面的所有Token或者加上条件信息如类别标签预测序列中的下一个Token是什么。一个个Token预测下去直到生成完整的序列最后再用分词器的解码器把这串Token还原成图像。那么LlamaGen的核心主张是什么它认为只要模型规模参数量、数据量足够大这种最朴素、最直接的“下一个Token预测”范式完全可以在图像生成质量上达到甚至超越为视觉任务精心设计了“归纳偏置”如U-Net的卷积结构的扩散模型。这挑战了一个固有观念处理图像这种二维结构数据必须使用具有空间先验的模型架构如CNN。LlamaGen使用了为语言设计的TransformerLlama几乎没有为图像引入额外的结构假设纯粹靠海量数据和巨大模型来学习视觉规律。2.2 项目亮点与核心贡献架构简洁性直接复用在大语言模型LLM领域被验证成功的Llama架构无需为图像任务设计复杂的网络结构如U-Net降低了模型设计和理解的复杂度。可扩展性Scaling Law项目明确探索了模型规模与性能的关系提供了从111M到3.1B不同参数量的模型。结果证实随着参数量的增加生成图像的FID分数持续下降性能稳步提升这符合大模型领域的“缩放定律”为未来更大规模的视觉自回归模型指明了方向。开源与可复现不仅公开了论文还提供了完整的训练代码、推理代码以及所有规模的预训练模型权重。这对于社区深入研究自回归图像生成至关重要。高性能推理优化集成了vLLM这一针对大语言模型的高性能推理框架实现了300%-400%的推理加速让大参数模型的实用化成为可能。3. 环境搭建与模型获取在开始动手之前我们需要准备好运行环境。LlamaGen基于PyTorch对硬件有一定要求尤其是运行更大的模型时。3.1 基础环境配置我个人的实验环境是Ubuntu 20.04配备了一张RTX 4090显卡24GB显存。对于3B以下的模型单张A100或4090基本可以胜任推理如果要运行3B模型或进行训练可能需要多卡或更高显存的设备。首先克隆项目仓库并安装基础依赖git clone https://github.com/FoundationVision/LlamaGen.git cd LlamaGen pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 根据你的CUDA版本调整 pip install -r requirements.txt注意项目要求torch2.1.0。务必确认你的CUDA驱动版本与PyTorch版本匹配。一个常见的坑是安装了不兼容的版本组合导致无法调用GPU。可以通过nvidia-smi查看CUDA版本然后去PyTorch官网查找对应的安装命令。3.2 预训练模型下载LlamaGen提供了多种预训练模型分为两类图像分词器VQ-VAE和自回归生成模型AR GPT。你需要根据任务选择对应的模型。图像分词器负责将图像编码为离散Token以及将Token解码回图像。主要有两种vq_ds16_c2i.pt: 下采样率16输出16x16的Token网格。适用于256x256图像生成16*16256。vq_ds8_c2i.pt: 下采样率8输出32x32的Token网格。适用于256x256图像生成8*32256通常能保留更多细节。自回归生成模型根据条件类别或文本生成Token序列。模型按参数量从小到大命名c2i_B_256.pt: 111M参数基于类别生成256x256图像。c2i_L_384.pt: 343M参数基于类别生成384x384图像。c2i_XL_384.pt: 775M参数基于类别生成384x384图像。c2i_XXL_384.pt: 1.4B参数基于类别生成384x384图像。c2i_3B_384.pt: 3.1B参数基于类别生成384x384图像。t2i_XL_stage1_256.pt: 775M参数基于文本生成256x256图像第一阶段训练。t2i_XL_stage2_512.pt: 775M参数基于文本生成512x512图像第二阶段微调。你可以使用wget或直接通过Hugging Face链接下载。我建议建立一个统一的模型存放目录方便管理mkdir -p ./pretrained_models cd ./pretrained_models # 示例下载类别条件生成用的分词器和343M模型 wget https://huggingface.co/FoundationVision/LlamaGen/resolve/main/vq_ds16_c2i.pt wget https://huggingface.co/FoundationVision/LlamaGen/resolve/main/c2i_L_384.pt cd ..3.3 可选语言模型安装用于文生图如果你要运行文本到图像的生成还需要安装额外的语言模型来编码文本提示词。根据项目language/README.md的说明它可能依赖于像CLIP这样的模型来获取文本特征。你需要cd language pip install -r requirements.txt请务必仔细阅读对应的README文件因为文本编码器的选择和处理流程会影响最终的生成效果。4. 核心模块解析图像分词器与自回归Transformer要玩转LlamaGen必须理解它的两个核心组件图像分词器VQ-VAE和自回归生成器GPT。它们是如何协同工作的4.1 图像分词器将图像“翻译”成视觉词汇想象一下我们要让一个只懂“文字序列”的模型Llama来处理图像第一步就必须把图像转换成它所能理解的“语言”也就是离散的Token序列。这就是VQ-VAEVector Quantized Variational AutoEncoder的作用。它的工作流程可以拆解为三步编码输入一张图像如256x256x3经过一个编码器网络通常是CNN输出一个维度更低但特征更丰富的张量例如16x16xCC是特征通道数。这个张量中的每一个空间位置16x16网格中的一个点对应一个特征向量。向量量化这是最关键的一步。我们预先定义了一个“码本”里面包含了K个原型特征向量。对于编码器输出的每一个特征向量我们在码本里找到与它最相似通常用欧氏距离度量的那个原型向量并用这个原型向量的索引一个整数例如0到K-1来替换原来的特征向量。这样连续的图像特征就被离散化成了一串整数索引。解码将这些整数索引通过查表的方式映射回对应的原型向量重建出16x16xC的特征图再通过一个解码器网络也是CNN上采样最终重建出原始尺寸的图像。在LlamaGen中分词器的选择直接影响后续生成的质量和效率vq_ds16下采样16倍一张256图变成256个Token。序列短自回归模型生成速度快但可能丢失一些高频细节。vq_ds8下采样8倍一张256图变成1024个Token。序列长4倍生成更耗时但重建保真度更高FID分数更好如表中所见从0.70降至0.59。实操心得选择分词器时需要在生成速度和质量之间权衡。对于快速原型验证或对细节要求不极高的场景ds16是更经济的选择。如果你追求极限质量并且有足够的算力耐心ds8配合大模型会带来惊喜。另外下载模型时务必确认分词器与生成模型是匹配的例如用ds16的分词器训练出的AR模型推理时也必须用同一个ds16分词器来解码。4.2 自回归生成器基于Llama的“视觉语言模型”拿到了图像的“词典”码本和“句子结构”Token序列接下来就需要一个“作家”来创作新的“视觉句子”了。这个作家就是基于Llama架构改造的自回归Transformer。它的工作原理与GPT完全一致输入表示对于类别条件生成类别标签如“金毛犬”对应的ID会被转换成嵌入向量作为生成序列的起始条件。对于文本条件生成文本会先通过一个语言模型如CLIP的文本编码器转换成特征向量再作为条件输入。序列建模模型将条件向量和已经生成的部分Token序列在开始时是空的或一个起始符一起输入Transformer。Transformer利用其强大的注意力机制分析当前序列的上下文信息以及条件信息。下一个Token预测模型最后一层的输出经过一个线性投影层映射到与码本大小K相同的维度上然后通过Softmax函数得到下一个位置是码本中每一个Token的概率分布。我们通常采用采样策略如Top-p采样从这个分布中选取下一个Token。迭代生成将新预测的Token追加到序列末尾作为新的输入重复步骤2和3直到生成指定长度的完整Token序列如16x16256个。为什么用Llama架构因为Llama在语言模型上已经被证明具有优秀的扩展性和性能。LlamaGen团队几乎原封不动地使用了它的Transformer块包括RMSNorm、SwiGLU激活函数、旋转位置编码RoPE只是调整了输入嵌入层和输出层的维度来适配视觉Token的词汇表大小。这强力地验证了“一个架构统治所有模态”的可能性。注意事项自回归生成是顺序的无法并行。生成1024个Token就需要进行102次前向传播。这就是为什么推理速度是AR模型的一大挑战也是为什么项目要集成vLLM进行优化。在本地实验时对于长序列如ds8生成一张图可能需要几十秒甚至几分钟请保持耐心。5. 实战演练从零开始生成第一张图理论说了这么多手痒了吗让我们实际运行代码生成第一张由自回归模型创造的图像。我们从最简单的类别条件图像生成开始。5.1 类别条件图像生成实战假设我们已经下载好了vq_ds16_c2i.pt分词器和c2i_L_384.pt343M参数模型。目标是生成一张基于ImageNet类别例如“波斯猫”类别ID是283的384x384图像。项目提供了便捷的采样脚本autoregressive/sample/sample_c2i.py。我们来看一下核心命令和参数python3 autoregressive/sample/sample_c2i.py \ --vq-ckpt ./pretrained_models/vq_ds16_c2i.pt \ --gpt-ckpt ./pretrained_models/c2i_L_384.pt \ --gpt-model GPT-L \ --image-size 384 \ --num-samples 4 \ --class-label 283 \ --seed 42参数解析--vq-ckpt: 指定VQ-VAE分词器模型的路径。--gpt-ckpt: 指定自回归生成模型GPT的路径。--gpt-model: 指定模型架构大小必须与--gpt-ckpt对应。可选GPT-B,GPT-L,GPT-XL,GPT-XXL,GPT-3B。--image-size: 生成图像的高度/宽度。必须是分词器下采样率的倍数对于ds16可以是256 384等。--num-samples: 一次性生成多少张图。批量生成可以更高效利用GPU。--class-label: ImageNet的类别ID0-999。如果不指定则会随机生成。--seed: 随机种子用于复现结果。运行后脚本会加载模型进行自回归采样最后通过分词器解码生成图像并保存为sample_c2i.png。你会看到一张或多张根据指定类别生成的图片。对于更大的模型如XXL 3B它们可能是用FSDP完全分片数据并行策略训练的加载时需要添加--from-fsdp参数python3 autoregressive/sample/sample_c2i.py \ --vq-ckpt ./pretrained_models/vq_ds16_c2i.pt \ --gpt-ckpt ./pretrained_models/c2i_XXL_384.pt \ --gpt-model GPT-XXL \ --from-fsdp \ --image-size 3845.2 文本条件图像生成实战文本生成图像需要额外的语言模型。确保你已经按照language/README.md安装好了相关依赖。假设我们下载了文生图专用的分词器vq_ds16_t2i.pt和模型t2i_XL_stage2_512.pt支持512x512生成。运行命令如下python3 autoregressive/sample/sample_t2i.py \ --vq-ckpt ./pretrained_models/vq_ds16_t2i.pt \ --gpt-ckpt ./pretrained_models/t2i_XL_stage2_512.pt \ --gpt-model GPT-XL \ --image-size 512 \ --prompt “A majestic eagle soaring above snow-capped mountains at sunrise, photorealistic, detailed plumage”--prompt: 你的文本描述。描述越详细、越具象模型越有可能生成符合你预期的图像。这个脚本会调用语言模型将你的提示词编码成条件向量然后引导自回归模型生成图像最终保存为sample_t2i.png。实操心得文生图的效果非常依赖于提示词工程。与Stable Diffusion类似你可以尝试添加质量修饰词如“masterpiece, best quality, ultra detailed, 8K”。指定风格如“digital art, illustration, photorealistic, oil painting”。使用否定提示词如果脚本支持如“--negative-prompt “blurry, ugly, deformed””。需要检查脚本是否实现了该功能。多跑几次不同的随机种子--seed因为自回归采样本身具有随机性可以获取多样化的结果。5.3 使用vLLM加速推理当模型很大如XXL 3B或需要高频生成时原始PyTorch推理可能较慢。LlamaGen集成了vLLM这是一个专为LLM推理设计的高性能库通过PagedAttention等优化技术可以极大提升吞吐量。使用vLLM服务的步骤稍复杂一些安装vLLMpip install vllm运行服务脚本项目提供了autoregressive/serve/sample_c2i.py。其参数与普通采样脚本类似但内部会调用vLLM的引擎。python3 autoregressive/serve/sample_c2i.py \ --vq-ckpt ./pretrained_models/vq_ds16_c2i.pt \ --gpt-ckpt ./pretrained_models/c2i_XXL_384.pt \ --gpt-model GPT-XXL \ --from-fsdp \ --image-size 384在我的测试中使用vLLM后生成速度有显著提升尤其是当需要连续生成多张图片时优势更明显。但请注意vLLM对模型格式和加载方式有特定要求如果遇到加载失败请仔细阅读autoregressive/serve/README.md并检查模型是否为vLLM兼容的格式。6. 训练你自己的LlamaGen模型如果你不满足于使用预训练模型想在自己的数据集上训练或者研究模型行为项目也提供了完整的训练代码。这是一个计算密集型任务需要强大的GPU集群。6.1 数据准备训练需要两个部分的数据训练VQ-VAE分词器需要大量无标签的图像。项目默认使用ImageNet数据集。你需要将ImageNet数据集整理成指定的格式通常是一个文件夹其中包含按类别分好的子文件夹或者是一个包含图片路径和标签的文本文件。训练自回归模型对于类别条件模型需要图像 类别ID对。对于文本条件模型需要图像 文本描述对。论文中使用了LAION-COCO5000万对和内部数据1000万对。数据准备的代码通常在datasets/目录下。你需要根据自己数据集的格式修改数据加载器。6.2 分词器训练分词器的训练目标是让重建的图像尽可能接近原图同时让离散化后的编码能够有效代表图像内容。训练命令大致如下具体参数请参考GETTING_STARTED.mdpython train_vq.py \ --data-path /path/to/your/image/folder \ --arch vq_ds16 \ # 或 vq_ds8 --batch-size 256 \ --lr 3e-4 \ --output-dir ./output_vq这个过程相对标准类似于训练一个VAE。训练完成后你会得到分词器的权重文件.pt这是后续训练自回归模型的前提。6.3 自回归模型训练这是最耗资源的阶段。以训练一个类别条件的GPT-L模型为例python train_ar.py \ --data-path /path/to/imagenet \ --vq-ckpt ./output_vq/checkpoint_best.pt \ # 使用你训练好的分词器 --arch GPT-L \ --tokens-per-epoch 100000000 \ # 每个epoch的token数用于控制数据量 --batch-size 128 \ --lr 1.5e-4 \ --warmup-steps 2000 \ --total-steps 500000 \ --output-dir ./output_ar关键参数解析--tokens-per-epoch: 这是大语言模型训练中常见的设置定义一个epoch处理多少Token而不是多少张图。因为图像被编码成Token序列一张图可能包含256或1024个Token。这个设置有助于稳定训练。--batch-size: 根据你的GPU显存调整。对于大模型可能需要使用梯度累积来模拟更大的批次。--total-steps: 总训练步数。训练一个中等规模的模型到收敛可能需要数十万步。对于超过1B参数的大模型你需要使用分布式训练策略如DDP分布式数据并行或FSDP完全分片数据并行。项目中提供了相应的启动脚本示例。踩坑记录训练自回归模型非常容易过拟合尤其是在数据量不足的情况下。务必使用强大的数据增强如随机裁剪、翻转、颜色抖动并在验证集上监控损失。如果验证损失很早就停止下降甚至上升而训练损失持续下降就是过拟合的典型信号需要增加数据增强强度或收集更多数据。7. 效果评估与对比分析如何判断LlamaGen生成图像的好坏除了主观的视觉评判在研究中我们主要依赖客观指标。7.1 核心评估指标FID与rFIDFID (Fréchet Inception Distance)这是图像生成领域最常用的指标。它通过比较生成图像和真实图像在Inception-v3网络特征空间中的分布距离来评估质量。FID值越低说明生成图像的质量和多样性越接近真实数据。LlamaGen论文中主要报告了这个指标。rFID (Reconstruction FID)这个指标专门用于评估图像分词器VQ-VAE的重建质量。它计算原始图像与经过“编码-解码”流程后的重建图像之间的FID。rFID越低说明分词器在压缩-重建过程中丢失的信息越少保真度越高。查看项目提供的表格我们可以看到分词器vq_ds8_c2i的rFID (0.59) 低于vq_ds16_c2i(0.70)证实了下采样率更低压缩率更低能带来更好的重建质量。自回归模型方面参数量从111M增加到3.1B在ImageNet 256x256上的FID从5.46稳步下降到2.18清晰地展示了缩放定律。7.2 与扩散模型的对比这是论文的核心论点。作者在相同的数据集ImageNet和相似的训练计算量下对比了LlamaGen和领先的扩散模型如ADM LDM。结果显示在参数量达到一定规模如775M后自回归模型可以达到甚至超越扩散模型的FID分数。这背后的启示是深刻的它表明对于生成建模这个任务模型架构的“归纳偏置”可能没有我们想象的那么不可或缺。当拥有足够的数据和计算资源时一个极其通用、结构简单的模型Transformer通过纯粹的自回归下一个Token预测可以学会任何复杂的数据分布包括高维的图像空间。当然这并不意味着扩散模型被淘汰。两者各有优劣自回归模型推理过程是顺序的速度慢但训练目标交叉熵损失简单稳定易于扩展。扩散模型推理过程可并行步骤DDIM等加速采样速度相对快具有更好的插值特性和精细编辑能力但训练过程相对复杂。8. 常见问题与故障排查在实际操作中你可能会遇到以下问题。这里我整理了一份排查清单问题现象可能原因解决方案RuntimeError: CUDA out of memory1. 模型太大超出GPU显存。2. 设置的--image-size或--num-samples太大。1. 换用更小的模型如GPT-B/L。2. 减小--image-size确保是下采样率的整数倍。3. 减小--num-samples或使用--batch-size如果脚本支持并设为1。4. 使用CPU模式不推荐极慢。KeyError: ‘model’或加载模型时报错模型权重文件格式不对或加载代码期望的键名不匹配。1. 确认下载的模型完整无误。2. 对于使用--from-fsdp的模型必须添加该参数。3. 检查PyTorch版本是否与模型训练时一致。生成的图像全是噪声或无意义色块1. 分词器与生成模型不匹配。2. 模型权重未正确加载。3. 采样温度等超参数设置极端。1.最可能的原因确保--vq-ckpt和--gpt-ckpt是配套的同一下采样率同一任务类型。2. 检查模型加载过程是否有警告或错误。3. 尝试使用默认参数不要随意修改--temperature如果支持。文生图提示词无效1. 语言模型未正确安装或加载。2. 文本编码流程出错。1. 仔细按照language/README.md安装所有依赖。2. 检查sample_t2i.py中关于语言模型路径的配置。使用vLLM时失败1. vLLM版本与PyTorch/CUDA不兼容。2. 模型格式不被vLLM支持。1. 创建新的虚拟环境严格按照vLLM官方文档安装。2. 尝试使用项目提供的专门用于vLLM的脚本和模型转换工具如果有。训练过程Loss为NaN1. 学习率过高。2. 数据中存在异常值如损坏的图片。3. 混合精度训练AMP不稳定。1. 大幅降低学习率如降为1e-5试跑。2. 检查数据加载器确保所有图像都能正常读取和转换。3. 关闭AMP使用全精度FP32训练虽然更慢但更稳定。最后分享一个调试小技巧当你遇到复杂问题时先从最简单的配置开始验证。例如先确保能用官方提供的预训练模型和命令在CPU上成功生成一张图片。然后再逐步切换到GPU尝试更大的模型最后再引入vLLM或自定义训练。这种渐进式的方法能帮你快速定位问题所在的环节。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价