ComfyUI FaceSwap — готовый темплейт для RunPod
Поднимает на RunPod полностью настроенный ComfyUI с пайплайном замены лица:
- Flux.2 Klein 9b — переносит голову с одного фото на другое, сохраняя свет, ракурс и пропорции
- Z-Image Turbo + FaceDetailer — заново отрисовывает лицо в высоком разрешении, сюда подключается персональная LoRA
Оба этапа работают в связке и оба обязательны. Flux хорошо ставит голову по свету и ракурсу, но лицо у него выходит лишь похожим. Z-Image затем вырезает это лицо и рисует его заново — уже с обученной на конкретном человеке LoRA. Отсюда и настоящее сходство.
Ничего устанавливать руками не нужно. Один раз создаёшь темплейт — дальше запуск в два клика.
Железо: рассчитано на L40S (48 ГБ VRAM). Минимум — 24 ГБ VRAM и 32 ГБ RAM.
Что нужно иметь
- аккаунт на RunPod с пополненным балансом
- аккаунт на HuggingFace — бесплатный
Шаг 1. Токен HuggingFace
Нужен, чтобы скачать модель Flux. Свой, личный — чужие токены не используй.
- Открой https://huggingface.co/settings/tokens
- Create new token
- Тип — Read (не Write)
- Название любое, например
runpod - Create token → скопируй и сохрани в блокнот
HuggingFace показывает токен только один раз. Потеряешь — сделаешь новый, ничего страшного.
Шаг 2. Принять лицензию Flux
- Открой https://huggingface.co/black-forest-labs/FLUX.2-klein-9b-fp8
- Убедись, что залогинен
- Нажми 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. Запустить
- Pods → Deploy
- Выбери L40S
- Change Template → свой
ComfyUI-FaceSwap - В блоке Environment Variables впиши свой токен в
HF_TOKEN - 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. Работать
- Карточка пода → Connect → HTTP Service → :8188
- Воркфлоу уже загружен — в левой панели ComfyUI, раздел Workflows
- Загрузи две картинки:
- группа Your-Image — фото-основа: тело, поза, фон
- группа Reference-Image — лицо, которое переносим
- 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 не даёт ничего испортить.
- Не вставляй токен в сам скрипт — только в переменную окружения.