What it measures. Detection of personal data that has no fixed format —
PERSON ORGANIZATION LOCATION ADDRESS
DATE_TIME — in text shaped the way outbound traffic to AI assistants is shaped:
JSON request bodies, XML, SQL, CSV, key=value pairs, log lines, Markdown tables and OCR output,
as well as prose. Public PII benchmarks score prose; a model that is accurate on prose can still
miss the same name when it sits in a JSON string value, and a prose-only benchmark cannot show
it.
What it does not measure. Identifiers with a fixed format — email
addresses, payment-card, IBAN and passport numbers — are excluded from scoring, because a
regular expression resolves them exactly. A prediction that lands on such an identifier is not
counted as a false positive. Touch rate reports how often a model marks those
characters anyway; it is reported, never ranked. A touch rate of — means the
dataset contains no excluded identifiers, so it was not measured — it is not zero, and the
average skips it.
Protocol. 3,500 rows: 500 from each of seven third-party datasets (TAB, GermEval 2014, FactRuEval-2016, MEDDOCAN, IAHLT, Gretel, Nemotron), serialised into twelve carrier formats with every gold offset re-mapped so each span still covers the same substring. Precision, recall and F1 are computed over characters and are label-agnostic: a character counts as correctly detected when it is predicted as PII and lies inside a gold span of any scored type, so no entrant's label names are re-interpreted. Scores are micro-averaged within each dataset and then averaged across the seven, so no single dataset dominates. 95 % confidence intervals are percentile bootstrap intervals over rows, resampled within each dataset. Entrants are ranked by average F1 only, each at a pinned model revision, with the host and numeric precision of every run recorded beside its result.
Data and code. The rows, gold spans, per-dataset licences, the scoring code and every entrant's raw predictions are published as ScienceSoft/piibench. This page computes no metric of its own; it renders those result files. How to run the benchmark, below, reproduces any row or scores a new model.
Conflict of interest. piibench is built and published by
ScienceSoft, which also develops one of the models scored here; rows prefixed
scnsoft- are ScienceSoft's. On this board scnsoft-pii-encoder ranks
first: its average F1 is +0.0233 above that of the strongest independent
entrant, nvidia-gliner-pii (paired bootstrap over rows, 2,000 resamples, 95 % CI
[+0.0147, +0.0322]). Weigh that knowing who published the board.
What that result is evidence of. It concerns one artefact —
the published weights, revision 1c1e5be8cbe359c0, trained with one random seed —
not the training recipe. The recipe was trained with three seeds, and each run was scored
through the same production inference engine (the -engine-raw path). Against the
same reference, only one of the three clears it: seed 1234, the released model,
+0.0192 [+0.0105, +0.0278]; seed 4321, +0.0057 [−0.0028, +0.0145]; seed 7777,
+0.0011 [−0.0080, +0.0103]. The released model is therefore the upper end of the recipe's
observed spread, and another training run of the same recipe would not be expected to be
separably ahead of the reference.
The two other seeds are listed under Seed variance, reported and never ranked, and
their weights are published on the seed-4321 and seed-7777 branches
of the model repository. The margin is also specific to this corpus of 3,500 rows.
Rows that are one model. scnsoft-pii-encoder,
scnsoft-pii-encoder-engine-raw and scnsoft-pii-encoder-engine-shipped
are one artefact, the same weights, scored three ways: through the Hugging Face ONNX path used for
every other entrant; through the product's Rust engine before its post-filters
(-engine-raw); and after them (-engine-shipped). The post-filters trade
recall for precision on the product's own traffic, so -engine-shipped scores lower
here. The engine rows describe the product's pipeline around the model, not a model on their
own; otherwise this benchmark scores one model at a time, never a full product.
Steering. A dataset is steered for a model if that model's training was shaped by examining it — the difference between a measurement and a rehearsal. Four of the seven datasets steered ScienceSoft's model: TAB, FactRuEval, MEDDOCAN and IAHLT each motivated a change to its training corpus (TAB's mark is kept although the change it motivated was later switched off — DESIGN.md §4). GermEval, Gretel and Nemotron are unsteered. Steering for other entrants is not known and not claimed either way. Read ScienceSoft's placement with this in mind.
Ranked by average F1 over the seven datasets. Licence, model revision and notes are shown under each entrant's name.
| # | model | weights | F1 | 95 % CI | P | R | touch | median ms/row |
|---|---|---|---|---|---|---|---|---|
| 1 | scnsoft-pii-encoder | int8 | 0.777 | [0.769, 0.784] | 0.710 | 0.878 | 0.021 | 20.31R |
| 2 | scnsoft-pii-encoder-engine-raw | int8 | 0.772 | [0.765, 0.780] | 0.685 | 0.908 | 0.020 | — |
| 3 | nvidia-gliner-pii | fp32 | 0.753 | [0.746, 0.761] | 0.744 | 0.783 | 0.288 | 140.61 |
| 4 | scnsoft-pii-encoder-engine-shipped | int8 | 0.718 | [0.709, 0.726] | 0.712 | 0.742 | 0.017 | — |
| 5 | xlmr-ner-hrl | fp32 | 0.711 | [0.702, 0.719] | 0.794 | 0.653 | 0.017 | 27.05 |
| 6 | bardsai-eu-multi | fp32 | 0.706 | [0.696, 0.716] | 0.658 | 0.772 | 0.889 | 27.55 |
| 7 | openmed-small | fp32 | 0.689 | [0.681, 0.696] | 0.709 | 0.701 | 0.674 | 26.27 |
| 8 | openmed-large | fp32 | 0.660 | [0.652, 0.667] | 0.717 | 0.658 | 0.630 | 131.79 |
| 9 | gravitee-bert-small | fp32 | 0.604 | [0.596, 0.611] | 0.629 | 0.635 | 0.540 | 7.95 |
| 10 | presidio-spacy-sm | fp32 | 0.568 | [0.559, 0.576] | 0.526 | 0.632 | 0.481 | 8.47 |
| 11 | catalog-multilang-pii-ner-fp32 | fp32 | 0.552 | [0.543, 0.560] | 0.781 | 0.455 | 0.583 | 25.18 |
| 12 | catalog-multilang-pii-ner-int8 | int8 | 0.548 | [0.539, 0.556] | 0.777 | 0.451 | 0.587 | 20.14 |
| 13 | piiranha (non-commercial licence) | fp32 | 0.481 | [0.470, 0.492] | 0.812 | 0.359 | 0.367 | 49.82 |
| 14 | catalog-bert-small-pii-int8 | int8 | 0.473 | [0.466, 0.479] | 0.582 | 0.592 | 0.388 | 4.74 |
| 15 | deberta-finetuned-pii | fp32 | 0.419 | [0.410, 0.427] | 0.328 | 0.785 | 0.793 | 47.18 |
| 16 | tabularisai-eu | fp32 | 0.412 | [0.403, 0.422] | 0.827 | 0.320 | 0.585 | 70.92 |
95 % CI: percentile bootstrap over rows, 1000 resamples.
| model | F1 (avg) | csv n=168 | csv_row n=148 | json n=147 | json_fields n=173 | keyvalue n=154 | log n=159 | markdown_table n=162 | ocr n=167 | prose n=1719 | sql n=172 | sql_values n=153 | xml n=178 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| scnsoft-pii-encoder | 0.777 | 0.762 | 0.929 | 0.766 | 0.905 | 0.747 | 0.759 | 0.774 | 0.731 | 0.759 | 0.729 | 0.957 | 0.745 |
| scnsoft-pii-encoder-engine-raw | 0.772 | 0.749 | 0.950 | 0.744 | 0.915 | 0.739 | 0.745 | 0.754 | 0.728 | 0.755 | 0.725 | 0.968 | 0.732 |
| nvidia-gliner-pii | 0.753 | 0.748 | 0.941 | 0.702 | 0.896 | 0.747 | 0.585 | 0.752 | 0.723 | 0.739 | 0.707 | 0.940 | 0.739 |
| scnsoft-pii-encoder-engine-shipped | 0.718 | 0.726 | 0.852 | 0.708 | 0.815 | 0.686 | 0.739 | 0.697 | 0.672 | 0.718 | 0.697 | 0.866 | 0.679 |
| xlmr-ner-hrl | 0.711 | 0.728 | 0.730 | 0.698 | 0.715 | 0.682 | 0.742 | 0.712 | 0.694 | 0.725 | 0.702 | 0.728 | 0.712 |
| bardsai-eu-multi | 0.706 | 0.703 | 0.850 | 0.702 | 0.824 | 0.643 | 0.731 | 0.704 | 0.637 | 0.704 | 0.665 | 0.786 | 0.695 |
| openmed-small | 0.689 | 0.721 | 0.812 | 0.664 | 0.779 | 0.699 | 0.552 | 0.700 | 0.665 | 0.710 | 0.674 | 0.769 | 0.719 |
| openmed-large | 0.660 | 0.691 | 0.778 | 0.624 | 0.779 | 0.667 | 0.543 | 0.703 | 0.650 | 0.691 | 0.653 | 0.764 | 0.696 |
| gravitee-bert-small | 0.604 | 0.584 | 0.795 | 0.564 | 0.745 | 0.606 | 0.482 | 0.616 | 0.587 | 0.574 | 0.565 | 0.847 | 0.600 |
| presidio-spacy-sm | 0.568 | 0.632 | 0.564 | 0.609 | 0.688 | 0.619 | 0.522 | 0.636 | 0.612 | 0.643 | 0.620 | 0.676 | 0.621 |
| catalog-multilang-pii-ner-fp32 | 0.552 | 0.610 | 0.612 | 0.567 | 0.618 | 0.534 | 0.520 | 0.594 | 0.526 | 0.590 | 0.551 | 0.586 | 0.568 |
| catalog-multilang-pii-ner-int8 | 0.548 | 0.603 | 0.629 | 0.562 | 0.630 | 0.524 | 0.522 | 0.586 | 0.513 | 0.584 | 0.547 | 0.592 | 0.561 |
| piiranha | 0.481 | 0.522 | 0.478 | 0.503 | 0.473 | 0.481 | 0.572 | 0.493 | 0.422 | 0.506 | 0.479 | 0.371 | 0.515 |
| catalog-bert-small-pii-int8 | 0.473 | 0.452 | 0.756 | 0.467 | 0.734 | 0.466 | 0.418 | 0.434 | 0.424 | 0.431 | 0.449 | 0.726 | 0.445 |
| deberta-finetuned-pii | 0.419 | 0.282 | 0.616 | 0.314 | 0.550 | 0.291 | 0.282 | 0.291 | 0.304 | 0.325 | 0.304 | 0.693 | 0.304 |
| tabularisai-eu | 0.412 | 0.468 | 0.307 | 0.459 | 0.528 | 0.432 | 0.471 | 0.431 | 0.390 | 0.458 | 0.412 | 0.388 | 0.461 |
| model | F1 (avg) | factrueval† | germeval† | gretel | iahlt | meddocan | nemotron | tab |
|---|---|---|---|---|---|---|---|---|
| scnsoft-pii-encoder | 0.777 | 0.751 | 0.658 | 0.889 | 0.692 | 0.854 | 0.818 | 0.774 |
| scnsoft-pii-encoder-engine-raw | 0.772 | 0.754 | 0.657 | 0.893 | 0.681 | 0.844 | 0.820 | 0.758 |
| nvidia-gliner-pii | 0.753 | 0.696 | 0.722 | 0.862 | 0.591 | 0.796 | 0.871 | 0.735 |
| scnsoft-pii-encoder-engine-shipped | 0.718 | 0.797 | 0.734 | 0.820 | 0.666 | 0.821 | 0.736 | 0.450 |
| xlmr-ner-hrl | 0.711 | 0.775 | 0.860 | 0.666 | 0.755 | 0.805 | 0.703 | 0.414 |
| bardsai-eu-multi | 0.706 | 0.730 | 0.749 | 0.796 | 0.709 | 0.808 | 0.728 | 0.424 |
| openmed-small | 0.689 | 0.489 | 0.629 | 0.840 | 0.455 | 0.846 | 0.840 | 0.724 |
| openmed-large | 0.660 | 0.393 | 0.587 | 0.847 | 0.373 | 0.844 | 0.847 | 0.729 |
| gravitee-bert-small | 0.604 | 0.084 | 0.518 | 0.960 | 0.321 | 0.737 | 0.825 | 0.783 |
| presidio-spacy-sm | 0.568 | 0.738 | 0.682 | 0.662 | 0.000 | 0.595 | 0.628 | 0.669 |
| catalog-multilang-pii-ner-fp32 | 0.552 | 0.388 | 0.528 | 0.781 | 0.205 | 0.747 | 0.682 | 0.535 |
| catalog-multilang-pii-ner-int8 | 0.548 | 0.393 | 0.535 | 0.775 | 0.179 | 0.739 | 0.681 | 0.533 |
| piiranha | 0.481 | 0.251 | 0.488 | 0.686 | 0.454 | 0.699 | 0.488 | 0.301 |
| catalog-bert-small-pii-int8 | 0.473 | 0.023 | 0.330 | 0.891 | 0.057 | 0.430 | 0.844 | 0.735 |
| deberta-finetuned-pii | 0.419 | 0.271 | 0.168 | 0.741 | 0.251 | 0.465 | 0.503 | 0.533 |
| tabularisai-eu | 0.412 | 0.098 | 0.310 | 0.848 | 0.145 | 0.672 | 0.585 | 0.230 |
† GermEval and FactRuEval annotate no dates; any date a model finds there counts against it, for every model.
| model | F1 (avg) | ar | de | en | es | ru |
|---|---|---|---|---|---|---|
| scnsoft-pii-encoder | 0.777 | 0.692 | 0.658 | 0.811 | 0.854 | 0.751 |
| scnsoft-pii-encoder-engine-raw | 0.772 | 0.681 | 0.657 | 0.804 | 0.844 | 0.754 |
| nvidia-gliner-pii | 0.753 | 0.591 | 0.722 | 0.796 | 0.796 | 0.696 |
| scnsoft-pii-encoder-engine-shipped | 0.718 | 0.666 | 0.734 | 0.615 | 0.821 | 0.797 |
| xlmr-ner-hrl | 0.711 | 0.755 | 0.860 | 0.543 | 0.805 | 0.775 |
| bardsai-eu-multi | 0.706 | 0.709 | 0.749 | 0.593 | 0.808 | 0.730 |
| openmed-small | 0.689 | 0.455 | 0.629 | 0.786 | 0.846 | 0.489 |
| openmed-large | 0.660 | 0.373 | 0.587 | 0.793 | 0.844 | 0.393 |
| gravitee-bert-small | 0.604 | 0.321 | 0.518 | 0.840 | 0.737 | 0.084 |
| presidio-spacy-sm | 0.568 | 0.000 | 0.682 | 0.658 | 0.595 | 0.738 |
| catalog-multilang-pii-ner-fp32 | 0.552 | 0.205 | 0.528 | 0.646 | 0.747 | 0.388 |
| catalog-multilang-pii-ner-int8 | 0.548 | 0.179 | 0.535 | 0.642 | 0.739 | 0.393 |
| piiranha | 0.481 | 0.454 | 0.488 | 0.468 | 0.699 | 0.251 |
| catalog-bert-small-pii-int8 | 0.473 | 0.057 | 0.330 | 0.803 | 0.430 | 0.023 |
| deberta-finetuned-pii | 0.419 | 0.251 | 0.168 | 0.585 | 0.465 | 0.271 |
| tabularisai-eu | 0.412 | 0.145 | 0.310 | 0.532 | 0.672 | 0.098 |
Further training runs of the released model's recipe that differ from it only in the random seed. They are not entrants: they are listed so that the released model's result can be read against the spread of its recipe, and they appear in no ranked table on this page. The released model on the same path, scnsoft-pii-encoder-engine-raw, scores 0.7725.
| model | F1 | 95 % CI | P | R |
|---|---|---|---|---|
| scnsoft-pii-encoder-seed-4321-engine-raw | 0.7590 | [0.751, 0.766] | 0.678 | 0.897 |
| scnsoft-pii-encoder-seed-7777-engine-raw | 0.7543 | [0.746, 0.762] | 0.658 | 0.913 |
Median and p95 milliseconds per row, timed one request at a time after a discarded warmup — the shape this product actually runs in (an agent inline in a request path), not batch throughput. Reported and separately sortable; it never reorders the F1 ranking above, and a model this benchmark cannot yet time shows an em dash, never a zero.
| model | median ms/row | p95 ms/row | rows/sec | host |
|---|---|---|---|---|
| catalog-bert-small-pii-int8 | 4.74 | 13.17 | 170.0 | Apple M4 Max / accelerator mps |
| gravitee-bert-small | 7.95 | 14.00 | 118.9 | Apple M4 Max / accelerator mps |
| presidio-spacy-sm | 8.47 | 18.27 | 113.9 | Apple M4 Max / accelerator mps |
| catalog-multilang-pii-ner-int8 | 20.14 | 36.18 | 50.7 | Apple M4 Max / accelerator mps |
| scnsoft-pii-encoder (timed at model revision e98225e07225; the accuracy on this board is for revision 1c1e5be8cbe359c0) | 20.31 | 33.46 | 51.7 | Apple M4 Max / accelerator mps |
| catalog-multilang-pii-ner-fp32 | 25.18 | 43.97 | 40.2 | Apple M4 Max / accelerator mps |
| openmed-small | 26.27 | 36.48 | 37.8 | Apple M4 Max / accelerator mps |
| xlmr-ner-hrl | 27.05 | 32.63 | 38.5 | Apple M4 Max / accelerator mps |
| bardsai-eu-multi | 27.55 | 34.28 | 38.0 | Apple M4 Max / accelerator mps |
| deberta-finetuned-pii | 47.18 | 134.63 | 16.6 | Apple M4 Max / accelerator mps |
| piiranha | 49.82 | 66.11 | 20.8 | Apple M4 Max / accelerator mps |
| tabularisai-eu | 70.92 | 116.98 | 13.3 | Apple M4 Max / accelerator mps |
| openmed-large | 131.79 | 182.87 | 7.4 | Apple M4 Max / accelerator mps |
| nvidia-gliner-pii | 140.61 | 199.67 | 6.9 | Apple M4 Max / accelerator mps |
| scnsoft-pii-encoder-engine-raw | timing failed or excluded: not timed: this row is scored from predictions the Rust engine saved to a file, so there is no Python model for this timer to call. Timing the Rust engine needs its own measurement. | — | ||
| scnsoft-pii-encoder-engine-shipped | timing failed or excluded: not timed: this row is scored from predictions the Rust engine saved to a file, so there is no Python model for this timer to call. Timing the Rust engine needs its own measurement. | — | ||
| model | exact F1 | partial F1 |
|---|---|---|
| scnsoft-pii-encoder | 0.539 | 0.638 |
| scnsoft-pii-encoder-engine-raw | 0.542 | 0.635 |
| nvidia-gliner-pii | 0.589 | 0.651 |
| scnsoft-pii-encoder-engine-shipped | 0.519 | 0.601 |
| xlmr-ner-hrl | 0.062 | 0.366 |
| bardsai-eu-multi | 0.369 | 0.445 |
| openmed-small | 0.038 | 0.253 |
| openmed-large | 0.035 | 0.256 |
| gravitee-bert-small | 0.353 | 0.428 |
| presidio-spacy-sm | 0.360 | 0.425 |
| catalog-multilang-pii-ner-fp32 | 0.070 | 0.212 |
| catalog-multilang-pii-ner-int8 | 0.070 | 0.211 |
| piiranha | 0.035 | 0.245 |
| catalog-bert-small-pii-int8 | 0.235 | 0.312 |
| deberta-finetuned-pii | 0.014 | 0.160 |
| tabularisai-eu | 0.166 | 0.243 |
The benchmark names failures rather than omitting them. A model absent with no explanation is indistinguishable from one quietly dropped for scoring badly.
| slug | id | licence | reason |
|---|---|---|---|
catalog-neurobert-ner | onnx-community/NeuroBERT-NER-ONNX | unstated | Not scored: the model card declares no licence; it will be scored once a licence is stated at the source. |
hikmaai-distilbert | HikmaAI/hikmaai-distilbert-pii | Apache-2.0 | Not scored: the standard token-classification pipeline passes token_type_ids to this DistilBERT model, which does not accept them, and no ONNX export exists to work around it. |
gliner-pii-base | knowledgator/gliner-pii-base-v1.0 | Apache-2.0 | no result published yet; it is scored when one is. |
wikineural-multilingual | Babelscape/wikineural-multilingual-ner | CC-BY-NC-SA-4.0 | Not scored: licensed CC BY-NC-SA 4.0 (non-commercial), excluded under the same rule that excludes non-commercial datasets. |
Inference ran on CPU (accelerators present but unused).
Apple M4 Max, accelerator mps, device cpu, transformers 4.57.6, onnxruntime 1.19.2Everything needed is in the
dataset repository: the rows,
the scoring harness and every published result. Python 3.9 or later, and the Hugging Face
command-line tool (pip install -U huggingface_hub) for step 1.
hf download ScienceSoft/piibench --repo-type dataset --local-dir piibench cd piibench pip install -e ".[predict]"
token-classification with aggregation_strategy="simple";
--pipeline onnx, gliner and presidio are also available and
additionally need onnxruntime, gliner or presidio-analyzer
respectively. Steps 3 and 4 need only the base install.
piibench predict --rows data/rows.jsonl --model <hf-model-id> --revision <commit> --out preds.jsonl
result.json, a copy of the
predictions and meta.json (host, precision, library versions).
piibench score --rows data/rows.jsonl --preds preds.jsonl --model <name> --out-dir results/<name>
piibench compare --rows data/rows.jsonl --a preds.jsonl --b results/nvidia-gliner-pii/preds.jsonl --iterations 2000 --seed 0
Reproducing a published row. Run step 2 with that row's model id and the
revision recorded in results/<slug>/result.json
(_provenance.model_revision), or re-score its published preds.jsonl
directly with step 3. Scores are deterministic for a given rows file; each result records that
file's SHA-256 as _provenance.rows_sha256 — cite it with any number you report.
Rows produced by ScienceSoft's Rust engine (-engine-*) cannot be regenerated with
this harness; their predictions are published so that they can be re-scored.
Submitting a model. Open a pull request on the dataset repository that adds
results/<name>/ as written by step 3, with the model id and pinned revision.
Generated from result files; this page computes no metric of its own. Framework, datasets, licences and the honesty rules are in the dataset repository.