Views
No views yet
nvidia-modelopt 0.44.0).| Property | Value |
|---|---|
| Method | Post-Training Quantization (PTQ) |
| Format | NVFP4 (W4A4) |
| Config | mtq.NVFP4_DEFAULT_CFG with audio_tower* and audio_projector* excluded |
| Calibration | cnn_dailymail 3.0.0, 128 samples, max_seq_len=512 |
| Base Precision | BF16 (non-quantized layers remain BF16) |
| GPU Required | NVIDIA Blackwell (Compute Capability ≥ 10.0) |
| Tool | nvidia-modelopt 0.44.0 |
| Component | Precision | Why |
|---|---|---|
| Language model (Qwen3) | NVFP4 W4A4 | vLLM's Qwen3ForCausalLM is quantization-aware |
| Vision tower (Qwen3VL) | NVFP4 W4A4 | vLLM's Qwen3_VisionTransformer is quantization-aware |
| Audio tower | BF16 (unquantized) | transformers.Qwen2_5OmniAudioEncoder uses plain nn.Linear |
| Audio projector | BF16 (unquantized) | Plain nn.Linear in vllm_qwen3vl_audio.py |
vllm_qwen3vl_audio.py constructs its audio components
with plain (non-quantization-aware) nn.Linear layers. Quantizing those
layers produces NVFP4-packed safetensors that don't fit the BF16 parameter
shapes at load time. Keeping audio in BF16 costs ~30 MB on a ~1.1 GB model
(roughly 3% size overhead) and lets the model serve out of the box with
vLLM's --quantization modelopt_fp4 flag.1vllm serve georgelpreput/jina-embeddings-v5-omni-small-retrieval-NVFP4 \
2 --trust-remote-code \
3 --runner pooling \
4 --quantization modelopt_fp41import requests
2
3r = requests.post("http://localhost:8000/v1/embeddings", json={
4 "model": "georgelpreput/jina-embeddings-v5-omni-small-retrieval-NVFP4",
5 "input": [
6 "Query: What is the capital of France?",
7 "Document: Paris is the capital city of France.",
8 ],
9})vllm_qwen3vl_audio.pyvllm_qwen3vl_audio.py that self-registers
Qwen3VLAudioModel with vLLM. In NGC vLLM 26.04-py3 (vLLM
0.19.0+nv26.04) this registration silently fails — even when loading
via the HF Hub repo ID — because HuggingFace's trust_remote_code loader
copies only the file listed in config.json's auto_map
(modeling_qwen3vl_audio.py) into the transformers_modules/<SHA>/
cache namespace. The companion vllm_qwen3vl_audio.py lives in the
snapshot dir but never gets copied into the import namespace, so
modeling_qwen3vl_audio.py's from .vllm_qwen3vl_audio import _register_vllm
raises ModuleNotFoundError. vLLM then falls back to its generic
transformers backend with the wrong pooling, producing degenerate
embeddings (every text → near-identical vector).vllm serve
in a script that runs it on every start):1python3 - <<'PY'
2import shutil
3from pathlib import Path
4from huggingface_hub import snapshot_download
5
6snap = Path(snapshot_download(
7 repo_id="georgelpreput/jina-embeddings-v5-omni-small-retrieval-NVFP4",
8 allow_patterns=["*.py", "config.json"],
9))
10sha = snap.name
11hf_home = Path.home() / ".cache" / "huggingface"
12dst = hf_home / "modules" / "transformers_modules" / sha
13dst.mkdir(parents=True, exist_ok=True)
14(dst / "__init__.py").touch()
15for src in snap.glob("*.py"):
16 shutil.copy2(src, dst / src.name)
17 print(f"staged {src.name}")
18PY>= 0.20.1 per the
Jina model card claims native support); we have not tested those builds.