60 分钟内用 LoRA 微调 FLUX.2 [klein] 模型实操指南
为什么选 FLUX.2 [klein] 做微调
FLUX.2 [klein] 有两个版本:4B 和 9B,每个又分 base(50 步)和 distilled(4 步)。做 LoRA 微调时,应该用 base 版本作为训练目标。原因很简单:distilled 模型是为了快速推理而压缩的,不能直接拿来训练;但你在 base 上训好的 LoRA,完全可以加载到 distilled 模型上跑,速度更快,效果往往还更好。
以 4B 版本为例,它的权重在 bf16 下约 13GB,加上 LoRA 训练开销,总显存占用能控制在 24GB 以内。这意味着一张 RTX 4090 或云上的 L4 就够用。训练一次大约一小时,租卡成本大概 0.5 美元。而且模型是 Apache 2.0 协议,你训出来的东西可以自由发布。
如果你只是想用现成的 LoRA,Hugging Face Hub 上已经有不少社区作品。但当你需要一种现有 LoRA 没覆盖的独特风格或编辑能力时,自己动手就很有必要了。
准备工作
你需要三样东西:
- 15–40 张图片:它们得共享同一种视觉风格(比如你的插画、有授权的照片,或者维基共享资源里的公有领域作品)。
- 一块 GPU:建议 RTX 4090(24GB),训练时间能压到一小时内。
- 一个训练器:本文推荐 ostris/ai-toolkit,它带图形界面,不用手写 YAML。当然,任何支持 klein 的训练器都行。
ai-toolkit 提供两种运行方式:一是通过 RunPod 模板一键部署(适合大多数人,成本约 0.5 美元/次);二是本地运行(前提是你有 24GB 以上显存的 NVIDIA 显卡)。无论哪种,后续的数据集和标注规则都一样。
第一步:构建数据集
风格 LoRA 的数据要求
风格 LoRA 是最容易出效果的类型。假设你想做一个像素风角色 LoRA,那就收集 15–40 张具有相同视觉语言的图。注意几点:
- 主体要多样:不同角色、角度、构图,别老用同一个背景。
- 分辨率至少 1024px(长边)。
- 每张图配一个同名
.txt文件(如img (1).png对应img (1).txt)。
标注的核心原则:只描述内容,不提风格
这是最容易犯错的地方。对于风格 LoRA,你的标注应该只说图里有什么,绝口不提画风。因为风格正是你希望模型自己学会的东西。
每条标注以一个自创触发词开头,后面跟主体描述:
SPR1TE8. 一个穿板甲、手持剑的骑士,正面,纯色背景。
SPR1TE8. 一只展翅喷火的龙,侧面视角。千万别写“像素艺术”“8-bit”“复古游戏”这类词。一旦你在标注里写了风格,模型就会依赖这个词来出图,而不是把风格真正学到权重里。
触发词要选一个现实中不存在的词,比如 SPR1TE8、RISO_PR1NT、ZK_TOON,避免和模型原有词汇冲突。这个触发词必须和后续训练配置里的 trigger_word 完全一致。
例外情况:如果你的数据集里包含几种明确的子风格,并且希望以后能通过提示词切换,那可以在标注里写出这些变体。例如:
SPR1TE8. 一个拿法杖的巫师,Q 版。
SPR1TE8. 一个宝箱,16-bit 像素风。
SPR1TE8. 一座山上的城堡,32-bit 像素风。这样,以后你就能在提示词里加 Q 版、16-bit 像素风 来控制输出。标注里写的,就是你以后能调的旋钮。
如果不想手动标注,可以用视觉模型自动描述,但记得检查并删掉漏进来的风格形容词。
第二步:配置训练器
用 Web UI 的话,填个表就行:指定数据集路径、选 FLUX.2-klein-base-4B、填触发词,然后开始。如果偏好 YAML 配置,Black Forest Labs 官方文档里有示例。每次训练只需改三处:
name:输出文件夹名。trigger_word:必须和标注里的触发词一致。datasets.folder_path:图片所在目录。
另外,记得在 sample.prompts 里用上你的触发词,这样训练过程中的预览图才能正确反映风格学习进度。
第三步:开始训练
点击“开始”或运行命令:
cd /app/ai-toolkit
python run.py /workspace/configs/my_lora_klein_4b.yaml训练会每 250 步存一个 checkpoint,并生成对应的样本图。在 4090 上跑 1800 步不到一小时。
关键提醒:看图选 checkpoint,别只看 loss。Loss 会一直降,但图像可能早就过拟合了。对大多数风格 LoRA 来说,750 到 1500 步之间往往是视觉效果最好的区间。打开样本图文件夹,挑一张最满意的,用那个 .safetensors 文件,别默认用最后一个。
第四步:使用你的 LoRA
加载 LoRA 只需在标准 pipeline 上加两行。以下代码从 Hugging Face Hub 加载一个现成的像素风 LoRA:
from diffusers import Flux2KleinPipeline
import torch
pipe = Flux2KleinPipeline.from_pretrained(
"black-forest-labs/FLUX.2-klein-4B", torch_dtype=torch.bfloat16
).to("cuda")
pipe.load_lora_weights("Limbicnation/pixel-art-lora")
img = pipe(
prompt="pixel art sprite, a brave knight in shining armor, game asset, transparent background",
num_inference_steps=4, guidance_scale=1.0,
height=512, width=512,
).images[0]注意,这里加载的是 distilled 版本的模型(4 步),而不是训练用的 base 版。实践表明,在 distilled 模型上应用 LoRA 效果更好、速度更快,所以这是推荐做法。
要测试自己的 LoRA,只需把 load_lora_weights 的路径换成你的 .safetensors 文件或 Hub 仓库,并在提示词里用上你的触发词。
不想写代码?可以用 Build Small 起始 Space,它有个标签页能同时显示原模型和 LoRA 的输出,方便对比效果。
如何训练编辑型 LoRA
FLUX.2 [klein] 不仅能文生图,还能图生图(编辑)。因此,你也可以训练一个编辑型 LoRA,比如输入一张宠物照片,输出一张特定风格的重绘图。
编辑 LoRA 和风格 LoRA 的区别全在数据,模型和训练器都一样。下面以一个名为 ugly-kontext-klein-4b-lora 的例子说明。
数据集结构变了
不再是单一文件夹,而是成对的两个:
ugly_kontext/
reference/ # 输入原图
target/ # 编辑后的目标图 + 标注训练器会根据文件名(不含扩展名)自动配对 reference/<id> 和 target/<id>。因为成对数据信息量更大,你只需要 50–200 对就够了(这个例子用了 120 对)。
标注内容是“指令”而非“描述”
风格 LoRA 的标注描述图里有什么,而编辑 LoRA 的标注则描述你希望执行的变换。例如:
把这张猫的照片改成同一姿势的丑陋草图
把这张狗的照片改成同一姿势的丑陋草图这里不需要自创触发词。只要在整个数据集中保持变换描述的一致性(比如都用“丑陋草图”),这个短语就会自动成为激活编辑的关键词。当然,你也可以额外加 trigger_word 来更严格地控制。
配置文件多一行
在数据集配置里,除了 folder_path(指向 target 目录),还要加一行 control_path(指向 reference 目录):
datasets:
- folder_path: "/workspace/datasets/ugly_kontext/target"
control_path: "/workspace/datasets/ugly_kontext/reference" # 这行让它变成编辑 LoRA
caption_ext: "txt"
resolution: [512]其他配置(模型架构、网络参数、学习率等)和风格 LoRA 完全一样。编辑 LoRA 的最佳 checkpoint 通常也在 1000–1750 步之间,同样要靠肉眼挑选。
推理时,你需要传入原图:
import torch
from PIL import Image
from diffusers import Flux2KleinPipeline
pipe = Flux2KleinPipeline.from_pretrained(
"black-forest-labs/FLUX.2-klein-4B", torch_dtype=torch.bfloat16
).to("cuda")
pipe.load_lora_weights(
"stephenbtl/ugly-kontext-klein-4b-lora",
weight_name="ugly_kontext_klein_4b_v1.safetensors",
)

