Files
face-lora-qwen-image/config/训练脚本.py
T

77 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
正式训练脚本:脸部 LoRAQwen-Image Edit-2511 / 16G 显存 / 32G 内存优化)
用法: python 训练脚本.py
前置: output/train_dataset/ 里有 img_001.jpg + img_001.txt 打标
"""
import json
import os
import subprocess
import sys
os.environ["PYTHONUTF8"] = "1"
os.environ["HF_HUB_OFFLINE"] = "1"
VENV = r"M:\AI\sd\musubi-tuner\.venv\Scripts"
PROJ = r"D:\F\NewI\opencode\daily-workspace\projects\脸部LoRA训练-Qwen-Image"
MODELS = r"M:\AI\sd\models\qwen-edit-2511"
# 动态目录配置(GUI 训练 Tab 写入 config/train_config.json
_cfg = {}
_cfg_path = os.path.join(PROJ, "config", "train_config.json")
if os.path.exists(_cfg_path):
try:
_cfg = json.load(open(_cfg_path, encoding="utf-8-sig")) # utf-8-sig 处理 BOM
except Exception as _e:
print(f"[WARN] train_config.json 读取失败: {_e}")
_cfg = {}
TRAIN_DATASET = _cfg.get("train_dataset", os.path.join(PROJ, "output", "train_dataset"))
CKPT_OUT = _cfg.get("output_dir", os.path.join(PROJ, "output", "checkpoints"))
# 动态生成数据集配置(image_directory 指向所选训练集)
_dataset_toml = os.path.join(PROJ, "config", "dataset_active.toml")
_toml_body = f"""# 由 GUI 训练 Tab 动态生成(勿手改)
[general]
resolution = 1024
caption_extension = ".txt"
batch_size = 1
enable_bucket = true
bucket_no_upscale = false
[[datasets]]
image_directory = "{TRAIN_DATASET.replace(chr(92), '/')}"
num_repeats = 1
"""
with open(_dataset_toml, "w", encoding="utf-8") as _f:
_f.write(_toml_body)
cmd = [
os.path.join(VENV, "accelerate.exe"), "launch",
"--num_cpu_threads_per_process", "1", "--mixed_precision", "bf16",
r"D:\AI\sd\musubi-tuner\src\musubi_tuner\qwen_image_train_network.py",
"--dit", os.path.join(MODELS, "transformer", "diffusion_pytorch_model-00001-of-00005.safetensors"),
"--vae", os.path.join(MODELS, "diffusion_pytorch_model.safetensors"),
"--text_encoder", os.path.join(MODELS, "text_encoder", "model-00001-of-00004.safetensors"),
"--model_version", "edit-2511",
"--dataset_config", _dataset_toml,
"--sdpa", "--mixed_precision", "bf16",
"--timestep_sampling", "shift", "--weighting_scheme", "none", "--discrete_flow_shift", "2.2",
"--optimizer_type", "adamw8bit", "--learning_rate", "5e-5",
"--gradient_checkpointing",
"--network_module", "networks.lora_qwen_image", "--network_dim", "16",
# 续炼:加载旧 LoRA 000060(脸已成形、细节未过度固化),用重调后的 v7 数据增量修正标签
"--network_weights", r"M:\AI\sd\novelai-webui-aki-v3-r\models\Lora\v6\myface_lora-000060.safetensors",
"--fp8_base", "--fp8_scaled", "--fp8_vl", "--blocks_to_swap", "24",
"--max_train_epochs", "50", "--save_every_n_epochs", "10", "--seed", "42",
"--sample_prompts", os.path.join(PROJ, "config", "sample_prompts.txt"),
"--sample_every_n_epochs", "10",
"--output_dir", CKPT_OUT,
"--output_name", "myface_v7",
]
print("训练集:", TRAIN_DATASET)
print("输出目录:", CKPT_OUT)
print("CMD:", " ".join(cmd))
r = subprocess.run(cmd)
print("EXIT CODE:", r.returncode)
sys.exit(r.returncode)