FLUX.1 文生图:dev 与 schnell 本地部署
FLUX.1 是 Black Forest Labs 的文生图模型——这家公司由前 Stable Diffusion 团队成员创立。官方教程对它的介绍是:最大的开源文生图模型之一,12B 参数、原始文件约 23GB,以出色的图像质量和灵活性著称,架构上混合了 Transformer 与扩散模型两家之长。
这一页带你把官方 FLUX 工作流从头跑通:先分清 dev 与 schnell 两个开源版本,再用「全量版四件套」跑出第一张图,最后看看低显存设备怎么用 fp8 单文件版。
学完你能做什么
- 分清 FLUX.1 三兄弟(Pro / dev / schnell)的定位与许可证,知道本地部署选哪个
- 跑通 FLUX.1 dev 全量版工作流:四个模型文件各归其位,20 步出图
- 一键切换 schnell:只换扩散模型、步数改 4,高速抽卡
- 用 fp8 单文件 checkpoint 在低显存设备上跑 FLUX,只装一个模型文件
- 记住 FLUX 的铁律参数:cfg 1、不写负向提示词、euler + simple
你现在的困境
- 听说 FLUX 画质顶,一看权重 20GB 起步,不知道自己的显卡和硬盘带不带得动
- 下载了官方模板,DualCLIPLoader 两个下拉框不知道 clip_l 和 t5xxl 谁放哪格
- 沿用 SD1.5 的习惯:cfg 拉到 7、猛写负向提示词,FLUX 完全不理会
什么时候用这一招
当你需要:
- 出色的图像质量和「写什么画什么」的提示词遵循——复杂提示词也还原得到位
- 本地跑旗舰级开源模型,不依赖、也不为闭源 API 付费
- 要么精修出图(dev 20 步),要么高速抽卡(schnell 4 步)
而且不想:
- 在低显存机器上被 23GB 权重劝退——第 6 步的 fp8 单文件版就是解法
- 折腾负向提示词——FLUX 的官方工作流根本不用它
🎒 开始前的准备
- 跑通了第一次生图:会加载工作流、写提示词、按
Ctrl+Enter运行 - 模型目录规则心里有数:
diffusion_models、text_encoders、vae、checkpoints各放什么(忘了回看模型放哪里) - 硬盘预留约 32GB 给 dev 全量版四件套;走 fp8 单文件版只需一个文件的量
- 想下 dev 版:Hugging Face 账号已登录,并同意 FLUX.1-dev 仓库的许可协议(非商用);schnell 是 Apache 2.0,没有这个门槛
- 网络能连 Hugging Face;连不稳就走 ModelScope 国内镜像(第 2 步给地址)
- ComfyUI 已更新到最新版本(官方教程开篇的提醒)
- 一杯水 ☕——本课最大的等待就是下模型
核心思路
FLUX.1 是「混合架构」。 官方说明它结合了 Transformer 网络和扩散模型的优势:文本和图像信息在模型里有效整合,生成图与提示词的对齐精度高,对复杂提示词的还原尤其出色。12B 参数捕捉到的模式关系更复杂,出图更真实、更多样,风格适配面也宽。
三兄弟分工(本页跑的是后两个):
| 版本 | 许可证 | 特点 | 获取方式 |
|---|---|---|---|
| FLUX.1 Pro | 闭源 | 表现最好的旗舰 | 仅 API 调用 |
| FLUX.1 dev | 开源,非商用 | 从 Pro 蒸馏,性能接近 Pro | Hugging Face 下载,需同意协议 |
| FLUX.1 schnell | Apache 2.0 | 蒸馏加速版,4 步出图,适合低配硬件 | Hugging Face 直接下载 |
两条部署路线(官方教程就是这么分的):
| 路线 | 要装什么 | 画质 | 显存 | 适合 |
|---|---|---|---|---|
| 全量版(四件套) | 扩散模型 + 两个文本编码器 + VAE 分开装 | 最佳 | 要求更高 | 显存充足、要最佳提示词遵循 |
| fp8 单文件 checkpoint | 一个 fp8 量化文件 | 略低于全量版 | 要求更低 | 显存有限、想快速跑起来 |
为什么 cfg 固定 1、不写负向提示词? 官方教程原话:得益于 FLUX 出色的提示词遵循能力,不需要任何负向提示词。所以官方模板把负向条件用 ConditioningZeroOut 节点直接置零,cfg 固定 1——schnell 模板里的便签还专门提醒:cfg 设成 1.0,负向提示词就被忽略了。
工作流骨架(全量版;比单 checkpoint 工作流多出两个 loader):
UNETLoader(扩散模型)──────────────────────────→ KSampler ──→ VAEDecode ──→ SaveImage
DualCLIPLoader(clip_l + t5xxl)──→ CLIPTextEncode(你的提示词)──→ KSampler(positive)
└──→ ConditioningZeroOut ──→ KSampler(negative,置零)
VAELoader(VAE)──────────────────────────────────────────────→ VAEDecode
EmptySD3LatentImage(1024×1024 空画布)───────────────────────→ KSampler跟我做
第 1 步:加载官方 FLUX 工作流
为什么:官方模板库里 FLUX.1 文生图模板的参数和模型链接都配好了,比从零连线快得多。
操作:左侧栏 Templates 打开模板库,搜 Flux.1,本课主线用这一个:
| 模板名 | 模板 ID | 内容 |
|---|---|---|
| Flux.1 开发专用:文生图 | flux_dev_full_text_to_image | dev 全量版,20 步 |
不想用模板库的话,直接下载 JSON 再用菜单 Workflows → Open(Ctrl+O)打开:flux_dev_full_text_to_image.json。模板库的完整玩法见模板库。
你应该看到:画布上是一个名为 Text to Image (Flux.1 Dev) 的子图节点,prompt、宽高、seed、模型文件名这些常用参数都暴露在节点表面,旁边还有一张写满模型下载链接的便签(MarkdownNote)。
- 画布上加载了 dev 全量版工作流
第 2 步:下载 dev 全量版四件套并归位
为什么:全量版不打包成单个 checkpoint,四个文件分开装;放错子目录,loader 的下拉列表里就找不到文件。
操作:从 Hugging Face 下载四个文件(模板便签里附了官方下载入口):
| 文件 | 大小 | 放进哪个子目录 | 下载 |
|---|---|---|---|
flux1-dev.safetensors | 22.17 GB | models/diffusion_models/ | Hugging Face |
clip_l.safetensors | 234.7 MB | models/text_encoders/ | Hugging Face |
t5xxl_fp16.safetensors | 9.12 GB | models/text_encoders/ | Hugging Face |
ae.safetensors | 319.8 MB | models/vae/ | Hugging Face |
目录结构长这样:
ComfyUI/
├── models/
│ ├── diffusion_models/
│ │ └── flux1-dev.safetensors
│ ├── text_encoders/
│ │ ├── clip_l.safetensors
│ │ └── t5xxl_fp16.safetensors
│ └── vae/
│ └── ae.safetensors💡 国内下载与低显存替换
- ModelScope 有官方镜像:扩散模型仓库 Comfy-Org/flux1-dev、VAE 所在的 Comfy-Org/Lumina_Image_2.0_Repackaged,模板便签里都附了链接。
- 显存不到 32GB:官方教程建议换用 fp8 版文本编码器省显存,模板便签列出的是
t5xxl_fp8_e4m3fn_scaled.safetensors(4.8 GB),其余文件不动。
⚠️ dev 版要先同意许可协议
dev 权重在 Hugging Face 上需要登录并同意 FLUX.1-dev 的许可协议(非商用)才能下载——官方教程特别提醒:下不了先检查这两件事。schnell 是 Apache 2.0,没有这个门槛。
放好后画布上按 r 刷新,在子图的模型下拉框(或进子图内部的 loader 节点)选中对应文件。哪个文件进哪格不确定,回看模型放哪里的对照表。
你应该看到:红色缺失警告全部消失,loader 都显示正确的文件名。
- 四个文件各归其位,loader 都选中了文件
第 3 步:读懂 FLUX 工作流的节点与参数
为什么:会调参的前提,是知道每个节点干什么、默认参数为什么是它。
操作:双击进子图内部,逐节点对照这张表:
| 节点 | 干什么 | 模板里的关键参数 |
|---|---|---|
| UNETLoader(Load Diffusion Model) | 装扩散模型本体(12B) | flux1-dev.safetensors |
| DualCLIPLoader | 一次装两个文本编码器 | 第一格 clip_l.safetensors,第二格 t5xxl_fp16.safetensors,type flux |
| VAELoader(Load VAE) | 装 VAE | ae.safetensors |
| CLIPTextEncode | 把提示词编码成条件 | 接 KSampler 的 positive |
| ConditioningZeroOut | 把负向条件置零 | FLUX cfg=1,不需要负向提示词 |
| EmptySD3LatentImage | 造空画布 | 1024×1024、批次 1 |
| KSampler | 去噪采样 | 20 步、cfg 1、euler、simple、denoise 1.0 |
| VAEDecode | 潜空间解码成像素 | — |
| SaveImage | 预览并保存 | 文件落 ComfyUI/output/ |
DualCLIPLoader 两格的顺序有讲究:ComfyUI 源码里写明的配方是 flux 类型 = clip-l, t5——第一格放 clip_l,第二格放 t5xxl,type 选 flux。
你应该看到:从左到右你能说出每个节点的职责,KSampler 参数与上表一致。
- 我能说出四件套分别由哪个 loader 装、KSampler 的关键参数是什么
第 4 步:写提示词,跑出第一张 dev 图
为什么:FLUX 的招牌是提示词遵循——提示词写得越具体,画面还原越到位,而且不需要负向提示词。
操作:
- 在子图的 prompt 框写提示词。官方模板自带的示例:
A fairy tale scene of a young girl with silver curly hair wearing a delicate white dress, standing among crystal butterflies and glowing glass roses. The scene is filled with soft magical light, like a dream from a fantasy world.- 尺寸默认 1024×1024,想换比例就改子图的 width / height
- 点 Run,或按
Ctrl+Enter
你应该看到:进度条走满 20 步,SaveImage 节点出图——画面里是提示词描述的那些元素:银发女孩、白裙、水晶蝴蝶、发光玻璃玫瑰,像童话场景。
- SaveImage 里出现了第一张 FLUX.1 dev 生成的图
第 5 步:换 schnell——4 步快速出图
为什么:schnell 在蒸馏路上走得更远:4 步就能出好图,许可证还是宽松的 Apache 2.0。官方教程说明:schnell 工作流与 dev 版相比只有模型文件不同。
操作:
- 额外下载
flux1-schnell.safetensors(22.15 GB)放进models/diffusion_models/,仓库:Comfy-Org/flux1-schnell(ModelScope 镜像)。文本编码器和 VAE 沿用第 2 步那套(官方模板默认t5xxl_fp16;文档也提到 schnell 可用 fp8 版 t5xxl 省显存,fp16 效果更好) - 两种跑法任选:
方式 A:加载 schnell 全量版模板(推荐)
模板库搜 Flux.1,选「Flux.1 Schnell Full: 文生图」(flux_schnell_full_text_to_image)。它的提示词节点是 CLIPTextEncodeFlux:提示词分成 clip_l 和 t5xxl 两个字段——可以写不一样的内容,官方示例就是两段不同的描述——外加一个 guidance 参数,模板默认 3.5。
方式 B:沿用 dev 工作流改两处
把 UNETLoader 换成 flux1-schnell.safetensors,KSampler 步数 20 → 4。其余不动。
- 点 Run
你应该看到:进度条只走 4 步就出图,速度肉眼可见地快。官方对 schnell 的定位就是低配硬件也能跑的快速版。
- schnell 版跑通,4 步出图
第 6 步:显存吃紧?上 fp8 单文件 checkpoint
为什么:fp8 单文件版把扩散模型、文本编码器、VAE 打包成一个量化 checkpoint——只要一个文件、显存要求更低,代价是画质比全量版略降。官方对它的定位就是显存有限设备的单文件入门方案。
操作:
| 版本 | 下载 | 放进 | 加载节点 | 步数 |
|---|---|---|---|---|
| schnell fp8 | flux1-schnell-fp8.safetensors | models/checkpoints/ | Load Checkpoint | 4 |
| dev fp8 | flux1-dev-fp8.safetensors | models/checkpoints/ | Load Checkpoint | 20(同全量版) |
- schnell fp8 直接用模板:模板库搜
Flux.1,选「Flux.1 Schnell FP8」(flux_schnell)。它的结构就是单 checkpoint 版:一个 CheckpointLoaderSimple 节点输出 MODEL / CLIP / VAE 三路,负向提示词框留空,KSampler 4 步、cfg 1 - dev fp8 按官方教程手动搭:下载
flux1-dev-fp8.safetensors放进models/checkpoints/,用 Load Checkpoint 节点加载。最省事的搭法:复制 schnell fp8 模板,把 checkpoint 换成flux1-dev-fp8.safetensors,步数改回 20 - 点 Run
⚠️ 别被这个模板名带偏
模板库里还有个「Flux.1 开发专用 fp8: 文生图」(flux_dev_checkpoint_example)——名字带 fp8,但模板实际内容是与第 1 步同结构的全量版四件套工作流(同样 20 步)。跑单文件 dev 版按上面第 2 条手动改,别指望这个模板。
你应该看到:画布上只剩一个 checkpoint loader(不再是一排 loader),checkpoints/ 里一个新文件就能出图。
- fp8 单文件版跑通,且文件放在
models/checkpoints/
检查点 ✅
- dev 全量版跑通:模板加载 → 四件套归位 → 20 步出图
- schnell 跑通:换扩散模型 + 4 步,或直接用 schnell 模板
- 我知道 cfg 1、不写负向提示词是 FLUX 的设计,不是工作流坏了
- fp8 单文件版的文件放在
models/checkpoints/,不是diffusion_models/ - 说得出 dev(非商用、20 步)和 schnell(Apache 2.0、4 步)的区别
踩坑提醒
❌ cfg 拉高、猛写负向提示词
原因:FLUX 官方工作流 cfg 固定 1,负向条件被 ConditioningZeroOut 置零;schnell 模板便签原话——cfg 设成 1.0,负向提示词就被忽略。正确做法:cfg 保持 1,精力全放在正向提示词的画面描述上。
❌ dev 模型下载被拒(401 / 403)
原因:FLUX.1 dev 是非商用许可,Hugging Face 上要先登录并同意仓库协议。正确做法:登录账号、进仓库同意协议后再下;或走 ModelScope 镜像(第 2 步)。schnell(Apache 2.0)无此限制。
❌ fp8 文件放进 diffusion_models,节点里找不到
原因:flux1-dev-fp8.safetensors / flux1-schnell-fp8.safetensors 是打包好的 checkpoint,归 models/checkpoints/,由 Load Checkpoint 加载;全量版的 flux1-dev.safetensors 才归 diffusion_models/。正确做法:按第 6 步的表格归位;还找不到就按模型加载失败排查。
❌ 显存不够,全量版直接 OOM
原因:全量版要同时伺候 22GB 级的扩散模型和 9GB 级的 t5xxl_fp16。正确做法:先按官方建议把 t5xxl 换成 t5xxl_fp8_e4m3fn_scaled.safetensors(4.8 GB);还不行就整体换 fp8 单文件版;系统解法见显存不足。
进阶技巧(可选)
🔧 提示词写完整长句:FLUX 对复杂提示词的还原是强项,官方示例都是完整的长句场景描述——人物、环境、光线一次写全,比堆关键词标签更有效。
🔧 拖图即得工作流:官方教程的示例图都带工作流元数据,把图直接拖进 ComfyUI 窗口(或 Workflows → Open)就能还原出完整工作流和模型下载信息——看到别人用 FLUX 出的好图,先试试拖进来。
🔧 FLUX 家族还有几张牌:修图用 FLUX.1 Kontext(角色一致性、多轮迭代),局部重绘与扩图用 FLUX.1 Fill,新一代多参照一致性见 FLUX.2 和 FLUX.3 Klein。
本课小结
✅ FLUX 工作流跑通了:dev 全量版四件套归位 → 20 步出图;schnell 换扩散模型、步数改 4。
✅ 版本会选了:dev 非商用、性能接近闭源旗舰 Pro;schnell 是 Apache 2.0 的 4 步加速版,低配友好。
✅ 参数记住了:cfg 1、不写负向提示词、euler + simple;dev 20 步、schnell 4 步。
✅ 低显存有后路:t5xxl 换 fp8 版省一半体积,或整体换 fp8 单文件 checkpoint(放 checkpoints/)。
关键配置回顾:
| 配置 | 推荐值 | 说明 |
|---|---|---|
| 扩散模型(dev) | flux1-dev.safetensors(22.17 GB) | 放 models/diffusion_models/;fp8 单文件版用 flux1-dev-fp8.safetensors,放 checkpoints/ |
| 扩散模型(schnell) | flux1-schnell.safetensors(22.15 GB) | 同上;fp8 版 flux1-schnell-fp8.safetensors |
| 文本编码器 | clip_l.safetensors + t5xxl_fp16.safetensors(9.12 GB) | 放 models/text_encoders/;低显存换 t5xxl_fp8_e4m3fn_scaled.safetensors(4.8 GB) |
| VAE | ae.safetensors(319.8 MB) | 放 models/vae/ |
| DualCLIPLoader | 第一格 clip_l、第二格 t5xxl、type flux | 源码配方:flux = clip-l, t5 |
| KSampler(dev) | 20 步、cfg 1、euler、simple、denoise 1.0 | 官方模板配置 |
| KSampler(schnell) | 4 步、cfg 1、euler、simple、denoise 1.0 | schnell 是 4 步蒸馏模型 |
| 画布 | EmptySD3LatentImage 1024×1024 | 换比例改 width / height |
下一课预告
文生图只是 FLUX.1 的起点。下一课的 FLUX.1 Kontext 把它变成「迭代修图引擎」:给一张角色图,用指令一轮轮地改,角色长相还不跑偏。下一课:FLUX.1 Kontext。
你会学到:
- Kontext dev 的本地部署(fp8 权重 + 文本编码器 + VAE)
- 用「Load Image(from output)」节点把上一轮结果直接喂回下一轮
- 指令式迭代修图:角色一致性、风格参照
- Kontext 的限制:提示词仅支持英文