GLiNER2.5 · ONNX WebGPU
Span-free NER in the browser. Models: small · base · multi. Nothing leaves the page except the Hugging Face download.
GLiNER2 vs 2.5, and what this page can run
GLiNER2 enumerates candidate spans up to a fixed width (about twelve words). Anything longer is invisible. GLiNER2.5 scores start and end boundaries instead, so a forty-word clause costs the same as a two-word name.
Python classify_text is one forward pass (trained max_len 4096 words). That is Fastino’s long-context classification on CUDA/CPU. This page is WebGPU. One-shot classify_text on small finished 4096 words here. base and multi died between 3500 and 3600 words (12-head attention vs Chrome’s ~1 GiB buffer). The Long contract chip calls classify_text_long: 384-word windows, overlap 64. A 4096-word file is 13 GPU runs of 384 words, not one 4096-word encode. Same split as Python classify_text_long.
Fastino's 2.5 blog also adds JointIE knowledge graphs, constrained classification, and span attributes. This page runs the boundary entity path, the v3 classifier, and (when heads.onnx is loaded) typed JointIE edges. Record-mode JSON is host assignment of repeated fields, not the neural RecordHead.
CrossNER is the one public NER number we can check. Fastino reports macro F1 on 2.5-base 58.30 / 2.5-multi 54.85. Our JS ONNX domain-macro (same five test splits, threshold 0.5) is 55.8 / 52.2. JS matches Python AutoExtractor on those splits; the remaining ~2.5 points is protocol (token-level vs char-span, not the export).
| CrossNER | blog 2.5 base | our JS base | blog 2.5 multi | our JS multi |
|---|---|---|---|---|
| AI | 50.69 | 48.6 | 45.60 | 43.2 |
| Literature | 54.56 | 53.1 | 51.52 | 50.3 |
| Music | 68.96 | 65.0 | 65.80 | 62.9 |
| Politics | 56.41 | 57.5 | 55.26 | 55.9 |
| Science | 60.85 | 54.7 | 56.08 | 48.7 |
| domain-macro | 58.30 | 55.8 | 54.85 | 52.2 |
Entities will appear here.