训练功能改用本地 kohya conda 环境执行,移除 Docker 依赖

- lora_train_service_1.py: 将 sudo docker run 命令替换为本地
  python -m accelerate.commands.launch,通过 PYTHONPATH 复用 .local/
  下的 torch/accelerate/bitsandbytes 等包
- setup.sh: 添加 kohya 环境到 conda-pack 恢复列表
- start_all_services.sh: 导出 CONDA_BASE 供 photo_service 读取
- README.md: 添加 kohya.tar.gz 到网盘下载清单
- 已验证: 训练命令可完整执行(加载底模→创建LoRA→训练→保存)
This commit is contained in:
colomi
2026-07-11 18:53:45 +08:00
parent 40a512a6c4
commit 4b959b3a98
4 changed files with 27 additions and 19 deletions
+5 -4
View File
@@ -47,8 +47,9 @@ cd ~/change_hair_3090
| kohya_ss_home/.cache/ | 3.3M | CLIP 缓存 |
| kohya_ss_home/kohya_ss/ | 439M | 训练代码 |
| data/ | 4.9G | 业务数据 |
| conda_envs/my_hair.tar.gz | ~5G | conda 环境 |
| conda_envs/sdwebui.tar.gz | ~4G | conda 环境 |
| conda_envs/my_hair.tar.gz | ~5G | conda 环境(换发算法) |
| conda_envs/sdwebui.tar.gz | ~4G | conda 环境SD WebUI |
| conda_envs/kohya.tar.gz | 84M | conda 环境(LoRA 训练,仅含 Python+numpy,大包在 .local/ |
### 3. 运行部署脚本
@@ -59,7 +60,7 @@ chmod +x setup.sh start_all_services.sh
setup.sh 会:
1. 生成 configure.ini(自动替换路径)
2. 恢复 conda 环境(my_hair, sdwebui, py310
2. 恢复 conda 环境(my_hair, sdwebui, kohya 从 conda-pack 恢复;py310 从 yml 创建
3. 检查模型和数据目录完整性
4. 创建运行时目录
@@ -75,7 +76,7 @@ setup.sh 会:
|------|------|-----------|------|
| hair_service_sd | 8801 | my_hair | 换发型/换发色核心算法 |
| stable-diffusion-webui | 57860 | sdwebui | SD 图生图推理 |
| photo_service | 32678 | py310 | LoRA 训练调度 |
| photo_service | 32678 | py310 | LoRA 训练调度(训练子进程使用 kohya 环境 + .local 包) |
## 查看日志
+20 -14
View File
@@ -43,6 +43,15 @@ else:
webui_lora_dir = os.path.join(BASE_DIR, 'stable-diffusion-webui', 'models', 'Lora')
inference_use_onediff = False
callback_url = 'http://0.0.0.0:8801/api/hair/trainCallBack'
# kohya 训练环境路径(本地执行,不再使用 Docker)
CONDA_BASE = os.environ.get('CONDA_BASE', os.path.expanduser('~/miniconda3'))
kohya_python = os.path.join(CONDA_BASE, 'envs', 'kohya', 'bin', 'python')
kohya_local_packages = os.path.join(kohya_ss_home_dir, '.local', 'lib', 'python3.10', 'site-packages')
kohya_ss_code_dir = os.path.join(kohya_ss_home_dir, 'kohya_ss')
sd_models_dir = os.path.join(BASE_DIR, 'stable-diffusion-webui', 'models', 'Stable-diffusion')
clip_cache_dir = os.path.join(kohya_ss_home_dir, '.cache', 'clip')
base_webui_port = '57860'
base_onediff_port = '9038'
base_webui_url = "http://127.0.0.1:57860/sdapi/v1/img2img"
@@ -299,27 +308,24 @@ def train_thread(sq, gpu_id):
# f.write('titor hairstyle, faceless, no human, gray background, simple background, ' + tags)
os.system(f'chmod 777 {model_dir}')
#训练头发lora
sd_models_dir = os.path.join(BASE_DIR, 'stable-diffusion-webui', 'models', 'Stable-diffusion')
container_images_dir = images_dir.replace(kohya_ss_home_dir, '/home/chinatszrn')
container_model_dir = model_dir.replace(kohya_ss_home_dir, '/home/chinatszrn')
#训练头发lora(本地执行,使用 kohya conda 环境 + .local 包)
base_model_path = os.path.join(sd_models_dir, 'v1-5-pruned-emaonly.safetensors')
cmd_train = (
f'sudo docker run --rm --privileged=true --gpus "device=0" '
f'-v {kohya_ss_home_dir}:/home/chinatszrn '
f'-v {sd_models_dir}:/mnt/sd_models '
'-e PATH=/home/chinatszrn/.local/bin -w /home/chinatszrn/kohya_ss '
'--net=host chinatszrn/ubuntu:kohya_ss accelerate launch --num_cpu_threads_per_process=2 "./train_network.py" --enable_bucket '
'--min_bucket_reso=256 --max_bucket_reso=2048 --pretrained_model_name_or_path="/mnt/sd_models/v1-5-pruned-emaonly.safetensors" '
f'--train_data_dir={container_images_dir} --resolution="2000,2000" '
f'--output_dir={container_model_dir} '
f'cd "{kohya_ss_code_dir}" && '
f'PYTHONPATH="{kohya_local_packages}" '
f'"{kohya_python}" -m accelerate.commands.launch --num_cpu_threads_per_process=2 "./train_network.py" --enable_bucket '
'--min_bucket_reso=256 --max_bucket_reso=2048 '
f'--pretrained_model_name_or_path="{base_model_path}" '
f'--train_data_dir="{images_dir}" --resolution="2000,2000" '
f'--output_dir="{model_dir}" '
'--network_alpha="64" --save_model_as=safetensors --network_module=networks.lora --text_encoder_lr=5e-05 '
'--unet_lr=0.0001 --network_dim=128 --output_name="hairstyle_hd_lora" --lr_scheduler_num_cycles="20" '
'--no_half_vae --learning_rate="0.0001" --lr_scheduler="cosine" --lr_warmup_steps="650" --train_batch_size="1" '
'--max_train_steps="1500" --save_every_n_epochs="100" --mixed_precision="fp16" --save_precision="fp16" '
'--caption_extension=".txt" --sample_sampler=ddim '
f'--sample_prompts={sample_txt} --sample_every_n_epochs="1000" '
f'--sample_prompts="{sample_txt}" --sample_every_n_epochs="1000" '
'--seed="1234" --cache_latents --optimizer_type="AdamW8bit" --max_data_loader_n_workers="0" --bucket_reso_steps=64 '
'--xformers --bucket_no_upscale --noise_offset=0.0 --tokenizer_cache_dir="/home/chinatszrn/.cache/clip"')
f'--xformers --bucket_no_upscale --noise_offset=0.0 --tokenizer_cache_dir="{clip_cache_dir}"')
print("cmd_train:", cmd_train)
os.system(cmd_train)
+1 -1
View File
@@ -27,7 +27,7 @@ echo " configure.ini 已生成"
# 3. 恢复 conda 环境(conda-pack
echo "[3/7] 恢复 conda 环境..."
for env_name in my_hair sdwebui; do
for env_name in my_hair sdwebui kohya; do
if [ -f "$BASE_DIR/conda_envs/${env_name}.tar.gz" ]; then
echo " 恢复 $env_name ..."
rm -rf "$CONDA_BASE/envs/$env_name"
+1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
CONDA_BASE="${CONDA_BASE:-/home/szlc/miniconda3}"
export CONDA_BASE
mkdir -p "$BASE_DIR/logs"