cocount21's picture
Upload 3 files
3717b68 verified
|
Raw History Blame Contribute Delete
9.93 kB
---
license: apache-2.0
tags:
- comfyui
- runpod
- faceswap
---
# ComfyUI FaceSwap — готовый темплейт для RunPod
Поднимает на RunPod полностью настроенный ComfyUI с пайплайном замены лица:
1. **Flux.2 Klein 9b** — переносит голову с одного фото на другое, сохраняя свет, ракурс и пропорции
2. **Z-Image Turbo + FaceDetailer** — заново отрисовывает лицо в высоком разрешении, сюда подключается персональная LoRA
Оба этапа работают в связке и оба обязательны. Flux хорошо ставит голову по свету и ракурсу, но лицо у него выходит лишь похожим. Z-Image затем вырезает это лицо и рисует его заново — уже с обученной на конкретном человеке LoRA. Отсюда и настоящее сходство.
Ничего устанавливать руками не нужно. Один раз создаёшь темплейт — дальше запуск в два клика.
**Железо:** рассчитано на L40S (48 ГБ VRAM). Минимум — 24 ГБ VRAM и 32 ГБ RAM.
---
## Что нужно иметь
- аккаунт на [RunPod](https://runpod.io) с пополненным балансом
- аккаунт на [HuggingFace](https://huggingface.co) — бесплатный
---
## Шаг 1. Токен HuggingFace
Нужен, чтобы скачать модель Flux. Свой, личный — чужие токены не используй.
1. Открой https://huggingface.co/settings/tokens
2. **Create new token**
3. Тип — **Read** (не Write)
4. Название любое, например `runpod`
5. **Create token** → скопируй и сохрани в блокнот
HuggingFace показывает токен только один раз. Потеряешь — сделаешь новый, ничего страшного.
---
## Шаг 2. Принять лицензию Flux
1. Открой https://huggingface.co/black-forest-labs/FLUX.2-klein-9b-fp8
2. Убедись, что залогинен
3. Нажми **Agree** на серой плашке
Выбирать там нечего, полей нет — просто кнопка.
> ⚠️ У FLUX.2 Klein **некоммерческая лицензия**. Использование результатов в коммерческих целях она не разрешает. Это твоя зона ответственности.
>
> Обойти этот шаг и всё равно пользоваться воркфлоу не получится: Flux здесь делает первый этап, без него замена лица не работает. Переключатель `WANT_FLUX=0` из таблицы настроек существует для тех, кто собирает что-то своё только на Z-Image — для этого воркфлоу его выключать нельзя.
---
## Шаг 3. Создать темплейт в RunPod
Консоль RunPod → левое меню **Templates** → **New Template**.
| Поле | Значение |
|---|---|
| Template Name | `ComfyUI-FaceSwap` |
| Template Type | `Pod` |
| Container Image | `runpod/pytorch:1.3.1-cu1300-torch291-ubuntu2404` |
| Container Disk | `20` GB |
| Volume Disk | `80` GB |
| Volume Mount Path | `/workspace` |
| Expose HTTP Ports | `8188,8888` |
| Expose TCP Ports | `22` |
**Container Start Command** (в некоторых версиях поле называется Docker Command):
```
bash -c "curl -sL https://huggingface.co/cocount21/comfy-faceswap-setup/resolve/main/provision.sh -o /provision.sh && bash /provision.sh 2>&1 | tee /workspace/provision.log"
```
**Environment Variables** — добавь одну переменную:
| Key | Value |
|---|---|
| `HF_TOKEN` | **оставь пустым** |
Пустым — потому что заполнять её ты будешь при запуске пода, своим токеном. Так она видна в форме деплоя и её не забудешь.
Нажми **Save Template**.
---
## Шаг 4. Запустить
1. **Pods** → **Deploy**
2. Выбери **L40S**
3. **Change Template** → свой `ComfyUI-FaceSwap`
4. В блоке Environment Variables впиши **свой** токен в `HF_TOKEN`
5. **Deploy On-Demand**
---
## Шаг 5. Подождать
Первый запуск — 10–20 минут, качается около 40 ГБ моделей. ComfyUI стартует последним, раньше времени его дёргать бесполезно.
Смотреть прогресс: карточка пода → **Logs** → **Container Logs**.
В конце скрипт печатает отчёт:
```
=========================== SUMMARY ===========================
OK Flux-2-Klein-9b-fp8.safetensors
OK qwen_3_8b_fp8mixed.safetensors
...
=================================================================
time: 812 s
ALL GOOD - ComfyUI is starting on port 8188
```
Зелёное `ALL GOOD` — всё готово. Красные строки — смотри раздел «Если что-то пошло не так».
---
## Шаг 6. Работать
1. Карточка пода → **Connect** → **HTTP Service → :8188**
2. Воркфлоу уже загружен — в левой панели ComfyUI, раздел Workflows
3. Загрузи две картинки:
- группа **Your-Image** — фото-основа: тело, поза, фон
- группа **Reference-Image** — лицо, которое переносим
4. **Run**
Результат — в ноде **SaveImage** с жёлтой рамкой. Вторая SaveImage показывает промежуточный результат Flux, до починки лица.
### Своя LoRA
Залей свою LoRA в любой публичный репозиторий на HuggingFace и при деплое добавь переменную:
```
EXTRA_LORAS = твой_ник/твой_репозиторий:имя_файла.safetensors
```
Несколько — через запятую. Файлы лягут в `models/loras/`, останется выбрать их в ноде.
---
## Настройки (Environment Variables)
| Переменная | По умолчанию | Что делает |
|---|---|---|
| `HF_TOKEN` | пусто | твой read-токен HuggingFace |
| `WANT_FLUX` | `1` | этап Flux.2 Klein, ~19 ГБ, gated, non-commercial. **Для этого воркфлоу выключать нельзя** |
| `WANT_ZIMAGE` | `1` | этап Z-Image Turbo, ~21 ГБ, Apache 2.0. **Для этого воркфлоу выключать нельзя** |
| `WANT_DETECTORS` | `1` | детекторы лица для FaceDetailer, ~0.4 ГБ. **Выключать нельзя** |
| `EXTRA_LORAS` | пусто | свои LoRA: `repo:file.safetensors`, через запятую |
| `GET_WORKFLOWS` | `1` | подтянуть воркфлоу автоматически |
| `START_JUPYTER` | `0` | поднять JupyterLab на порту 8888 |
| `SKIP_MODELS` | `0` | только ноды, без моделей — для быстрой проверки |
| `COMFY_PORT` | `8188` | порт ComfyUI |
| `COMFY_REF` | пусто | закрепить ComfyUI на конкретном коммите |
---
## Если что-то пошло не так
Скрипт проверяет доступ к Flux **до** скачивания и объясняет проблему прямо в логе.
| В логе | Причина | Решение |
|---|---|---|
| `HTTP 401` | токен неверный или пустой | сделать Read-токен, вписать в `HF_TOKEN` |
| `HTTP 403` | лицензия не принята | нажать Agree на странице модели |
| `BAD SIZE` | файл скачался битым | перезапустить под, скрипт перекачает сам |
| `TORCH CHANGED` | нода подменила torch | сообщи автору темплейта |
| `NODE MISSING` | не склонировалась нода | перезапустить под |
Полный лог лежит в поде: `/workspace/provision.log`
---
## Что внутри
**Ноды:** ComfyUI-Manager, Impact-Pack, Impact-Subpack, Easy-Use, rgthree-comfy, utils-nodes
**Модели:**
| Файл | Размер | Лицензия |
|---|---|---|
| Flux-2-Klein-9b-fp8 | 8.8 ГБ | FLUX Non-Commercial |
| qwen_3_8b_fp8mixed | 8.1 ГБ | — |
| flux2-vae | 0.3 ГБ | — |
| bfs_head_v1 (LoRA свапа) | 0.6 ГБ | не указана автором |
| z_image_turbo_bf16 | 11.5 ГБ | Apache 2.0 |
| qwen_3_4b | 7.5 ГБ | Apache 2.0 |
| ae (VAE) | 0.3 ГБ | Apache 2.0 |
| face_yolov8m + SAM | 0.4 ГБ | — |
Скрипт сверяет размер каждого скачанного файла с эталоном. Битый файл будет пойман сразу, а не через час непонятных ошибок.
---
## Безопасность
- Токен вписывай **свой**. Переменные окружения видны изнутри пода любому, у кого есть к нему доступ.
- Используй **Read**-токен, не Write. Read не даёт ничего испортить.
- Не вставляй токен в сам скрипт — только в переменную окружения.