File size: 8,910 Bytes
60024c0 | 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 208 209 | # План внедрения: Python-скрипт для генерации SCAIL-2 видео
## Цель
Написать Python-скрипт, который генерирует видео через SCAIL-2 пайплайн,
используя прямое обращение к нодам ComfyUI (без API, без сервера, без GUI).
## Исходные данные
### Железо
- 7× NVIDIA RTX PRO 6000 Blackwell (97 GB VRAM каждая)
- CUDA 0 свободна (~97 GB)
### Софт (уже установлено)
- ComfyUI: `/home/ubuntu/ComfyUI`
- Python 3.12.3, torch 2.12.1+cu130
### Модели (уже скачаны)
| Файл | Путь |
|------|------|
| SCAIL-2 diffusion model | `models/diffusion_models/wan2.1_14B_SCAIL_2_fp8_scaled.safetensors` |
| VAE | `models/vae/wan_2.1_vae.safetensors` |
| Text encoder (umt5) | `models/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors` |
| CLIP vision | `models/clip_vision/clip_vision_h_fp16.safetensors` |
| LoRA (lightx2v) | `models/loras/lightx2v_I2V_14B_480p_cfg_step_distill_rank64_bf16.safetensors` |
### Custom nodes (уже установлены)
- `scail-auto-extend` — референсная реализация, делает то же самое (прямой вызов нод)
- `comfyui-videohelpersuite` — VHS для загрузки/сохранения видео
- `comfyui-kjnodes` — утилиты (ресайз и т.д.)
### Встроенные ноды ComfyUI (уже есть)
- `comfy_extras.nodes_scail.WanSCAILToVideo` — SCAIL-2 conditioning
- `comfy_extras.nodes_custom_sampler.SamplerCustom` — sampling
- `comfy_extras.nodes_post_processing.ColorTransfer` — color matching
- Базовые: `CheckpointLoaderSimple`, `VAELoader`, `CLIPLoader`, `CLIPVisionLoader` и т.д.
## Архитектура скрипта (v1 — базовый SCAIL-2)
### Этап 1: загрузка моделей
```
1. LoadDiffusionModel (SCAIL-2) → MODEL
2. LoadVAE (wan_2.1) → VAE
3. LoadCLIP (umt5) → CLIP
4. LoadCLIPVision (clip_h) → CLIP_VISION
```
Используем существующие ноды ComfyUI: `CheckpointLoaderSimple`, `VAELoader`, `CLIPLoader`, `CLIPVisionLoader`.
### Этап 2: подготовка conditioning
```
5. CLIPTextEncode(positive_prompt) → CONDITIONING (+)
6. CLIPTextEncode(negative_prompt) → CONDITIONING (−)
7. CLIPVisionEncode(ref_image) → CLIP_VISION_OUTPUT
8. LoadVideo(pose_video) → IMAGE (pose frames)
9. WanSCAILToVideo( → SCAIL conditioning
positive, negative, vae,
width, height, length,
pose_video, reference_image,
clip_vision_output, ...
)
```
### Этап 3: sampling
```
10. KSamplerSelect(sampler_name) → SAMPLER
11. BasicScheduler(sigmas) → SIGMAS
12. SamplerCustom( → denoised latents
model, positive, negative,
sampler, sigmas, latent
)
```
### Этап 4: декодирование и сохранение
```
13. VAEDecode(samples) → IMAGE
14. SaveVideo / VHS_VideoCombine → video.mp4
```
## Входные параметры скрипта (v1)
```python
CONFIG = {
# Модели
"diffusion_model": "wan2.1_14B_SCAIL_2_fp8_scaled.safetensors",
"vae": "wan_2.1_vae.safetensors",
"text_encoder": "umt5_xxl_fp8_e4m3fn_scaled.safetensors",
"clip_vision": "clip_vision_h_fp16.safetensors",
# Входные данные
"pose_video": "pose.mp4", # драйвер-видео с позами
"reference_image": "ref.png", # референсное изображение
"reference_mask": None, # маска референса (опционально)
"pose_mask": None, # маска поз (опционально)
# Параметры генерации
"width": 832,
"height": 480,
"num_frames": 81, # длина одного чанка
"overlap": 5, # перекрытие между чанками
"total_frames": None, # если None = длина pose_video
"seed": 42,
"cfg": 1.0,
"steps": 20,
"sampler": "dpmpp_2m_sde",
"scheduler": "karras",
# SCAIL-2 специфичные
"replacement_mode": False, # False = animation, True = replacement
"pose_strength": 1.0,
"pose_start": 0.0,
"pose_end": 1.0,
# Промпты
"positive_prompt": "...",
"negative_prompt": "...",
# LoRA (опционально)
"lora": "lightx2v_I2V_14B_480p_cfg_step_distill_rank64_bf16.safetensors",
"lora_strength": 1.0,
# Вывод
"output": "output.mp4",
"fps": 24,
}
```
## План разработки (по шагам)
### Шаг 1: разведать API загрузки моделей
- Посмотреть, как `CheckpointLoaderSimple` загружает diffusion model
- Посмотреть, как `VAELoader` загружает VAE
- Посмотреть, как `CLIPLoader` / `CLIPVisionLoader` работают
- Понять сигнатуры `.execute()` или прямого вызова
### Шаг 2: написать загрузку моделей
- Функции `load_model()`, `load_vae()`, `load_clip()`, `load_clip_vision()`
- Проверить, что всё загружается без ошибок
### Шаг 3: написать conditioning
- Разобрать сигнатуру `WanSCAILToVideo.execute()`
- Подготовить все входы (pose video, reference image, masks, clip vision)
- Вызвать и получить conditioning
### Шаг 4: написать sampling
- Разобрать `SamplerCustom.execute()`
- Подготовить sampler, sigmas, noise
- Запустить sampling на одном чанке
### Шаг 5: цикл по чанкам (auto-extend)
- Реализовать логику как в `scail-auto-extend`:
- Первый чанк: полная генерация
- Последующие чанки: overlap с предыдущим, продление
- Color transfer между чанками для борьбы с дрифтом
- Склейка результата
### Шаг 6: декодирование и сохранение
- VAE decode
- Сохранение в mp4 (через torchvision или imageio)
### Шаг 7: обвязка — CLI и конфиг
- Чтение параметров из JSON/YAML конфига
- Прогресс-бар
- Обработка ошибок
## Что НЕ делаем в v1
- ❌ prefix_frames / transition_video (требует установки WanAnimatePlus + WanVideoWrapper)
- ❌ Bernini
- ❌ Uni3C ControlNet
- ❌ Face detection / pose detection (видео подаётся уже готовое)
- ❌ Real-time preview
## Что можно добавить в v2
- Установить `ComfyUI-WanVideoWrapper` + `ComfyUI-WanAnimatePlus`
- prefix_frames (1–5 reference-изображений)
- transition_video (бесшовная склейка сегментов)
- Bernini (v2v, rv2v, r2v)
- Автоматическая детекция поз/лиц через SDPoseOOD + YOLO
## Референсы для изучения
1. `/home/ubuntu/ComfyUI/custom_nodes/scail-auto-extend/__init__.py` — как делать прямой вызов нод
2. `/home/ubuntu/ComfyUI/comfy_extras/nodes_scail.py` — сигнатура WanSCAILToVideo
3. `/home/ubuntu/ComfyUI/comfy_extras/nodes_custom_sampler.py` — сигнатура SamplerCustom
4. https://github.com/wuwukaka/ComfyUI-WanAnimatePlus — целевой пайплайн (для v2)
## Открытые вопросы
1. **Загрузка SCAIL-2 модели**: `CheckpointLoaderSimple` ожидает чекпоинт в `models/checkpoints/`,
а SCAIL-2 лежит в `models/diffusion_models/`. Нужно выяснить, какой loader использовать.
2. **Текстовый энкодер**: SCAIL-2 использует umt5. Нужно выяснить, как `WanSCAILToVideo`
получает текстовые эмбеддинги — через стандартный `CLIPTextEncode` или иначе.
3. **CLIP Vision**: как именно `clip_vision_output` подаётся в `WanSCAILToVideo` —
нужно посмотреть на example workflow (SCAIL Auto Extend V2/V3.json).
4. **LoRA**: как применять LoRA к SCAIL-2 модели. Есть ли встроенный механизм или нужно
использовать отдельную ноду.
5. **Memory**: SCAIL-2 14B в fp8 ≈ 22 GB VRAM. С 97 GB на GPU 0 проблем быть не должно,
но нужно проверить, что torch не аллоцирует лишнего.
|