File size: 9,929 Bytes
3717b68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
---
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 не даёт ничего испортить.
- Не вставляй токен в сам скрипт — только в переменную окружения.