Lab-LS's picture
Add benchmark summaries and graphics
b84952d verified
|
Raw
History Blame Contribute Delete
11.6 kB
---
license: mit
base_model: deepreinforce-ai/Ornith-1.0-35B
base_model_relation: quantized
library_name: vllm
pipeline_tag: image-text-to-text
tags:
- ornith
- qwen3.5
- qwen3.5-moe
- multimodal
- vision-language
- modelopt
- nvfp4
- quantized
- vllm
- flashinfer
- blackwell
- dgx-spark
- gb10
quantized_by: LS-ML
---
# Ornith 1.0 35B ModelOpt NVFP4 Expert
This repository contains a community ModelOpt NVFP4 experts-only quantization of
[`deepreinforce-ai/Ornith-1.0-35B`](https://huggingface.co/deepreinforce-ai/Ornith-1.0-35B).
This is not an official DeepReinforce release. The source BF16 checkpoint is
unchanged and remains available from the upstream repository.
## Model Details
| Field | Value |
|---|---|
| Base model | `deepreinforce-ai/Ornith-1.0-35B` |
| Base revision | `5df2ed3f675c7beaa490328cc70bb573b65fb660` |
| Release repo | `LS-ML/Ornith-1.0-35B-ModelOpt-NVFP4-Expert` |
| Architecture | `Qwen3_5MoeForConditionalGeneration` |
| Model type | `qwen3_5_moe` |
| Modality | Text and vision-language |
| Max context tested | `262144` tokens |
| Quantization | ModelOpt `NVFP4`, experts-only target |
| Group size | `16` |
| Exported checkpoint size | `23G` on disk |
| Source BF16 checkpoint size | `66G` on disk |
| License | MIT |
The repository name uses `Expert`, but the quantization target is experts-only:
the MoE expert linear weights are quantized while embeddings, lm head, visual
modules, attention, linear-attention modules, and shared experts are excluded.
See `hf_quant_config.json` and `config.json` for the exact ModelOpt
quantization metadata.
## Benchmark Summary
The checkpoint was benchmarked against the upstream BF16 model on the same DGX
Spark / GB10, same vLLM nightly container, same 262K serving profile, same FP8
KV cache allocation, and same benchmark harness.
Performance summary:
| Metric | BF16 | ModelOpt NVFP4 | Result |
|---|---:|---:|---:|
| Model directory size | `66G` | `23G` | `2.9x` smaller |
| vLLM model loading memory | `65.53 GiB` | `22.41 GiB` | `2.9x` lower |
| Weight loading time | `454.55s` | `153.13s` | `3.0x` faster |
| Text prefill speedup range | baseline | `1.08x` to `1.41x` | faster in every row |
| Text decode speedup range | baseline | `1.16x` to `1.45x` | faster in every row |
| 4K image prefill | `1204.6 tok/s` | `1357.6 tok/s` | `1.13x` faster |
| 4K image decode | `30.0 tok/s` | `36.1 tok/s` | `1.20x` faster |
Accuracy summary:
| Benchmark | BF16 acc / score | NVFP4 acc / score | Delta NVFP4-BF16 |
|---|---:|---:|---:|
| MMLU-Pro | `55.8%` | `55.0%` | `-0.8 pp` |
| GPQA Diamond mirror | `22.7%` | `13.6%` | `-9.1 pp` |
| MATH-500 | `34.6%` | `36.6%` | `+2.0 pp` |
| HumanEval+ | `39.0%` | `21.3%` | `-17.7 pp` |
| MBPP+ | `78.0%` | `76.5%` | `-1.6 pp` |
| MMMU validation | `57.4%` | `56.1%` | `-1.3 pp` |
| OCRBench | `69.9%` | `70.2%` | `+0.3 pp` |
| BFCL v3 10-each subset | `1.0%` | `0.0%` | `-1.0 pp` |
| ToolEvalBench | `82` | `88` | `+6` |
Detailed performance and accuracy benchmark tables are included below.
### Benchmark Graphics
Performance benchmark:
![Ornith 1.0 35B BF16 vs ModelOpt NVFP4 performance benchmark](assets/ornith-35b-performance-benchmark.jpg)
Accuracy and quality benchmark:
![Ornith 1.0 35B BF16 vs ModelOpt NVFP4 accuracy benchmark](assets/ornith-35b-accuracy-benchmark.jpg)
## Quantization
The checkpoint was produced with NVIDIA ModelOpt from a fused-expert staging copy
of the upstream BF16 model. The upstream checkpoint stores split expert tensors;
the staging copy fused expert gate/up/down tensors into the layout expected by
current Transformers and ModelOpt. The upstream BF16 checkpoint itself was not
modified.
Quantization metadata:
| Field | Value |
|---|---|
| ModelOpt source version | `0.46.0.dev106+g6cc522658` |
| ModelOpt commit | `6cc5226588f0668679df03ba4646b7dfec32f99c` |
| Quant algorithm | `NVFP4` |
| KV cache quantization during export | none |
| Calibration dataset | `nvidia/Nemotron-SFT-Agentic-v2`, split `search` |
| Calibration settings | `calib_size=16`, `calib_seq=512`, `batch_size=1` |
| Export mode | low-memory ModelOpt path |
The quantization notes used during export are included in
`QUANTIZATION_NOTES.md`.
## Serving With vLLM
Validated serving stack:
- `vllm/vllm-openai:nightly`
- ModelOpt quantization loader: `--quantization modelopt`
- FlashInfer attention backend
- Blackwell / GB10 tested with `CUTE_DSL_ARCH=sm_121a`
- OpenAI-compatible chat completions
- Text, image, and Qwen3 XML tool-call smoke tests
Example full-context DGX Spark / GB10 launch:
```bash
docker run --rm \
--name ornith35-nvfp4-vllm \
--gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --shm-size=32g \
-p 8000:8000 \
-v /path/to/models:/models \
-v ~/.cache:/root/.cache \
-e FLASHINFER_DISABLE_VERSION_CHECK=1 \
-e CUTE_DSL_ARCH=sm_121a \
vllm/vllm-openai:nightly \
--model /models/Ornith-1.0-35B-ModelOpt-NVFP4-Expert \
--host 0.0.0.0 \
--port 8000 \
--served-model-name ornith35-nvfp4 \
--trust-remote-code \
--dtype bfloat16 \
--quantization modelopt \
--kv-cache-dtype fp8 \
--kv-cache-memory-bytes 28G \
--attention-backend flashinfer \
--max-model-len 262144 \
--max-num-seqs 4 \
--max-num-batched-tokens 8192 \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_xml \
--enable-chunked-prefill
```
Lower-memory smoke profile:
```bash
docker run --rm \
--name ornith35-nvfp4-vllm-smoke \
--gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --shm-size=32g \
-p 8000:8000 \
-v /path/to/models:/models \
-v ~/.cache:/root/.cache \
-e FLASHINFER_DISABLE_VERSION_CHECK=1 \
-e CUTE_DSL_ARCH=sm_121a \
vllm/vllm-openai:nightly \
--model /models/Ornith-1.0-35B-ModelOpt-NVFP4-Expert \
--host 0.0.0.0 \
--port 8000 \
--served-model-name ornith35-nvfp4 \
--trust-remote-code \
--dtype bfloat16 \
--quantization modelopt \
--kv-cache-dtype fp8 \
--kv-cache-memory-bytes 4G \
--attention-backend flashinfer \
--max-model-len 8192 \
--max-num-seqs 1 \
--max-num-batched-tokens 8192 \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_xml \
--enable-chunked-prefill
```
For non-thinking deterministic chat/eval requests, use:
```json
{
"temperature": 0,
"chat_template_kwargs": {
"enable_thinking": false
}
}
```
## Validation
The quantized checkpoint was validated on a local DGX Spark / GB10 against the
BF16 upstream checkpoint using the same vLLM runtime profile, same maximum
context, same FP8 KV cache allocation, and the same benchmark harness.
### Performance Benchmark Results
All text rows below used unique prompts, prefix caching disabled, `max_tokens=128`,
and submitted concurrency `1`, `2`, or `4`.
| Context | Conc | BF16 prefill | NVFP4 prefill | Prefill speedup | BF16 decode | NVFP4 decode | Decode speedup | BF16 TTFT | NVFP4 TTFT |
|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| 32k | 1 | 3288.8 | 4626.2 | 1.41x | 29.6 | 35.5 | 1.20x | 10.0s | 7.1s |
| 32k | 2 | 4349.7 | 5412.5 | 1.24x | 55.4 | 70.2 | 1.27x | 15.1s | 12.1s |
| 32k | 4 | 4425.1 | 5512.5 | 1.25x | 82.1 | 118.9 | 1.45x | 29.6s | 23.8s |
| 64k | 1 | 3656.1 | 4348.0 | 1.19x | 28.2 | 33.5 | 1.19x | 17.9s | 15.1s |
| 64k | 2 | 3625.8 | 4315.6 | 1.19x | 48.5 | 63.6 | 1.31x | 36.1s | 30.4s |
| 64k | 4 | 3594.4 | 4289.9 | 1.19x | 79.7 | 103.3 | 1.30x | 72.9s | 61.1s |
| 128k | 1 | 2653.1 | 3003.2 | 1.13x | 26.1 | 30.7 | 1.18x | 49.4s | 43.6s |
| 128k | 2 | 2632.2 | 2988.2 | 1.14x | 45.0 | 55.5 | 1.23x | 99.6s | 87.7s |
| 128k | 4 | 2607.5 | 2969.3 | 1.14x | 64.0 | 84.4 | 1.32x | 201.1s | 176.6s |
| full | 1 | 1713.5 | 1853.7 | 1.08x | 22.2 | 25.7 | 1.16x | 152.8s | 141.3s |
| full | 2 | 1704.9 | 1838.8 | 1.08x | 37.5 | 43.8 | 1.17x | 307.2s | 284.8s |
| full | 4 | 1702.5 | 1840.8 | 1.08x | 56.7 | 71.0 | 1.25x | 615.3s | 569.0s |
Throughput units are tokens per second. TTFT is max time to first token for the
concurrent batch.
The serial 4096 x 4096 image test:
| Case | BF16 prefill | NVFP4 prefill | Prefill speedup | BF16 decode | NVFP4 decode | Decode speedup | BF16 TTFT | NVFP4 TTFT |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| 4K image | 1204.6 | 1357.6 | 1.13x | 30.0 | 36.1 | 1.20x | 13.6s | 12.1s |
Startup and memory observations:
| Metric | BF16 | ModelOpt NVFP4 |
|---|---:|---:|
| Remote model directory size | `66G` | `23G` |
| vLLM model loading memory | `65.53 GiB` | `22.41 GiB` |
| Weight loading time | `454.55s` | `153.13s` |
| Engine init observed to health | about `610s` | about `290s` |
| MemAvailable after health | about `17 GiB` | about `59 GiB` |
### Accuracy Benchmark Results
Quality runs used deterministic decoding with `temperature=0`,
`chat_template_kwargs={"enable_thinking": false}`, and paired per-item scoring.
The key quantization regression count is "BF16 correct / NVFP4 wrong".
| Benchmark | Items | BF16 acc | NVFP4 acc | Delta NVFP4-BF16 | BF16 correct/NVFP4 wrong | NVFP4 correct/BF16 wrong |
|---|---:|---:|---:|---:|---:|---:|
| MMLU-Pro | 12032 | 55.8% | 55.0% | -0.8 pp | 527 | 429 |
| GPQA Diamond mirror | 198 | 22.7% | 13.6% | -9.1 pp | 23 | 5 |
| MATH-500 | 500 | 34.6% | 36.6% | +2.0 pp | 17 | 27 |
| HumanEval+ | 164 | 39.0% | 21.3% | -17.7 pp | 33 | 4 |
| MBPP+ | 378 | 78.0% | 76.5% | -1.6 pp | 13 | 7 |
| MMMU validation | 900 | 57.4% | 56.1% | -1.3 pp | 54 | 42 |
| OCRBench | 1000 | 69.9% | 70.2% | +0.3 pp | 17 | 20 |
| BFCL v3 10-each subset | 100 | 1.0% | 0.0% | -1.0 pp | 1 | 0 |
ToolEvalBench version `2.0.7` was run sequentially over 69 standard scenarios:
| Model | Final score | Points | Deployability | Responsiveness | Safety warnings |
|---|---:|---:|---:|---:|---|
| BF16 | 82 | 113 / 138 | 74 | 54 | 3 |
| NVFP4 | 88 | 121 / 138 | 81 | 64 | 1 |
Interpretation: this NVFP4 export is close to BF16 on broad multiple-choice,
multimodal, OCR, and MBPP-style code tasks, but it showed clear regressions on
GPQA Diamond and HumanEval+ in this run.
## Caveats
- This is a community quantization, not an official upstream release.
- The checkpoint has been validated with vLLM ModelOpt loading. Other loaders
may not support this ModelOpt NVFP4 format.
- vLLM marks ModelOpt NVFP4 support as experimental, so revalidate after major
vLLM, ModelOpt, CUDA, or FlashInfer changes.
- The export does not include FP8 KV q/prob scaling factors. When serving with
`--kv-cache-dtype fp8`, vLLM reports that it uses scale `1.0`; treat this as
a quality caveat for accuracy-sensitive workloads.
- GPQA used the ungated `fingertap/GPQA-Diamond` mirror because the official
dataset was gated at the time of evaluation.
- HumanEval+ and MBPP+ used EvalPlus prompts and expanded inputs, but scoring
used a local subprocess checker because the official EvalPlus sandbox failed
on the local macOS host with resource-limit errors.
- BFCL v3 10-each should be treated as raw paired signal only; ToolEvalBench is
the stronger tool-use benchmark in this report.
## Responsible Use
Use this model consistently with the upstream model license and any applicable
laws or platform policies. Because this is a quantized derivative, evaluate it
for your own target domain before relying on it in production or
accuracy-sensitive workflows.
## License And Attribution
The upstream model is MIT licensed. This quantized release preserves the MIT
license and attribution to `deepreinforce-ai/Ornith-1.0-35B`.
Upstream model:
https://huggingface.co/deepreinforce-ai/Ornith-1.0-35B
Quantized by LS-ML.