Image-Text-to-Text
Transformers
Safetensors
English
Chinese
sensenova_loop
text-generation
nvfp4
modelopt
quantized
multimodal
looped-transformer
mhc
mtp
custom_code
conversational
8-bit precision
Instructions to use gitcommit90/SenseNova-Loop-9B-Preview-NVFP4 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use gitcommit90/SenseNova-Loop-9B-Preview-NVFP4 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="gitcommit90/SenseNova-Loop-9B-Preview-NVFP4", trust_remote_code=True) messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("gitcommit90/SenseNova-Loop-9B-Preview-NVFP4", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use gitcommit90/SenseNova-Loop-9B-Preview-NVFP4 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "gitcommit90/SenseNova-Loop-9B-Preview-NVFP4" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "gitcommit90/SenseNova-Loop-9B-Preview-NVFP4", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/gitcommit90/SenseNova-Loop-9B-Preview-NVFP4
- SGLang
How to use gitcommit90/SenseNova-Loop-9B-Preview-NVFP4 with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "gitcommit90/SenseNova-Loop-9B-Preview-NVFP4" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "gitcommit90/SenseNova-Loop-9B-Preview-NVFP4", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "gitcommit90/SenseNova-Loop-9B-Preview-NVFP4" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "gitcommit90/SenseNova-Loop-9B-Preview-NVFP4", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use gitcommit90/SenseNova-Loop-9B-Preview-NVFP4 with Docker Model Runner:
docker model run hf.co/gitcommit90/SenseNova-Loop-9B-Preview-NVFP4
Add measured figures4papers-style charts and GitHub companion links
Browse files- .gitattributes +2 -0
- README.md +38 -2
- SHA256SUMS +74 -65
- figures/README.md +17 -0
- figures/performance-summary.pdf +0 -0
- figures/performance-summary.png +3 -0
- figures/performance-summary.svg +710 -0
- figures/plot_benchmarks.py +71 -0
- figures/quality-summary.pdf +0 -0
- figures/quality-summary.png +3 -0
- figures/quality-summary.svg +700 -0
- figures/requirements.txt +2 -0
.gitattributes
CHANGED
|
@@ -44,3 +44,5 @@ examples/moon-simulation/moon-simulation.gif filter=lfs diff=lfs merge=lfs -text
|
|
| 44 |
examples/teacher-day/teacher-day-horizontal.jpg filter=lfs diff=lfs merge=lfs -text
|
| 45 |
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
| 46 |
examples/odyssey/odyssey-preview.gif filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
| 44 |
examples/teacher-day/teacher-day-horizontal.jpg filter=lfs diff=lfs merge=lfs -text
|
| 45 |
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
| 46 |
examples/odyssey/odyssey-preview.gif filter=lfs diff=lfs merge=lfs -text
|
| 47 |
+
figures/performance-summary.png filter=lfs diff=lfs merge=lfs -text
|
| 48 |
+
figures/quality-summary.png filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
|
@@ -28,6 +28,27 @@ tags:
|
|
| 28 |
A calibrated, packed **NVFP4** (ModelOpt) checkpoint of SenseNova-Loop-9B-Preview with the **MTP head kept BF16**
|
| 29 |
so MTP speculative decoding works, validated on an NVIDIA DGX Spark (GB10, SM121) with **native W4A4 FP4 GEMMs**.
|
| 30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
## Provenance
|
| 32 |
| Item | Value |
|
| 33 |
| --- | --- |
|
|
@@ -139,9 +160,24 @@ Marlin weight-only kernels; it is faster for single-stream decode on GB10 but sl
|
|
| 139 |
checkpoint or MTP; use the SGLang runtime above.
|
| 140 |
|
| 141 |
## Usage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 142 |
```bash
|
| 143 |
-
# from the
|
| 144 |
-
runtime/serve_sglang.sh . # NVFP4 W4A4 + MTP (NEXTN, 3 steps), 127.0.0.1:30080
|
| 145 |
curl -s http://127.0.0.1:30080/v1/models
|
| 146 |
python3 runtime/probe.py http://127.0.0.1:30080/v1 sensenova-loop-9b-nvfp4 [image.jpg] # text / thinking / tool / image smoke test
|
| 147 |
# options: --no-mtp ; W4A16: SGLANG_DISABLE_SILU_FP4_QUANT_FUSION=1 runtime/serve_sglang.sh . --fp4-gemm-backend marlin
|
|
|
|
| 28 |
A calibrated, packed **NVFP4** (ModelOpt) checkpoint of SenseNova-Loop-9B-Preview with the **MTP head kept BF16**
|
| 29 |
so MTP speculative decoding works, validated on an NVIDIA DGX Spark (GB10, SM121) with **native W4A4 FP4 GEMMs**.
|
| 30 |
|
| 31 |
+
## Downloads and companion source
|
| 32 |
+
|
| 33 |
+
- **Weights and complete model files:** [https://huggingface.co/gitcommit90/SenseNova-Loop-9B-Preview-NVFP4](https://huggingface.co/gitcommit90/SenseNova-Loop-9B-Preview-NVFP4)
|
| 34 |
+
- **Runtime, quantization recipe, evaluation harness and charts:** [https://github.com/gitcommit90/sensenova-loop-9b-nvfp4-dgx-spark](https://github.com/gitcommit90/sensenova-loop-9b-nvfp4-dgx-spark)
|
| 35 |
+
|
| 36 |
+
This is the **October 30 functional-release baseline**, not the later speed-optimization work.
|
| 37 |
+
Weights live on Hugging Face; the GitHub companion does not duplicate the 9.38 GB checkpoint.
|
| 38 |
+
|
| 39 |
+
## Measured results at a glance
|
| 40 |
+
|
| 41 |
+
[](figures/performance-summary.pdf)
|
| 42 |
+
|
| 43 |
+
[](figures/quality-summary.pdf)
|
| 44 |
+
|
| 45 |
+
Figures are regenerated directly from the checked-in evaluation JSONs with
|
| 46 |
+
[`figures/plot_benchmarks.py`](figures/plot_benchmarks.py), following the publication-figure conventions of
|
| 47 |
+
[figures4papers](https://github.com/ChenLiu-1996/figures4papers).
|
| 48 |
+
PNG previews, vector PDF/SVG exports, and plotting dependencies are included.
|
| 49 |
+
**Aggregate throughput is not per-user decode speed.** Quality scores are small-subset regression measurements,
|
| 50 |
+
not full-benchmark scores or a comparison against Qwen.
|
| 51 |
+
|
| 52 |
## Provenance
|
| 53 |
| Item | Value |
|
| 54 |
| --- | --- |
|
|
|
|
| 160 |
checkpoint or MTP; use the SGLang runtime above.
|
| 161 |
|
| 162 |
## Usage
|
| 163 |
+
Docker and the NVIDIA container runtime are required. Use **one** of the following paths.
|
| 164 |
+
|
| 165 |
+
**From the GitHub companion** (weights are downloaded once to an ignored local directory):
|
| 166 |
+
```bash
|
| 167 |
+
git clone https://github.com/gitcommit90/sensenova-loop-9b-nvfp4-dgx-spark.git
|
| 168 |
+
cd sensenova-loop-9b-nvfp4-dgx-spark
|
| 169 |
+
python3 -m venv .venv-download
|
| 170 |
+
.venv-download/bin/pip install 'huggingface_hub>=1,<2'
|
| 171 |
+
.venv-download/bin/hf download gitcommit90/SenseNova-Loop-9B-Preview-NVFP4 --local-dir models/SenseNova-Loop-9B-Preview-NVFP4
|
| 172 |
+
# Verify the downloaded release before serving:
|
| 173 |
+
(cd models/SenseNova-Loop-9B-Preview-NVFP4 && sha256sum -c SHA256SUMS)
|
| 174 |
+
bash runtime/serve_sglang.sh models/SenseNova-Loop-9B-Preview-NVFP4
|
| 175 |
+
```
|
| 176 |
+
|
| 177 |
+
**From a complete Hugging Face snapshot** containing `model.safetensors`:
|
| 178 |
```bash
|
| 179 |
+
# from the snapshot root
|
| 180 |
+
bash runtime/serve_sglang.sh . # NVFP4 W4A4 + MTP (NEXTN, 3 steps), 127.0.0.1:30080
|
| 181 |
curl -s http://127.0.0.1:30080/v1/models
|
| 182 |
python3 runtime/probe.py http://127.0.0.1:30080/v1 sensenova-loop-9b-nvfp4 [image.jpg] # text / thinking / tool / image smoke test
|
| 183 |
# options: --no-mtp ; W4A16: SGLANG_DISABLE_SILU_FP4_QUANT_FUSION=1 runtime/serve_sglang.sh . --fp4-gemm-backend marlin
|
SHA256SUMS
CHANGED
|
@@ -1,65 +1,74 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
8951a99119cdcd06c699d91ccc5db0a40b595961041a5ec2e6103b88112757e8 .gitattributes
|
| 2 |
+
c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4 LICENSE
|
| 3 |
+
60e1c4899e3a776a61e0223abb3ed02317be0fae58d3beb24d86dfbc981fd408 README.md
|
| 4 |
+
a4aee8afcf2e0711942cf848899be66016f8d14a889ff9ede07bca099c28f715 chat_template.jinja
|
| 5 |
+
5bec5643138a09f2917a0b7471a673baecfbf85f59af49cc048f4318f32e7a3d config.json
|
| 6 |
+
ccdb9203010fc0534d37b0b475d85f088f5e62568d3cbd76229af4d8e50ffb28 evaluation/QUALITY_GATES.md
|
| 7 |
+
021b420e4757b37909200d1cc52bf308116461735a6b50c67df652267f54c587 evaluation/compare_vs_ref.json
|
| 8 |
+
5d01579bee6c0863addc3236392b4d88c8d7a7d3cf66b62ae65db1430c0110a3 evaluation/eval_data_MANIFEST.json
|
| 9 |
+
6df2bf0438b64d1353c1737e3659c86bce501dc188de9ce448492895e8b5ae63 evaluation/harness/build_eval_data.py
|
| 10 |
+
e2818e8c8ff581d65ac8a4dbfc07b58eaea97546dfd63cc3f8f31faaf8ed0f22 evaluation/harness/common.py
|
| 11 |
+
0423139c0573e09181f065dbdb273b123aa4a966a5ec57a3643b2fe4f8f43b92 evaluation/harness/compare.py
|
| 12 |
+
535255ccff9b6032494d918331dce7d7bbd5a455771143afeaf7977458b52bf4 evaluation/harness/ifeval_lite.py
|
| 13 |
+
c0e6d611823b672513730fae4f83d6e72cb0927202a0df1112176465d316731f evaluation/harness/mock_server.py
|
| 14 |
+
8909f46e7c6383cce45dbad9c64d78035316031b6f7d99be664ae8b7c3d3577a evaluation/harness/perf_bench.py
|
| 15 |
+
d2b24fe51830bf6ed99af01c66ed1b861a50eff88d130fac3f9369e6865837cd evaluation/harness/requirements.lock
|
| 16 |
+
49f85f32fb01f029182491d5dd803c26c37814e9ecfa283f37d705543242bc3d evaluation/harness/run_eval.py
|
| 17 |
+
fe25e6a9d5432922ff4509a9a80e7b996072ee2091353840a6d0fdf764d8daef evaluation/harness/tasks.py
|
| 18 |
+
8c28fad23d10bfa56897a6c0d306b0a474cb6bc2ac7a08355682bd697a2dcd3f evaluation/harness/test_harness.py
|
| 19 |
+
ec6899745f66eaf5eb92975341bd44b8c6d5ede2116ea6d0d56d8ba008ae7702 evaluation/harness/tool_cases.py
|
| 20 |
+
90dbf7789104b8763f8980f564d8da2c6d033a2207707a386dba8756cd8d2063 evaluation/hf_bf16_checks.json
|
| 21 |
+
a1a5de6483f0d8c2d759b9c60cb86da4794a4036c6101bba104cc1d5dba63dfb evaluation/kernel_summary.txt
|
| 22 |
+
ce49434ad0c1806bcf01a57957add6fb2ca67f1aa6a61394ae248a75d41b7c80 evaluation/nvfp4_v1_mtp_release_probe.json
|
| 23 |
+
4cfff7659e057c02133576124dd0dd65b28a8d6869d1b460d68055dc01a2454a evaluation/nvfp4_v1_probe.json
|
| 24 |
+
a588317f6ba1071ab5f67a850e0ced977dfbf3f3dd0b34ea2d5ac54767947c17 evaluation/perf_sglang_bf16.json
|
| 25 |
+
7f9aa0a53f019234a256057b0f759695cf0ac266ac033e3e02b84bf71ffcec41 evaluation/perf_sglang_bf16_mtp.json
|
| 26 |
+
8a115863344c244470a3a18959e89c914aa852602e75cb365554d62adfd66c9f evaluation/perf_sglang_nvfp4_v1.json
|
| 27 |
+
d68a9f7a151718b65b6782ea48f4db0aa60f068ab8636eb51f2f2935a61b0058 evaluation/perf_sglang_nvfp4_v1_marlin_w4a16.json
|
| 28 |
+
546730231cdf739cf84f0d92768c2a31378c165b3e48a1840117b9a2faa5035a evaluation/perf_sglang_nvfp4_v1_mtp.json
|
| 29 |
+
8f50277ef8a232dc4abab998fa80ffdcc46c13cbebea1d9328e93878af035157 evaluation/sglang_bf16_mtp_probe.json
|
| 30 |
+
92c0708bb0d27772bedefc3d5f458b742c48325025af5a1269535de6dca2d914 evaluation/sglang_bf16_probe.json
|
| 31 |
+
ec88f909edcbf225936bbeac88ede9312520593eb53db976d5079d9dd6c45ed1 evaluation/summary_sglang_bf16.json
|
| 32 |
+
58cd6bbadfc9fc070a784e65810414a24919084e4570e1ff7680e8a00f14504b evaluation/summary_sglang_bf16_mtp.json
|
| 33 |
+
c6d75330180b2d1bd5f2dda574afeee8844e18e44c46ba0f3a1128eb052d2326 evaluation/summary_sglang_nvfp4_v1.json
|
| 34 |
+
aff7bcc52ad3e83e6394a8d31e733d8b5725d213836beb98824c397e726c66c6 evaluation/summary_sglang_nvfp4_v1_marlin_w4a16_gsm8k.json
|
| 35 |
+
944d3ce06cffbfb7a8e10c1af186aaa62a196e6b96cd8c3a1e6800e5d998fa70 evaluation/summary_sglang_nvfp4_v1_mtp.json
|
| 36 |
+
e6df880d4632abe34376bbf9d349ff694129e21067f4e58a757919715804a8b9 figures/README.md
|
| 37 |
+
47eecb7dab94c2cbe44756977f2e4e81380a059f1661060c0ac5e0909d9b1c24 figures/performance-summary.pdf
|
| 38 |
+
7012b65a258263617bcd3a9d57e93c4cb24836d9da35a69d723a0f6ef6416d68 figures/performance-summary.png
|
| 39 |
+
975894bd93a506565d81573ecfc75b9e6202406c2f21940750ec1ad7c9635e8c figures/performance-summary.svg
|
| 40 |
+
058f67de2a71ee67cf48f4976b69d353cfaea0607bb2d91a20e33774c35c2df7 figures/plot_benchmarks.py
|
| 41 |
+
ceca3cd14f612774aad2f9f076a1d77177bd6f6090c41f8a3ca985318ada3793 figures/quality-summary.pdf
|
| 42 |
+
761cb0de5f120ec2934b7b900b0d4961464ba24686b4175095289e9d245b0a04 figures/quality-summary.png
|
| 43 |
+
0315f8e622b4b9cb9ca36ed3718403ba64ea4f8f3df582853fd3e4c0b4fe15c5 figures/quality-summary.svg
|
| 44 |
+
472fcc1fa6325424ea016e5fb386728d1bf661e21582f7e2e829387053eb9a0e figures/requirements.txt
|
| 45 |
+
f288bb4281580138395c6acc7b3adb62f45c21530bc0708cb2cf9edf093f6a4f generation_config.json
|
| 46 |
+
b197af747a1f072419a8e7e2db3252d9aeea84d21f65db37f748430ab7f83bfd hf_quant_config.json
|
| 47 |
+
1e420ea69111b7bb3c7c529cdbbb4ff4e6ebb531c0cd2be5c634cd88cd40eaca model.safetensors
|
| 48 |
+
26e11d3522aa730c0ba031340ce42632bc2834da8cc0b6804006bb207d979a5b modeling_sensenova_loop.py
|
| 49 |
+
3a159dfec9978a186a72ba085e0ad6a050f3968d8b364218d7bd13f5c89381f2 preprocessor_config.json
|
| 50 |
+
d89ef49ce9cd37fbf510158e13c1ef063d9286411c1ec9049932dbe0487143b1 processor_config.json
|
| 51 |
+
df49d802cffe959b3176eed9abee2277d3e4291cdaf2d9abf8430ee17aeba700 quantization/10_reference_checks.py
|
| 52 |
+
67d6edacb11e519afb6d81adb4c559930b17ce9a8adeed0e7c8c2043d8383337 quantization/20_quantize.py
|
| 53 |
+
27dcbf33dfb7e83cace92cc8221e20d2ead29d4090bf15c9348e181b6bb5ba47 quantization/30_verify_export.py
|
| 54 |
+
dc54da6f2e37136c3172779d86ae0134a353942f341eaa8934d3000a01f34682 quantization/build_calib.py
|
| 55 |
+
04c164fb57e8125eed5d624cefa806a61bc28cb929aca6406d2923ea43f11825 quantization/calib_v1.jsonl.sha256
|
| 56 |
+
3a2015bbf02262d97e0de28f4fa2b3e73d43f58635a507a96788bf7b587236d8 quantization/calib_v1.meta.json
|
| 57 |
+
4d71bc0045ee80c45f5eef89e5e721e064e2505020b327942501b017daf0fdf8 quantization/quantization_stats.json
|
| 58 |
+
723419a376e5f2339f4f0d4f9376b16ea2d5359e54659ccb85c2bb2d5c3028fd quantization/requirements-quant.lock
|
| 59 |
+
be632c83213d44b4a18f367c59fcb55f5d0d738b8c67f64ccc61df3c6a9fb598 quantization/verify.json
|
| 60 |
+
1b95e589cd65a97a97fae93cdeec07fcadbf0ff204be746fe20db32550a2c248 runtime/COMPAT_NOTES.md
|
| 61 |
+
e00d2fafe780fcf4c04ab52b040e43ec7143c7bd6e070637563f2724b59888d1 runtime/overlay/python/sglang/srt/configs/__init__.py
|
| 62 |
+
bdc7fa2055b799ce07441a5d499fafa554b7b797d4c4a24fd251b846b51260fd runtime/overlay/python/sglang/srt/configs/model_config.py
|
| 63 |
+
eb6df8f37ac06e6f439dd24f687e5bf1078599ade28acaa20d8799bf77c7e057 runtime/overlay/python/sglang/srt/configs/sensenova_loop.py
|
| 64 |
+
b3b4959f2336d1afdf4f0353a0a0eecfc38495226912022dd862489cbb532c98 runtime/overlay/python/sglang/srt/layers/rotary_embedding/mrope_rope_index.py
|
| 65 |
+
0883bffeff0519db0fb8035b3260eca57c48ebe00e42323fb75cb7f455c1ddad runtime/overlay/python/sglang/srt/models/sensenova_loop.py
|
| 66 |
+
7fc07bd18b974aa8f54013f2bb39536a65d32ad0cc1a1df2d239ead0dc136754 runtime/overlay/python/sglang/srt/multimodal/processors/qwen_vl.py
|
| 67 |
+
68e1076237ed67adfa06530139d79df0783a2519620443a58cce94c5143d56c4 runtime/overlay/python/sglang/srt/utils/hf_transformers/common.py
|
| 68 |
+
d93e6342f9487567a7847443eb47b41701b4510474cd5664c8dc51b37eb6f6fd runtime/patches/model_config_mtp_draft.patch
|
| 69 |
+
029fa25bb4ea5a16c9fce8de412e7ea6481fc540508c63bdd629026b9a56f926 runtime/patches/sensenova_loop_quant.patch
|
| 70 |
+
7b9fd04a5e756a982cac292d314ef2ca84dca0517a4abb4f8a4c009745fd0267 runtime/probe.py
|
| 71 |
+
be2e56aca0bdbc48bab616db27b37ab36a170b2a3a35534e8be25b291508e54a runtime/serve_sglang.sh
|
| 72 |
+
06b9509352d2af50381ab2247e083b80d32d5c0aba91c272ca9ff729b6a0e523 tokenizer.json
|
| 73 |
+
792fa3f0cb88b111e54ef3134c873531008c4df471d108da17903426e308aa7b tokenizer_config.json
|
| 74 |
+
bd96830cce1312679aa1f2ea43ed17da20e8ebbcea2398cfa64e2d275a96fdd7 video_preprocessor_config.json
|
figures/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Reproducible publication figures
|
| 2 |
+
|
| 3 |
+
House style: [figures4papers Scientific Figure Making](https://github.com/ChenLiu-1996/figures4papers/tree/main/scientific-figure-making).
|
| 4 |
+
|
| 5 |
+
```bash
|
| 6 |
+
python3 -m venv .venv-figures
|
| 7 |
+
.venv-figures/bin/pip install -r figures/requirements.txt
|
| 8 |
+
.venv-figures/bin/python figures/plot_benchmarks.py
|
| 9 |
+
```
|
| 10 |
+
|
| 11 |
+
No hand-entered benchmark values: performance is read from `evaluation/perf_sglang_*.json`, quality from
|
| 12 |
+
`evaluation/compare_vs_ref.json`. The header and captions identify the October 30, 2026 functional baseline.
|
| 13 |
+
Performance panels distinguish median per-request decode, time to first token, and aggregate output throughput.
|
| 14 |
+
Quality panels show task scores and paired-bootstrap 95% intervals from the original saved comparisons.
|
| 15 |
+
These intervals reflect this small item set, not run-to-run throughput variation or full-benchmark accuracy.
|
| 16 |
+
|
| 17 |
+
The originals are 300-DPI PNG plus vector PDF and SVG. No new GPU benchmarks were run to make these figures.
|
figures/performance-summary.pdf
ADDED
|
Binary file (37.8 kB). View file
|
|
|
figures/performance-summary.png
ADDED
|
Git LFS Details
|
figures/performance-summary.svg
ADDED
|
|
figures/plot_benchmarks.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Regenerate figures from checked-in measurements; figures4papers house conventions.
|
| 3 |
+
https://github.com/ChenLiu-1996/figures4papers/tree/main/scientific-figure-making
|
| 4 |
+
Usage: python3 -m pip install -r figures/requirements.txt; python3 figures/plot_benchmarks.py
|
| 5 |
+
"""
|
| 6 |
+
import json
|
| 7 |
+
from pathlib import Path
|
| 8 |
+
import matplotlib
|
| 9 |
+
matplotlib.use('Agg')
|
| 10 |
+
import matplotlib.pyplot as plt
|
| 11 |
+
import numpy as np
|
| 12 |
+
ROOT=Path(__file__).resolve().parent.parent
|
| 13 |
+
OUT=ROOT/'figures'
|
| 14 |
+
plt.rcParams.update({'font.family':'sans-serif','font.sans-serif':['DejaVu Sans','Arial','Helvetica'],
|
| 15 |
+
'font.size':12,'axes.titlesize':14,'axes.labelsize':12,'axes.linewidth':1.8,
|
| 16 |
+
'axes.spines.right':False,'axes.spines.top':False,'legend.frameon':False,
|
| 17 |
+
'svg.fonttype':'none','pdf.fonttype':42})
|
| 18 |
+
COLORS=['#767676','#B64342','#3775BA','#0F4D92']
|
| 19 |
+
LABELS=['BF16','BF16 + MTP','NVFP4','NVFP4 + MTP']
|
| 20 |
+
FILES=['perf_sglang_bf16.json','perf_sglang_bf16_mtp.json','perf_sglang_nvfp4_v1.json','perf_sglang_nvfp4_v1_mtp.json']
|
| 21 |
+
data=[json.loads((ROOT/'evaluation'/f).read_text()) for f in FILES]
|
| 22 |
+
for d in data:
|
| 23 |
+
assert [l['concurrency'] for l in d['levels']]==[1,2,4,8]
|
| 24 |
+
assert all(l['n_errors']==0 and l['output_tokens_mean']==256 for l in d['levels'])
|
| 25 |
+
def save(fig,name):
|
| 26 |
+
for ext in ['png','pdf','svg']:
|
| 27 |
+
fig.savefig(OUT/f'{name}.{ext}',dpi=300,bbox_inches='tight',facecolor='white')
|
| 28 |
+
plt.close(fig)
|
| 29 |
+
fig=plt.figure(figsize=(12.8,8.1))
|
| 30 |
+
gs=fig.add_gridspec(2,2,left=.09,right=.97,top=.84,bottom=.17,wspace=.32,hspace=.55)
|
| 31 |
+
ax=fig.add_subplot(gs[0,0]); ax2=fig.add_subplot(gs[0,1]); ax3=fig.add_subplot(gs[1,:])
|
| 32 |
+
fig.suptitle('SenseNova Loop 9B NVFP4 — one DGX Spark',y=.98,fontsize=19,fontweight='bold')
|
| 33 |
+
fig.text(.5,.927,'Functional release baseline • native W4A4 • original weights, PTQ only',ha='center',color='#4D4D4D',fontsize=12)
|
| 34 |
+
x=np.arange(4)
|
| 35 |
+
for a,key,title,ylabel in [(ax,'decode_tok_s_per_req','A Single-request decode','Median decode tokens/s'),(ax2,'ttft_s','B Time to first token (one request)','Median TTFT (seconds)')]:
|
| 36 |
+
vals=[d['levels'][0][key]['p50'] for d in data]
|
| 37 |
+
bars=a.bar(x,vals,color=COLORS,edgecolor='black',linewidth=1)
|
| 38 |
+
for b,v in zip(bars,vals):a.text(b.get_x()+b.get_width()/2,v+max(vals)*.035,f'{v:.2f}',ha='center',fontsize=11,fontweight='bold')
|
| 39 |
+
a.set(title=title,ylabel=ylabel,xticks=x,xticklabels=['BF16','BF16\n+ MTP','NVFP4','NVFP4\n+ MTP'],ylim=(0,max(vals)*1.24))
|
| 40 |
+
a.grid(axis='y',alpha=.16); a.set_axisbelow(True)
|
| 41 |
+
for d,c,label,marker in zip(data,COLORS,LABELS,['o','s','^','D']):
|
| 42 |
+
vals=[l['aggregate_output_tok_s'] for l in d['levels']]
|
| 43 |
+
ax3.plot([1,2,4,8],vals,color=c,label=label,marker=marker,lw=2.5,ms=7)
|
| 44 |
+
ax3.set(title='C Concurrency scales aggregate throughput — not individual-user speed',xlabel='Concurrent requests',ylabel='Aggregate output tokens/s',xticks=[1,2,4,8],ylim=(0,78))
|
| 45 |
+
ax3.legend(loc='upper left',ncol=2,fontsize=10);ax3.grid(axis='y',alpha=.16)
|
| 46 |
+
ax3.annotate('64.79 without MTP / 64.43 with MTP',xy=(8,64.79),xytext=(4.0,72),fontsize=10,arrowprops={'arrowstyle':'-','color':'#767676'})
|
| 47 |
+
fig.text(.5,.075,'1,051 prompt tokens → 256 output tokens • greedy • unique prompts, no prefix-cache hits\n16 requests/level without MTP; 8 with MTP • CUDA graphs • 0 request errors/OOMs\nSource: evaluation/perf_sglang_*.json • Measurements: October 30, 2026',ha='center',va='center',fontsize=10,color='#4D4D4D',linespacing=1.6)
|
| 48 |
+
save(fig,'performance-summary')
|
| 49 |
+
comp=json.loads((ROOT/'evaluation/compare_vs_ref.json').read_text())
|
| 50 |
+
keys=['ifeval','gsm8k','mmlu_pro','humaneval','tools','vqa']
|
| 51 |
+
names=['IFEval*','GSM8K','MMLU-Pro','HumanEval','Tools**','TextVQA']
|
| 52 |
+
fig,axes=plt.subplots(1,2,figsize=(13.5,6.6),gridspec_kw={'width_ratios':[1.15,1]})
|
| 53 |
+
fig.subplots_adjust(left=.07,right=.98,top=.78,bottom=.36,wspace=.37)
|
| 54 |
+
fig.suptitle('Quality after NVFP4 quantization — small regression suite',y=.98,fontsize=18,fontweight='bold')
|
| 55 |
+
fig.text(.5,.903,'300 fixed items • thinking off • paired comparison to BF16 • not full-benchmark scores',ha='center',fontsize=12,color='#4D4D4D')
|
| 56 |
+
x=np.arange(len(keys));w=.36
|
| 57 |
+
for off,k,col,label in [(-w/2,'ref_acc',COLORS[0],'BF16'),(w/2,'cand_acc',COLORS[2],'NVFP4')]:
|
| 58 |
+
vals=[100*comp['tasks'][t][k] for t in keys]
|
| 59 |
+
axes[0].bar(x+off,vals,w,color=col,edgecolor='black',linewidth=.8,label=label)
|
| 60 |
+
axes[0].set(title='A Task accuracy',ylabel='Accuracy (%)',xticks=x,xticklabels=names,ylim=(0,105));axes[0].tick_params(axis='x',labelrotation=25)
|
| 61 |
+
axes[0].legend(loc='lower left',fontsize=10);axes[0].grid(axis='y',alpha=.16);axes[0].set_axisbelow(True)
|
| 62 |
+
ys=np.arange(6)
|
| 63 |
+
for i,t in enumerate(keys):
|
| 64 |
+
q=comp['tasks'][t];v=q['delta']*100;lo,hi=[v*100 for v in q['delta_boot95']]
|
| 65 |
+
axes[1].errorbar(v,i,xerr=[[max(0,v-lo)],[max(0,hi-v)]],fmt='o',color=COLORS[2],capsize=4,lw=2)
|
| 66 |
+
axes[1].axvline(0,color='#767676',lw=1,ls='--')
|
| 67 |
+
axes[1].set(title='B Change and paired-bootstrap 95% CI',xlabel='NVFP4 − BF16 (percentage points)',yticks=ys,yticklabels=[f'{n} (n={comp["tasks"][k]["n"]})' for n,k in zip(names,keys)],xlim=(-18,18))
|
| 68 |
+
axes[1].invert_yaxis();axes[1].grid(axis='x',alpha=.16)
|
| 69 |
+
fig.text(.5,.12,'Pooled accuracy: BF16 82.7% → NVFP4 83.0% • Δ +0.3 pp [−3.0, +4.0]\n*IFEval subset uses a re-implemented checker. **Tools: 20 hand-written BFCL-style cases.\nSubsets of 20–80 items/task; uncertainty is wide. No claim of losslessness or intelligence improvement.\nSource: evaluation/compare_vs_ref.json; see model card for truncations and methodology.',ha='center',va='center',fontsize=10,color='#4D4D4D',linespacing=1.65)
|
| 70 |
+
save(fig,'quality-summary')
|
| 71 |
+
print('Rendered performance and quality figures from measured JSONs.')
|
figures/quality-summary.pdf
ADDED
|
Binary file (37.6 kB). View file
|
|
|
figures/quality-summary.png
ADDED
|
Git LFS Details
|
figures/quality-summary.svg
ADDED
|
|
figures/requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
matplotlib==3.11.1
|
| 2 |
+
numpy>=2,<3
|