Document official ParseBench validation for nano-v2
Browse files- README.md +12 -1
- evaluation/parsebench-20261028-gpu5.json +116 -0
- evaluation/reproduce.md +46 -0
README.md
CHANGED
|
@@ -27,7 +27,18 @@ A 1.2B-parameter open-weight document parsing model, packaged and orchestrated b
|
|
| 27 |
|
| 28 |
## ParseBench results
|
| 29 |
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
## Serving
|
| 33 |
|
|
|
|
| 27 |
|
| 28 |
## ParseBench results
|
| 29 |
|
| 30 |
+
Measured 2026-10-28 with the official ParseBench harness, **full set, single end-to-end pass** (2,078 unique documents; 2,553 group test cases; 0 inference failures):
|
| 31 |
+
|
| 32 |
+
| Dimension | Metric | Score |
|
| 33 |
+
|---|---|---|
|
| 34 |
+
| **Overall (mean)** | mean of 5 dimensions | 78.96 |
|
| 35 |
+
| Tables | grits_trm_composite | 86.06 |
|
| 36 |
+
| Visual Grounding / Layout | layout_element_rule_pass_rate | 75.31 |
|
| 37 |
+
| Content Faithfulness | content_faithfulness | 87.64 |
|
| 38 |
+
| Semantic Formatting | semantic_formatting | 76.91 |
|
| 39 |
+
| Charts | rule_pass_rate | 68.87 |
|
| 40 |
+
|
| 41 |
+
Author-measured with unmodified upstream `7de04fc11c6a692dfc5e1a86c7be817f3f0af8de` and dataset revision `2805a1d940f95a203e0ae4b88be9934f7765b3fc`. All 2,553 officially eligible group cases were scored successfully; the reports additionally retain 32 skipped records outside those case counts. This is one pass, not a repeated-run mean; maintainer reproduction and official leaderboard acceptance are pending. [Full validation summary](evaluation/parsebench-20261028-gpu5.json) · [Reproduction instructions](evaluation/reproduce.md).
|
| 42 |
|
| 43 |
## Serving
|
| 44 |
|
evaluation/parsebench-20261028-gpu5.json
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema": "parsebench-author-validation/v1",
|
| 3 |
+
"model_id": "KDLAI/KDL-Frontier-Parser-nano-v2",
|
| 4 |
+
"model_revision": "766505d578be5d99f2358ec9c95224023cd28d5f",
|
| 5 |
+
"model_safetensors_sha256": "596389309a85a67341cf5e6b062aefc1042116314ed365b2eb3ffb2d57924047",
|
| 6 |
+
"benchmark_repository": "run-llama/ParseBench",
|
| 7 |
+
"benchmark_revision": "7de04fc11c6a692dfc5e1a86c7be817f3f0af8de",
|
| 8 |
+
"dataset_id": "llamaindex/ParseBench",
|
| 9 |
+
"dataset_revision": "2805a1d940f95a203e0ae4b88be9934f7765b3fc",
|
| 10 |
+
"provider": "kdl_frontier_nano",
|
| 11 |
+
"replicates": 1,
|
| 12 |
+
"author_measured": true,
|
| 13 |
+
"maintainer_reproduction": "not_yet_observed",
|
| 14 |
+
"unique_documents": 2078,
|
| 15 |
+
"group_test_cases": 2553,
|
| 16 |
+
"evaluation_skipped_records": 32,
|
| 17 |
+
"inference_failures": 0,
|
| 18 |
+
"inference_skipped": 0,
|
| 19 |
+
"group_results": {
|
| 20 |
+
"table": {
|
| 21 |
+
"metric": "grits_trm_composite",
|
| 22 |
+
"raw_value": 0.8606003056212997,
|
| 23 |
+
"score": 86.06003056212998,
|
| 24 |
+
"coverage": {
|
| 25 |
+
"total_examples": 503,
|
| 26 |
+
"successful": 503,
|
| 27 |
+
"failed": 0,
|
| 28 |
+
"skipped": 0
|
| 29 |
+
},
|
| 30 |
+
"report_sha256": "f51c795aaa21f4d80acaffddbd0073013ea59db160ede3b502851132c58c6968",
|
| 31 |
+
"started_at": "2026-10-28T12:19:20.974057",
|
| 32 |
+
"completed_at": "2026-10-28T12:19:21.003449"
|
| 33 |
+
},
|
| 34 |
+
"chart": {
|
| 35 |
+
"metric": "rule_pass_rate",
|
| 36 |
+
"raw_value": 0.6887017813954434,
|
| 37 |
+
"score": 68.87017813954434,
|
| 38 |
+
"coverage": {
|
| 39 |
+
"total_examples": 568,
|
| 40 |
+
"successful": 568,
|
| 41 |
+
"failed": 0,
|
| 42 |
+
"skipped": 0
|
| 43 |
+
},
|
| 44 |
+
"report_sha256": "390f082bee239c6f5847d1c3d7a76d80c1192018c443f3f5558b1eb7c0e8176c",
|
| 45 |
+
"started_at": "2026-10-28T12:18:33.777658",
|
| 46 |
+
"completed_at": "2026-10-28T12:18:33.812787"
|
| 47 |
+
},
|
| 48 |
+
"text_content": {
|
| 49 |
+
"metric": "content_faithfulness",
|
| 50 |
+
"raw_value": 0.876431835862896,
|
| 51 |
+
"score": 87.6431835862896,
|
| 52 |
+
"coverage": {
|
| 53 |
+
"total_examples": 506,
|
| 54 |
+
"successful": 506,
|
| 55 |
+
"failed": 0,
|
| 56 |
+
"skipped": 1
|
| 57 |
+
},
|
| 58 |
+
"report_sha256": "0623e8c2f33928753d7e7441155e2c86f63eeba4bf1d18e6f37f8f4a5f27dc3e",
|
| 59 |
+
"started_at": "2026-10-28T12:20:54.215579",
|
| 60 |
+
"completed_at": "2026-10-28T12:20:54.365057"
|
| 61 |
+
},
|
| 62 |
+
"text_formatting": {
|
| 63 |
+
"metric": "semantic_formatting",
|
| 64 |
+
"raw_value": 0.7691130071725973,
|
| 65 |
+
"score": 76.91130071725973,
|
| 66 |
+
"coverage": {
|
| 67 |
+
"total_examples": 476,
|
| 68 |
+
"successful": 476,
|
| 69 |
+
"failed": 0,
|
| 70 |
+
"skipped": 31
|
| 71 |
+
},
|
| 72 |
+
"report_sha256": "fcdd64bc31ce727483a291cfa25af322b227f9f228a2947f23b0ade0032cdc0a",
|
| 73 |
+
"started_at": "2026-10-28T12:21:03.998469",
|
| 74 |
+
"completed_at": "2026-10-28T12:21:04.052873"
|
| 75 |
+
},
|
| 76 |
+
"layout": {
|
| 77 |
+
"metric": "layout_element_rule_pass_rate",
|
| 78 |
+
"raw_value": 0.7531206769668802,
|
| 79 |
+
"score": 75.31206769668802,
|
| 80 |
+
"coverage": {
|
| 81 |
+
"total_examples": 500,
|
| 82 |
+
"successful": 500,
|
| 83 |
+
"failed": 0,
|
| 84 |
+
"skipped": 0
|
| 85 |
+
},
|
| 86 |
+
"report_sha256": "11128ae4266152c4b3630540fe9c4cd803d636303fbae8711856b47a1e1f541d",
|
| 87 |
+
"started_at": "2026-10-28T12:18:50.184160",
|
| 88 |
+
"completed_at": "2026-10-28T12:18:50.255268"
|
| 89 |
+
}
|
| 90 |
+
},
|
| 91 |
+
"scores": {
|
| 92 |
+
"table": 86.06003056212998,
|
| 93 |
+
"chart": 68.87017813954434,
|
| 94 |
+
"text_content": 87.6431835862896,
|
| 95 |
+
"text_formatting": 76.91130071725973,
|
| 96 |
+
"layout": 75.31206769668802,
|
| 97 |
+
"overall": 78.95935214038234
|
| 98 |
+
},
|
| 99 |
+
"wall_seconds_including_server_start_and_cleanup": 1396.8262436389923,
|
| 100 |
+
"runtime": {
|
| 101 |
+
"image_id": "sha256:609a5b463503f663bedc6a8045ef2aae530bf59c6dc20371c84b1d302fb6f9ca",
|
| 102 |
+
"image_reference": "vllm/vllm-openai@sha256:61fc8a896b0a4fbbbdc063bc4b0dbc25ce98e02b5050c24aeb7830ac02039b14",
|
| 103 |
+
"vllm_version": "0.28.0",
|
| 104 |
+
"hardware": "single NVIDIA B200 GPU",
|
| 105 |
+
"weight_dtype": "bfloat16",
|
| 106 |
+
"max_model_len": 8192,
|
| 107 |
+
"max_num_seqs": 24,
|
| 108 |
+
"max_concurrent_documents": 20,
|
| 109 |
+
"per_document_concurrency": 8,
|
| 110 |
+
"gpu_memory_utilization": "vLLM default; no override",
|
| 111 |
+
"LLM_normalization": "off",
|
| 112 |
+
"custom_provider_or_post_normalize_rules": false
|
| 113 |
+
},
|
| 114 |
+
"date": "2026-10-28",
|
| 115 |
+
"scope": "Full-set single end-to-end pass using the unchanged upstream multi-stage layout/region provider; not a one-request-per-page model or a repeated-run mean."
|
| 116 |
+
}
|
evaluation/reproduce.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Reproduce the published nano-v2 validation
|
| 2 |
+
|
| 3 |
+
Model: `KDLAI/KDL-Frontier-Parser-nano-v2@766505d578be5d99f2358ec9c95224023cd28d5f`. Use the original upstream `kdl_frontier_nano` provider unchanged. A full end-to-end pass uses layout detection and multiple region-recognition calls; it does not mean a single full-page OCR request.
|
| 4 |
+
|
| 5 |
+
## Pinned source and data
|
| 6 |
+
|
| 7 |
+
```bash
|
| 8 |
+
git clone https://github.com/run-llama/ParseBench.git
|
| 9 |
+
cd ParseBench
|
| 10 |
+
git checkout --detach 7de04fc11c6a692dfc5e1a86c7be817f3f0af8de
|
| 11 |
+
uv sync --frozen --python /usr/bin/python3.12 --extra openai
|
| 12 |
+
.venv/bin/python -c "from huggingface_hub import snapshot_download; snapshot_download('KDLAI/KDL-Frontier-Parser-nano-v2', revision='766505d578be5d99f2358ec9c95224023cd28d5f', local_dir='model-v2', token=False); snapshot_download('llamaindex/ParseBench', repo_type='dataset', revision='2805a1d940f95a203e0ae4b88be9934f7765b3fc', local_dir='data', token=False)"
|
| 13 |
+
```
|
| 14 |
+
|
| 15 |
+
## Serve the pinned downloaded weights
|
| 16 |
+
|
| 17 |
+
The validation used one NVIDIA B200, vLLM 0.28.0, BF16, no GPU-memory-utilization override, local image ID `sha256:609a5b463503f663bedc6a8045ef2aae530bf59c6dc20371c84b1d302fb6f9ca` and registry-pinned image `vllm/vllm-openai@sha256:61fc8a896b0a4fbbbdc063bc4b0dbc25ce98e02b5050c24aeb7830ac02039b14`. Set `GPU_UUID` to the device assigned to your run. Use a fresh container name and output directory.
|
| 18 |
+
|
| 19 |
+
```bash
|
| 20 |
+
export GPU_UUID='<your assigned GPU UUID>'
|
| 21 |
+
docker run --rm --name parsebench-nano-v2-reproduction \
|
| 22 |
+
--gpus "device=$GPU_UUID" --shm-size 8g \
|
| 23 |
+
-p 127.0.0.1:8000:8000 \
|
| 24 |
+
-e HF_HUB_OFFLINE=1 -e HF_HUB_DISABLE_TELEMETRY=1 \
|
| 25 |
+
-v "$PWD/model-v2:/model:ro" \
|
| 26 |
+
vllm/vllm-openai@sha256:61fc8a896b0a4fbbbdc063bc4b0dbc25ce98e02b5050c24aeb7830ac02039b14 \
|
| 27 |
+
/model --served-model-name kdl-frontier-parser-nano \
|
| 28 |
+
--host 0.0.0.0 --port 8000 --max-model-len 8192 --max-num-seqs 24 \
|
| 29 |
+
--trust-remote-code --limit-mm-per-prompt '{"image": 1}'
|
| 30 |
+
```
|
| 31 |
+
|
| 32 |
+
## Run the complete official pipeline
|
| 33 |
+
|
| 34 |
+
In a second terminal at that checkout, after `/v1/models` is ready:
|
| 35 |
+
|
| 36 |
+
```bash
|
| 37 |
+
env -i PATH="$PATH" HOME="$HOME" LANG=C.UTF-8 \
|
| 38 |
+
LLAMACLOUD_BENCH_LLM_NORMALIZATION=off HF_HUB_OFFLINE=1 \
|
| 39 |
+
KDL_NANO_ENDPOINT_URL=http://127.0.0.1:8000/v1 \
|
| 40 |
+
.venv/bin/parse-bench run kdl_frontier_nano \
|
| 41 |
+
--input_dir data --output_dir output-nano-v2-clean --open_report=False
|
| 42 |
+
```
|
| 43 |
+
|
| 44 |
+
No provider, prompt, normalization, scoring, layout adapter or aggregation edits are required. Do not use local provider-rule patches or a group-wise model ensemble. The server alias is intentionally the upstream default; the weights are the pinned v2 repository above.
|
| 45 |
+
|
| 46 |
+
Read the five `_evaluation_report.json` reports, checking their coverage/failures as well as the process exit. Default metrics are Tables `grits_trm_composite`, Charts `rule_pass_rate`, Content `content_faithfulness`, Formatting `semantic_formatting`, Layout `layout_element_rule_pass_rate`; Overall is their unrounded five-way mean times 100. Use the official test-case loader's grouped, eligible case IDs rather than JSONL rule-row counts to verify coverage. The reports' `skipped` counters are additional scanned records outside `total_examples`, not additional successful eligible cases. The accompanying JSON keeps the observed single-pass values and counts, without redistributing benchmark inputs or predictions.
|