# 换发型项目迁移到 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+** | |