Privacy Filter (ONNX, FP16)
FP16 ONNX export of openai/privacy-filter for efficient inference with ONNX Runtime. The model detects eight categories of personally identifiable information (PII) in text and returns BIOES-tagged token spans.
The exported graph has dynamic batch and sequence dimensions, and has been validated against the original PyTorch implementation with 100% argmax agreement on reference prompts.
Model details
| Base model | openai/privacy-filter |
| Parameters | 1.5 B total, 50 M active (128-expert top-4 MoE) |
| Precision | FP16 weights, FP32 router |
| Context length | Up to 128k tokens (dynamic) |
| Label set | 33 classes (O + BIOES × 8 categories) |
| License | Apache 2.0 |
Detected categories
account_number, private_address, private_date, private_email, private_person, private_phone, private_url, secret
Repository contents
config.json Model config including the 33-class id2label map
tokenizer.json o200k tokenizer (tiktoken-compatible)
tokenizer_config.json
special_tokens_map.json
viterbi_calibration.json Default operating-point biases for Viterbi decoding
onnx/
model_fp16.onnx Graph
model_fp16.onnx.data Weights (external data, ~2.6 GB)
Installation
pip install onnxruntime transformers tiktoken numpy huggingface_hub
For GPU inference, substitute onnxruntime-gpu for onnxruntime.
Usage
Minimal example
from huggingface_hub import snapshot_download
from transformers import AutoTokenizer
import onnxruntime as ort
import numpy as np
import json
repo = "yasserrmd/privacy-filter-ONNX"
local = snapshot_download(repo)
tokenizer = AutoTokenizer.from_pretrained(local)
session = ort.InferenceSession(
f"{local}/onnx/model_fp16.onnx",
providers=["CPUExecutionProvider"], # or ["CUDAExecutionProvider"] for GPU
)
with open(f"{local}/config.json") as f:
id2label = {int(k): v for k, v in json.load(f)["id2label"].items()}
text = "Hi, I'm Alice Smith, email alice@example.com."
enc = tokenizer(text, return_tensors="np", add_special_tokens=False)
logits = session.run(None, {
"input_ids": enc["input_ids"].astype(np.int64),
"attention_mask": enc["attention_mask"].astype(np.int64),
})[0]
labels = [id2label[int(i)] for i in logits[0].argmax(-1)]
tokens = tokenizer.convert_ids_to_tokens(enc["input_ids"][0])
for tok, lbl in zip(tokens, labels):
if lbl != "O":
print(f"{tok:<20} {lbl}")
Complete usage with span decoding
The raw model output is per-token logits over 33 BIOES classes. For coherent spans, decode the logits with a constrained Viterbi pass using the biases in viterbi_calibration.json. A reference implementation is included in examples/detect.py in the export project; the essential steps are:
- Tokenize the input with
return_offsets_mapping=Trueto recover character positions. - Run the ONNX session to obtain logits of shape
[1, seq_len, 33]. - Run Viterbi decoding over the 33 labels with legal BIOES transitions.
- Group the resulting label sequence into spans and map token indices back to character spans via the offsets.
The viterbi_calibration.json file holds six transition-bias parameters under operating_points.default.biases that control the precision/recall trade-off. The defaults in this file are zeroed and match the reference implementation's default operating point.
Input and output shapes
| Tensor | Shape | Dtype |
|---|---|---|
input_ids (input) |
[batch, sequence] |
int64 |
attention_mask (input) |
[batch, sequence] |
int64 |
logits (output) |
[batch, sequence, 33] |
float32 |
Both batch and sequence are dynamic at runtime.
Export notes
- Exported with
torch.onnx.export(dynamo=True)fromtransformers>=5.6.0.dev0andtorch>=2.6. - The 128-expert top-4 MoE blocks in each decoder layer were rewritten to a dense-weighted-sum form to produce an ONNX-traceable graph while preserving reference arithmetic, including the clamped-SwiGLU activation (
alpha=1.702,limit=7.0) and the post-experts scaling. - The router linear remains in FP32 for numerical stability; all other weights are FP16.
- Parity validated against the PyTorch reference: max logit difference on the order of 1e-4, argmax agreement 100% across the standard evaluation prompts.
Intended use and limitations
This export preserves the behavior of the base model. Its intended use, evaluation results, and limitations are documented in the base model card and the accompanying OpenAI Privacy Filter Model Card (PDF). In brief:
- Optimized primarily for English; multilingual performance varies.
- Model-based redaction is a data-minimization aid, not an anonymization guarantee or compliance certification.
- For high-sensitivity domains (medical, legal, financial, government), pair with human review and organization-specific policies.
License
Apache 2.0, inherited from the base model.
Citation
If you use this export, please cite the base model:
@misc{openai_privacy_filter_2026,
title = {OpenAI Privacy Filter},
author = {OpenAI},
year = {2026},
howpublished = {\url{https://huggingface.co/openai/privacy-filter}},
note = {Apache-2.0},
}
- Downloads last month
- 71
Model tree for yasserrmd/privacy-filter-ONNX
Base model
openai/privacy-filter