ClipProj : remplacer l'encodeur 32B de MiniMax H3 par un 4B
Un nœud ComfyUI remplace l'encodeur Qwen3-VL-32B (15,7 Go) de MiniMax H3 par un Qwen3-VL-4B avec projection apprise, réduisant la VRAM à 4,5 Go.
ComfyUI-ClipProj est un nouveau nœud personnalisé qui remplace l'encodeur de texte Qwen3-VL-32B de MiniMax H3 par un Qwen3-VL-4B beaucoup plus compact, accompagné d'une projection linéaire apprise, ce qui réduit l'empreinte VRAM du conditionnement de 15,7 Go à 4,5 Go (matrices de projection sur Hugging Face). Le DiT, les VAE et l'échantillonneur restent inchangés : le nœud renvoie un objet qui se comporte comme le CLIP officiel, et s'insère donc directement dans l'entrée clip existante, sans recâblage.
Le pipeline complet : encodeur, projection, conditionnement, échantillonnage, décodage et sortie vidéo (examples/minimax_h3_clipproj.json).
Pourquoi cela économise autant de VRAM
MiniMax H3 utilise un Qwen3-VL-32B tronqué à 50 couches (15,7 Go en NVFP4), uniquement pour transformer un prompt en tenseur de conditionnement [seq, 5120]. ClipProj le remplace par un Qwen3-VL-4B (2 560 dimensions) plus une application linéaire apprise vers l'espace à 5 120 dimensions attendu par le DiT :
cond = ((h - mean_in) / std_in) @ W * std_out + mean_outMémoire de l'encodeur mesurée :
| Configuration de l'encodeur | VRAM |
|---|---|
| Qwen3-VL-32B d'origine (NVFP4) | 15,7 Go |
| Qwen3-VL-4B + ClipProj (bf16) | 8,3 Go |
| Qwen3-VL-4B + ClipProj (fp8) | 5,2 Go |
| Qwen3-VL-4B + ClipProj (int8_convrot) | 4,5 Go |
Comment la projection est apprise
Les encodeurs 4B et 32B partagent le même tokenizer (151 936 tokens), donc un prompt produit des tokens identiques aux mêmes positions dans les deux. Cela rend une correspondance position par position apprenable. La calibration est une régression ridge, pas un entraînement : il s'agit d'encoder N prompts avec les deux modèles, d'accumuler XᵀX et XᵀY en streaming (mémoire constante), puis de résoudre. Pas de gradients, pas d'epochs, pas de taux d'apprentissage.
Les mesures de l'auteur (MEASUREMENTS.md) font état d'un cosinus inter-prompts d'environ 0,71 avec un corpus de 2 000 prompts. En génération réelle, la projection tient la route pour les prompts simples, les prompts multi-plans structurés (subject_definitions, plans avec timecode, overall_soundscape), et fl2va avec première et dernière image. Elle est également robuste au remplacement des poids de l'encodeur : une projection calibrée en bf16 fonctionne sur une variante fp8 abliterée et sur int8_convrot.
Utilisation dans ComfyUI
Installer le nœud :
cd ComfyUI/custom_nodes
git clone https://github.com/nicolab28/ComfyUI-ClipProjRedémarrer ComfyUI. Il n'y a pas de requirements.txt : les nœuds n'importent que torch et les modules de ComfyUI lui-même. Au premier lancement, le dossier ComfyUI/models/clip_projections/ est créé ; déposez-y les matrices de projection (mmh3-4b-ClipProj*.safetensors, mmh3-8b-ClipProj*.safetensors). Des exemples de flux de travail se trouvent dans examples/ : faites glisser minimax_h3_clipproj.json sur la toile.
Un exemple de flux de travail associant le petit encodeur à la réécriture structurée de prompts H3 (examples/rewrite_h3_prompt.json).
Statut
La version 0.1.4 du nœud libère la carte GPU avant de charger un encodeur de remplacement (ce qui corrige les pics de OOM lorsque deux encodeurs seraient sinon résidents simultanément), libère les caches de projection au rechargement et conserve les réseaux résiduels dans leur précision d'origine. Les matrices -mlp sont désormais en fp16 et deux fois plus légères (240 Mo pour la 4B, 288 Mo pour la 8B).
Le projet est explicitement une preuve de concept : construit et testé sur une seule configuration (Windows 11, NVIDIA RTX 3090 / 4070 / 3060, ComfyUI 0.31.0) avec une exploration volontairement limitée. Attendez-vous à des imperfections et à des changements non rétrocompatibles.
Disponibilité
- Nœud personnalisé : nicolab28/ComfyUI-ClipProj
- Matrices de projection : NicoLab28/ClipProj-MiniMax-H3 sur Hugging Face (variantes 4B et 8B, ainsi que les options
celebet-mlp)
Commentaires
Connectez-vous avec GitHub pour rejoindre la discussion.