Views
No views yet
| Property | Value |
|---|---|
| Method | GPTQ W8A8 INT8 (weights INT8 per-channel, activations INT8 dynamic per-token) |
| Format | compressed-tensors (vLLM native) |
| Tool | llm-compressor |
| Calibration | 512 samples from ultrachat-200k (train_sft split), max 2048 tokens |
| Vision encoder | Kept in BF16 (not quantized) |
| Non-linear weights | Preserved exactly (norms, biases, embed_tokens) |
| Model size | ~10.5 GB (down from ~16 GB BF16) |
model.visual.*) — kept in full BF16embed_tokens)lm_head (not used for embeddings)1vllm serve collin-park/Qwen3-VL-Embedding-8B-W8A8 \
2 --quantization compressed-tensors \
3 --runner pooling \
4 --trust-remote-code \
5 --gpu-memory-utilization 0.90 \
6 --max-model-len 32768 \
7 --max-num-seqs 8 \
8 --host 0.0.0.0 \
9 --port 81001curl http://localhost:8100/v1/embeddings \
2 -H "Content-Type: application/json" \
3 -d '{"input": "What is machine learning?", "model": "collin-park/Qwen3-VL-Embedding-8B-W8A8"}'1from transformers import Qwen3VLForConditionalGeneration
2from llmcompressor import oneshot
3from llmcompressor.modifiers.quantization import GPTQModifier
4
5model = Qwen3VLForConditionalGeneration.from_pretrained(
6 "Qwen/Qwen3-VL-Embedding-8B", dtype="auto", device_map="auto", trust_remote_code=True
7)
8
9recipe = [GPTQModifier(targets="Linear", scheme="W8A8", ignore=["lm_head", "re:.*visual.*"])]
10
11oneshot(
12 model=model, dataset="ultrachat-200k", splits={"calibration": "train_sft"},
13 recipe=recipe, max_seq_length=2048, num_calibration_samples=512,
14 output_dir="Qwen3-VL-Embedding-8B-W8A8",
15)Qwen3VLForConditionalGeneration (not AutoModel) — preserves model.* weight prefix for vLLM compatibilitySmoothQuantModifier — it modifies RMSNorm weights, destroying embedding qualityignore=["re:.*visual.*"] — keep ViT in BF16 for quality