GPU HIGGS dense training: OpenNN vs PyTorch vs TensorFlow
OpenNN trains the canonical HIGGS dense classifier at 6.76 million samples/s in fp32 and 11.35 million samples/s in bf16 on an NVIDIA GeForce RTX 4080, leading both PyTorch and TensorFlow in the same five-epoch workload.
The benchmark records one representative run per engine and precision. Held-out accuracy, log loss, and ROC AUC are reported alongside throughput; no hard common quality threshold was configured for this run.
Contents
- Introduction
- Benchmark application
- Reference computer
- Methodology
- Results
- Held-out quality
- Discussion
- Conclusions
- Reproducing
- References
Introduction
HIGGS is a large tabular binary-classification dataset from high-energy physics. Its 10.5-million-row training split and 28 numerical features make it useful for measuring sustained dense-network throughput rather than a short synthetic kernel.
This GPU training benchmark uses the canonical 28-1024-1024-1 ReLU classifier with Adam, batch 7,000, five epochs, and fp32 and bf16 paths in OpenNN, PyTorch, and TensorFlow.
Benchmark application
| Item | Configuration |
|---|---|
| Dataset | HIGGS |
| Training rows | 10,500,000 |
| Test rows used by runner | 497,000 |
| Inputs | 28 normalized numerical features |
| Network | 28 -> 1024 ReLU -> 1024 ReLU -> 1 |
| Parameters | 1,080,321 |
| Loss | Binary cross-entropy |
| Optimizer | Adam |
| Batch | 7,000 |
| Epochs | 5 |
| Precisions | fp32 and bf16 |
| Metric | Training samples per second; higher is better |
Reference computer
| Component | Value |
|---|---|
| CPU | Intel Core i9-12900K |
| GPU | NVIDIA GeForce RTX 4080, 16 GB |
| Operating system | Linux 6.17 x86_64 |
| NVIDIA driver | 595.71.05 |
| Python | 3.12.3 |
| PyTorch | 2.13.0+cu130 |
| PyTorch CUDA / cuDNN | CUDA 13.0 / cuDNN 9.24 |
| TensorFlow | 2.21.0 |
| OpenNN | 9.0.0 |
| Git state | Clean |
Methodology
The three engines read the same prepared and normalized HIGGS split. Training throughput is calculated from 10.5 million training rows and the median epoch time produced inside each engine.
- OpenNN uses GPU-resident data and its CUDA graph training path.
- PyTorch uses its optimized dense path, with bf16 autocast in the bf16 cell.
- TensorFlow uses compiled graph execution and mixed bf16 in the bf16 cell.
- All models use the same layer widths, activation, parameter count, batch, and epoch count.
- Testing happens after training and is not part of the throughput numerator.
- One run is stored per cell, so the figures should be read as a controlled snapshot.
Results
| Precision | OpenNN | PyTorch | TensorFlow | OpenNN / PyTorch | OpenNN / TensorFlow |
|---|---|---|---|---|---|
| fp32 | 6,757,399 samples/s | 3,183,481 samples/s | 3,025,572 samples/s | 2.123x | 2.233x |
| bf16 | 11,350,935 samples/s | 8,468,435 samples/s | 6,741,006 samples/s | 1.340x | 1.684x |
| Precision | OpenNN epoch | PyTorch epoch | TensorFlow epoch |
|---|---|---|---|
| fp32 | 1.554 s | 3.298 s | 3.470 s |
| bf16 | 0.925 s | 1.240 s | 1.558 s |
Held-out quality
Throughput is only meaningful if the training loop produces a usable model. The runner reports the following held-out metrics after five epochs:
| Precision | Framework | Accuracy | Log loss | ROC AUC |
|---|---|---|---|---|
| fp32 | OpenNN | 0.7705 | 0.4696 | 0.8558 |
| fp32 | PyTorch | 0.7749 | 0.4629 | 0.8598 |
| fp32 | TensorFlow | 0.7784 | 0.4576 | 0.8632 |
| bf16 | OpenNN | 0.7707 | 0.4694 | 0.8558 |
| bf16 | PyTorch | 0.7755 | 0.4627 | 0.8600 |
| bf16 | TensorFlow | 0.7785 | 0.4573 | 0.8634 |
The models land in the same broad quality band, but TensorFlow has the best held-out log loss and AUC in this specific five-epoch snapshot. Because no common hard target was configured, this article does not convert throughput into a convergence-to-quality claim.
Discussion
OpenNN’s largest relative lead is fp32, where it processes 2.12x as many samples per second as PyTorch and 2.23x as many as TensorFlow. In bf16, the competitor implementations also benefit strongly from tensor-core execution; OpenNN remains first at 1.34x PyTorch and 1.68x TensorFlow.
Within OpenNN, bf16 improves throughput by 1.68x for this exact network. The absolute 11.35-million-sample/s result is the fastest cell in the training table.
The quality table is important context. OpenNN’s advantage is sustained training throughput, while the final five-epoch metrics are not identical and should not be described as a formal quality tie without repeated seeds or a fixed target.
Conclusions
- OpenNN leads both fp32 and bf16 training throughput.
- In fp32, OpenNN reaches 2.12x PyTorch and 2.23x TensorFlow.
- In bf16, OpenNN reaches 1.34x PyTorch and 1.68x TensorFlow.
- All held-out metrics are published so the throughput result can be interpreted with its quality context.
Reproducing
The canonical runner is docs/benchmarks/throughput/higgs-gpu/run_higgs_dense.py:
python run_higgs_dense.py \
--train "$OPENNN_BENCH_DATA/higgs/higgs_train.csv" \
--test "$OPENNN_BENCH_DATA/higgs/higgs_test.csv" \
--epochs 5 --batch 7000 --hidden 1024 --hidden-layers 2 \
--activation relu --shuffle shuffle --precision both --runs 1
The result artifact is docs/benchmarks/results/gpu-higgs-dense-training-speed-20260710T084732Z.json.