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

12 KiB
Raw Blame History

换发型项目迁移到 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 模式路径):

# 修改前
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:/mntNAS 挂载不再需要)
  • 新增 -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
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_pathonediff_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:复制资源(网盘文件)

  1. 复制 hair_service_sd/weights/10G
  2. 复制 hair_service_sd/data/9M 静态文件)
  3. 复制 stable-diffusion-webui/models/49G,含 33G LoRA
  4. 复制 stable-diffusion-webui/extensions/sd-webui-controlnet/4.4G
  5. 复制 stable-diffusion-webui/repositories/225M
  6. 复制 data/ 业务数据(4.9G
  7. 复制 kohya_ss_home/kohya_ss 代码 + .local 7.6G + .cache/clip + .cache/huggingface,排除 pip/torch 缓存)

阶段 3:路径修改

  1. 创建 configure.ini.template
  2. 修改 lora_train_service_1.pyBASE_DIR + Docker 命令)
  3. 注释 hairstyle_model_infer.py:1096
  4. 修改 watch_delete.py
  5. 清理 config.json(删除 onediff 配置)
  6. 注释 gunicorn_config.py:21
  7. 创建 start_all_services.sh
  8. 创建 setup.sh
  9. 创建 README.md
  10. 创建 .gitignore

阶段 4:导出环境和镜像

  1. conda install -n base -c conda-forge conda-pack
  2. conda pack -n my_hair -o conda_envs/my_hair.tar.gz
  3. conda pack -n sdwebui -o conda_envs/sdwebui.tar.gz
  4. conda env export -n py310 --no-builds > conda_envs/py310.yml
  5. sudo docker save chinatszrn/ubuntu:kohya_ss -o docker/kohya_ss_image.tar

阶段 5Git 提交

  1. git add . + 验证 .gitignore 生效(大文件不被追踪)
  2. 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 等)

验证方案

环境验证

# 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

服务启动验证

# 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
# 预期:服务启动无报错

路径一致性验证

# 无残留旧路径
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_material121G)不迁移,新路径在 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+