Skip to main content

Production-grade Kolmogorov-Arnold Networks — TensorFlow + PyTorch + ONNX.

Project description

🚀 kanx

Production-grade Kolmogorov-Arnold Networks
TensorFlow + PyTorch + ONNX — one library, four surfaces.
> `kanx` is the only Kolmogorov-Arnold Network (KAN) library purpose-built for production deployment.

PyPI Downloads Total Downloads Cite Python Docs Colab License DOI

KAN vs MLP benchmark

pip install kanx  ·  A small KAN beats a 10× larger MLP on smooth, separable targets — honest, param-matched benchmark below. One library. Two backends. Real ONNX export. Docker + Kubernetes ready. Prometheus metrics, TensorBoard logging, Hub and symbolic extras are now implemented.


⭐ Why kanx?

Every other KAN library stops at research. kanx goes the full distance:

pykan efficient-kan mlx-kan kanx
Framework PyTorch PyTorch MLX (Apple Silicon) TF + PyTorch
Vectorized B-spline partial
ONNX export both backends
REST API service ✅ FastAPI
Docker + K8s
Property-based tests ✅ Hypothesis
Test coverage research research research 94%
PyPI
CI/CD release pipeline ✅ PyPI + GHCR + Pages

Most of the other KAN implementations are strictly academic. KANX bridges the gap between theory and reality by providing:

  1. Multi-Backend Support: Native TensorFlow and PyTorch (MatrixKAN) implementations.
  2. Real Deployment: True ONNX export, FastAPI (/api/predict), Docker, and Kubernetes configs out-of-the-box.
  3. High-Throughput Options: Vectorized MatrixKAN to replace recursive B-splines with batched GEMMs for GPU acceleration.
  4. Grid Calibration: Native adaptive and static grid fitting to prevent out-of-bounds input collapse.

📊 Benchmarks (reproducible, fair, multi-baseline)

Synthetic 2-D regression target y = sin(π·x₁) + cos(2π·x₂), 100 epochs, Adam(lr=1e-2), batch=128, CPU.

Model Params Train (s) Infer 4k (ms) Test MSE
KAN[2,16,1] 432 12.50 68.64 2.14 × 10⁻⁵
KAN[2,32,1] 864 16.62 25.52 4.44 × 10⁻⁴
MLP[2,32,1] 129 5.07 6.17 4.61 × 10⁻¹ (undersized)
MLP[2,16,16,1] 337 5.46 4.08 1.60 × 10⁻³
MLP[2,64,64,1] 4 417 6.00 5.74 5.51 × 10⁻⁴

Honest read. The smallest KAN (432 params) wins on this smooth separable target. The same KAN is ~10–15× slower at inference than a same-MSE MLP because each edge does a B-spline evaluation. On non-smooth or high-dimensional targets, this picture often reverses. We do not claim KANs are universally better than MLPs.

Reproduce with python benchmarks/compare_mlp.py (quick, 100 epochs) or python benchmarks/compare_mlp.py --long (1000 epochs + early-stopping).


⚡ The 30-second magic moment

import kanx

# Build, train, predict — in one call. No config files. No compile dance.
model = kanx.quickstart()                       # trains on synthetic 2-D data
model.predict([[0.5, 0.2]])                     # → array([[1.04…]])

⚠️ Grid calibration — two methods

KANs use B-splines on a fixed input range (default [-1, 1]). If your inputs fall outside that range, the spline path silently returns zero and you only get the SiLU residual. Fix it one of two ways:

Static approach (pre-training):

from kanx import KAN, fit_grid_to_data
model = KAN([n_features, 64, 1])
fit_grid_to_data(model, X_train)              # one-time grid fit
model.fit(X_train, y_train, epochs=30)

Adaptive approach (during training — recommended):

model = KAN([n_features, 64, 1])
model.fit(X_train, y_train, epochs=15)
model.update_grid_from_samples(X_train)       # ← refine grid based on data
model.fit(X_train, y_train, epochs=15)        # continue training

kanx.check_input_range(model, X) will log a warning at inference if input exceeds the grid.


