diff --git a/README.md b/README.md index 06a1e81..a6c0287 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,9 @@ can act on it. | `mode` | compare / describe | compare | `describe` = first pass over the reference only → caption + target spec (seeds the prompt). `compare` = score ref vs generated | | `profile` | general / oral / penetration / handjob / solo | general | **analysis profile** — act-specialized axis set; the act-critical axes are distance/proximity-aware (e.g. `mouth_genital_distance`) so magnitude isn't hidden behind a coarse label | | `generated_image` | IMAGE (optional) | — | the candidate to score (required for `compare`, ignored for `describe`) | -| `model_path` | STRING | `/media/p5/qwen3vl_4b_abliterated_comfy_convert/hf_bf16` | local dir, **HF repo id** (`org/name`), or alias (`30b-a3b` / `8b` / `4b`) | -| `precision` | bf16 / fp16 / fp8 / nf4 | bf16 | `nf4` = 4-bit (run the 30B judge on 32 GB); `fp8` with the `hf_fp8` copy | +| `model_select` | dropdown | 4B local bf16 | curated **transformers** judges with VRAM hints: 4B local (bf16 ~9GB / fp8 ~5GB), 8B (bf16 ~17GB), 30B-A3B (nf4 ~18GB, slow). Auto-downloads on first use | +| `model_path` | STRING | "" (empty) | **manual override** of the dropdown — local dir, HF repo id, or alias (`30b-a3b`/`8b`/`4b`). Empty = use `model_select` | +| `precision` | bf16 / fp16 / fp8 / nf4 | bf16 | applies to a manual `model_path`; presets carry their own precision | | `axes` | STRING | "" (empty) | **override** the profile's axis set with a custom comma/newline list; empty = use `profile` | | `max_new_tokens` | INT | 1024 | | | `temperature` | FLOAT | 0.0 | 0 = greedy/repeatable | @@ -71,12 +72,18 @@ converted at `/media/p5/qwen3vl_4b_abliterated_comfy_convert/` so it runs out of (the abliterated/uncensored variant won't refuse to analyze adult imagery, which would otherwise break the loop). -**Recommended upgrade (latest Qwen VL + uncensored, fits 32 GB):** -[`huihui-ai/Huihui-Qwen3-VL-30B-A3B-Instruct-abliterated`](https://huggingface.co/huihui-ai/Huihui-Qwen3-VL-30B-A3B-Instruct-abliterated) -— MoE (3B active, fast), run at `precision=nf4` (~18 GB). The node auto-detects the MoE -class. An easier middle ground is the **8B** abliterated at `bf16` (~17 GB, no quantization). -Qwen3.5-VL abliterated isn't out yet (Qwen3.5 abliterated builds are text-only so far); -Gemma-3-27B-it abliterated (4-bit) is a viable non-Qwen alternative. See +**Pick the judge from `model_select`** (transformers / safetensors, auto-downloaded): +the **8B** abliterated at `bf16` (~17 GB) is the recommended intermediate — fast and +clearly better than the 4B. The **30B-A3B** (nf4 ~18 GB) is higher quality but slow (the +`nf4`/bitsandbytes path is the bottleneck, not the model). `model_path` overrides the +dropdown for anything else. + +**GGUF-only models are not in the dropdown.** Newer uncensored builds like +[`HauhauCS/Qwen3.5-9B-Uncensored`](https://huggingface.co/HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive) +and [`HauhauCS/Qwen3.6-35B-A3B-Uncensored`](https://huggingface.co/HauhauCS/Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive) +ship as **GGUF + mmproj** only — this node is transformers-only, so run those in a dedicated +GGUF node ([1038lab/ComfyUI-QwenVL](https://github.com/1038lab/ComfyUI-QwenVL) or +KLL535 Simple-Qwen3-VL-gguf) and feed their text output into the loop. See [docs/METHODOLOGY.md](docs/METHODOLOGY.md#model-sizing-on-32-gb-rtx-5090--abliterated-latest-qwen-vl). ## Loop sketch diff --git a/nodes/qwen_judge.py b/nodes/qwen_judge.py index e1f9ca5..afbe392 100644 --- a/nodes/qwen_judge.py +++ b/nodes/qwen_judge.py @@ -42,9 +42,10 @@ RECOMMENDED_MODELS = { } # Curated model dropdown (label shown in the node -> how to load it). The label -# carries the suggested VRAM. `backend`: "transformers" = safetensors via this node -# (auto-downloaded with snapshot_download); "gguf" = GGUF + mmproj (needs the GGUF -# backend). `model_path` (manual) overrides this when non-empty. +# carries the suggested VRAM. All entries are safetensors loaded via transformers +# (auto-downloaded with snapshot_download). `model_path` (manual) overrides this. +# GGUF-only models (e.g. HauhauCS Qwen3.5/3.6 Uncensored) are NOT listed — run those +# in a dedicated GGUF node (1038lab/ComfyUI-QwenVL, KLL535 Simple-Qwen3-VL-gguf). MANUAL_CHOICE = "(manual — use model_path below)" MODEL_PRESETS = { "Qwen3-VL-4B abliterated (huihui) · local bf16 ~9GB": { @@ -55,10 +56,6 @@ MODEL_PRESETS = { "repo": "huihui-ai/Huihui-Qwen3-VL-8B-Instruct-abliterated", "backend": "transformers", "precision": "bf16"}, "Qwen3-VL-30B-A3B abliterated (huihui) · nf4 ~18GB (slow)": { "repo": "huihui-ai/Huihui-Qwen3-VL-30B-A3B-Instruct-abliterated", "backend": "transformers", "precision": "nf4"}, - "Qwen3.5-9B Uncensored Aggressive (HauhauCS) · GGUF Q4 ~8GB": { - "repo": "HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive", "backend": "gguf", "precision": "Q4_K_M"}, - "Qwen3.6-35B-A3B Uncensored Aggressive (HauhauCS) · GGUF Q4 ~22GB": { - "repo": "HauhauCS/Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive", "backend": "gguf", "precision": "Q4_K_M"}, } # Difference axes + a one-line definition each. Definitions are injected into the @@ -731,9 +728,9 @@ class QwenVLImageJudge: eff_repo, eff_backend, eff_precision = preset["repo"], preset["backend"], preset["precision"] if eff_backend == "gguf": - msg = (f"[QwenVLImageJudge] '{eff_repo}' is a GGUF model — the GGUF backend " - f"is not enabled yet (pending Ollama vs llama-cpp-python choice). " - f"Use a transformers (safetensors) model for now.") + msg = (f"[QwenVLImageJudge] '{eff_repo}' is GGUF — this node is transformers " + f"(safetensors) only. Run GGUF models in a dedicated GGUF node " + f"(1038lab/ComfyUI-QwenVL or KLL535 Simple-Qwen3-VL-gguf).") print(msg); return (0.0, "{}", msg, msg, "") try: