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

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 六类图片任务

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

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

1.2 当前技术的局限性

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

1.3 五层生态结构

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

arduino 复制代码
┌─────────────────────────────────────────────────────────┐
│  第 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 和本地部署:

markdown 复制代码
                    文本 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 封装了所有步骤:

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

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

bash 复制代码
# 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 条验证命令全部通过,即说明环境已就绪:

bash 复制代码
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 最小可运行示例

python 复制代码
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) 这一行看似简洁的调用,内部实际顺序执行了六个步骤:

arduino 复制代码
用户输入: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 为代表)

markdown 复制代码
  输入(含噪潜空间 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 为代表)

markdown 复制代码
  输入(含噪潜空间 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 / SDXL FLUX.1 / SD 3.5 / SORA / Wan 2.7

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

3.5 参数含义与调节方向

python 复制代码
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 条件,一次不带条件,然后按公式合成:

scss 复制代码
最终噪声预测 = 无条件预测 + guidance_scale × (有条件预测 − 无条件预测)

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

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

python 复制代码
# 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合集

相关推荐
Patrick在香港1 小时前
Python爬虫框架实战:优雅抓取香港政府公开API数据的通用方案
java·开发语言·爬虫·python·ai编程·数据可视化·可用性测试
李剑一1 小时前
AI生成的配图没有灵魂?我找到一个能生成灵魂文章配图的Skill
aigc·ai编程
Flynt2 小时前
给AI编程工具装了张"代码地图"后,它终于不瞎猜了
ai编程·claude·mcp
程序员韩星2 小时前
从模型直连到统一 AI 网关:多模型 API、Codex 与 Claude Code 接入实践
前端·程序员·ai编程
大熊猫侯佩2 小时前
别再把大模型供在云端了,WWDC26 CoreAI 大模型下凡实战
ai编程·swift·wwdc
lifallen3 小时前
Avernet:Agent 的组织网络
人工智能·学习·ai·开源软件·ai编程
必须会一定会4 小时前
用纯 HTML/JS 做一个 AI 需求澄清器:把模糊想法转换成可执行任务书
开发语言·前端·javascript·人工智能·html·ai编程
小帅不太帅4 小时前
1.5M 参数的 OCR 模型,我把它跑进了浏览器
前端·javascript·ai编程
chaors10 小时前
DeepResearchSystem 0x08:KB 知识记忆
langchain·agent·ai编程