包含: - 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 排除, 由网盘单独上传。
12 KiB
12 KiB
换发型项目迁移到 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__/logsconfigure.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:/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)
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:创建目录结构 + 复制代码
- 创建目标目录结构
rsync复制 hair_service_sd 代码(排除 weights, pycache, .git, *.log, nohup.out)rsync复制 photo_service 代码(排除 pycache, .idea, *.log, 大图片)rsync复制 stable-diffusion-webui 代码(排除 models/, extensions/sd-webui-controlnet/, repositories/, .git, cache/, outputs/)rsync复制 meidaojia(排除 .git, nohup.out, 大图片)- 复制 kohya_ss_home/start_docker.sh 到 git 管理
阶段 2:复制资源(网盘文件)
- 复制 hair_service_sd/weights/(10G)
- 复制 hair_service_sd/data/(9M 静态文件)
- 复制 stable-diffusion-webui/models/(49G,含 33G LoRA)
- 复制 stable-diffusion-webui/extensions/sd-webui-controlnet/(4.4G)
- 复制 stable-diffusion-webui/repositories/(225M)
- 复制 data/ 业务数据(4.9G)
- 复制 kohya_ss_home/(kohya_ss 代码 + .local 7.6G + .cache/clip + .cache/huggingface,排除 pip/torch 缓存)
阶段 3:路径修改
- 创建
configure.ini.template - 修改
lora_train_service_1.py(BASE_DIR + Docker 命令) - 注释
hairstyle_model_infer.py:1096 - 修改
watch_delete.py - 清理
config.json(删除 onediff 配置) - 注释
gunicorn_config.py:21 - 创建
start_all_services.sh - 创建
setup.sh - 创建
README.md - 创建
.gitignore
阶段 4:导出环境和镜像
conda install -n base -c conda-forge conda-packconda pack -n my_hair -o conda_envs/my_hair.tar.gzconda pack -n sdwebui -o conda_envs/sdwebui.tar.gzconda env export -n py310 --no-builds > conda_envs/py310.ymlsudo docker save chinatszrn/ubuntu:kohya_ss -o docker/kohya_ss_image.tar
阶段 5:Git 提交
git add .+ 验证 .gitignore 生效(大文件不被追踪)git commit
setup.sh 部署脚本功能
新机器上执行 ./setup.sh 完成:
- 检查前提条件(git, conda, docker, nvidia-docker)
- 用 sed 从 template 生成 configure.ini
- 用 conda-pack 恢复 my_hair 和 sdwebui 环境
- 用 yml 创建 py310 环境
docker load导入 kohya_ss 镜像- 检查所有模型/数据目录是否存在(报告缺失项)
- 检查 majicmixRealistic_v7.safetensors 是否已下载
- 创建运行时目录(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 启动脚本(小文件)
关键风险
- hairstyle_model_infer.py:1096 — 活跃代码路径中的
cv2.imwrite('/home/student/Desktop/...'),不注释会导致换发色功能崩溃 - Docker GPU 设备号 — 原代码
--gpus "device=1",新机器需改为device=0 - train_dir 路径变更 — 原
/data/train_material(121G)不迁移,新路径在kohya_ss_home/train_material/ - OSS 密钥 — upload_oss.py 含硬编码密钥,会进入 git
- majicmixRealistic_v7 — 需用户手动下载放置到
stable-diffusion-webui/models/Stable-diffusion/ - 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+ |