Files
change_hair_3090/.trae/documents/项目迁移到3090部署计划.md
T
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

273 lines
12 KiB
Markdown
Raw 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.
# 换发型项目迁移到 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+** | |