Haigini commited on
Commit
5b5e0ed
·
verified ·
1 Parent(s): 766505d

Document official ParseBench validation for nano-v2

Browse files
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
- Official end-to-end validation of these v2 weights is pending. Benchmark results from the original model are not presented as v2 results.
 
 
 
 
 
 
 
 
 
 
 
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.