ERNIE-Image 自定义风格微调实战:从零训练专属风格 LoRA
摘要:ERNIE-Image 的 LoRA 微调能力让个人创作者也能训练专属艺术风格。本文从零开始,教你准备数据集、配置训练环境、运行 LoRA 微调,并在 ComfyUI 中加载使用。全程本地运行,完全免费。
为什么需要风格微调?
ERNIE-Image 基模型已经覆盖了广泛的风格范围——从写实摄影到动漫、从水彩到油画。但当你有独特的视觉风格需求时,基模型往往力不从心:
- 品牌视觉一致性:电商产品的固定视觉风格
- 个人艺术签名:独特的绘画风格或配色方案
- IP 角色统一性:系列作品中角色外观保持一致
- 特定媒介风格:如赛博朋克、复古海报、极简主义等
LoRA(Low-Rank Adaptation)微调只需训练 0.5%~1.5% 的模型参数,就能让 ERNIE-Image "学会"你的专属风格。相比全量微调,它更快、更省资源,且可以像插件一样随时切换。
硬件要求
| 配置 | 最低要求 | 推荐配置 |
|---|---|---|
| GPU | NVIDIA 12GB VRAM | NVIDIA 24GB+ VRAM |
| 量化版本 | 8GB VRAM (GGUF/NVFP4) | — |
| 内存 | 16GB | 32GB |
| 磁盘 | 20GB 可用空间 | 40GB+ |
提示:如果你的 GPU 显存不足 12GB,可以考虑使用 Cloud GPU 服务(RunPod、Vast.ai),每小时成本约 $0.20~$0.50。
第一步:准备风格数据集
数据集要求
- 图片数量:10~50 张(风格越统一,效果越好)
- 图片分辨率:建议统一缩放至 1024×1024 或 1024×768
- 格式:JPG 或 PNG
- 风格一致性:所有图片应属于同一视觉风格
数据集示例结构
my-style-dataset/
├── images/
│ ├── style_001.jpg
│ ├── style_002.jpg
│ ├── ...
│ └── style_050.jpg
├── captions/
│ ├── style_001.txt # "a digital painting of a landscape in watercolor style"
│ ├── style_002.txt # "a digital painting of a portrait in watercolor style"
│ └── ...
└── metadata.json
生成 Caption 的方法
Caption(图像描述)告诉模型"这张图片是什么",而风格信息通过视觉特征学习。建议使用以下格式:
a [style_keyword] of [subject]
例如:
a watercolor painting of a cata cyberpunk digital art of a city streeta vintage poster illustration of a woman
技巧:可以使用 CLIP 或 BLIP 模型自动为图片生成 Caption,再手动修正风格关键词。
第二步:安装训练环境
方式一:使用官方 Diffusers + PEFT
# 创建虚拟环境
python3 -m venv ernie-lora-env
source ernie-lora-env/bin/activate
安装依赖
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
pip install diffusers transformers accelerate peft bitsandbytes
pip install datasets pillow timm
克隆 ERNIE-Image 仓库
git clone https://github.com/baidu/ERNIE-Image.git
cd ERNIE-Image
方式二:使用 DreamBooth 训练脚本
ERNIE-Image 基于 Diffusers 架构,可以直接使用 HuggingFace 官方的 train_dreambooth.py 脚本:
git clone https://github.com/huggingface/diffusers.git
cd examples/dreambooth
pip install -r requirements.txt
第三步:运行 LoRA 微调训练
训练命令
accelerate launch train_dreambooth_lora.py \
--pretrained_model_name_or_path=baidu/ERNIE-Image \
--instance_data_dir=./my-style-dataset/images \
--instance_prompt="a {style_keyword} of subject" \
--output_dir=./lora-outputs \
--learning_rate=1e-4 \
--max_train_steps=1000 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--resolution=1024 \
--mixed_precision=bf16 \
--lora_rank=32 \
--lora_alpha=16 \
--lora_target_modules=["to_q","to_k","to_v","to_out.0"] \
--checkpointing_steps=200 \
--seed=42
关键参数说明
| 参数 | 推荐值 | 说明 |
|---|---|---|
learning_rate |
1e-4 ~ 5e-4 | 太高会导致过拟合,太低训练不充分 |
max_train_steps |
500~2000 | 图片少用少步数,图片多可多步数 |
lora_rank |
16~64 | 越大表达能力越强,但文件也越大 |
lora_alpha |
lora_rank/2 | 通常设为 rank 的一半 |
mixed_precision |
bf16 | 需要 Ampere+ GPU;旧 GPU 用 fp16 |
训练时间参考
| 图片数 | 步数 | 学习率 | RTX 3090 耗时 | RTX 4090 耗时 |
|---|---|---|---|---|
| 15 张 | 500 | 3e-4 | ~15 分钟 | ~10 分钟 |
| 30 张 | 1000 | 2e-4 | ~30 分钟 | ~20 分钟 |
| 50 张 | 2000 | 1e-4 | ~60 分钟 | ~40 分钟 |
第四步:验证微调效果
快速测试
训练完成后,在 lora-outputs 目录中找到 pytorch_lora_weights.safetensors 文件。使用以下 Python 代码测试:
from diffusers import DiffusionPipeline
from transformers import AutoTokenizer
加载基模型
pipe = DiffusionPipeline.from_pretrained(
"baidu/ERNIE-Image",
torch_dtype=torch.float16
)
pipe.to("cuda")
加载 LoRA
pipe.load_lora_weights("./lora-outputs", weight_name="pytorch_lora_weights.safetensors")
生成测试图
prompt = "a watercolor painting of a mountain landscape, soft colors, flowing brush strokes"
image = pipe(prompt, num_inference_steps=50, guidance_scale=7.5).images[0]
image.save("test_output.png")
评估要点
- 风格一致性:不同主题的生成结果是否保持统一风格?
- 过度拟合:模型是否只复训练数据中的图片,而非学习风格?
- Prompt 响应:改变 prompt 中的主体描述,风格是否跟随?
第五步:在 ComfyUI 中使用 LoRA
安装步骤
- 将
pytorch_lora_weights.safetensors复制到ComfyUI/models/loras/目录 - 启动 ComfyUI
- 在节点图中添加 "Load LoRA" 节点
- 选择你的 LoRA 模型文件
- 设置 LoRA 强度(推荐 0.6~0.9)
ComfyUI 工作流示例
[Load Checkpoint: ERNIE-Image]
↓
[Load LoRA: your-style-lora.safetensors, strength=0.8]
↓
[CLIP Text Encode (Positive Prompt)]
↓
[KSampler] → [VAE Decode] → [Save Image]
技巧:LoRA 强度设为 0.8 时通常效果最佳。过高(>1.0)可能导致风格过度,过低(<0.5)效果不明显。
常见问题与解决方案
问题 1:训练过程中显存溢出 (OOM)
RuntimeError: CUDA out of memory
解决方案:
- 降低
resolution至 768 或 512 - 使用梯度检查点:
--gradient_checkpointing - 减小
train_batch_size或增加gradient_accumulation_steps - 使用 8-bit 优化器:
--optimizer_type=8bit_adam
问题 2:生成的图片与训练数据过于相似
这是过度拟合的表现。
解决方案:
- 降低学习率(从 3e-4 降至 1e-4)
- 减少训练步数
- 在 instance prompt 中加入更多变化(不同主体描述)
- 使用 regularization images(正则化图片)
问题 3:风格不够明显
解决方案:
- 增加
lora_rank至 64 - 增加训练步数
- 确保训练数据的风格足够统一和鲜明
- 在 ComfyUI 中提高 LoRA 强度至 0.9~1.0
问题 4:多个 LoRA 叠加使用
ERNIE-Image 支持同时加载多个 LoRA,可以组合风格+角色:
pipe.load_lora_weights("./style-lora", weight_name="pytorch_lora_weights.safetensors", adapter_name="style")
pipe.load_lora_weights("./character-lora", weight_name="pytorch_lora_weights.safetensors", adapter_name="character")
pipe.set_adapters(["style", "character"], adapter_weights=[0.8, 0.7])
总结
ERNIE-Image 的 LoRA 风格微调是一项零成本的个性化生成能力。通过准备 1050 张风格统一的数据集,在消费级 GPU 上训练 1560 分钟,你就可以拥有一个专属的艺术风格模型。
核心流程回顾:
- 准备 10~50 张风格统一的图片 + Caption
- 配置 Diffusers + PEFT 训练环境
- 运行 LoRA 微调(lr=1e-4, steps=1000, rank=32)
- 验证风格效果
- 在 ComfyUI 中加载使用
与 Midjourney 的 --sref(风格参考)或 FLUX 的参考图功能相比,ERNIE-Image LoRA 提供了更精确、更可控的风格迁移能力——而且完全免费、本地运行。
本文首发于 ernie-image.app,欢迎转载并注明出处。