包含: - hair_service_sd: 换发型/换发色算法服务 (端口 8801) - photo_service: LoRA 训练调度服务 (端口 32678) - stable-diffusion-webui: SD WebUI 推理服务 (端口 57860) - kohya_ss_home: 训练环境代码 - meidaojia: 监控测试脚本 - setup.sh: 一键部署脚本 (conda环境恢复 + 配置生成 + 完整性检查) - start_all_services.sh: 启动3个服务 - configure.ini.template: 路径模板化 (BASE_DIR自动推导) - conda_envs/py310.yml: py310 环境定义 大文件 (weights/, models/, data/, conda_envs/*.tar.gz 等) 通过 .gitignore 排除, 由网盘单独上传。
331 lines
11 KiB
Markdown
331 lines
11 KiB
Markdown
# 换发型项目迁移收尾计划
|
||
|
||
## 背景
|
||
|
||
项目从 `/home/szlc/project` 迁移到 `/home/szlc/change_hair_3090`。前序工作已完成代码复制和大部分路径修改。本计划覆盖剩余的收尾工作。
|
||
|
||
## 当前状态
|
||
|
||
### 已完成
|
||
- ✅ 代码复制:hair_service_sd (代码+weights 9.9G)、photo_service (1.9M)、stable-diffusion-webui (代码+extensions 4.4G+repositories 225M)、meidaojia (124K)、kohya_ss_home (kohya_ss 439M + .local 7.6G + .cache 3.3M)、data (4.9G)
|
||
- ✅ configure.ini.template 创建 + configure.ini 生成
|
||
- ✅ lora_train_service_1.py 修改(BASE_DIR + Docker 命令路径修正)
|
||
- ✅ watch_delete.py 修改(从 config 读取路径)
|
||
- ✅ gunicorn_config.py 修改(注释 chdir)
|
||
- ✅ config.json 修改(删除 onediff 配置,改 sd_model_checkpoint)
|
||
- ✅ git init(main 分支,无提交)
|
||
|
||
### 未完成(本计划覆盖)
|
||
1. ❌ **stable-diffusion-webui/models/ 目录未复制**(41G,含 228 个 LoRA 33G + v1-5-pruned 4G + 辅助模型)
|
||
2. ❌ **hairstyle_model_infer.py:1096 未注释**(活跃代码,换发色会崩溃)
|
||
3. ❌ **.gitignore 未创建**
|
||
4. ❌ **setup.sh 未创建**
|
||
5. ❌ **start_all_services.sh 未创建**
|
||
6. ❌ **README.md 未创建**
|
||
7. ❌ **conda 环境未导出**(my_hair, sdwebui, py310)
|
||
8. ❌ **git commit 未执行**
|
||
|
||
### 用户决策
|
||
- Docker 镜像 `chinatszrn/ubuntu:kohya_ss` **不需要导出**(用户表示当前训练已不用 Docker)
|
||
- majicmixRealistic_v7.safetensors 用户会从网上下载
|
||
- onediff 不迁移
|
||
|
||
## 服务启动方式(从 .bash 脚本确认)
|
||
|
||
| 服务 | 端口 | conda 环境 | 启动命令 |
|
||
|------|------|-----------|---------|
|
||
| hair_service_sd | 8801 | my_hair | `python run_copy_cost_colorb64.py` |
|
||
| stable-diffusion-webui | 57860 | sdwebui | `python webui.py --api --listen --xformers --port 57860` |
|
||
| photo_service | 32678 | py310 | `python lora_train_service_1.py` |
|
||
|
||
---
|
||
|
||
## 执行步骤
|
||
|
||
### 步骤 1:复制 models/ 目录(41G)
|
||
|
||
源:`/home/szlc/project/onediff/stable-diffusion-webui/models/`
|
||
目标:`/home/szlc/change_hair_3090/stable-diffusion-webui/models/`
|
||
|
||
```bash
|
||
rsync -av --progress /home/szlc/project/onediff/stable-diffusion-webui/models/ /home/szlc/change_hair_3090/stable-diffusion-webui/models/
|
||
```
|
||
|
||
包含:
|
||
- Lora/ (33G, 228 个 LoRA 文件)
|
||
- Stable-diffusion/ (4G, v1-5-pruned-emaonly.safetensors)
|
||
- ESRGAN/ (1.2G)、BLIP/ (855M)、torch_deepdanbooru/ (615M)、roop/ (529M)、GFPGAN/ (519M)、Codeformer/ (360M)、RealESRGAN/ (64M) 等
|
||
|
||
注意:majicmixRealistic_v7.safetensors 不在源目录中,用户会单独下载。
|
||
|
||
### 步骤 2:注释 hairstyle_model_infer.py:1096
|
||
|
||
文件:`hair_service_sd/hairstyle_model_infer.py`
|
||
|
||
第 1096 行:
|
||
```python
|
||
# 修改前
|
||
cv2.imwrite('/home/student/Desktop/tmp_color/need/face_base2.png', user_res_8uc3_orisize2)
|
||
# 修改后
|
||
# cv2.imwrite('/home/student/Desktop/tmp_color/need/face_base2.png', user_res_8uc3_orisize2) # 调试用,路径不存在会导致崩溃
|
||
```
|
||
|
||
### 步骤 3:创建 .gitignore
|
||
|
||
文件:`/home/szlc/change_hair_3090/.gitignore`
|
||
|
||
```gitignore
|
||
# Python
|
||
__pycache__/
|
||
*.pyc
|
||
*.pyo
|
||
*.egg-info/
|
||
.eggs/
|
||
|
||
# IDE
|
||
.idea/
|
||
.vscode/
|
||
|
||
# Logs
|
||
*.log
|
||
nohup.out
|
||
/logs/
|
||
|
||
# 大文件目录(网盘上传)— 注意 /data/ 用前导斜杠仅匹配顶层
|
||
hair_service_sd/weights/
|
||
stable-diffusion-webui/models/
|
||
stable-diffusion-webui/extensions/sd-webui-controlnet/
|
||
stable-diffusion-webui/repositories/
|
||
kohya_ss_home/.local/
|
||
kohya_ss_home/.cache/
|
||
kohya_ss_home/kohya_ss/
|
||
/data/
|
||
conda_envs/*.tar.gz
|
||
docker/
|
||
|
||
# 运行时生成(setup.sh 生成)
|
||
hair_service_sd/config/configure.ini
|
||
*.pid
|
||
|
||
# 注意:hair_service_sd/data/ (19M 小静态文件) 不排除,需 git 管理
|
||
# 注意:conda_envs/py310.yml 不排除,需 git 管理
|
||
# 注意:kohya_ss_home/start_docker.sh 不排除,需 git 管理
|
||
```
|
||
|
||
### 步骤 4:创建 setup.sh
|
||
|
||
文件:`/home/szlc/change_hair_3090/setup.sh`
|
||
|
||
功能:
|
||
1. 检查前提条件(conda, git, nvidia-docker)
|
||
2. 从 template 生成 configure.ini(sed 替换 `__BASE_DIR__`)
|
||
3. 用 conda-pack 恢复 my_hair 和 sdwebui 环境
|
||
4. 用 yml 创建 py310 环境
|
||
5. 检查模型/数据目录完整性
|
||
6. 检查 majicmixRealistic_v7.safetensors 是否存在
|
||
7. 创建运行时目录(tmp, res_dir, userImage 等)
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
set -e
|
||
|
||
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
CONDA_BASE="${CONDA_BASE:-/home/szlc/miniconda3}"
|
||
|
||
# 初始化 conda(脚本中需要 source 才能用 conda activate)
|
||
if [ -f "$CONDA_BASE/etc/profile.d/conda.sh" ]; then
|
||
source "$CONDA_BASE/etc/profile.d/conda.sh"
|
||
else
|
||
echo "WARNING: 未找到 conda.sh,请确认 CONDA_BASE=$CONDA_BASE 正确"
|
||
fi
|
||
|
||
echo "=== 换发型项目部署脚本 ==="
|
||
echo "BASE_DIR: $BASE_DIR"
|
||
|
||
# 1. 检查前提条件
|
||
echo "[1/7] 检查前提条件..."
|
||
command -v git >/dev/null || { echo "ERROR: git 未安装"; exit 1; }
|
||
command -v conda >/dev/null || { echo "ERROR: conda 未安装"; exit 1; }
|
||
nvidia-smi >/dev/null 2>&1 || { echo "ERROR: NVIDIA 驱动未安装"; exit 1; }
|
||
|
||
# 2. 生成 configure.ini
|
||
echo "[2/7] 生成 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/7] 恢复 conda 环境..."
|
||
for env_name in my_hair sdwebui; do
|
||
if [ -f "$BASE_DIR/conda_envs/${env_name}.tar.gz" ]; then
|
||
echo " 恢复 $env_name ..."
|
||
rm -rf "$CONDA_BASE/envs/$env_name"
|
||
mkdir -p "$CONDA_BASE/envs/$env_name"
|
||
tar -xzf "$BASE_DIR/conda_envs/${env_name}.tar.gz" -C "$CONDA_BASE/envs/$env_name"
|
||
conda activate "$env_name"
|
||
conda-unpack # 修复打包后的硬编码路径
|
||
conda deactivate
|
||
echo " ✓ $env_name 已恢复"
|
||
else
|
||
echo " ✗ conda_envs/${env_name}.tar.gz 不存在,请从网盘下载"
|
||
fi
|
||
done
|
||
|
||
# 4. 创建 py310 环境(从 yml)
|
||
echo "[4/7] 创建 py310 环境..."
|
||
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
|
||
echo " ✗ conda_envs/py310.yml 不存在"
|
||
fi
|
||
|
||
# 5. 检查模型/数据目录
|
||
echo "[5/7] 检查模型和数据目录..."
|
||
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"
|
||
else
|
||
echo " ✗ $dir 缺失,请从网盘下载"
|
||
fi
|
||
done
|
||
|
||
# 6. 检查训练底模
|
||
echo "[6/7] 检查 majicmixRealistic_v7..."
|
||
if [ -f "$BASE_DIR/stable-diffusion-webui/models/Stable-diffusion/majicmixRealistic_v7.safetensors" ]; then
|
||
echo " ✓ majicmixRealistic_v7.safetensors 已存在"
|
||
else
|
||
echo " ✗ majicmixRealistic_v7.safetensors 缺失,请从网上下载并放置到 stable-diffusion-webui/models/Stable-diffusion/"
|
||
fi
|
||
|
||
# 7. 创建运行时目录
|
||
echo "[7/7] 创建运行时目录..."
|
||
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 ""
|
||
echo "=== 部署完成 ==="
|
||
echo "启动服务: ./start_all_services.sh"
|
||
```
|
||
|
||
### 步骤 5:创建 start_all_services.sh
|
||
|
||
文件:`/home/szlc/change_hair_3090/start_all_services.sh`
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
CONDA_BASE="${CONDA_BASE:-/home/szlc/miniconda3}"
|
||
|
||
# 1. hair_service_sd (端口 8801)
|
||
cd "$BASE_DIR/hair_service_sd"
|
||
nohup "$CONDA_BASE/envs/my_hair/bin/python" run_copy_cost_colorb64.py > "$BASE_DIR/logs/hair_service.log" 2>&1 &
|
||
echo "hair_service_sd 已启动 (PID: $!)"
|
||
|
||
# 2. stable-diffusion-webui (端口 57860)
|
||
cd "$BASE_DIR/stable-diffusion-webui"
|
||
nohup "$CONDA_BASE/envs/sdwebui/bin/python" webui.py --api --listen --xformers --port 57860 > "$BASE_DIR/logs/webui.log" 2>&1 &
|
||
echo "stable-diffusion-webui 已启动 (PID: $!)"
|
||
|
||
# 3. photo_service (端口 32678)
|
||
cd "$BASE_DIR/photo_service"
|
||
nohup "$CONDA_BASE/envs/py310/bin/python" lora_train_service_1.py > "$BASE_DIR/logs/photo_service.log" 2>&1 &
|
||
echo "photo_service 已启动 (PID: $!)"
|
||
|
||
echo "所有服务已在后台启动,日志在 $BASE_DIR/logs/"
|
||
```
|
||
|
||
### 步骤 6:创建 README.md
|
||
|
||
文件:`/home/szlc/change_hair_3090/README.md`
|
||
|
||
内容包含:
|
||
- 项目简介(3 个微服务)
|
||
- 目录结构
|
||
- 前提条件(Ubuntu 22.04, 3090 GPU, conda, git)
|
||
- 部署步骤(git clone → 下载网盘文件 → ./setup.sh → ./start_all_services.sh)
|
||
- 网盘文件清单(models/, weights/, data/, conda_envs/, etc.)
|
||
- 服务端口说明
|
||
- 常见问题
|
||
|
||
### 步骤 7:导出 conda 环境
|
||
|
||
```bash
|
||
# 安装 conda-pack
|
||
conda install -n base -c conda-forge conda-pack -y
|
||
|
||
# 导出 my_hair (10G → ~5G 压缩)
|
||
conda pack -n my_hair -o /home/szlc/change_hair_3090/conda_envs/my_hair.tar.gz --force
|
||
|
||
# 导出 sdwebui (7.3G → ~4G 压缩)
|
||
conda pack -n sdwebui -o /home/szlc/change_hair_3090/conda_envs/sdwebui.tar.gz --force
|
||
|
||
# 导出 py310 (yml)
|
||
conda env export -n py310 --no-builds > /home/szlc/change_hair_3090/conda_envs/py310.yml
|
||
```
|
||
|
||
注意:conda-pack 可能需要较长时间(每个环境 5-10 分钟),建议后台执行。
|
||
|
||
### 步骤 8:Git 提交
|
||
|
||
```bash
|
||
cd /home/szlc/change_hair_3090
|
||
git add .
|
||
# 验证大文件未被追踪
|
||
git status --short | grep -E "\.(safetensors|pth|pt|tar\.gz|tar)$" # 应无输出
|
||
git commit -m "初始化换发型项目:3个微服务代码 + 部署脚本"
|
||
```
|
||
|
||
---
|
||
|
||
## 验证步骤
|
||
|
||
### 路径一致性验证
|
||
```bash
|
||
# 检查无残留旧路径(注释行除外)
|
||
grep -rn "/home/szlc/project\|/gz-fs\|/mnt/nas_hdd\|/root/project" /home/szlc/change_hair_3090/ --include="*.py" --include="*.ini" --include="*.sh" | grep -v "^.*:#"
|
||
# 应无输出或仅匹配注释行
|
||
```
|
||
|
||
### Git 追踪验证
|
||
```bash
|
||
# 大文件不应被追踪
|
||
git status --short | grep -E "weights/|models/.*safetensors|\.tar\.gz|\.tar$"
|
||
# 应无输出
|
||
```
|
||
|
||
### 目录完整性验证
|
||
```bash
|
||
# 关键目录存在
|
||
for d in hair_service_sd/weights stable-diffusion-webui/models/Lora stable-diffusion-webui/models/Stable-diffusion stable-diffusion-webui/extensions/sd-webui-controlnet kohya_ss_home/.local data/ref_hairstyle; do
|
||
[ -d "$d" ] && echo "✓ $d" || echo "✗ $d 缺失"
|
||
done
|
||
```
|
||
|
||
---
|
||
|
||
## 网盘上传清单
|
||
|
||
| 路径 | 大小 | 说明 |
|
||
|------|------|------|
|
||
| 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环境 |
|
||
| **合计** | **约 78G** | |
|
||
|
||
---
|
||
|
||
## 关键风险
|
||
|
||
1. **hairstyle_model_infer.py:1096** — 活跃代码路径中的 `cv2.imwrite('/home/student/Desktop/...')`,不注释会导致换发色功能崩溃
|
||
2. **majicmixRealistic_v7.safetensors** — 训练底模不在源目录中,用户需从网上下载
|
||
3. **conda-pack glibc 兼容性** — 源机器和目标机器需同为 Ubuntu 且 glibc 版本兼容
|
||
4. **Docker 训练** — 当前代码仍含 Docker 命令,用户表示不再需要 Docker 训练,代码可能需要后续修改
|