Views
No views yet
FP8_DYNAMIC scheme + compressed-tensors float-quantized format.⚠️ Vision pipeline fix (2026-05-03)
Pre-2026-05-03 uploads of this checkpoint had broken vision input — the model would emit!!!!!token loops on any image. Root cause: vLLM (≤0.20.0) expects vision tensor keys atvisual.*, butQwen3_5MoeForConditionalGenerationsaves them undermodel.language_model.visual.*, so all 333 vision-tower tensors got silently skipped during load.This is now fixed: shard 19 +model.safetensors.index.jsonre-uploaded with the visual prefix stripped. Text-only output is unaffected.If you cloned the model before 2026-05-03, the cleanest path ishuggingface_hub.snapshot_download(..., force_download=True, allow_patterns=["model-00019-of-00019.safetensors", "model.safetensors.index.json"])— only ~600 MB of changed weights.Diagnosis + remap script: seeremap_visual_path.pyin this repo.
| Metric | Value |
|---|---|
| Base | huihui-ai/Huihui-Qwen3.6-35B-A3B-abliterated (BF16, 67 GB) |
| Format | compressed-tensors float-quantized (FP8 e4m3fn weights, dynamic per-token activation) |
| Disk size | ~36 GB (1.86× shrink from BF16) |
| Quant scheme | FP8_DYNAMIC via llm-compressor 0.10 |
| Quantized layers | 31,030 Linear modules → FP8 e4m3fn |
| Kept BF16 | lm_head, visual.*, mlp.gate (router), shared_expert_gate |
| MTP weights | Preserved (model_mtp.safetensors) for speculative decoding |
| Modality | Text + Image (vision tower preserved BF16, see fix note above) |
vllm-node-tf5 build:| Configuration | tok/s | vs BF16 |
|---|---|---|
| BF16 abliterated (this base) | 30.71 | 1.00× |
| This FP8 + MTP speculative | 51.72 | 1.68× |
qwen3_next_mtp, num_speculative_tokens=2) is the dominant contribution.1vllm serve coolthor/Huihui-Qwen3.6-35B-A3B-abliterated-FP8-DYNAMIC \
2 --max-model-len 32768 \
3 --gpu-memory-utilization 0.90 \
4 --reasoning-parser qwen3 \
5 --speculative-config '{"method":"qwen3_next_mtp","num_speculative_tokens":2}' \
6 --enable-auto-tool-choice \
7 --tool-call-parser qwen3_coder--kv-cache-dtype fp8 on GB10 — FP8 KV cache has known accuracy/repetition issues on SM121.--language-model-only if you want to feed images).tensor-parallel-size > 1), follow the official Qwen 3.6 FP8 model card recipe and replace the model path. This artifact's FP8 layout is standard compressed-tensors, so it loads on any vLLM build that supports the architecture.1from compressed_tensors.utils import save_mtp_tensors_to_checkpoint
2from transformers import AutoProcessor, Qwen3_5MoeForConditionalGeneration
3from llmcompressor import oneshot
4from llmcompressor.modifiers.quantization import QuantizationModifier
5
6MODEL_PATH = "huihui-ai/Huihui-Qwen3.6-35B-A3B-abliterated"
7SAVE_DIR = "Huihui-Qwen3.6-35B-A3B-abliterated-FP8-DYNAMIC"
8
9model = Qwen3_5MoeForConditionalGeneration.from_pretrained(
10 MODEL_PATH, dtype="auto", low_cpu_mem_usage=True,
11)
12processor = AutoProcessor.from_pretrained(MODEL_PATH)
13
14recipe = QuantizationModifier(
15 targets="Linear",
16 scheme="FP8_DYNAMIC",
17 ignore=[
18 "re:.*lm_head",
19 "re:visual.*",
20 "re:model.visual.*",
21 "re:.*mlp.gate$",
22 "re:.*shared_expert_gate$",
23 ],
24)
25
26oneshot(model=model, recipe=recipe)
27model.save_pretrained(SAVE_DIR, max_shard_size="2GB", safe_serialization=True)
28processor.save_pretrained(SAVE_DIR)
29save_mtp_tensors_to_checkpoint(source_model=MODEL_PATH, dest_dir=SAVE_DIR)Qwen3_5MoeForConditionalGeneration writes a triple language_model. prefix in keys that vLLM's loader can't match (looks for model.language_model.). Strip one extra language_model.language_model. substring from each key in the saved safetensors before serving. (This is the LM-body fix; the visual tower needs an additional strip — see #2.)Qwen3_5MoeForConditionalGeneration writes vision weights as model.language_model.visual.*, but vLLM's qwen3_5.py loader looks for visual.* (no prefix). All 333 vision-tower tensors will silently skip-load and any image input produces !!!!! token loops with text-only output unaffected. Strip the model.language_model. prefix from every key matching model.language_model.visual.* in both the relevant safetensors shard and model.safetensors.index.json. The full remap script is at remap_visual_path.py in this repo (~50 lines, ~2 sec runtime — only one shard contains visual tensors, the other 18 can be hard-linked unchanged).max_shard_size="2GB" is required; the default 50 GB shard buffer + GPU pool overlap will OOM-kill on Spark.1import base64, json, urllib.request
2
3with open("test.png", "rb") as f:
4 b64 = base64.b64encode(f.read()).decode()
5
6payload = {
7 "model": "qwen36-abliterated",
8 "messages": [{"role": "user", "content": [
9 {"type": "text", "text": "Describe this image in one sentence."},
10 {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
11 ]}],
12 "max_tokens": 200,
13}
14req = urllib.request.Request(
15 "http://localhost:8000/v1/chat/completions",
16 data=json.dumps(payload).encode(),
17 headers={"Content-Type": "application/json"},
18)
19print(json.loads(urllib.request.urlopen(req).read())["choices"][0]["message"]["content"])!!!!! loop means you're still hitting the prefix issue (your local copy is pre-fix — re-pull shard 19 + index.json).remove-refusals-with-transformers derivative). Qwen 3.6 base is Apache-2.0.model-00019-of-00019.safetensors and model.safetensors.index.json with visual.* prefix corrected; added remap_visual_path.py and updated docs. No change to text-only behavior or benchmarks. Earlier downloads silently skipped 333 vision-tower tensors on load.