From 4b959b3a987b2d0ba25307b91f7d5633872d096d Mon Sep 17 00:00:00 2001 From: colomi <1421901449@qq.com> Date: Sat, 11 Jul 2026 18:53:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=AD=E7=BB=83=E5=8A=9F=E8=83=BD=E6=94=B9?= =?UTF-8?q?=E7=94=A8=E6=9C=AC=E5=9C=B0=20kohya=20conda=20=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E6=89=A7=E8=A1=8C=EF=BC=8C=E7=A7=BB=E9=99=A4=20Docker?= =?UTF-8?q?=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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→训练→保存) --- README.md | 9 +++---- photo_service/lora_train_service_1.py | 34 ++++++++++++++++----------- setup.sh | 2 +- start_all_services.sh | 1 + 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 5bbf1f9..8da7782 100644 --- a/README.md +++ b/README.md @@ -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 包) | ## 查看日志 diff --git a/photo_service/lora_train_service_1.py b/photo_service/lora_train_service_1.py index eff8401..8fee251 100644 --- a/photo_service/lora_train_service_1.py +++ b/photo_service/lora_train_service_1.py @@ -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) diff --git a/setup.sh b/setup.sh index f3810b9..e7faa9c 100755 --- a/setup.sh +++ b/setup.sh @@ -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" diff --git a/start_all_services.sh b/start_all_services.sh index 7d9e0a3..96895a4 100755 --- a/start_all_services.sh +++ b/start_all_services.sh @@ -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"