第一次用AI生图,出来一只六条腿的猫——直到我拆开了扩散模型的6步推理过程

207 阅读10分钟

AI 图片生成完全指南:扩散模型与 DiT 架构

AI 图片生成的核心不是"写对 prompt"——是理解扩散模型怎么从噪声中找回图片。这篇文章给你三条路线:原理线——扩散模型 6 步推理(加噪→UNet 预测噪声→去噪→重复),6 行代码跑通 SD 推理;架构线——UNet 到 DiT 的代际对比(为什么 FLUX 用 Transformer 替代 UNet);实战线——FLUX vs SD 3.5 选型 + 提示词工程五要素。三条线走完,从"乱出图"到"能控图"。

阅读约 22 分钟 | 系列第 5/14 篇


⚠️ 时效性提示:本文基于 2026 年 7 月的技术状态撰写。大模型版本迭代迅速(通常 3-6 个月一次大版本更新),文中涉及的模型名称、API 端点及性能基准数据请以各厂商最新公告为准。建议重点关注文章中的架构原理与设计决策——这些内容具有更长的时效性。

一、能力全景:AI 在图片与视频领域的边界

1.1 六类图片任务

                    输入             输出              典型用例
─────────────────────────────────────────────────────────────
① 文生图         一段文字          一张新图           根据描述生成全新图片
② 图生图         一张图+文字      一张变体图          将照片转换为特定艺术风格
③ Inpainting     一张图+遮罩      一张修复图          移除画面中的多余物体
④ Outpainting    一张图          一张扩展图          扩展画幅,AI 补全新增区域
⑤ 超分放大       一张小图        一张大图            提升分辨率并保持清晰度
⑥ 图片理解       一张图          一段文字            识别内容、提取结构化信息

上述六类任务并非各自对应独立的模型——其底层共享同一套扩散模型架构,区别仅在于输入条件的不同组合。

1.2 当前技术的局限性

  • ❌ 在保留真实背景的前提下移除大面积物体——生成式模型倾向于"虚构"背景内容
  • ❌ 生成图片中的文字准确渲染(2026 年刚取得突破,仍未完全解决)
  • ❌ 长视频(超过 2 分钟)中保持角色外貌和场景风格的一致性
  • ❌ 精确控制人体细节部位(手指数量、牙齿形态等常见问题)
  • ❌ 在消费级显卡(8GB VRAM)上进行 4K 视频生成

1.3 五层生态结构

AI 图片/视频处理的工具链可划分为五个层次:

┌─────────────────────────────────────────────────────────┐
│  第 5 层:用户界面                                       │
│  ComfyUI(节点式编排) / WebUI(图形界面) / 代码直接调用   │
├─────────────────────────────────────────────────────────┤
│  第 4 层:模型权重(.safetensors / .ckpt 文件)           │
│  FLUX.1 / SD 3.5 / Qwen-Image / Wan 2.7 ...             │
├─────────────────────────────────────────────────────────┤
│  第 3 层:工具库(Python 包)                             │
│  diffusers / transformers / opencv / onnxruntime        │
├─────────────────────────────────────────────────────────┤
│  第 2 层:深度学习框架                                    │
│  PyTorch / ONNX Runtime / llama.cpp                     │
│  注:llama.cpp(C++实现)完全不依赖 PyTorch,              │
│  直接被 Ollama 用作底层推理引擎。图片模型暂无等价物。        │
├─────────────────────────────────────────────────────────┤
│  第 1 层:硬件与驱动                                      │
│  NVIDIA GPU + CUDA + cuDNN                              │
└─────────────────────────────────────────────────────────┘

关键认知

  • 日常所说的"下载一个模型",实际下载的是第 4 层的 .safetensors 权重文件。但该文件必须依赖第 1~3 层的完整环境才能运行
  • Ollama 的特殊性:Ollama 的底层推理引擎 llama.cpp(C++)绕过了 PyTorch(第 2 层)直接从 CUDA/CPU 执行推理。图片模型领域暂无此类统一工具——多组件管线难以用统一 C++ 引擎覆盖
  • 模型权重文件不包含原始训练数据——它是训练得到的"识别与生成规律",而非训练数据的压缩存储

