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")
核心要点回顾
- 五层生态结构(CUDA→PyTorch/llama.cpp→diffusers→.safetensors→ComfyUI/代码)是理解所有 AI 图片工具的分层框架
- 扩散模型推理 = Text Encoder + 初始噪声 + Scheduler + 去噪循环×N + VAE Decoder + 后处理------六步可以精确拆解任何文生图管线的内部流程
- DiT(Diffusion Transformer)是图片生成模型的分水岭------从 CNN-based UNet 到 Transformer-based DiT,与文本 LLM 正在架构层面趋于统一
- guidance_scale 的数学本质是 CFG 算法 :
无条件 + scale × (有条件 − 无条件) - 远程 API 和本地部署使用同一份模型权重------区别仅在于计算归属和推理优化
扩散模型 6 步推理 + UNet/DiT 代际对比 + FLUX/SD 3.5 选型------AI 图片生成的三条知识线,每一条都直指"为什么出图不对"。收藏这篇,下次出图翻车时回来对照原理,比盲目改 prompt 高效十倍。
上一篇 :《Agent的本质》 | 下一篇 :《精确控制与视频生成》 系列合集 :掘金AI合集