FLUX.2 Klein 9B LoRA 训练 + 生图完整搭建方案
Context
用户在 Windows + WSL2 环境下搭建 FLUX.2 Klein 9B 流程,用于风格 LoRA 训练和图像生成。
硬件环境:
- GPU: NVIDIA RTX 5070 Ti (16GB VRAM, Blackwell sm_120)
- 内存: 48GB
- 存储: C 盘 >500GB 剩余
- 系统: Windows + WSL2 Ubuntu 22.04
用户画像:
- 训练目标: 风格 LoRA
- 用途: 训练和生图各一半
- Linux 经验: 基础(会用命令行,查教程能走)
一、关键发现
FLUX.2 Klein 的文本编码器是 Qwen3 8B,不是 T5/CLIP-L
这和 FLUX.1 完全不同,所以不能用 FLUX.1 的模型文件。
二、文件下载清单
训练用模型(FluxGym)
| 文件 |
来源 |
大小 |
| FLUX.2-klein-base-9b-fp8.safetensors |
HuggingFace / ModelScope |
~8.8GB |
| qwen_3_8b_fp8mixed.safetensors |
同上(模型自带) |
~7.2GB |
| flux2-vae.safetensors |
同上(模型自带) |
~335MB |
下载地址:
生图用模型(ComfyUI 分片格式)
| 文件 |
大小 |
放置路径 |
| flux2-klein-9B-transformer-NVFP4.safetensors |
~4.8GB |
models/diffusion_models/ |
| qwen_3_8b_fp8mixed.safetensors |
~7.2GB |
models/text_encoders/ |
| flux2-vae.safetensors |
~335MB |
models/vae/ |
下载地址: https://huggingface.co/Comfy-Org/flux2-klein-9B/tree/main/split_files
三、安装步骤(按顺序执行)
Phase 1: Windows 端(30 分钟)
1.1 更新 NVIDIA 驱动
1 2 3
| 下载地址: https://www.nvidia.cn/geforce/drivers/ 最低版本: >= 550.90(Blackwell 基础支持) 推荐版本: 595.76+(RTX 50 系列热修复,修复电压问题)
|
验证:打开 CMD,运行 nvidia-smi,确认看到 RTX 5070 Ti
1.2 启用 WSL2
1 2
| wsl --install -d Ubuntu-24.04
|
安装完成后重启,设置 Ubuntu 用户名密码。
1.3 验证 WSL2 能识别 GPU
应该看到和 Windows 一样的输出。
Phase 2: WSL2 系统环境(20 分钟)
2.1 安装系统依赖
1 2 3
| sudo apt update && sudo apt upgrade -y sudo apt install -y python3-venv python3-pip git git-lfs git lfs install
|
2.2 创建 Python 虚拟环境
1 2 3
| cd ~ python3 -m venv flux-env source ~/flux-env/bin/activate
|
2.3 安装 PyTorch(关键!必须 cu128)
1 2 3 4 5 6
|
pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu128
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128
|
2.4 验证 CUDA
1
| python3 -c "import torch; print(torch.cuda.get_device_capability()); print(torch.cuda.get_device_name(0))"
|
期望输出:
1 2
| (12, 0) NVIDIA GeForce RTX 5070 Ti
|
Phase 3: 下载模型(1-3 小时)
3.1 安装 hf CLI
1 2 3 4
| pip install -U huggingface_hub
hf --version
|
3.2 创建模型目录
1 2 3
| mkdir -p ~/models/{diffusion_models,text_encoders,vae,lora} mkdir -p ~/datasets mkdir -p ~/outputs
|
3.3 下载训练模型(ModelScope 国内更快)
1 2 3 4 5 6 7 8
| pip install modelscope
python3 << 'EOF' from modelscope import snapshot_download snapshot_download('black-forest-labs/FLUX.2-klein-base-9B', local_dir='~/models/klein-9b-base') EOF
|
或用 hf(HuggingFace 新版 CLI):
1
| hf download black-forest-labs/FLUX.2-klein-base-9B --local-dir ~/models/klein-9b-base
|
3.4 下载 ComfyUI 分片模型(生图用)
1 2 3
| hf download Comfy-Org/flux2-klein-9B split_files/flux2-klein-9B-transformer-NVFP4.safetensors --local-dir ~/models --local-dir-use-symlinks False hf download Comfy-Org/flux2-klein-9B split_files/qwen_3_8b_fp8mixed.safetensors --local-dir ~/models --local-dir-use-symlinks False hf download Comfy-Org/flux2-klein-9B split_files/flux2-vae.safetensors --local-dir ~/models --local-dir-use-symlinks False
|
Phase 4: 安装 ComfyUI(生图用,20 分钟)
4.1 克隆 ComfyUI
1 2 3 4
| cd ~ git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI pip install -r requirements.txt
|
4.2 安装 ComfyUI Manager(扩展管理器)
1 2
| cd ~/ComfyUI/custom_nodes git clone https://github.com/ltdrdata/ComfyUI-Manager.git
|
4.3 安装推荐节点
1 2
| git clone https://github.com/rgthree/rgthree-comfy.git git clone https://github.com/yolain/ComfyUI-Easy-Use.git
|
4.4 链接模型文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| cd ~/ComfyUI/models
ln -s ~/models/flux2-klein-9B-transformer-NVFP4.safetensors diffusion_models/
ln -s ~/models/qwen_3_8b_fp8mixed.safetensors text_encoders/
ln -s ~/models/flux2-vae.safetensors vae/
ln -s ~/outputs/lora lora/
|
4.5 启动 ComfyUI
1 2
| cd ~/ComfyUI python main.py --listen
|
浏览器打开 http://localhost:8188
Phase 5: 安装训练工具
5.0 工具选择
| 工具 |
显存 |
易用性 |
说明 |
| FluxGym |
12GB |
★★★ 可视化 |
专为 FLUX 优化,自动打标,本文档主推 |
| DiffSynth-Studio |
12GB |
★★★ 一键流程 |
阿里出品,国内下载快,备选方案 |
| Kohya sd-scripts |
16-24GB |
★★ |
功能全,但配置复杂 |
| AI Toolkit (ostris) |
24GB |
★★ |
需要 24GB 显存,5070 Ti 不推荐 |
5070 Ti (16GB) 推荐:FluxGym(下文)或 DiffSynth-Studio(备选)
5.1 方案 A:FluxGym(推荐)
克隆 FluxGym
1 2 3
| cd ~ git clone https://github.com/cocktailpeanut/fluxgym.git cd fluxgym
|
5.2 安装依赖
1
| pip install -r requirements.txt
|
5.3 克隆 sd-scripts(后端训练脚本)
1 2 3 4 5
| cd ~/fluxgym
git clone -b sd3 https://github.com/kohya-ss/sd-scripts.git cd sd-scripts pip install -r requirements.txt
|
5.4 配置 Klein 9B 模型
编辑 ~/fluxgym/models.yaml,添加:
1 2 3 4 5 6 7 8
| flux2-klein-9b: name: FLUX.2 Klein 9B type: flux2 base: ~/models/klein-9b-base/flux2-klein-base-9b-fp8.safetensors clip_l: ~/models/klein-9b-base/qwen_3_8b_fp8mixed.safetensors t5: ~/models/klein-9b-base/qwen_3_8b_fp8mixed.safetensors vae: ~/models/klein-9b-base/flux2-vae.safetensors default: true
|
5.5 启动 FluxGym
1 2
| cd ~/fluxgym python app.py
|
浏览器打开 http://localhost:7860
5.2 方案 B:DiffSynth-Studio(备选)
阿里出品的一体化训练平台,优势是国内下载快。
1 2 3 4
| cd ~ git clone https://github.com/modelscope/DiffSynth-Studio.git cd DiffSynth-Studio pip install -r requirements.txt
|
训练代码示例:
1 2 3 4 5 6 7 8 9 10 11
| from diffsynth.models.sd_lora import LoRATrainer
trainer = LoRATrainer( model_name="black-forest-labs/FLUX.2-klein-base-9B", train_data_dir="~/datasets/your_style", output_dir="~/outputs/lora", rank=16, learning_rate=1.5e-4, num_train_epochs=5 ) trainer.train()
|
DiffSynth-Studio 优势:
- 国内 ModelScope 镜像,下载无需翻墙
- 12GB 显存即可训练
- 训练完成后可直接在平台内测试生成效果
四、训练配置(16GB VRAM 优化)
FluxGym UI 设置
| 参数 |
推荐值 |
说明 |
| LoRA Rank |
16 |
风格学习够用 |
| LoRA Alpha |
32 |
通常 = 2 × rank |
| Learning Rate |
1.5e-4 |
风格 LoRA 推荐 |
| Steps |
1500-3000 |
20-50 张图 |
| Batch Size |
1 |
16GB 显存限制 |
| Optimizer |
AdamW 8bit |
省显存 |
| Mixed Precision |
bf16 |
RTX 5070 Ti 支持 |
| Gradient Checkpointing |
ON |
必开,省显存 |
| Resolution |
512 |
训练分辨率,显存够可用 1024 |
数据集准备
- 收集 20-50 张目标风格图片
- 统一分辨率(建议 512×512 或 1024×1024)
- 放入
~/datasets/<你的风格名>/
- FluxGym 会自动生成描述,或手动准备 caption 文件
数据打标(Tagging)
打标的作用
训练时每张图需要一段文字描述(caption/tag),告诉模型”这张图里有什么”。
模型从描述中学习图像内容,风格(画笔、色调、质感)会作为残差被一起学进去。
不同 LoRA 类型对打标的要求
| LoRA 类型 |
打标重要性 |
原因 |
| 角色 LoRA |
高 |
需要触发词绑定角色名,如 shiroha, 1girl |
| 风格 LoRA |
中 |
标签描述内容,风格自动学 |
| 概念 LoRA |
高 |
需要触发词绑定概念名 |
FluxGym 自动打标流程
FluxGym 内置自动打标,无需手动操作:
- 将原始图片放入
~/datasets/<你的风格名>/
- FluxGym 启动训练时,自动调用 JoyTag 或 BLIP-2 生成描述
- 生成的
.txt 文件与图片同名,保存在同一目录
1 2 3 4 5 6
| dataset/ ├── image001.jpg ├── image001.txt # 自动生成的描述 ├── image002.jpg ├── image002.txt └── ...
|
自动生成的描述示例:
1
| a woman with long hair, standing in a forest, soft lighting, detailed background, anime style, 1girl, white dress, sunlight through trees
|
手动干预打标
FluxGym 的自动打标不是强制的,逻辑是:
1 2
| 如果 图片同名.txt 存在 → 用已有的(你的手动版本) 如果 图片同名.txt 不存在 → 自动生成
|
所以干预方式有三种:
| 方式 |
操作 |
适用场景 |
| 全自动 |
什么都不做 |
数据量大、对标签质量要求不高 |
| 全手动 |
自己写所有 txt |
数据量小、标签要求精确 |
| 半自动 |
先自动生成,再批量修正 |
推荐:效率和质量兼顾 |
手动打标工具
| 工具 |
特点 |
链接 |
| WD Tagger |
Danbooru 风格标签,最常用 |
SmilingWolf/wd-v1-4-tagger |
| BooruDatasetTagManager |
批量编辑 tag,可视化界面 |
GitHub: deepghs/BooruDatasetTagManager |
| JoyTag |
新模型,标签质量更高 |
fancyfeast/joytag |
WD Tagger 安装与使用
1 2 3 4 5 6
| pip install onnxruntime
git clone https://huggingface.co/SmilingWolf/wd-vit-tagger-v3
|
使用脚本 tag_images.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import os import glob from PIL import Image import onnxruntime as ort import numpy as np
MODEL_PATH = "wd-vit-tagger-v3/model.onnx" INPUT_DIR = "~/datasets/your_style" THRESHOLD = 0.35
with open("wd-vit-tagger-v3/selected_tags.csv", "r") as f: tags = [line.split(",")[1] for line in f.readlines()[1:]]
session = ort.InferenceSession(MODEL_PATH)
for img_path in glob.glob(f"{INPUT_DIR}/*.[jp][pn]g"): img = Image.open(img_path).convert("RGB").resize((448, 448)) img_np = np.array(img)[None, ...].transpose(0, 3, 1, 2).astype(np.float32) / 255
probs = session.run(None, {"input": img_np})[0][0] selected = [tags[i] for i, p in enumerate(probs) if p > THRESHOLD]
txt_path = os.path.splitext(img_path)[0] + ".txt" with open(txt_path, "w", encoding="utf-8") as f: f.write(", ".join(selected))
print(f"{os.path.basename(img_path)}: {len(selected)} tags")
|
运行:
后续处理流程
1 2 3 4 5 6 7 8 9 10 11 12 13
| cd ~/datasets/your_style
sed -i 's/, watermark//g' *.txt sed -i 's/, signature//g' *.txt sed -i 's/, caption//g' *.txt sed -i 's/, text//g' *.txt
sed -i 's/^/mystyle, /' *.txt
head -n 3 *.txt
|
FluxGym txt 格式要求
| 要求 |
说明 |
| 文件名 |
与图片同名,扩展名 .txt(如 image001.jpg → image001.txt) |
| 编码 |
UTF-8 |
| 格式 |
单行,逗号分隔(如 mystyle, 1girl, red dress, outdoor) |
| 触发词位置 |
必须在开头 |
| Token 限制 |
最多 225 tokens,超出会被截断 |
支持两种格式:
1 2 3 4 5
| # Danbooru 标签(推荐) mystyle, 1girl, long hair, red dress, outdoor, soft lighting
# 自然语言(也可) mystyle photo of a girl with long red hair standing outdoors
|
触发词(Trigger Word)— 关键干预点
触发词是风格 LoRA 最重要的控制开关。
| 有触发词 |
无触发词 |
mystyle, a cat → 用该画风画猫 |
a cat → 也带这个画风 |
a cat(不带触发词)→ 正常画风 |
无法关闭风格,所有图都被污染 |
正确做法:
1 2 3 4
| # 每个 caption 开头加触发词 mystyle, 1girl, forest, soft lighting, detailed background mystyle, cityscape, night, neon lights, cyberpunk mystyle, still life, flowers, vase, soft shadows
|
生图时:
1 2 3 4 5
| # 想用这个风格 mystyle, a girl reading book in library
# 不想用这个风格(不加触发词) a girl reading book in library
|
常见清理的标签
WD Tagger 会输出一些训练不需要的标签:
| 标签 |
建议处理 |
原因 |
watermark |
删除 |
不想让模型学水印 |
signature |
删除 |
同上 |
text |
删除 |
画面中的文字通常不需要 |
caption |
删除 |
字幕/对白框 |
lowres |
可选删除 |
取决于你的训练图片质量 |
bad anatomy |
可选删除 |
如果原画作有解剖问题 |
数据量与过拟合风险
| 数据量 |
过拟合风险 |
训练步数建议 |
说明 |
| < 20张 |
高 |
500-1000 |
容易记住具体内容,需严格控制步数 |
| 20-50张 |
中 |
1500-3000 |
标准配置,需监控生成效果 |
| 100-300张 |
低 |
2000-4000 |
数据充足,泛化性好 |
| 500张+ |
很低 |
3000-5000 |
数据丰富,学到的是抽象风格 |
过拟合表现:
- 生成的图像和训练集中某张图几乎一样
- 风格过于强烈,LoRA 强度调到 0.3 都很明显
- 缺乏灵活性,无法和其他风格融合
缓解方法:
- 数据量充足时,降低 repeats per image(设为 1)
- 数据量充足时,可适当降低 learning rate(1e-4)
- 定期检查生成效果,发现过拟合及时停止
大数据量训练配置示例(500张+)
| 参数 |
推荐值 |
原因 |
| Steps |
3000-5000 |
数据多,可以多跑几轮 |
| Repeats |
1 |
数据充足不需要重复 |
| Batch Size |
1 |
显存限制 |
| LoRA Rank |
16-32 |
风格复杂可稍高 |
| Learning Rate |
1e-4 |
数据多可稍低,更稳定 |
五、生图工作流
模型文件放置
| 文件类型 |
文件名 |
放置路径 |
| Diffusion Model |
flux2-klein-9B-transformer-NVFP4.safetensors |
models/diffusion_models/ |
| Text Encoder |
qwen_3_8b_fp8mixed.safetensors |
models/text_encoders/ |
| VAE |
flux2-vae.safetensors |
models/vae/ |
| LoRA |
你的 LoRA 文件 |
models/loras/ |
ComfyUI 节点配置
必需节点
| 节点 |
作用 |
关键配置 |
| UNETLoader |
加载扩散模型 |
weight_dtype: fp8_e4m3fn(16GB 显存推荐) |
| CLIPLoader |
加载 Qwen3 文本编码器 |
单个 CLIPLoader(非 DualCLIPLoader) |
| VAELoader |
加载 VAE |
选择 flux2-vae.safetensors |
| CLIPTextEncode |
编码 prompt |
正向 prompt + 可选负向 prompt |
| EmptyLatentImage |
生成空白潜空间 |
设置分辨率(如 1024×1024) |
| KSampler |
采样生成 |
见下表 |
| VAEDecode |
潜空间转图像 |
— |
| SaveImage |
保存图像 |
— |
KSampler 参数(16GB 显存优化)
| 参数 |
推荐值 |
说明 |
| Steps |
20-30 |
Klein 9B 建议值 |
| CFG |
4-6 |
5.0 推荐 |
| Sampler |
dpmpp_2m 或 euler |
— |
| Scheduler |
normal 或 sgm_uniform |
— |
| Denoise |
1.0(文生图) |
图生图用 0.7-0.8 |
LoRA 加载
节点:LoraLoader
连接顺序:
1 2 3
| UNETLoader ──► LoraLoader ──► KSampler │ CLIPLoader ─────►┘
|
| 参数 |
推荐值 |
说明 |
lora_name |
选择你的 LoRA |
从 models/loras/ 选择 |
strength_model |
0.7-1.0 |
模型影响力 |
strength_clip |
1.0 |
文本编码器影响力 |
FLUX.2 Klein vs FLUX.1 的关键区别
| 项目 |
FLUX.1 |
FLUX.2 Klein |
| 文本编码器 |
T5 XXL + CLIP-L(DualCLIPLoader) |
Qwen3 8B(单个 CLIPLoader) |
| 语言支持 |
英语为主 |
原生支持中文 |
| 模型文件 |
t5xxl_fp16.safetensors + clip_l.safetensors |
qwen_3_8b_fp8mixed.safetensors |
节点连接图
1 2 3 4 5 6 7 8 9 10 11
| UNETLoader ───────────────────────────────────────────┐ │ CLIPLoader ─┬─► LoraLoader ─┬─► CLIPTextEncode (+) ──┼─► KSampler ─► VAEDecode ─► SaveImage │ │ │ ▲ │ └─► CLIPTextEncode (-) ──┤ │ │ │ └───────────────────────────────────────────┘ │ VAELoader ──────────────────────────────────────────────┘ │ EmptyLatentImage ───────────────────────────────────────┘
|
16GB 显存优化配置
| 配置项 |
值 |
说明 |
| 模型格式 |
NVFP4 |
flux2-klein-9B-transformer-NVFP4.safetensors |
| Text Encoder |
FP8 |
qwen_3_8b_fp8mixed.safetensors |
| Weight Dtype |
fp8_e4m3fn |
UNETLoader 设置 |
| 分辨率 |
1024×1024 |
显存够可用更高 |
| 显存占用 |
~13-14GB |
留 2-3GB 给推理缓存 |
内置工作流模板
ComfyUI 内置了 FLUX.2 Klein 工作流,加载方式:
1
| ComfyUI → Load → Default Workflows → Flux2
|
可选模板:
image_flux2_klein_text_to_image.json — 文生图
image_flux2_klein_image_edit_9b_base.json — 图生图
image_flux2_klein_image_edit_9b_distilled.json — 蒸馏版图生图
训练监控
FluxGym UI 内置监控项:
| 监控项 |
说明 |
| Loss 曲线 |
观察是否收敛、是否过拟合(先降后升) |
| Checkpoint 保存 |
每 N 步保存一次,方便回滚 |
| 生成预览 |
训练过程中用 LoRA 生成样本,直观判断效果 |
| 显存占用 |
是否 OOM、是否有泄漏 |
建议配置:
- 每 500 步保存一次 checkpoint
- 每 200 步生成预览图
- 发现过拟合(Loss 上升或生成质量下降)立即停止
六、磁盘空间预估
| 项目 |
大小 |
| 训练模型(FP8) |
~16GB |
| 生图模型(NVFP4) |
~12GB |
| ComfyUI + FluxGym |
~2GB |
| Python 环境 |
~3GB |
| 训练数据 + LoRA 输出 |
~5GB |
| 总计 |
~40GB |
C 盘 500GB+ 剩余完全够用。
七、常见问题
Q: nvidia-smi 在 WSL2 里看不到 GPU?
A: 确保 Windows 驱动 >= 595.76,WSL2 不需要单独装驱动。
Q: PyTorch 报错 CUDA not available?
A: 必须用 cu128 版本,RTX 5070 Ti 是 Blackwell 架构。
Q: 训练时 CUDA OOM?
A: 降低 batch_size 到 1,启用 gradient checkpointing,用 FP8 模型。
Q: 生图很慢?
A: 确保用 NVFP4 量化模型,T5/Qwen 可以卸载到 CPU。
八、验证清单
九、快速启动脚本
创建 ~/start-flux.sh:
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash source ~/flux-env/bin/activate
tmux new-session -d -s flux 'cd ~/ComfyUI && python main.py --listen' tmux new-window -t flux -n gym 'cd ~/fluxgym && python app.py'
echo "ComfyUI: http://localhost:8188" echo "FluxGym: http://localhost:7860" echo "Attach: tmux attach -t flux"
|
使用:
1 2
| chmod +x ~/start-flux.sh ./start-flux.sh
|
十、文档更新记录
2026-05-11 核实修正
| 原内容 |
修正后 |
原因 |
来源 |
| NVIDIA 驱动 >= 595.76 |
>= 550.90(推荐 595.76+) |
595.76 是热修复版,非最低要求;550.90 才是 Blackwell 基础支持 |
NVIDIA R550 Driver |
| Ubuntu 22.04 |
Ubuntu 24.04 |
RTX 50 系列在 24.04 内核支持更好,原生 CUDA 12.8 支持,10 年 LTS |
Ubuntu 22.04 vs 24.04 深度学习对比 |
| PyTorch nightly cu128 |
稳定版 2.7.0 cu128(nightly 备选) |
PyTorch 2.7.0 稳定版已支持 CUDA 12.8,生产环境推荐稳定版 |
PyTorch 2.7.0 cu128 安装 |
git clone sd-scripts |
git clone -b sd3 sd-scripts |
kohya sd-scripts 主分支不支持 FLUX.2,必须用 sd3 分支 |
kohya-ss FLUX 训练 |
clip_l: null |
clip_l: qwen_3_8b_fp8mixed.safetensors |
FLUX.2 Klein 用 Qwen3 8B 替代 CLIP-L,设为 null 会导致模型加载失败 |
FluxGym models.yaml 格式 |
huggingface-cli |
hf |
huggingface_hub v1.0 后 huggingface-cli 已弃用,统一使用 hf 命令 |
Hugging Face v1.0 发布 |
验证通过项
- RTX 5070 Ti 计算能力 = (12, 0) / sm_120(Blackwell 架构)
- FluxGym 仓库活跃,支持 FLUX.2 系列
- Comfy-Org/flux2-klein-9B split_files 路径正确,包含 NVFP4 量化文件
- rgthree-comfy、ComfyUI-Easy-Use 节点持续维护
- 训练配置(AdamW 8bit、bf16、gradient checkpointing)正确
- ModelScope 存在 black-forest-labs/FLUX.2-klein-base-9B 模型
2026-05-11 补充训练工具对比