1.4 远程 API 与本地部署

一个常见误解是"图片模型必须下载到本地才能使用"。实际上,图片模型与文本 LLM 一样,同时支持远程 API 和本地部署:

                    文本 LLM                        图片模型
                    ────────                       ────────
远程 API 模式      调用 DeepSeek API               调用 Kling / SiliconFlow API
                   → 模型运行在服务端                → 模型运行在服务端
                   → 本地无需 GPU                    → 本地无需 GPU

本地部署模式       Ollama + Qwen 本地运行           diffusers + FLUX 本地运行
                   → 模型权重下载至本地              → 模型权重下载至本地
                   → 单一模型推理                    → 多子模型管线(额外复杂度来源)

二、环境地基

2.1 第 1 层:CUDA — AI 推理的物理引擎

Python 代码 → PyTorch(执行矩阵乘法)→ CUDA(翻译为 GPU 指令)→ GPU 硬件 → 返回结果
  • 无 NVIDIA 显卡 → CPU 推理 → 速度下降 10-100 倍
  • CUDA 版本与 PyTorch 版本必须匹配——约 80% 的环境问题源于此

2.2 第 2 层:PyTorch — AI 模型的运行时

PyTorch 是所有 AI 模型推理的运行时环境。类比:运行 Java 程序需要 JVM,运行 AI 模型需要 PyTorch。提供两项核心能力:张量运算(GPU 上的 numpy)和自动求导(训练用)。

2.3 第 3 层:工具库

PyTorch 仅提供"张量运算",不具备"加载模型并完成推理全流程"的高层功能。diffusers 封装了所有步骤:

库名功能定位若不使用的后果
torchGPU 加速的张量计算无法运行任何 AI 模型
diffusers扩散模型的管线工厂,一行加载、一行推理需手写数百行管线代码
transformers文本编码器的管线工厂diffusers 会自动安装
opencv-contrib-python-headless经典图像处理 + DNN 推理 + 超分辨率读写/缩放/超分均需另寻方案
accelerate自动 GPU 分配、混合精度需手写显存管理逻辑
xformers(可选)注意力机制加速,节省约 30% 显存显存更紧张
bitsandbytes(可选)8-bit/4-bit 量化推理大模型在消费级显卡上无法运行

2.4 第 4 层:模型权重 — .safetensors 文件的本质

# FLUX.1-dev 模型权重文件的目录结构
~/.cache/huggingface/hub/models--black-forest-labs--FLUX.1-dev/
├── model_index.json       # 记录该模型由哪些子模型组件构成
├── transformer/           # 主去噪网络(UNet/DiT)的权重 → 约 23GB
├── vae/                   # VAE 编解码器的权重 → 约 300MB
├── text_encoder/          # 文本编码器的权重 → 约 3GB
└── scheduler/             # 去噪策略配置

2.5 环境安装验证清单

以下 4 条验证命令全部通过,即说明环境已就绪:

python -c "import torch; print(torch.cuda.is_available())"     # → True
python -c "import torch; print(torch.version.cuda)"            # → 12.1
python -c "from diffusers import DiffusionPipeline; print('OK')"  # → OK
python -c "import cv2; cv2.dnn_superres.DnnSuperResImpl_create()" # → 成功

三、第一张 AI 图片:从代码到理解

3.1 最小可运行示例

from diffusers import AutoPipelineForText2Image
import torch

pipe = AutoPipelineForText2Image.from_pretrained(
    "black-forest-labs/FLUX.1-schnell",
    torch_dtype=torch.bfloat16
)
pipe.to("cuda")

image = pipe(
    prompt="一只橘猫戴着墨镜坐在沙滩上,日落光线,电影质感"
).images[0]

image.save("my_first_ai_image.jpg")

