# C4-SECURE GPU Benchmark Report (synthetic stub)

> **Provenance first.** Numbers below are for a **synthetic TransformerEncoder
> stub** sized like BERT-base — **not** the shipping C4 classifier
> (`c4_bert_v1.onnx` / `c4_mdeberta_v2.onnx` with Z₃³ heads).
> Treat as order-of-magnitude GPU proxy only.
>
> Reproducible CPU numbers for the real classifier (machine provenance + weight
> SHA-256): `python benchmarks/classifier_benchmark.py` →
> `benchmarks/classifier_benchmark_results.json`.
>
> Local CPU (Apple M-series), real model: heavy mDeBERTa ~8–10 ms/call,
> light DistilBERT ~5 ms/call, keyword fallback &lt;1 ms.

## Date
2026-04-08 · **reframed 2026-08-06** (honesty pass — no product SOTA claims)

## Stub under test
- Architecture: TransformerEncoder (12 layers, 768 hidden, 12 heads)
- Parameters: ~110M (BERT-base size proxy)
- Kind: GPU load proxy — **not** C4 heads

## Stub GPU results (historical lab notes)

Raw JSON (if present in repo): `website/benchmark_rtx4090.json`,
`website/benchmark_rtx3090.json`. Do **not** cite median/throughput from this
markdown as shipping-classifier performance.

| GPU | Role in lab note | Caveat |
|-----|------------------|--------|
| RTX 4090 | Faster stub proxy in that run | Stub ≠ C4 ONNX |
| RTX 3090 | Slower/cheaper stub proxy | Stub ≠ C4 ONNX |

## Context

For a BERT-base-sized encoder, GPU forward is cheap vs typical LLM API RTT
(tens–hundreds of ms). The same qualitative story holds for real C4 CPU
inference (~8–10 ms heavy) — measure with the harness above.

## Methodology (stub run)

- Warmup: 100 iterations
- Latency samples: 1000
- Throughput: 100 batches
- Batch sizes: 1, 8, 16, 32, 64
- CUDA 12.1 · PyTorch 2.1.0 (lab machine of record)

## Honest recommendations

1. Prefer **measured** `classifier_benchmark_results.json` for product claims.
2. Size GPU for your own batch profile; do not copy stub medians into README.
3. Keyword fallback remains the fast path when ONNX is unavailable.
