--- 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 не даёт ничего испортить. - Не вставляй токен в сам скрипт — только в переменную окружения.