Want more control? Same simplicity, your data:

from kanx import KAN
import numpy as np

X = np.random.uniform(-1, 1, (1024, 2)).astype("float32")
y = np.sin(np.pi * X[:, :1]) + X[:, 1:2] ** 2

model = KAN([2, 64, 1])
model.fit(X, y, epochs=30, verbose=0)           # auto-compiles with Adam+MSE
model.predict(X[:3])

🔥 PyTorch? Same API.

from kanx.torch import KAN
import torch

model = KAN([2, 64, 1])
X = torch.randn(1024, 2); y = torch.sin(torch.pi * X[:, :1])
model.fit(X, y, epochs=30, lr=1e-2)             # one-liner, same semantics
model.predict([[0.5, 0.2]])

⚡ GPU-optimized MatrixKAN

For higher throughput on accelerators, use the vectorized MatrixKAN (replaces recursion with batched GEMM):

from kanx.torch import MatrixKAN

model = MatrixKAN([4, 32, 1])  # same interface as KAN
model.fit(X, y, epochs=30)      # ~1.5–2× faster on GPU vs standard KAN

📦 Installation

pip install kanx                # core (TensorFlow)
pip install "kanx[torch]"       # +PyTorch backend
pip install "kanx[onnx]"        # +tf2onnx + onnxruntime
pip install "kanx[api]"         # +FastAPI service
pip install "kanx[hub]"         # +HuggingFace Hub integration
pip install "kanx[symbolic]"    # +Symbolic regression hooks
pip install "kanx[all]"         # everything (api + torch + onnx + hub + symbolic + dev + docs)

Optional extras:

  • kanx[api] adds FastAPI serving with /metrics Prometheus scraping.
  • kanx[torch] adds the PyTorch backend, MatrixKAN, and symbolic helpers.
  • kanx[hub] adds push_to_hub() / from_pretrained() for HuggingFace integration.
  • kanx[symbolic] adds SymbolicFitter for post-hoc edge function extraction.

→ Open in Colab: Train a KAN in 2-to-5 minutes


🏗️ Production Serving

We include out-of-the-box serving. Simply install kanx[api] and run:

# Starts a FastAPI server with Prometheus scraping at /metrics
python -m kanx.serve 

API Contract:

  • GET /api/health - Liveness & model load source
  • GET /api/info - TF/Torch backend version and summary
  • POST /api/predict - Batched inference

For enterprise scaling, see our /k8s directory for Helm charts and Kubernetes manifests.


🌐 REST API

docker run --rm -p 8000:8000 ghcr.io/mattral/kanx:latest
# or
uvicorn api.app:app --port 8000
Method Path Purpose
GET /api/health Liveness + model load source
GET /api/info Version + TF/Torch + model summary
GET /metrics Prometheus scrape endpoint
POST /api/predict Inference (single or batch)
POST /api/load Hot-swap checkpoint
POST /api/reset Re-init from KANX_CONFIG
curl -X POST http://localhost:8000/api/predict \
     -H 'content-type: application/json' \
     -d '{"x": [[0.1, -0.2], [0.5, 0.7]]}'

The startup contract loads KANX_CHECKPOINT if it exists, otherwise falls back to a fresh model built from KANX_CONFIG. Boundaries are validated: wrong feature count → 400, oversized batch → 413, missing checkpoint → 404.


🔄 ONNX export

# From PyTorch
from kanx.torch import KAN, export_onnx
model = KAN([2, 64, 1])
export_onnx(model, "kan.onnx")
# From TensorFlow
from kanx import KAN, export_onnx_tf
import tensorflow as tf
model = KAN([2, 64, 1]); model(tf.zeros((1, 2)))
export_onnx_tf(model, "kan.onnx")

✔ Dynamic batch ✔ Verified numerical consistency (1e-5) ✔ Works with ONNX Runtime / TensorRT / OpenVINO


🐳 Docker / ☸️ Kubernetes

docker run --rm -p 8000:8000 ghcr.io/mattral/kanx:latest
kubectl apply -f k8s/    # Deployment + Service + Ingress + HPA + PVC

