Compare commits
5
Commits
master
...
ubuntu3090
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c5e50de40a | ||
|
|
0926c61bd0 | ||
|
|
fc66534a74 | ||
|
|
6f34e8876c | ||
|
|
9b7324cd26 |
@@ -296,8 +296,8 @@ curl -X POST http://127.0.0.1:32678/api/hair/train \
|
|||||||
| 改动 | 说明 |
|
| 改动 | 说明 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| `config.json` 的 onediff compiler 路径 | 指向本机 onediff 目录 |
|
| `config.json` 的 onediff compiler 路径 | 指向本机 onediff 目录 |
|
||||||
| 启动加 `HF_HUB_OFFLINE=1` | 本机无法访问 huggingface.co,用本地缓存离线加载 CLIP |
|
| 启动加 `HF_HUB_OFFLINE=1` | 本机无法稳定访问 huggingface.co,用本地缓存离线加载 CLIP(需预先缓存 `openai/clip-vit-large-patch14`) |
|
||||||
| SD 模型 | 实际加载 `v1-5-pruned-emaonly`(config 里写的 majicmix 不存在,webui 自动 fallback) |
|
| SD 模型 | `sd_model_checkpoint` 固定为 `v1-5-pruned-emaonly.safetensors`(本机无 majicmix)。仓库内权威副本:`configs/stable-diffusion-webui.config.json`;部署时拷到 `project/onediff/stable-diffusion-webui/config.json`(该目录是独立 git 仓库,无法被本仓直接跟踪) |
|
||||||
|
|
||||||
### 3. 换发型推理改动(`hair_service_sd/gen_super_image.py`)
|
### 3. 换发型推理改动(`hair_service_sd/gen_super_image.py`)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=change_hair hair_service_sd swapHair (8801)
|
||||||
|
After=network-online.target change_hair-webui.service change_hair-photo.service
|
||||||
|
Wants=change_hair-webui.service change_hair-photo.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=ubuntu
|
||||||
|
WorkingDirectory=/home/ubuntu/change_hair/project/hair_service_sd
|
||||||
|
Environment=CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
|
||||||
|
Environment=CUDA_VISIBLE_DEVICES=0
|
||||||
|
Environment=APP_WORKER_ID=1
|
||||||
|
ExecStart=/home/ubuntu/miniconda3/envs/my_hair/bin/python run_copy_cost_colorb64.py
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
TimeoutStartSec=300
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=change_hair photo_service LoRA scheduler (32678)
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=ubuntu
|
||||||
|
WorkingDirectory=/home/ubuntu/change_hair/project/photo_service
|
||||||
|
Environment=CUDA_VISIBLE_DEVICES=0
|
||||||
|
Environment=APP_WORKER_ID=1
|
||||||
|
ExecStart=/home/ubuntu/miniconda3/envs/py310/bin/python -u lora_train_service_1.py
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=change_hair SD WebUI (57860)
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=ubuntu
|
||||||
|
WorkingDirectory=/home/ubuntu/change_hair/project/onediff/stable-diffusion-webui
|
||||||
|
Environment=CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
|
||||||
|
Environment=CUDA_VISIBLE_DEVICES=0
|
||||||
|
Environment=HF_HUB_OFFLINE=1
|
||||||
|
Environment=TRANSFORMERS_OFFLINE=1
|
||||||
|
ExecStart=/home/ubuntu/miniconda3/envs/sdwebui/bin/python webui.py --api --listen --xformers --port 57860
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=10
|
||||||
|
TimeoutStartSec=600
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
Executable
+40
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"ldsr_steps": 100,
|
||||||
|
"ldsr_cached": false,
|
||||||
|
"SCUNET_tile": 256,
|
||||||
|
"SCUNET_tile_overlap": 8,
|
||||||
|
"SWIN_tile": 192,
|
||||||
|
"SWIN_tile_overlap": 8,
|
||||||
|
"SWIN_torch_compile": false,
|
||||||
|
"hypertile_enable_unet": false,
|
||||||
|
"hypertile_enable_unet_secondpass": false,
|
||||||
|
"hypertile_max_depth_unet": 3,
|
||||||
|
"hypertile_max_tile_unet": 256,
|
||||||
|
"hypertile_swap_size_unet": 3,
|
||||||
|
"hypertile_enable_vae": false,
|
||||||
|
"hypertile_max_depth_vae": 3,
|
||||||
|
"hypertile_max_tile_vae": 128,
|
||||||
|
"hypertile_swap_size_vae": 3,
|
||||||
|
"onediff_compiler_caches_path": "/home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/extensions/onediff_sd_webui_extensions/compiler_caches",
|
||||||
|
"onediff_compiler_backend": "oneflow",
|
||||||
|
"sd_model_checkpoint": "v1-5-pruned-emaonly.safetensors",
|
||||||
|
"sd_checkpoint_hash": "6ce0161689b3853acaa03779ec93eafe75a02f4ced659bee03f50797806fa2fa",
|
||||||
|
"control_net_detectedmap_dir": "detected_maps",
|
||||||
|
"control_net_models_path": "",
|
||||||
|
"control_net_modules_path": "",
|
||||||
|
"control_net_unit_count": 3,
|
||||||
|
"control_net_model_cache_size": 2,
|
||||||
|
"control_net_inpaint_blur_sigma": 7,
|
||||||
|
"control_net_no_detectmap": false,
|
||||||
|
"control_net_detectmap_autosaving": false,
|
||||||
|
"control_net_allow_script_control": false,
|
||||||
|
"control_net_sync_field_args": true,
|
||||||
|
"controlnet_show_batch_images_in_ui": false,
|
||||||
|
"controlnet_increment_seed_during_batch": false,
|
||||||
|
"controlnet_disable_openpose_edit": false,
|
||||||
|
"controlnet_disable_photopea_edit": false,
|
||||||
|
"controlnet_photopea_warning": true,
|
||||||
|
"controlnet_ignore_noninpaint_mask": false,
|
||||||
|
"controlnet_clip_detector_on_cpu": false,
|
||||||
|
"controlnet_control_type_dropdown": false
|
||||||
|
}
|
||||||
+33
-33
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
> 适用场景:从原服务器打包上传 conda 环境 + SD WebUI 代码,在本机完成换发型推理部署。
|
> 适用场景:从原服务器打包上传 conda 环境 + SD WebUI 代码,在本机完成换发型推理部署。
|
||||||
>
|
>
|
||||||
> 本机路径:`/home/ubuntu/change_hair`(GPU:RTX 5090 32G,CUDA 12.8)
|
> 本机路径:`/home/xsl/change_hair`(GPU:RTX 5090 32G,CUDA 12.8)
|
||||||
>
|
>
|
||||||
> 原服务器参考:`szlc@192.168.101.63`
|
> 原服务器参考:`szlc@192.168.101.63`
|
||||||
>
|
>
|
||||||
@@ -48,13 +48,13 @@
|
|||||||
|
|
||||||
### 2.1 Conda 环境 × 3
|
### 2.1 Conda 环境 × 3
|
||||||
|
|
||||||
从原服务器 `/home/szlc/miniconda3/envs/` 打包,上传到本机 `/home/ubuntu/miniconda3/envs/`。
|
从原服务器 `/home/szlc/miniconda3/envs/` 打包,上传到本机 `/home/xsl/miniconda3/envs/`。
|
||||||
|
|
||||||
| 环境名 | 原服务器路径 | 本机目标路径 | 用途 | 预估大小 |
|
| 环境名 | 原服务器路径 | 本机目标路径 | 用途 | 预估大小 |
|
||||||
|--------|-------------|-------------|------|---------|
|
|--------|-------------|-------------|------|---------|
|
||||||
| `my_hair` | `/home/szlc/miniconda3/envs/my_hair/` | `/home/ubuntu/miniconda3/envs/my_hair/` | hair_service_sd 主服务(端口 8801) | ~5–8G |
|
| `my_hair` | `/home/szlc/miniconda3/envs/my_hair/` | `/home/xsl/miniconda3/envs/my_hair/` | hair_service_sd 主服务(端口 8801) | ~5–8G |
|
||||||
| `sdwebui` | `/home/szlc/miniconda3/envs/sdwebui/` | `/home/ubuntu/miniconda3/envs/sdwebui/` | SD WebUI 推理(端口 57860) | ~8–12G |
|
| `sdwebui` | `/home/szlc/miniconda3/envs/sdwebui/` | `/home/xsl/miniconda3/envs/sdwebui/` | SD WebUI 推理(端口 57860) | ~8–12G |
|
||||||
| `py310` | `/home/szlc/miniconda3/envs/py310/` | `/home/ubuntu/miniconda3/envs/py310/` | photo_service LoRA 调度(端口 32678) | ~2–4G |
|
| `py310` | `/home/szlc/miniconda3/envs/py310/` | `/home/xsl/miniconda3/envs/py310/` | photo_service LoRA 调度(端口 32678) | ~2–4G |
|
||||||
|
|
||||||
> ⚠️ **为什么必须上传,不能从公网安装?** 这三个环境包含特定版本的 PyTorch + CUDA 扩展、历史版本的 pip 包、以及编译好的 C++/CUDA 算子,依赖关系复杂。项目中的 `env.yaml` 是旧的 Python 3.7 规格,与实际运行环境(Python 3.10)不一致,无法用于重建。
|
> ⚠️ **为什么必须上传,不能从公网安装?** 这三个环境包含特定版本的 PyTorch + CUDA 扩展、历史版本的 pip 包、以及编译好的 C++/CUDA 算子,依赖关系复杂。项目中的 `env.yaml` 是旧的 Python 3.7 规格,与实际运行环境(Python 3.10)不一致,无法用于重建。
|
||||||
|
|
||||||
@@ -72,8 +72,8 @@ tar czf py310.tar.gz py310/
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 在本机执行(上传完成后)
|
# 在本机执行(上传完成后)
|
||||||
mkdir -p /home/ubuntu/miniconda3/envs
|
mkdir -p /home/xsl/miniconda3/envs
|
||||||
cd /home/ubuntu/miniconda3/envs
|
cd /home/xsl/miniconda3/envs
|
||||||
tar xzf /path/to/my_hair.tar.gz
|
tar xzf /path/to/my_hair.tar.gz
|
||||||
tar xzf /path/to/sdwebui.tar.gz
|
tar xzf /path/to/sdwebui.tar.gz
|
||||||
tar xzf /path/to/py310.tar.gz
|
tar xzf /path/to/py310.tar.gz
|
||||||
@@ -87,7 +87,7 @@ tar xzf /path/to/py310.tar.gz
|
|||||||
|
|
||||||
| 原服务器路径 | 本机目标路径 | 说明 | 预估大小 |
|
| 原服务器路径 | 本机目标路径 | 说明 | 预估大小 |
|
||||||
|-------------|-------------|------|---------|
|
|-------------|-------------|------|---------|
|
||||||
| `/home/szlc/project/onediff/stable-diffusion-webui/`(排除 `models/`) | `/home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/` | webui.py、modules/、extensions/、repositories/ 等 | ~2–5G |
|
| `/home/szlc/project/onediff/stable-diffusion-webui/`(排除 `models/`) | `/home/xsl/change_hair/project/onediff/stable-diffusion-webui/` | webui.py、modules/、extensions/、repositories/ 等 | ~2–5G |
|
||||||
|
|
||||||
> ⚠️ 本机当前 `project/onediff/stable-diffusion-webui/` 目录只有 `models/` 子目录(4.6G 模型权重),缺少 `webui.py`、`modules/`、`extensions/` 等所有代码文件。
|
> ⚠️ 本机当前 `project/onediff/stable-diffusion-webui/` 目录只有 `models/` 子目录(4.6G 模型权重),缺少 `webui.py`、`modules/`、`extensions/` 等所有代码文件。
|
||||||
|
|
||||||
@@ -131,7 +131,7 @@ tar czf webui_code.tar.gz \
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 在本机执行(保留已有 models 目录)
|
# 在本机执行(保留已有 models 目录)
|
||||||
cd /home/ubuntu/change_hair/project/onediff
|
cd /home/xsl/change_hair/project/onediff
|
||||||
tar xzf /path/to/webui_code.tar.gz
|
tar xzf /path/to/webui_code.tar.gz
|
||||||
# 解压后确认 models/ 仍在且未被覆盖
|
# 解压后确认 models/ 仍在且未被覆盖
|
||||||
ls -lh stable-diffusion-webui/models/Stable-diffusion/
|
ls -lh stable-diffusion-webui/models/Stable-diffusion/
|
||||||
@@ -147,13 +147,13 @@ ls -lh stable-diffusion-webui/models/Stable-diffusion/
|
|||||||
# ===== 必须上传(方案 A,共 4 项,约 18–30G)=====
|
# ===== 必须上传(方案 A,共 4 项,约 18–30G)=====
|
||||||
|
|
||||||
# 1. Conda 环境(3 个)
|
# 1. Conda 环境(3 个)
|
||||||
/home/szlc/miniconda3/envs/my_hair/ → /home/ubuntu/miniconda3/envs/my_hair/
|
/home/szlc/miniconda3/envs/my_hair/ → /home/xsl/miniconda3/envs/my_hair/
|
||||||
/home/szlc/miniconda3/envs/sdwebui/ → /home/ubuntu/miniconda3/envs/sdwebui/
|
/home/szlc/miniconda3/envs/sdwebui/ → /home/xsl/miniconda3/envs/sdwebui/
|
||||||
/home/szlc/miniconda3/envs/py310/ → /home/ubuntu/miniconda3/envs/py310/
|
/home/szlc/miniconda3/envs/py310/ → /home/xsl/miniconda3/envs/py310/
|
||||||
|
|
||||||
# 2. SD WebUI 代码(排除 models/)
|
# 2. SD WebUI 代码(排除 models/)
|
||||||
/home/szlc/project/onediff/stable-diffusion-webui/(排除 models/)
|
/home/szlc/project/onediff/stable-diffusion-webui/(排除 models/)
|
||||||
→ /home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/
|
→ /home/xsl/change_hair/project/onediff/stable-diffusion-webui/
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -166,16 +166,16 @@ ls -lh stable-diffusion-webui/models/Stable-diffusion/
|
|||||||
|
|
||||||
| 原服务器路径 | 本机目标路径 | 预估大小 |
|
| 原服务器路径 | 本机目标路径 | 预估大小 |
|
||||||
|-------------|-------------|---------|
|
|-------------|-------------|---------|
|
||||||
| `/home/szlc/project/kohya_ss_home/` | `/home/ubuntu/change_hair/project/kohya_ss_home/` | ~13G |
|
| `/home/szlc/project/kohya_ss_home/` | `/home/xsl/change_hair/project/kohya_ss_home/` | ~13G |
|
||||||
| `/home/szlc/miniconda3/envs/kohya/` | `/home/ubuntu/miniconda3/envs/kohya/` | ~5G |
|
| `/home/szlc/miniconda3/envs/kohya/` | `/home/xsl/miniconda3/envs/kohya/` | ~5G |
|
||||||
|
|
||||||
### 4.2 换发色功能
|
### 4.2 换发色功能
|
||||||
|
|
||||||
| 原服务器路径 | 本机目标路径 |
|
| 原服务器路径 | 本机目标路径 |
|
||||||
|-------------|-------------|
|
|-------------|-------------|
|
||||||
| `/home/szlc/project/data/ref_haircolor/` | `/home/ubuntu/change_hair/project/data/ref_haircolor/` |
|
| `/home/szlc/project/data/ref_haircolor/` | `/home/xsl/change_hair/project/data/ref_haircolor/` |
|
||||||
| `/home/szlc/project/data/ref_color/` | `/home/ubuntu/change_hair/project/data/ref_color/` |
|
| `/home/szlc/project/data/ref_color/` | `/home/xsl/change_hair/project/data/ref_color/` |
|
||||||
| `/home/szlc/project/data/ref_color_imgs/` | `/home/ubuntu/change_hair/project/data/ref_color_imgs/` |
|
| `/home/szlc/project/data/ref_color_imgs/` | `/home/xsl/change_hair/project/data/ref_color_imgs/` |
|
||||||
| `/home/szlc/.../weights/classify_3_2499.pth` | `project/hair_service_sd/weights/classify_3_2499.pth` |
|
| `/home/szlc/.../weights/classify_3_2499.pth` | `project/hair_service_sd/weights/classify_3_2499.pth` |
|
||||||
|
|
||||||
### 4.3 更多发型
|
### 4.3 更多发型
|
||||||
@@ -207,25 +207,25 @@ ls -lh stable-diffusion-webui/models/Stable-diffusion/
|
|||||||
# 从原服务器直传到本机(在本机执行)
|
# 从原服务器直传到本机(在本机执行)
|
||||||
rsync -avP --partial \
|
rsync -avP --partial \
|
||||||
szlc@192.168.101.63:/home/szlc/miniconda3/envs/my_hair/ \
|
szlc@192.168.101.63:/home/szlc/miniconda3/envs/my_hair/ \
|
||||||
/home/ubuntu/miniconda3/envs/my_hair/
|
/home/xsl/miniconda3/envs/my_hair/
|
||||||
|
|
||||||
rsync -avP --partial \
|
rsync -avP --partial \
|
||||||
szlc@192.168.101.63:/home/szlc/miniconda3/envs/sdwebui/ \
|
szlc@192.168.101.63:/home/szlc/miniconda3/envs/sdwebui/ \
|
||||||
/home/ubuntu/miniconda3/envs/sdwebui/
|
/home/xsl/miniconda3/envs/sdwebui/
|
||||||
|
|
||||||
rsync -avP --partial \
|
rsync -avP --partial \
|
||||||
szlc@192.168.101.63:/home/szlc/miniconda3/envs/py310/ \
|
szlc@192.168.101.63:/home/szlc/miniconda3/envs/py310/ \
|
||||||
/home/ubuntu/miniconda3/envs/py310/
|
/home/xsl/miniconda3/envs/py310/
|
||||||
|
|
||||||
rsync -avP --partial \
|
rsync -avP --partial \
|
||||||
--exclude='models/' \
|
--exclude='models/' \
|
||||||
szlc@192.168.101.63:/home/szlc/project/onediff/stable-diffusion-webui/ \
|
szlc@192.168.101.63:/home/szlc/project/onediff/stable-diffusion-webui/ \
|
||||||
/home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/
|
/home/xsl/change_hair/project/onediff/stable-diffusion-webui/
|
||||||
```
|
```
|
||||||
|
|
||||||
### 方式 2:先 tar 再上传到 `/home/ubuntu/data`
|
### 方式 2:先 tar 再上传到 `/home/xsl/data`
|
||||||
|
|
||||||
若通过网盘中转,先 tar 再上传到 `/home/ubuntu/data/`,上传完成后告知我解压。
|
若通过网盘中转,先 tar 再上传到 `/home/xsl/data/`,上传完成后告知我解压。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -235,15 +235,15 @@ rsync -avP --partial \
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Conda 环境
|
# 1. Conda 环境
|
||||||
ls /home/ubuntu/miniconda3/envs/my_hair/bin/python
|
ls /home/xsl/miniconda3/envs/my_hair/bin/python
|
||||||
ls /home/ubuntu/miniconda3/envs/sdwebui/bin/python
|
ls /home/xsl/miniconda3/envs/sdwebui/bin/python
|
||||||
ls /home/ubuntu/miniconda3/envs/py310/bin/python
|
ls /home/xsl/miniconda3/envs/py310/bin/python
|
||||||
|
|
||||||
# 2. WebUI 代码
|
# 2. WebUI 代码
|
||||||
ls /home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/webui.py
|
ls /home/xsl/change_hair/project/onediff/stable-diffusion-webui/webui.py
|
||||||
|
|
||||||
# 3. 模型未被覆盖
|
# 3. 模型未被覆盖
|
||||||
ls -lh /home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors
|
ls -lh /home/xsl/change_hair/project/onediff/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors
|
||||||
```
|
```
|
||||||
|
|
||||||
期望结果:4 项均存在,SD 底模约 4.0G。
|
期望结果:4 项均存在,SD 底模约 4.0G。
|
||||||
@@ -254,7 +254,7 @@ ls -lh /home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/models/St
|
|||||||
|
|
||||||
你上传完毕并告知后,我会依次执行:
|
你上传完毕并告知后,我会依次执行:
|
||||||
|
|
||||||
1. **路径适配**:运行 `adapt_paths.sh`,将所有硬编码路径从 `/home/xsl/change_hair` 改为 `/home/ubuntu/change_hair`,`/home/xsl/miniconda3` 改为 `/home/ubuntu/miniconda3`
|
1. **路径适配**:运行 `adapt_paths.sh`,将所有硬编码路径从 `/home/xsl/change_hair` 改为 `/home/xsl/change_hair`,`/home/xsl/miniconda3` 改为 `/home/xsl/miniconda3`
|
||||||
2. **Conda 路径修复**:运行 `fix_conda_paths.py`,修复 3 个环境中二进制文件的 shebang 和内部路径前缀
|
2. **Conda 路径修复**:运行 `fix_conda_paths.py`,修复 3 个环境中二进制文件的 shebang 和内部路径前缀
|
||||||
3. **安装 Miniconda 基础环境**(如尚未安装):从 `repo.anaconda.com` 下载安装
|
3. **安装 Miniconda 基础环境**(如尚未安装):从 `repo.anaconda.com` 下载安装
|
||||||
4. **启动服务**:`bash start_all.sh start`(依赖顺序:webui → photo_service → hair_service_sd)
|
4. **启动服务**:`bash start_all.sh start`(依赖顺序:webui → photo_service → hair_service_sd)
|
||||||
@@ -283,11 +283,11 @@ POST http://127.0.0.1:8801/api/swapHair/v1
|
|||||||
|
|
||||||
**Q:能否只上传 miniconda3 整包,不传单个 env?**
|
**Q:能否只上传 miniconda3 整包,不传单个 env?**
|
||||||
|
|
||||||
可以。上传 `/home/szlc/miniconda3/` 整包到 `/home/ubuntu/miniconda3/` 也行,体积更大(约 20–30G)但更省事。
|
可以。上传 `/home/szlc/miniconda3/` 整包到 `/home/xsl/miniconda3/` 也行,体积更大(约 20–30G)但更省事。
|
||||||
|
|
||||||
**Q:webui 上传时不小心覆盖了 models 怎么办?**
|
**Q:webui 上传时不小心覆盖了 models 怎么办?**
|
||||||
|
|
||||||
重新从 `/home/ubuntu/data/sdwebui/models/` 或原服务器补传 models 目录即可。
|
重新从 `/home/xsl/data/sdwebui/models/` 或原服务器补传 models 目录即可。
|
||||||
|
|
||||||
**Q:本机没有 miniconda 基础安装,只传 envs 够吗?**
|
**Q:本机没有 miniconda 基础安装,只传 envs 够吗?**
|
||||||
|
|
||||||
@@ -299,4 +299,4 @@ webui 启动参数可能需要去掉 `--xformers`,改用 `--opt-sdp-no-mem-att
|
|||||||
|
|
||||||
**Q:本机磁盘空间是否足够?**
|
**Q:本机磁盘空间是否足够?**
|
||||||
|
|
||||||
当前 `/home` 剩余约 30G。3 个 conda 环境约 20–25G,解压后可能吃紧。建议解压一个删一个 tar 包,或考虑清理 `/home/ubuntu/data/`(已有 16G 冗余数据,解压完成后可删除)。
|
当前 `/home` 剩余约 30G。3 个 conda 环境约 20–25G,解压后可能吃紧。建议解压一个删一个 tar 包,或考虑清理 `/home/xsl/data/`(已有 16G 冗余数据,解压完成后可删除)。
|
||||||
|
|||||||
+2
-2
@@ -9,7 +9,7 @@ OLD_PREFIXES = [
|
|||||||
b"/home/szlc/miniconda3",
|
b"/home/szlc/miniconda3",
|
||||||
b"/usr/local/miniconda3",
|
b"/usr/local/miniconda3",
|
||||||
]
|
]
|
||||||
NEW_PREFIX = b"/home/ubuntu/miniconda3"
|
NEW_PREFIX = b"/home/xsl/miniconda3"
|
||||||
|
|
||||||
def is_probably_binary(filepath):
|
def is_probably_binary(filepath):
|
||||||
"""通过文件扩展名和内容判断是否为二进制文件"""
|
"""通过文件扩展名和内容判断是否为二进制文件"""
|
||||||
@@ -61,7 +61,7 @@ def fix_env(env_dir):
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
for env in sys.argv[1:]:
|
for env in sys.argv[1:]:
|
||||||
env_path = f"/home/ubuntu/miniconda3/envs/{env}"
|
env_path = f"/home/xsl/miniconda3/envs/{env}"
|
||||||
if os.path.isdir(env_path):
|
if os.path.isdir(env_path):
|
||||||
print(f"[{env}] 修复中...")
|
print(f"[{env}] 修复中...")
|
||||||
fix_env(env_path)
|
fix_env(env_path)
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
### 1. 确认 webui 已启动(生发依赖 SD inpainting)
|
### 1. 确认 webui 已启动(生发依赖 SD inpainting)
|
||||||
```bash
|
```bash
|
||||||
ss -tlnp | grep 57860 # 确认 webui 在跑
|
ss -tlnp | grep 57860 # 确认 webui 在跑
|
||||||
bash /home/ubuntu/change_hair/start_all.sh status # 看 webui 是否就绪
|
bash /home/xsl/change_hair/start_all.sh status # 看 webui 是否就绪
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. 启动生发服务(端口 8899)
|
### 2. 启动生发服务(端口 8899)
|
||||||
```bash
|
```bash
|
||||||
nohup /home/ubuntu/change_hair/start_hairgrow.sh > /home/ubuntu/change_hair/project/logs/hair_grow_service.log 2>&1 &
|
nohup /home/xsl/change_hair/start_hairgrow.sh > /home/xsl/change_hair/project/logs/hair_grow_service.log 2>&1 &
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. 打开测试页面
|
### 3. 打开测试页面
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import base64
|
|||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
# 把 hair_service_sd 加入 path,使其模块可被导入
|
# 把 hair_service_sd 加入 path,使其模块可被导入
|
||||||
HAIR_SERVICE_DIR = "/home/ubuntu/change_hair/project/hair_service_sd"
|
HAIR_SERVICE_DIR = "/home/xsl/change_hair/project/hair_service_sd"
|
||||||
sys.path.insert(0, HAIR_SERVICE_DIR)
|
sys.path.insert(0, HAIR_SERVICE_DIR)
|
||||||
# 切换到 hair_service_sd 目录,使 common.logger 能读到 config/configure.ini(相对路径)
|
# 切换到 hair_service_sd 目录,使 common.logger 能读到 config/configure.ini(相对路径)
|
||||||
os.chdir(HAIR_SERVICE_DIR)
|
os.chdir(HAIR_SERVICE_DIR)
|
||||||
@@ -414,7 +414,7 @@ def train_src_img(hair_id):
|
|||||||
"""返回发型的训练原图(hair_type_images/<hair_id>.jpg/.png)。
|
"""返回发型的训练原图(hair_type_images/<hair_id>.jpg/.png)。
|
||||||
用于测试页展示发型真实样子,而非套在标准脸上的效果图。
|
用于测试页展示发型真实样子,而非套在标准脸上的效果图。
|
||||||
"""
|
"""
|
||||||
src_dir = "/home/ubuntu/change_hair/hair_type_images"
|
src_dir = "/home/xsl/change_hair/hair_type_images"
|
||||||
for ext in (".jpg", ".jpeg", ".png"):
|
for ext in (".jpg", ".jpeg", ".png"):
|
||||||
path = os.path.join(src_dir, hair_id + ext)
|
path = os.path.join(src_dir, hair_id + ext)
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
|
|||||||
@@ -70,7 +70,11 @@ def process_infer(user_img_path, target_color, color_dir, dst_path, ratio=1.0):
|
|||||||
# 通过webui对照片进行增强
|
# 通过webui对照片进行增强
|
||||||
s4 = time.time()
|
s4 = time.time()
|
||||||
# cv2.imwrite('/home/student/Downloads/12121.jpg',crop_img)
|
# cv2.imwrite('/home/student/Downloads/12121.jpg',crop_img)
|
||||||
|
try:
|
||||||
enhanced_img = enhance_hair.webui_img2img(crop_img, crop_mask, prompt=prompt)
|
enhanced_img = enhance_hair.webui_img2img(crop_img, crop_mask, prompt=prompt)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[process_infer] webui enhance skipped: {e}")
|
||||||
|
enhanced_img = crop_img
|
||||||
print("----------------------------webui_img2img", time.time() - s4)
|
print("----------------------------webui_img2img", time.time() - s4)
|
||||||
|
|
||||||
# 写回原图
|
# 写回原图
|
||||||
|
|||||||
@@ -32,4 +32,3 @@ name=watch-time
|
|||||||
[errorlogger]
|
[errorlogger]
|
||||||
level=ERROR
|
level=ERROR
|
||||||
name=w-error
|
name=w-error
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/home/ubuntu/miniconda3/envs/yd/bin/python
|
#!/home/xsl/miniconda3/envs/yd/bin/python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import os
|
import os
|
||||||
# 监听本机的端口
|
# 监听本机的端口
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import cv2
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
# MediaPipe 模型路径
|
# MediaPipe 模型路径
|
||||||
MP_MODEL = "/home/ubuntu/change_hair/project/hair_service_sd/weights/mediapipe/face_landmarker.task"
|
MP_MODEL = "/home/xsl/change_hair/project/hair_service_sd/weights/mediapipe/face_landmarker.task"
|
||||||
_mp_detector = None
|
_mp_detector = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,8 @@ class HairStyle_Model_Infer(object):
|
|||||||
# haircolor_dir = '/home/data/hair/data/ref_color/3628746832766'
|
# haircolor_dir = '/home/data/hair/data/ref_color/3628746832766'
|
||||||
face_base, hair_matting, status = self.infer_haircolor_new(user_rgb_8uc3_orisize, haircolor_dir,target_hair_color,
|
face_base, hair_matting, status = self.infer_haircolor_new(user_rgb_8uc3_orisize, haircolor_dir,target_hair_color,
|
||||||
return_matting=True)
|
return_matting=True)
|
||||||
|
if status != 0:
|
||||||
|
return user_rgb_8uc3_orisize, None, status
|
||||||
user_rgb_8uc3_orisize = face_base
|
user_rgb_8uc3_orisize = face_base
|
||||||
# 构建一个色板
|
# 构建一个色板
|
||||||
r, g, b = target_hair_color
|
r, g, b = target_hair_color
|
||||||
@@ -1016,7 +1018,7 @@ class HairStyle_Model_Infer(object):
|
|||||||
def infer_haircolor_new(self, user_rgb_8uc3_orisize, haircolor_dir, target_hair_color, return_matting=False):
|
def infer_haircolor_new(self, user_rgb_8uc3_orisize, haircolor_dir, target_hair_color, return_matting=False):
|
||||||
landmarks_origin_img_1k= self.get_landmark.forward(user_rgb_8uc3_orisize)
|
landmarks_origin_img_1k= self.get_landmark.forward(user_rgb_8uc3_orisize)
|
||||||
if landmarks_origin_img_1k is None:
|
if landmarks_origin_img_1k is None:
|
||||||
return None, 10001
|
return None, None, 10001
|
||||||
need_process = (target_hair_color[0] * 0.299 + target_hair_color[1] * 0.587 + target_hair_color[2] * 0.114) > 150
|
need_process = (target_hair_color[0] * 0.299 + target_hair_color[1] * 0.587 + target_hair_color[2] * 0.114) > 150
|
||||||
_, user_matting_8uc1_bald_orisize = self.process_data_infer.generator_matte.matte_inference(user_rgb_8uc3_orisize,
|
_, user_matting_8uc1_bald_orisize = self.process_data_infer.generator_matte.matte_inference(user_rgb_8uc3_orisize,
|
||||||
landmarks_origin_img_1k)
|
landmarks_origin_img_1k)
|
||||||
@@ -1036,12 +1038,15 @@ class HairStyle_Model_Infer(object):
|
|||||||
need_process=True
|
need_process=True
|
||||||
if need_process:
|
if need_process:
|
||||||
haircolor_dir_tmp = os.path.join(config.get('default', "haircolorDir"), config.get('default', "baseColor_ID"))
|
haircolor_dir_tmp = os.path.join(config.get('default', "haircolorDir"), config.get('default', "baseColor_ID"))
|
||||||
|
if os.path.exists(haircolor_dir_tmp):
|
||||||
face_base, status1 = self.infer_haircolor_tj(user_rgb_8uc3_orisize, haircolor_dir_tmp)
|
face_base, status1 = self.infer_haircolor_tj(user_rgb_8uc3_orisize, haircolor_dir_tmp)
|
||||||
# cv2.imwrite('/home/student/Desktop/tmp_color/need/face_base.png', face_base)
|
# cv2.imwrite('/home/student/Desktop/tmp_color/need/face_base.png', face_base)
|
||||||
if status1 == 0:
|
if status1 == 0:
|
||||||
return face_base, user_matting_8uc1_bald_orisize, 0
|
return face_base, user_matting_8uc1_bald_orisize, 0
|
||||||
else:
|
else:
|
||||||
need_process = False
|
need_process = False
|
||||||
|
else:
|
||||||
|
need_process = False
|
||||||
if not need_process:
|
if not need_process:
|
||||||
hair_gene_color_8uc3_768, user_matting_mask_8uc3_768 = self.change_haircolor.Change_Hair_inference(
|
hair_gene_color_8uc3_768, user_matting_mask_8uc3_768 = self.change_haircolor.Change_Hair_inference(
|
||||||
user_rgb_8uc3_change_color_768,
|
user_rgb_8uc3_change_color_768,
|
||||||
|
|||||||
@@ -255,7 +255,8 @@ def change_hair_colorv3():
|
|||||||
jsonify({'msg': '算法解析错误', 'result': '', 'umd': '', 'state': -1}), 400)
|
jsonify({'msg': '算法解析错误', 'result': '', 'umd': '', 'state': -1}), 400)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(f"[hairColor ERROR] {e}")
|
||||||
|
traceback.print_exc()
|
||||||
return make_response(
|
return make_response(
|
||||||
jsonify({'msg': '算法解析错误', 'result': '', 'umd': '', 'state': -1}), 400)
|
jsonify({'msg': '算法解析错误', 'result': '', 'umd': '', 'state': -1}), 400)
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
export CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
|
export CRYPTOGRAPHY_OPENSSL_NO_LEGACY=1
|
||||||
|
|
||||||
# 创建Lora目录软连接
|
# 创建Lora目录软连接
|
||||||
TARGET_LORA="/home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/models/Lora"
|
TARGET_LORA="/home/xsl/change_hair/project/onediff/stable-diffusion-webui/models/Lora"
|
||||||
if [ -e "$TARGET_LORA" ]; then
|
if [ -e "$TARGET_LORA" ]; then
|
||||||
echo "删除已存在的Lora连接或目录: $TARGET_LORA"
|
echo "删除已存在的Lora连接或目录: $TARGET_LORA"
|
||||||
rm -rf "$TARGET_LORA"
|
rm -rf "$TARGET_LORA"
|
||||||
@@ -13,16 +13,16 @@ ln -s /gz-fs/Lora "$TARGET_LORA"
|
|||||||
echo "创建软连接成功: /gz-fs/Lora -> $TARGET_LORA"
|
echo "创建软连接成功: /gz-fs/Lora -> $TARGET_LORA"
|
||||||
|
|
||||||
# 1. 换发算法服务
|
# 1. 换发算法服务
|
||||||
cd /home/ubuntu/change_hair/project/hair_service_sd
|
cd /home/xsl/change_hair/project/hair_service_sd
|
||||||
nohup /home/ubuntu/miniconda3/envs/condiff-train-hair/bin/python run_copy_cost_colorb64.py > hair_service.log 2>&1 &
|
nohup /home/xsl/miniconda3/envs/condiff-train-hair/bin/python run_copy_cost_colorb64.py > hair_service.log 2>&1 &
|
||||||
|
|
||||||
# 2. webUI服务推理 + onediff
|
# 2. webUI服务推理 + onediff
|
||||||
cd /home/ubuntu/change_hair/project/onediff/stable-diffusion-webui
|
cd /home/xsl/change_hair/project/onediff/stable-diffusion-webui
|
||||||
nohup /home/ubuntu/miniconda3/envs/onediff/bin/python webui.py --api --listen --xformers --port 57860 > webui.log 2>&1 &
|
nohup /home/xsl/miniconda3/envs/onediff/bin/python webui.py --api --listen --xformers --port 57860 > webui.log 2>&1 &
|
||||||
nohup ./webui.sh --api --listen --disable-safe-unpickle --port 9038 > webui_sh.log 2>&1 &
|
nohup ./webui.sh --api --listen --disable-safe-unpickle --port 9038 > webui_sh.log 2>&1 &
|
||||||
|
|
||||||
# 3. photo_service
|
# 3. photo_service
|
||||||
cd /home/ubuntu/change_hair/project/photo_service
|
cd /home/xsl/change_hair/project/photo_service
|
||||||
nohup /home/ubuntu/miniconda3/envs/py310/bin/python lora_train_service_1.py > photo_service.log 2>&1 &
|
nohup /home/xsl/miniconda3/envs/py310/bin/python lora_train_service_1.py > photo_service.log 2>&1 &
|
||||||
|
|
||||||
echo "所有服务已在后台启动"
|
echo "所有服务已在后台启动"
|
||||||
@@ -43,6 +43,9 @@ def webui_img2img(img, mask, prompt='', denoising_strength=0.35):
|
|||||||
}
|
}
|
||||||
response = requests.post(url=url, json=request_dict)
|
response = requests.post(url=url, json=request_dict)
|
||||||
ret_json = response.json()
|
ret_json = response.json()
|
||||||
|
if 'images' not in ret_json:
|
||||||
|
print(f"[webui_img2img ERROR] {ret_json}")
|
||||||
|
raise Exception(f"webui error: {ret_json.get('error', 'unknown')}")
|
||||||
result = ret_json['images'][0]
|
result = ret_json['images'][0]
|
||||||
img = cv2.imdecode(np.frombuffer(base64.b64decode(result.split(",", 1)[0]), np.uint8), cv2.IMREAD_COLOR)
|
img = cv2.imdecode(np.frombuffer(base64.b64decode(result.split(",", 1)[0]), np.uint8), cv2.IMREAD_COLOR)
|
||||||
return img
|
return img
|
||||||
|
|||||||
@@ -307,13 +307,13 @@ def train_thread(sq, gpu_id):
|
|||||||
# 3. GPU 固定 device=0(单卡)
|
# 3. GPU 固定 device=0(单卡)
|
||||||
# 4. 去掉 tokenizer_cache_dir(改用 HF 本地缓存 + 离线模式)
|
# 4. 去掉 tokenizer_cache_dir(改用 HF 本地缓存 + 离线模式)
|
||||||
# 5. 设置 HF_HUB_OFFLINE 避免联网检查
|
# 5. 设置 HF_HUB_OFFLINE 避免联网检查
|
||||||
kohya_python = '/home/ubuntu/miniconda3/envs/kohya/bin/python'
|
kohya_python = '/home/ubuntu/miniconda3/envs/my_hair/bin/python'
|
||||||
kohya_workdir = os.path.join(kohya_ss_home_dir, 'kohya_ss')
|
kohya_workdir = os.path.join(kohya_ss_home_dir, 'kohya_ss')
|
||||||
base_model = '/home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors'
|
base_model = '/home/ubuntu/change_hair/project/onediff/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors'
|
||||||
cmd_train = (
|
cmd_train = (
|
||||||
f'cd {kohya_workdir} && '
|
f'cd {kohya_workdir} && '
|
||||||
f'HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 CUDA_VISIBLE_DEVICES={device_id} '
|
f'HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 CUDA_VISIBLE_DEVICES={device_id} '
|
||||||
f'/home/ubuntu/miniconda3/envs/kohya/bin/accelerate launch --num_cpu_threads_per_process=2 "./train_network.py" --enable_bucket '
|
f'/home/ubuntu/miniconda3/envs/my_hair/bin/accelerate launch --num_cpu_threads_per_process=2 "./train_network.py" --enable_bucket '
|
||||||
f'--min_bucket_reso=256 --max_bucket_reso=2048 --pretrained_model_name_or_path="{base_model}" '
|
f'--min_bucket_reso=256 --max_bucket_reso=2048 --pretrained_model_name_or_path="{base_model}" '
|
||||||
f'--train_data_dir={images_dir} --resolution="2000,2000" '
|
f'--train_data_dir={images_dir} --resolution="2000,2000" '
|
||||||
f'--output_dir={model_dir} '
|
f'--output_dir={model_dir} '
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# 断点续传大文件到云服务器 /home/ubuntu/data
|
# 断点续传大文件到云服务器 /home/xsl/data
|
||||||
# 用法: bash scripts/sync_data_to_server.sh [all|weights|sd|hairstyles]
|
# 用法: bash scripts/sync_data_to_server.sh [all|weights|sd|hairstyles]
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
REMOTE="ubuntu@117.50.213.111"
|
REMOTE="ubuntu@117.50.213.111"
|
||||||
REMOTE_BASE="/home/ubuntu/data"
|
REMOTE_BASE="/home/xsl/data"
|
||||||
LOCAL_BASE="/home/xsl/change_hair"
|
LOCAL_BASE="/home/xsl/change_hair"
|
||||||
LOG_DIR="${LOCAL_BASE}/project/logs"
|
LOG_DIR="${LOCAL_BASE}/project/logs"
|
||||||
mkdir -p "$LOG_DIR"
|
mkdir -p "$LOG_DIR"
|
||||||
|
|||||||
@@ -158,6 +158,10 @@ def step3_wait_and_callback(hair_id, template_img):
|
|||||||
else:
|
else:
|
||||||
print(" ✗ 训练超时"); return False
|
print(" ✗ 训练超时"); return False
|
||||||
time.sleep(5) # 等训练进程写完
|
time.sleep(5) # 等训练进程写完
|
||||||
|
# 训练时停掉了 hair 服务,回调前需要重启
|
||||||
|
print(" 重启 change_hair-hair 服务...")
|
||||||
|
os.system("sudo systemctl restart change_hair-hair")
|
||||||
|
time.sleep(20)
|
||||||
# 触发回调生成ref材质
|
# 触发回调生成ref材质
|
||||||
print(" 触发回调生成ref材质...")
|
print(" 触发回调生成ref材质...")
|
||||||
r = req.post(HAIR_CALLBACK, json={"task_id":f"train_{hair_id}","hair_id":hair_id,
|
r = req.post(HAIR_CALLBACK, json={"task_id":f"train_{hair_id}","hair_id":hair_id,
|
||||||
|
|||||||
Reference in New Issue
Block a user