训练功能改用本地 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:
@@ -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 包) |
|
||||
|
||||
## 查看日志
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user