包含: - 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 排除, 由网盘单独上传。
273 lines
12 KiB
Markdown
273 lines
12 KiB
Markdown
# 换发型项目迁移到 3090 部署计划
|
||
|
||
## Context
|
||
|
||
本机 `/home/szlc/project` 下有一个换发型/换发色/训练发型的 AI 项目,包含 3 个微服务协同工作。目标是将所有代码和依赖迁移到 `/home/szlc/change_hair_3090`,代码用 git 管理,模型/数据/环境等大文件放在同一目录但 .gitignore 排除(单独用网盘上传)。最终实现:在新 3090 Ubuntu 机器上 `git clone` + 下载网盘文件 + 运行 `setup.sh` 即可完成部署。
|
||
|
||
**用户决策**:包含全部 228 个 LoRA(33G);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`
|
||
|
||
### 阶段 5:Git 提交
|
||
|
||
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+** | |
|