reference = Image.open("your_pet.jpg").convert("RGB").resize((1024, 1024))
img = pipe(
prompt="把这张猫的照片改成同一姿势的丑陋草图",
image=reference,
num_inference_steps=4, guidance_scale=4.0,
).images[0]
值得注意的是,虽然这个 LoRA 只在猫狗照片上训练过,但它学到的是“保留结构,重绘为草图”这个通用编辑逻辑,所以给它一张建筑照片也能处理。
编辑 LoRA 的难点在于制作成对数据。常见方法有:复用已有的编辑数据集、用程序批量生成目标图(比如裁剪+放大)、或者用现有编辑模型跑一遍再筛选结果。
打包成 Gradio 应用
Build Small 黑客松要求提交一个托管在 Hugging Face Space 上的 Gradio 应用。你可以直接复制 起始 Space,它已经集成了文生图、图生图、LoRA 加载和训练指南,几分钟就能在你账号下跑起来。
部署前注意两点:
- ZeroGPU Space 需要 HF PRO 会员(9 美元/月)。没有的话,Space 依然能被任何人复制和运行,或者在你自己的 CUDA 机器上免费跑。但 CPU-only 的 Space 跑不动 4B 模型(需要 ~13GB 显存)。
- 在
requirements.txt里加上peft。否则load_lora_weights()会报错“PEFT backend is required”,导致应用启动后崩溃。
总结一下
整个流程其实很直接:
- 风格 LoRA:15–40 张图,内容-only 标注 + 自创触发词,训练时盯紧 750–1500 步的样本图。
- 编辑 LoRA:换成成对的
reference/target文件夹,标注写成变换指令,配置里加一行control_path。
训好后,把 LoRA 加载到 distilled 模型上跑,再套个 Gradio 界面,一个完整的应用就 ready 了。