K8s manifests ship with rolling updates, readiness/liveness probes on /api/health, an HPA (2 ↔ 10 replicas, CPU-target 70%) and a PVC for the model registry.


🛠️ CLI

python -m kanx info                                          # versions
python -m kanx train --config configs/default.yaml           # train
python -m kanx predict --checkpoint model.keras --input X.json

⭐ Quality

  • 95 tests across 8 files — unit, integration, E2E, property-based, performance regression
  • 94% library coverage (99% layers, 100% model)
  • Hypothesis property tests: partition of unity, shape invariants, gradient finiteness
  • Numerical contracts: ONNX parity within 1e-5, save/load roundtrip identity
  • Performance regression alarms: latency budgets on forward pass and predict
  • CI matrix: Python 3.10 / 3.11 / 3.12 + lint + Docker smoke + MkDocs build
pytest tests/ -v --cov=src/kanx

📚 Documentation

https://mattral.github.io/KANX/ (MkDocs Material)

Page What's inside
Quickstart Train your first KAN in 60 seconds
Architecture Package layout, module contracts
System Design Serving topology, scaling, failure modes
REST API Endpoint reference + curl examples
Testing Test pyramid, numerical invariants
Deployment CI/CD, rollout, observability
Benchmarks KAN vs MLP — methodology + numbers

📄 Research Paper

If you use kanx in academic work, please cite both the original paper and the library.

Our work is formally documented and available as a preprint:

Citation

@article{mattral2026kanx,
  title={KANX: A Production-Grade Open-Source Library for Kolmogorov-Arnold Networks},
  author={Myet, Min Htet},
  year={2026},
  doi={10.5281/zenodo.20615396},
  publisher={Zenodo}
}

@article{liu2024kan,
  title   = {KAN: Kolmogorov-Arnold Networks},
  author  = {Liu, Ziming and Wang, Yixuan and Vaidya, Sachin and Ruehle,
             Fabian and Halverson, James and Soljačić, Marin and
             Hou, Thomas Y. and Tegmark, Max},
  journal = {arXiv preprint arXiv:2404.19756},
  year    = {2024}
}

References


🤝 Contributing

PRs welcome! See CONTRIBUTING.md. Good places to start:


📜 License

Apache 2.0. Use it. Ship it. Tell us when you do — we'd love to hear how kanx is being used in the wild.

Star the repo if kanx saved you time!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kanx-0.1.9.tar.gz (64.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kanx-0.1.9-py3-none-any.whl (50.7 kB view details)

Uploaded Python 3

File details

Details for the file kanx-0.1.9.tar.gz.

File metadata

  • Download URL: kanx-0.1.9.tar.gz
  • Upload date:
  • Size: 64.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for kanx-0.1.9.tar.gz
Algorithm Hash digest
SHA256 5d4e1d4f26d10a20b7502e3b5e6eaac375eb61c4a792362b9e02b8c93f529cab
MD5 82bd2ba3c2d3c996db2f8ecc3eace80d
BLAKE2b-256 84ad89a028e8987fbfa2e5ebbc598dbec260c350046cfa268ce312912a463caa

See more details on using hashes here.

Provenance

The following attestation bundles were made for kanx-0.1.9.tar.gz:

Publisher: release.yml on Mattral/KANX

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kanx-0.1.9-py3-none-any.whl.

File metadata

  • Download URL: kanx-0.1.9-py3-none-any.whl
  • Upload date:
  • Size: 50.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for kanx-0.1.9-py3-none-any.whl
Algorithm Hash digest
SHA256 701577f8ed1cbf02861f496cdbffbaea53eb9af88438b55f30b1b4bb8973c9e0
MD5 e172909a676b4e954d3545747afd3dd4
BLAKE2b-256 cc90f79e79f6c3fc8919adc5f91a9b0b49223e2736188e48eba1162098811236

See more details on using hashes here.

Provenance

The following attestation bundles were made for kanx-0.1.9-py3-none-any.whl:

Publisher: release.yml on Mattral/KANX

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page