ClipProj: замена текстового энкодера MiniMax H3 с 32B на 4B в ComfyUI
Пользовательская нода ComfyUI заменяет энкодер Qwen3-VL-32B (15,7 ГБ) из MiniMax H3 на Qwen3-VL-4B с обученной проекцией, снижая расход VRAM до 4,5 ГБ.
Новая пользовательская нода ComfyUI-ClipProj заменяет текстовый энкодер Qwen3-VL-32B из MiniMax H3 на гораздо меньший Qwen3-VL-4B с обученной линейной проекцией, сокращая объём VRAM, занимаемый условием, с 15,7 ГБ до 4,5 ГБ (матрицы проекций на Hugging Face). DiT, VAE и сэмплер остаются нетронутыми: нода возвращает объект, который ведёт себя как официальный CLIP, поэтому она подключается к существующему входу clip без перекоммутации.
Полный pipeline: энкодер, проекция, условие, сэмплирование, декодирование и вывод видео (examples/minimax_h3_clipproj.json).
Почему это экономит так много VRAM
MiniMax H3 использует Qwen3-VL-32B, усечённый до 50 слоёв (15,7 ГБ в NVFP4), только для того, чтобы превратить промпт в tensor условия размерности [seq, 5120]. ClipProj заменяет его на Qwen3-VL-4B (2560 измерений) с обученным линейным отображением в 5120-мерное пространство, которое ожидает DiT:
cond = ((h - mean_in) / std_in) @ W * std_out + mean_outЗамеры памяти энкодера:
| Конфигурация энкодера | VRAM |
|---|---|
| Оригинальный Qwen3-VL-32B (NVFP4) | 15,7 ГБ |
| Qwen3-VL-4B + ClipProj (bf16) | 8,3 ГБ |
| Qwen3-VL-4B + ClipProj (fp8) | 5,2 ГБ |
| Qwen3-VL-4B + ClipProj (int8_convrot) | 4,5 ГБ |
Как обучается проекция
Энкодеры 4B и 32B используют один и тот же tokenizer (151 936 токенов), поэтому промпт даёт одинаковые токены на одинаковых позициях в обеих моделях. Это делает попозиционное отображение обучаемым. Калибровка выполняется с помощью гребневой регрессии, а не обучения: закодируйте N промптов обеими моделями, накопите XᵀX и XᵀY в потоковом режиме (с постоянным расходом памяти), затем решите систему. Никаких градиентов, эпох и скорости обучения.
Измерения автора (MEASUREMENTS.md) показывают косинусное сходство между промптами ~0,71 на корпусе из 2 000 промптов. В реальной генерации проекция хорошо показывает себя на простых промптах, структурированных многосегментных промптах (subject_definitions, кадры с таймкодами, overall_soundscape) и fl2va с первым и последним кадром. Она также устойчива к замене весов энкодера: проекция, откалиброванная на bf16, работает с abliterated fp8-вариантом и с int8_convrot.
Использование в ComfyUI
Установите ноду:
cd ComfyUI/custom_nodes
git clone https://github.com/nicolab28/ComfyUI-ClipProjПерезапустите ComfyUI. Файла requirements.txt нет: ноды импортируют только torch и собственные модули ComfyUI. При первом запуске создаётся папка ComfyUI/models/clip_projections/; положите туда матрицы проекций (mmh3-4b-ClipProj*.safetensors, mmh3-8b-ClipProj*.safetensors). Примеры рабочих процессов находятся в examples/: перетащите minimax_h3_clipproj.json на холст.
Пример рабочего процесса, в котором маленький энкодер сочетается со структурированным переписыванием H3-промптов (examples/rewrite_h3_prompt.json).
Статус
Версия 0.1.4 ноды освобождает видеокарту перед загрузкой заменяющего энкодера (исправляя скачки OOM, когда два энкодера иначе находились бы в памяти одновременно), очищает кэши проекций при перезагрузке и сохраняет остаточные сети в их исходной точности. Матрицы -mlp теперь хранятся в fp16 и вдвое меньше по размеру (240 МБ для 4B, 288 МБ для 8B).
Проект прямо заявлен как доказательство концепции: он создан и протестирован на одной конфигурации (Windows 11, NVIDIA RTX 3090 / 4070 / 3060, ComfyUI 0.31.0) при намеренно ограниченном объёме экспериментов. Ожидайте шероховатостей и ломающих изменений.
Доступность
- Пользовательская нода: nicolab28/ComfyUI-ClipProj
- Матрицы проекций: NicoLab28/ClipProj-MiniMax-H3 на Hugging Face (варианты 4B и 8B, а также опции
celebи-mlp)
Комментарии
Войдите через GitHub, чтобы участвовать в обсуждении.