diff --git a/DEPLOY.md b/DEPLOY.md index 7872a61..b96fa5e 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -99,27 +99,69 @@ change_hair_3090/ ## 4. 下载网盘文件 -将网盘上的以下文件/目录下载到项目根目录(与代码合并)。**所有路径必须与下表一致**。 +将网盘上的 `cloud_packages/` 目录下载到项目根目录。网盘文件已分类打包为 14 个文件,便于上传和下载。 -### 4.1 网盘文件清单 +### 4.1 网盘文件清单(已分类打包) -| 路径 | 大小 | 说明 | +| 文件 | 大小 | 说明 | |------|------|------| -| `hair_service_sd/weights/` | 9.9G | 换发算法模型(matting、分割等) | -| `stable-diffusion-webui/models/` | 41G | SD 模型 + 228 个 LoRA + 辅助模型 | -| `stable-diffusion-webui/extensions/sd-webui-controlnet/` | 4.4G | ControlNet 扩展 | -| `stable-diffusion-webui/repositories/` | 225M | SD 依赖仓库(k-diffusion 等) | -| `kohya_ss_home/.local/` | 7.6G | 训练 pip 包(torch、accelerate、diffusers 等) | -| `kohya_ss_home/.cache/` | 3.3M | CLIP tokenizer 缓存 | -| `kohya_ss_home/kohya_ss/` | 439M | kohya_ss 训练代码 | -| `data/` | 4.9G | 业务数据(参考发型图等) | -| `conda_envs/my_hair.tar.gz` | 4.2G | conda 环境(换发算法服务用) | -| `conda_envs/sdwebui.tar.gz` | 3.6G | conda 环境(SD WebUI 用) | -| `conda_envs/kohya.tar.gz` | 84M | conda 环境(LoRA 训练用,仅含 Python+numpy) | +| `my_hair.tar.gz` | 4.2G | conda 环境(换发算法服务用) | +| `sdwebui.tar.gz` | 3.6G | conda 环境(SD WebUI 用) | +| `kohya.tar.gz` | 84M | conda 环境(LoRA 训练用,仅含 Python+numpy) | +| `sd_base_models.tar.gz` | 3.6G | SD 底模(v1-5-pruned-emaonly.safetensors) | +| `lora_0-9.tar.gz` | 29G | LoRA 模型(数字开头,约 228 个) | +| `lora_h.tar.gz` | 132M | LoRA 模型(h 开头) | +| `lora_n.tar.gz` | 132M | LoRA 模型(n 开头) | +| `lora_t.tar.gz` | 791M | LoRA 模型(t 开头) | +| `weights.tar.gz` | 9.2G | 换发算法模型(matting、分割等) | +| `kohya_local.tar.gz` | 3.4G | 训练 pip 包(torch、accelerate、diffusers 等) | +| `kohya_code.tar.gz` | 365M | kohya_ss 训练代码 + CLIP 缓存 | +| `data.tar.gz` | 3.4G | 业务数据(参考发型图等) | +| `webui_controlnet.tar.gz` | 4.1G | ControlNet 扩展 | +| `webui_repositories.tar.gz` | 221M | SD 依赖仓库(k-diffusion 等) | -**合计约 76G** +**合计约 62G** -### 4.2 下载后验证 +### 4.2 下载后解压 + +```bash +cd ~/change_hair_3090 + +# 创建 cloud_packages 目录并下载网盘文件到这里 +mkdir -p cloud_packages +# ... 将网盘上的 cloud_packages/ 目录下载到这里 ... + +# 解压所有包(按顺序执行) +echo "=== 1. 解压 conda 环境 ===" +tar -xzf cloud_packages/my_hair.tar.gz -C conda_envs/ +tar -xzf cloud_packages/sdwebui.tar.gz -C conda_envs/ +tar -xzf cloud_packages/kohya.tar.gz -C conda_envs/ + +echo "=== 2. 解压 SD 模型 ===" +tar -xzf cloud_packages/sd_base_models.tar.gz -C stable-diffusion-webui/models/Stable-diffusion/ + +echo "=== 3. 解压 LoRA 模型 ===" +tar -xzf cloud_packages/lora_0-9.tar.gz -C stable-diffusion-webui/models/Lora/ +tar -xzf cloud_packages/lora_h.tar.gz -C stable-diffusion-webui/models/Lora/ +tar -xzf cloud_packages/lora_n.tar.gz -C stable-diffusion-webui/models/Lora/ +tar -xzf cloud_packages/lora_t.tar.gz -C stable-diffusion-webui/models/Lora/ + +echo "=== 4. 解压换发算法权重 ===" +tar -xzf cloud_packages/weights.tar.gz -C hair_service_sd/ + +echo "=== 5. 解压 kohya 训练环境 ===" +tar -xzf cloud_packages/kohya_local.tar.gz -C kohya_ss_home/ +tar -xzf cloud_packages/kohya_code.tar.gz -C kohya_ss_home/ + +echo "=== 6. 解压业务数据 ===" +tar -xzf cloud_packages/data.tar.gz -C . + +echo "=== 7. 解压 WebUI 扩展 ===" +tar -xzf cloud_packages/webui_controlnet.tar.gz -C stable-diffusion-webui/extensions/ +tar -xzf cloud_packages/webui_repositories.tar.gz -C stable-diffusion-webui/ +``` + +### 4.3 解压后验证 ```bash cd ~/change_hair_3090 @@ -128,7 +170,7 @@ cd ~/change_hair_3090 ls -lh conda_envs/*.tar.gz ls -d hair_service_sd/weights/ ls -d kohya_ss_home/.local/ -ls -d stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors +ls -lh stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors ``` 期望输出: @@ -138,7 +180,7 @@ ls -d stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safeten -rw------- ... 3.6G ... conda_envs/sdwebui.tar.gz hair_service_sd/weights/ kohya_ss_home/.local/ -stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors +-rw-rw-r-- ... 4.0G ... v1-5-pruned-emaonly.safetensors ``` ### 4.3 关于 kohya 训练环境的架构说明 diff --git a/README.md b/README.md index 8da7782..58217e7 100644 --- a/README.md +++ b/README.md @@ -35,21 +35,31 @@ cd ~/change_hair_3090 ### 2. 下载网盘文件 -将网盘上的以下目录/文件下载到项目根目录(与代码合并): +将网盘上的 `cloud_packages/` 目录下载到项目根目录。网盘文件已分类打包为 14 个文件(合计约 62G): -| 路径 | 大小 | 说明 | +| 文件 | 大小 | 说明 | |------|------|------| -| hair_service_sd/weights/ | 10G | 换发算法模型 | -| stable-diffusion-webui/models/ | 41G | SD模型 + LoRA + 辅助模型 | -| stable-diffusion-webui/extensions/sd-webui-controlnet/ | 4.4G | ControlNet 扩展 | -| stable-diffusion-webui/repositories/ | 225M | SD 依赖仓库 | -| kohya_ss_home/.local/ | 7.6G | 训练 pip 包 | -| 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 环境(SD WebUI) | -| conda_envs/kohya.tar.gz | 84M | conda 环境(LoRA 训练,仅含 Python+numpy,大包在 .local/) | +| my_hair.tar.gz | 4.2G | conda 环境(换发算法服务用) | +| sdwebui.tar.gz | 3.6G | conda 环境(SD WebUI 用) | +| kohya.tar.gz | 84M | conda 环境(LoRA 训练用) | +| sd_base_models.tar.gz | 3.6G | SD 底模 | +| lora_0-9.tar.gz | 29G | LoRA 模型(约 228 个) | +| lora_h.tar.gz | 132M | LoRA 模型 | +| lora_n.tar.gz | 132M | LoRA 模型 | +| lora_t.tar.gz | 791M | LoRA 模型 | +| weights.tar.gz | 9.2G | 换发算法模型 | +| kohya_local.tar.gz | 3.4G | 训练 pip 包(torch、accelerate 等) | +| kohya_code.tar.gz | 365M | kohya_ss 训练代码 | +| data.tar.gz | 3.4G | 业务数据 | +| webui_controlnet.tar.gz | 4.1G | ControlNet 扩展 | +| webui_repositories.tar.gz | 221M | SD 依赖仓库 | + +下载后执行解压脚本: + +```bash +# 将 cloud_packages/ 目录放到项目根目录后 +./setup.sh +``` ### 3. 运行部署脚本 diff --git a/setup.sh b/setup.sh index 3120bae..007712d 100755 --- a/setup.sh +++ b/setup.sh @@ -24,8 +24,85 @@ echo "" ERRORS=() +# 0. 自动解压网盘文件(如果 cloud_packages/ 存在) +CLOUD_DIR="$BASE_DIR/cloud_packages" +if [ -d "$CLOUD_DIR" ] && [ "$(ls -A "$CLOUD_DIR")" ]; then + echo "[0/9] 自动解压网盘文件..." + + # conda 环境 + for pkg in my_hair.tar.gz sdwebui.tar.gz kohya.tar.gz; do + if [ -f "$CLOUD_DIR/$pkg" ]; then + echo " 解压 $pkg..." + tar -xzf "$CLOUD_DIR/$pkg" -C "$BASE_DIR/conda_envs/" + echo " ✓ $pkg" + fi + done + + # SD 底模 + if [ -f "$CLOUD_DIR/sd_base_models.tar.gz" ]; then + echo " 解压 sd_base_models.tar.gz..." + mkdir -p "$BASE_DIR/stable-diffusion-webui/models/Stable-diffusion" + tar -xzf "$CLOUD_DIR/sd_base_models.tar.gz" -C "$BASE_DIR/stable-diffusion-webui/models/Stable-diffusion/" + echo " ✓ sd_base_models.tar.gz" + fi + + # LoRA 模型 + mkdir -p "$BASE_DIR/stable-diffusion-webui/models/Lora" + for pkg in lora_0-9.tar.gz lora_h.tar.gz lora_n.tar.gz lora_t.tar.gz; do + if [ -f "$CLOUD_DIR/$pkg" ]; then + echo " 解压 $pkg..." + tar -xzf "$CLOUD_DIR/$pkg" -C "$BASE_DIR/stable-diffusion-webui/models/Lora/" + echo " ✓ $pkg" + fi + done + + # 换发算法权重 + if [ -f "$CLOUD_DIR/weights.tar.gz" ]; then + echo " 解压 weights.tar.gz..." + tar -xzf "$CLOUD_DIR/weights.tar.gz" -C "$BASE_DIR/hair_service_sd/" + echo " ✓ weights.tar.gz" + fi + + # kohya 训练环境 + if [ -f "$CLOUD_DIR/kohya_local.tar.gz" ]; then + echo " 解压 kohya_local.tar.gz..." + tar -xzf "$CLOUD_DIR/kohya_local.tar.gz" -C "$BASE_DIR/kohya_ss_home/" + echo " ✓ kohya_local.tar.gz" + fi + if [ -f "$CLOUD_DIR/kohya_code.tar.gz" ]; then + echo " 解压 kohya_code.tar.gz..." + tar -xzf "$CLOUD_DIR/kohya_code.tar.gz" -C "$BASE_DIR/kohya_ss_home/" + echo " ✓ kohya_code.tar.gz" + fi + + # 业务数据 + if [ -f "$CLOUD_DIR/data.tar.gz" ]; then + echo " 解压 data.tar.gz..." + tar -xzf "$CLOUD_DIR/data.tar.gz" -C "$BASE_DIR/" + echo " ✓ data.tar.gz" + fi + + # WebUI 扩展 + mkdir -p "$BASE_DIR/stable-diffusion-webui/extensions" + if [ -f "$CLOUD_DIR/webui_controlnet.tar.gz" ]; then + echo " 解压 webui_controlnet.tar.gz..." + tar -xzf "$CLOUD_DIR/webui_controlnet.tar.gz" -C "$BASE_DIR/stable-diffusion-webui/extensions/" + echo " ✓ webui_controlnet.tar.gz" + fi + if [ -f "$CLOUD_DIR/webui_repositories.tar.gz" ]; then + echo " 解压 webui_repositories.tar.gz..." + tar -xzf "$CLOUD_DIR/webui_repositories.tar.gz" -C "$BASE_DIR/stable-diffusion-webui/" + echo " ✓ webui_repositories.tar.gz" + fi + + echo " ✓ 网盘文件解压完成" +else + echo "[0/9] cloud_packages/ 目录不存在或为空,跳过自动解压" +fi +echo "" + # 1. 检查前提条件 -echo "[1/8] 检查前提条件..." +echo "[1/9] 检查前提条件..." command -v git >/dev/null || { echo " ✗ git 未安装"; ERRORS+=("git"); } command -v conda >/dev/null || { echo " ✗ conda 未安装"; ERRORS+=("conda"); } nvidia-smi >/dev/null 2>&1 || { echo " ✗ NVIDIA 驱动未安装"; ERRORS+=("nvidia-smi"); } @@ -34,12 +111,12 @@ if [ ${#ERRORS[@]} -eq 0 ]; then fi # 2. 生成 configure.ini -echo "[2/8] 生成 configure.ini..." +echo "[2/9] 生成 configure.ini..." sed "s|__BASE_DIR__|$BASE_DIR|g" "$BASE_DIR/hair_service_sd/config/configure.ini.template" > "$BASE_DIR/hair_service_sd/config/configure.ini" echo " ✓ configure.ini 已生成" # 3. 恢复 conda 环境(conda-pack) -echo "[3/8] 恢复 conda 环境(my_hair, sdwebui, kohya)..." +echo "[3/9] 恢复 conda 环境(my_hair, sdwebui, kohya)..." for env_name in my_hair sdwebui kohya; do if [ -f "$BASE_DIR/conda_envs/${env_name}.tar.gz" ]; then echo " 恢复 $env_name ..." @@ -57,7 +134,7 @@ for env_name in my_hair sdwebui kohya; do done # 4. 创建 py310 环境(从 yml) -echo "[4/8] 创建 py310 环境(从 yml)..." +echo "[4/9] 创建 py310 环境(从 yml)..." if [ -f "$BASE_DIR/conda_envs/py310.yml" ]; then conda env create -f "$BASE_DIR/conda_envs/py310.yml" -n py310 2>/dev/null && echo " ✓ py310 已创建" || echo " ℹ py310 环境已存在,跳过" else @@ -66,7 +143,7 @@ else fi # 5. 检查模型/数据目录 -echo "[5/8] 检查模型和数据目录..." +echo "[5/9] 检查模型和数据目录..." for dir in hair_service_sd/weights stable-diffusion-webui/models/Lora stable-diffusion-webui/models/Stable-diffusion stable-diffusion-webui/extensions/sd-webui-controlnet stable-diffusion-webui/repositories kohya_ss_home/.local kohya_ss_home/kohya_ss data/ref_hairstyle; do if [ -d "$BASE_DIR/$dir" ]; then echo " ✓ $dir" @@ -77,7 +154,7 @@ for dir in hair_service_sd/weights stable-diffusion-webui/models/Lora stable-dif done # 6. 检查训练底模 -echo "[6/8] 检查训练底模 v1-5-pruned-emaonly..." +echo "[6/9] 检查训练底模 v1-5-pruned-emaonly..." if [ -f "$BASE_DIR/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors" ]; then echo " ✓ v1-5-pruned-emaonly.safetensors 已存在" else @@ -86,14 +163,14 @@ else fi # 7. 创建运行时目录 -echo "[7/8] 创建运行时目录..." +echo "[7/9] 创建运行时目录..." mkdir -p "$BASE_DIR/logs" mkdir -p "$BASE_DIR/data/tmp" "$BASE_DIR/data/res_dir" "$BASE_DIR/data/userImage" "$BASE_DIR/data/user_info" mkdir -p "$BASE_DIR/kohya_ss_home/train_material" echo " ✓ 运行时目录已创建" # 8. 验证 kohya 训练环境 -echo "[8/8] 验证 kohya 训练环境..." +echo "[8/9] 验证 kohya 训练环境..." KOHYA_PYTHON="$CONDA_BASE/envs/kohya/bin/python" KOHYA_LOCAL="$BASE_DIR/kohya_ss_home/.local/lib/python3.10/site-packages" if [ -f "$KOHYA_PYTHON" ] && [ -d "$KOHYA_LOCAL" ]; then