Files
colomi 0eb61f3e60 初始化换发型项目:3个微服务代码 + 部署脚本
包含:
- 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 排除,
由网盘单独上传。
2026-07-11 18:11:49 +08:00

331 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 换发型项目迁移收尾计划
## 背景
项目从 `/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 initmain 分支,无提交)
### 未完成(本计划覆盖)
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.inised 替换 `__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 分钟),建议后台执行。
### 步骤 8Git 提交
```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 训练,代码可能需要后续修改