初始化换发型项目: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 排除,
由网盘单独上传。
This commit is contained in:
colomi
2026-07-11 18:11:49 +08:00
commit 0eb61f3e60
628 changed files with 120882 additions and 0 deletions
@@ -0,0 +1,272 @@
# 换发型项目迁移到 3090 部署计划
## Context
本机 `/home/szlc/project` 下有一个换发型/换发色/训练发型的 AI 项目,包含 3 个微服务协同工作。目标是将所有代码和依赖迁移到 `/home/szlc/change_hair_3090`,代码用 git 管理,模型/数据/环境等大文件放在同一目录但 .gitignore 排除(单独用网盘上传)。最终实现:在新 3090 Ubuntu 机器上 `git clone` + 下载网盘文件 + 运行 `setup.sh` 即可完成部署。
**用户决策**:包含全部 228 个 LoRA33G);Docker sudo 密码 asdfasdf;从网上下载 majicmixRealistic_v7;不迁移 onediff。
---
## 目标目录结构
```
/home/szlc/change_hair_3090/ ← Git 仓库根
├── .gitignore
├── README.md ← 部署文档 [git]
├── setup.sh ← 一键部署脚本 [git]
├── start_all_services.sh ← 启动3个服务 [git]
├── hair_service_sd/ ← 换发算法服务 [git: 代码]
│ ├── config/configure.ini.template ← 配置模板(含 __BASE_DIR__ 占位符)[git]
│ ├── config/configure.ini ← setup.sh 生成 [gitignore]
│ ├── core/ models/ utils/ common/ ← 代码 [git]
│ ├── *.py ← 代码 [git]
│ ├── data/ ← 小静态文件 9M [git]
│ └── weights/ ← 10G 模型 [gitignore/网盘]
├── photo_service/ ← 训练服务 [git: 代码 4M]
│ ├── lora_train_service_1.py ← 需修改路径 [git]
│ ├── webui_im2im.py *.py utils/ ← [git]
│ └── conda_envs/py310.yml ← py310 环境定义 [git]
├── stable-diffusion-webui/ ← SD WebUI [git: 代码 ~280M]
│ ├── webui.py modules/ javascript/ ← 代码 [git]
│ ├── config.json ← 清理onediff配置 [git]
│ ├── extensions/sd-webui-controlnet/ ← 4.4G(annotator+models) [gitignore/网盘]
│ ├── repositories/ ← 225M [gitignore/网盘]
│ └── models/ ← 49G [gitignore/网盘]
│ ├── Lora/ ← 33G 228个LoRA
│ ├── Stable-diffusion/ ← v1-5 + majicmixRealistic_v7
│ └── ESRGAN/ GFPGAN/ BLIP/ ...
├── kohya_ss_home/ ← 训练环境 [gitignore/网盘]
│ ├── kohya_ss/ ← 训练代码 427M
│ ├── .local/ ← pip包 7.6G
│ ├── .cache/clip/ ← CLIP缓存 1.6M
│ ├── .cache/huggingface/ ← 1.8M
│ └── start_docker.sh ← [单独提取到git]
├── data/ ← 业务数据 4.9G [gitignore/网盘]
│ ├── ref_hairstyle/ ref_color/ ref_online/ ...
├── conda_envs/ ← [gitignore/网盘]
│ ├── my_hair.tar.gz ← conda-pack ~5G
│ └── sdwebui.tar.gz ← conda-pack ~4G
├── docker/ ← [gitignore/网盘]
│ └── kohya_ss_image.tar ← Docker镜像
├── logs/ ← [gitignore]
└── meidaojia/ ← 监控测试脚本 [git]
```
---
## 路径迁移策略(核心)
### 策略:BASE_DIR 自动推导 + configure.ini 模板
所有服务通过脚本自身位置自动推导 `BASE_DIR`,不依赖环境变量,clone 到任意目录均可工作。
### 1. configure.ini → 模板化
创建 `hair_service_sd/config/configure.ini.template`[git] 管理),所有 `/home/szlc/project/data/...` 替换为 `__BASE_DIR__/data/...`
关键变更:
- 所有数据路径:`/home/szlc/project/data/...``__BASE_DIR__/data/...`
- `train_dir``/data/train_material``__BASE_DIR__/kohya_ss_home/train_material`(必须在 kohya_ss_home 下,Docker 容器才能访问)
- `logpath``/home/szlc/project/logs``__BASE_DIR__/logs`
- `configure.ini` 本身加入 .gitignore,由 setup.sh 用 sed 替换 `__BASE_DIR__` 生成
### 2. lora_train_service_1.py → BASE_DIR 自动推导
**第 38-43 行**online 模式路径):
```python
# 修改前
kohya_ss_home_dir = '/root/project/kohya_ss_home'
webui_lora_dir = '/gz-fs/Lora'
# 修改后
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
kohya_ss_home_dir = os.path.join(BASE_DIR, 'kohya_ss_home')
webui_lora_dir = os.path.join(BASE_DIR, 'stable-diffusion-webui', 'models', 'Lora')
```
### 3. Docker 训练命令(第 301-315 行)→ 路径映射修正
关键变更:
- `--gpus "device=1"``--gpus "device=0"`(新机器单 GPU
- 删除 `-v /mnt:/mnt`NAS 挂载不再需要)
- 新增 `-v {sd_models_dir}:/mnt/sd_models`(挂载训练底模到容器)
- `--pretrained_model_name_or_path``/mnt/sd_models/majicmixRealistic_v7.safetensors`
- `--train_data_dir``--output_dir`:主机路径转换为容器路径(`kohya_ss_home_dir``/home/chinatszrn`
```python
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')
```
### 4. 其他硬编码路径修复
| 文件 | 行号 | 修改 |
|------|------|------|
| `hairstyle_model_infer.py` | 1096 | 注释掉 `cv2.imwrite('/home/student/Desktop/...')`(**活跃代码路径,不注释会崩溃**) |
| `watch_delete.py` | 8 | 从 configure.ini 读取 userDir 而非硬编码 |
| `config.json` (webui) | - | 删除 `onediff_compiler_caches_path``onediff_compiler_backend` 两行 |
| `gunicorn_config.py` | 21 | 注释掉 `chdir`(未使用) |
| webui extensions | - | 删除失效的 onediff_sd_webui_extensions 符号链接 |
### 5. 安全提醒
`upload_oss.py` 第 8-9 行包含硬编码的阿里云 OSS AccessKey/Secret(作为 `os.getenv` 默认值)。这些密钥会随代码进入 git。如仓库非私有,应改为只从环境变量读取。
---
## Conda 环境迁移
| 环境 | 大小 | 策略 |
|------|------|------|
| my_hair | 10G/289包 | conda-pack 打包为 tar.gz(约 5G 压缩) |
| sdwebui | 7.3G/193包 | conda-pack 打包为 tar.gz(约 4G 压缩) |
| py310 | 701M/32包 | yml 导出(包少,重建可靠) |
setup.sh 中用 `conda pack` 恢复 tar.gz 环境,用 `conda env create -f` 恢复 py310。
---
## 执行步骤
### 阶段 1:创建目录结构 + 复制代码
1. 创建目标目录结构
2. `rsync` 复制 hair_service_sd 代码(排除 weights, __pycache__, .git, *.log, nohup.out
3. `rsync` 复制 photo_service 代码(排除 __pycache__, .idea, *.log, 大图片)
4. `rsync` 复制 stable-diffusion-webui 代码(排除 models/, extensions/sd-webui-controlnet/, repositories/, .git, cache/, outputs/
5. `rsync` 复制 meidaojia(排除 .git, nohup.out, 大图片)
6. 复制 kohya_ss_home/start_docker.sh 到 git 管理
### 阶段 2:复制资源(网盘文件)
7. 复制 hair_service_sd/weights/10G
8. 复制 hair_service_sd/data/9M 静态文件)
9. 复制 stable-diffusion-webui/models/49G,含 33G LoRA
10. 复制 stable-diffusion-webui/extensions/sd-webui-controlnet/4.4G
11. 复制 stable-diffusion-webui/repositories/225M
12. 复制 data/ 业务数据(4.9G
13. 复制 kohya_ss_home/kohya_ss 代码 + .local 7.6G + .cache/clip + .cache/huggingface,排除 pip/torch 缓存)
### 阶段 3:路径修改
14. 创建 `configure.ini.template`
15. 修改 `lora_train_service_1.py`BASE_DIR + Docker 命令)
16. 注释 `hairstyle_model_infer.py:1096`
17. 修改 `watch_delete.py`
18. 清理 `config.json`(删除 onediff 配置)
19. 注释 `gunicorn_config.py:21`
20. 创建 `start_all_services.sh`
21. 创建 `setup.sh`
22. 创建 `README.md`
23. 创建 `.gitignore`
### 阶段 4:导出环境和镜像
24. `conda install -n base -c conda-forge conda-pack`
25. `conda pack -n my_hair -o conda_envs/my_hair.tar.gz`
26. `conda pack -n sdwebui -o conda_envs/sdwebui.tar.gz`
27. `conda env export -n py310 --no-builds > conda_envs/py310.yml`
28. `sudo docker save chinatszrn/ubuntu:kohya_ss -o docker/kohya_ss_image.tar`
### 阶段 5Git 提交
29. `git add .` + 验证 .gitignore 生效(大文件不被追踪)
30. `git commit`
---
## setup.sh 部署脚本功能
新机器上执行 `./setup.sh` 完成:
1. 检查前提条件(git, conda, docker, nvidia-docker
2. 用 sed 从 template 生成 configure.ini
3. 用 conda-pack 恢复 my_hair 和 sdwebui 环境
4. 用 yml 创建 py310 环境
5. `docker load` 导入 kohya_ss 镜像
6. 检查所有模型/数据目录是否存在(报告缺失项)
7. 检查 majicmixRealistic_v7.safetensors 是否已下载
8. 创建运行时目录(tmp, res_dir, userImage 等)
---
## 验证方案
### 环境验证
```bash
# Conda 环境
/home/szlc/miniconda3/envs/my_hair/bin/python -c "import torch; print(torch.cuda.is_available())"
/home/szlc/miniconda3/envs/sdwebui/bin/python -c "import torch; print(torch.cuda.is_available())"
# Docker
sudo docker run --rm --gpus all chinatszrn/ubuntu:kohya_ss nvidia-smi
```
### 服务启动验证
```bash
# 1. hair_service_sd(端口 8801
cd /home/szlc/change_hair_3090/hair_service_sd
/home/szlc/miniconda3/envs/my_hair/bin/python run_copy_cost_colorb64.py
# 预期:看到 "[HAIR_INIT] All init done." 且端口 8801 可访问
# 2. webui(端口 57860
cd /home/szlc/change_hair_3090/stable-diffusion-webui
/home/szlc/miniconda3/envs/sdwebui/bin/python webui.py --api --listen --xformers --port 57860
# 预期:curl http://127.0.0.1:57860/sdapi/v1/options 返回 JSON
# 3. photo_service(端口 32678
cd /home/szlc/change_hair_3090/photo_service
/home/szlc/miniconda3/envs/py310/bin/python lora_train_service_1.py
# 预期:服务启动无报错
```
### 路径一致性验证
```bash
# 无残留旧路径
grep -r "/home/szlc/project" /home/szlc/change_hair_3090/ --include="*.py" --include="*.ini" --include="*.sh"
grep -r "/gz-fs\|/mnt/nas_hdd\|/root/project" /home/szlc/change_hair_3090/ --include="*.py" --include="*.ini"
# 以上应无输出(注释行除外)
```
---
## .gitignore 中的例外
以下文件虽在大文件目录中,但需 git 管理(在 .gitignore 中用 `!` 添加例外):
- `!conda_envs/py310.yml` — py310 环境定义(小文本文件)
- `!kohya_ss_home/start_docker.sh` — Docker 启动脚本(小文件)
---
## 关键风险
1. **hairstyle_model_infer.py:1096** — 活跃代码路径中的 `cv2.imwrite('/home/student/Desktop/...')`,不注释会导致换发色功能崩溃
2. **Docker GPU 设备号** — 原代码 `--gpus "device=1"`,新机器需改为 `device=0`
3. **train_dir 路径变更** — 原 `/data/train_material`121G)不迁移,新路径在 `kohya_ss_home/train_material/`
4. **OSS 密钥** — upload_oss.py 含硬编码密钥,会进入 git
5. **majicmixRealistic_v7** — 需用户手动下载放置到 `stable-diffusion-webui/models/Stable-diffusion/`
6. **conda-pack glibc 兼容性** — 源机器和目标机器需同为 Ubuntu 且 glibc 版本兼容
---
## 网盘需上传的文件清单
| 路径 | 大小 | 说明 |
|------|------|------|
| hair_service_sd/weights/ | 10G | 换发算法模型 |
| stable-diffusion-webui/models/ | 49G | SD模型+LoRA+辅助模型 |
| stable-diffusion-webui/extensions/sd-webui-controlnet/ | 4.4G | ControlNet扩展 |
| stable-diffusion-webui/repositories/ | 225M | SD依赖仓库 |
| kohya_ss_home/ | ~8G | 训练环境(代码+.local+clip缓存) |
| data/ | 4.9G | 业务数据 |
| conda_envs/my_hair.tar.gz | ~5G | conda环境 |
| conda_envs/sdwebui.tar.gz | ~4G | conda环境 |
| docker/kohya_ss_image.tar | ?G | Docker镜像 |
| **合计** | **约 85G+** | |