以上共 6 行有效代码。

3.2 一行推理调用背后的六个步骤

pipe(prompt) 这一行看似简洁的调用,内部实际顺序执行了六个步骤:

用户输入:prompt="一只橘猫戴着墨镜坐在沙滩上..."
    │
    ▼
┌─────────────────────────────────────────────────────────┐
│ 步骤①:Text Encoder(文本编码)                           │
│  "一只橘猫戴着墨镜..." → CLIP / T5 模型 → 语义向量        │
├─────────────────────────────────────────────────────────┤
│ 步骤②:随机种子 → 初始噪声                               │
│  torch.randn(...) → 在潜空间中生成纯随机噪声              │
│  512×512 像素空间经 VAE 压缩后,在潜空间仅 64×64          │
├─────────────────────────────────────────────────────────┤
│ 步骤③:Scheduler 初始化                                  │
│  FLUX-schnell(蒸馏版):仅需 1-4 步                      │
│  SD 3.5(标准版):需要 20-50 步                          │
├─────────────────────────────────────────────────────────┤
│ 步骤④:去噪循环(推理核心)——重复 N 次                    │
│  循环每一步:当前噪声图 + 文本条件向量 + 当前步数编号        │
│  → UNet/DiT 预测"哪些像素更可能是噪声"                    │
│  → Scheduler 按预定公式减去预测的噪声分量                  │
│  第 1 步:完全随机噪点 → 第 20 步:细节全部完成           │
├─────────────────────────────────────────────────────────┤
│ 步骤⑤:VAE Decoder(潜空间 → 像素空间)                   │
│  潜空间中 64×64×16 的张量 → VAE 解码 → 512×512×3 像素图  │
├─────────────────────────────────────────────────────────┤
│ 步骤⑥:后处理                                           │
│  值域裁剪([-1,1] → [0,255])→ 转换为 PIL Image 对象     │
└─────────────────────────────────────────────────────────┘

3.3 四个核心组件的职责

组件在管线中的职责类比
Text Encoder将 Prompt 编码为语义条件向量需求翻译
UNet / DiT去噪循环的核心计算模块雕刻:每次削去多余的石料
Scheduler控制去噪的节奏节拍器
VAE像素空间与潜空间的双向转换打包与拆包

3.4 UNet 与 DiT:两代去噪架构

§3.3 的组件表中将去噪网络写为"UNet / DiT",两者是代际关系——当前旗舰模型(FLUX、SD 3.5)已全面转向 DiT。

UNet(2015-2023,以 Stable Diffusion 1.x/2.x/XL 为代表)

  输入(含噪潜空间 64×64×4)
      ↓
  ┌──────────────────────┐
  │  卷积下采样(Encoder) │  ← 基于 CNN 卷积层
  │  64→32→16→8          │    跳跃连接 = Encoder 中间结果
  │      ↓ 跳跃连接       │    直接传给 Decoder 同分辨率层
  │  8→16→32→64          │
  │  卷积上采样(Decoder) │
  └──────────────────────┘
      ↓
  输出(噪声预测)
  文本条件注入:Cross-Attention

DiT(Diffusion Transformer,2024-至今,以 FLUX/SD 3.5/SORA 为代表)

  输入(含噪潜空间 latent)
      ↓
  ┌──────────────────────────────┐
  │  Patch Embedding             │  ← 将图像切成小块(类似 ViT)
  ├──────────────────────────────┤
  │  Transformer Block × N 层    │  ← 无需卷积,纯 Transformer
  │  ┌────────────────────────┐  │
  │  │ Adaptive Layer Norm     │  │  ← 时间步条件注入
  │  │   ↓                    │  │
  │  │ Multi-Head Self-Attention│ │  ← 图像各 patch 之间互相注意
  │  │   ↓                    │  │
  │  │ MLP(Feed-Forward)     │  │
  │  └────────────────────────┘  │
  │  文本条件注入:AdaLN 或 Joint Attention │
  └──────────────────────────────┘

