初始化换发型项目: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
+330
View File
@@ -0,0 +1,330 @@
# 换发型项目迁移收尾计划
## 背景
项目从 `/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 训练,代码可能需要后续修改
@@ -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+** | |