为什么 DiT 取代了 UNet

维度UNet(CNN 卷积)DiT(Transformer)
扩展性加深加宽收益递减随参数量增大持续提升(Scaling Law)
高分辨率卷积感受野有限Self-Attention 天然全局视野
文本对齐Cross-Attention 仅作用于特定层AdaLN 逐层注入,条件信号贯穿始终
代表模型SD 1.5 / SDXLFLUX.1 / SD 3.5 / SORA / Wan 2.7

与文本 LLM 的殊途同归:DiT 的思路是将图片生成问题重新表述为"序列到序列"的 Transformer 任务——图像被切分成 token 序列,去噪过程就是对 token 序列的逐步变换。这与文本 LLM 的"Token → Token 自回归"在数学形式上趋于统一。

3.5 参数含义与调节方向

image = pipe(
    prompt="...",                                      # 正向提示词
    negative_prompt="blurry, low quality",             # 负向提示词
    num_inference_steps=4,                             # schnell 版用 1-4,标准版用 20-50
    guidance_scale=3.5,                                # 引导强度:越高越贴合 Prompt
    generator=torch.Generator("cuda").manual_seed(42), # 固定随机种子以复现结果
).images[0]
参数增大减小推荐值
num_inference_steps质量↑、速度↓速度↑、质量↓schnell: 4 / 标准: 20-30
guidance_scale更紧密贴合 Prompt给模型更大自由度FLUX: 3.5 / SD: 7.5

关于 guidance_scale 的机制:该参数背后是 Classifier-Free Guidance(CFG,无分类器引导) 算法。每一步去噪时,模型实际上执行两次预测——一次带上 Prompt 条件,一次不带条件,然后按公式合成:

最终噪声预测 = 无条件预测 + guidance_scale × (有条件预测 − 无条件预测)

guidance_scale 控制"Prompt 额外信息"的放大倍数——越大越贴合 Prompt,但也可能放大伪影。

3.6 远程调用:三家国内服务商

# SiliconFlow(OpenAI 兼容接口,可用模型种类最多)
from openai import OpenAI
client = OpenAI(base_url="https://api.siliconflow.cn/v1", api_key="sk-xxx")
resp = client.images.generate(model="black-forest-labs/FLUX.1-dev",
                               prompt="一只猫", size="1024x1024")

# 智谱(CogView-4,支持对话式迭代编辑)
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="xxx")
resp = client.images.generations(model="cogview-4", prompt="一只猫")

# 阿里百炼(Qwen-Image,中文字符渲染能力领先)
import dashscope
from dashscope import ImageSynthesis
resp = ImageSynthesis.call(api_key="sk-xxx", model="qwen-image-max",
                            prompt="一只猫", n=1, size="1024*1024")

核心要点回顾

  1. 五层生态结构(CUDA→PyTorch/llama.cpp→diffusers→.safetensors→ComfyUI/代码)是理解所有 AI 图片工具的分层框架
  2. 扩散模型推理 = Text Encoder + 初始噪声 + Scheduler + 去噪循环×N + VAE Decoder + 后处理——六步可以精确拆解任何文生图管线的内部流程
  3. DiT(Diffusion Transformer)是图片生成模型的分水岭——从 CNN-based UNet 到 Transformer-based DiT,与文本 LLM 正在架构层面趋于统一
  4. guidance_scale 的数学本质是 CFG 算法无条件 + scale × (有条件 − 无条件)
  5. 远程 API 和本地部署使用同一份模型权重——区别仅在于计算归属和推理优化

扩散模型 6 步推理 + UNet/DiT 代际对比 + FLUX/SD 3.5 选型——AI 图片生成的三条知识线,每一条都直指"为什么出图不对"。收藏这篇,下次出图翻车时回来对照原理,比盲目改 prompt 高效十倍。

上一篇:《Agent的本质》 | 下一篇:《精确控制与视频生成》 系列合集掘金AI合集