ExBurn
Status: Early development. Not yet ready for production use.
ExBurn is a middle layer between Nx and Burn that enables GPU-accelerated ML/DL on mobile and desktop devices.
Architecture
Axon model
↓
Nx.Defn graph
↓
ExBurn.Backend (Nx.Backend behaviour)
↓
ExBurn.Nif (Rustler NIF) ←→ ExCubecl (GPU buffers, kernels, pipelines)
↓
Burn Autodiff<CubeCL> (Rust)
↓
CubeCL kernels
↓
Metal (iOS) / Vulkan (Android) / CUDA → GPUStatus
Version 0.1.0 — Early Alpha
| Feature | Status |
|---|---|
| Nx.Backend behaviour (basic ops) | ✅ Implemented |
| Nx.Backend behaviour (shape ops) | ✅ Implemented |
| Nx.Backend behaviour (reductions) | ✅ Implemented |
| Nx.Backend behaviour (linear algebra) | ✅ Implemented |
| Rust NIF bridge (Burn CubeCL) | ✅ Implemented |
| GPU acceleration (Metal/Vulkan) | ✅ Via Burn/CubeCL |
| Axon model compilation | 🔄 Basic support |
| Training loop (SGD/Adam/RMSprop) | 🔄 Basic support |
| Nx.Serving | ✅ Implemented |
| Nx.Defn.Compiler | 🚧 Planned |
| CUDA backend | 🚧 Planned |
| Precompiled NIF binaries | 🚧 Planned |
⚠️ Note: The Quick Start examples show the target API. Some features (training loop, mobile deployment) are partially implemented and may not work end-to-end yet. See the guides for what's currently working.
Features
- Nx Backend: Full
Nx.Backendbehaviour implementation — drop-in replacement forNx.BinaryBackend - GPU Acceleration: Burn's CubeCL backend with Metal (Apple), Vulkan (Android), CUDA (NVIDIA)
- ExCubecl Integration: GPU buffer management, kernel execution, async commands, and pipeline orchestration via ExCubecl
- Autodiff: Automatic differentiation via Burn's
Autodiffbackend decorator - Training Loop: Complete training with Adam, SGD, RMSprop optimizers, LR scheduling, gradient clipping, callbacks
- Model Management: Save/load, serialize, quantize (f16), benchmark
- Structured Errors:
ExBurn.Errorexception type with operation context
Quick Start
Note: This section shows the target API. Some features may not work end-to-end yet — see the Status section above.
# Set ExBurn as the default Nx backend
Nx.default_backend(ExBurn.Backend)
# Create and manipulate tensors
t = Nx.tensor([1.0, 2.0, 3.0])
Nx.add(t, t) |> Nx.to_list()
# Define a model with Axon
model =
Axon.input("input", shape: {nil, 784})
|> Axon.dense(256, activation: :relu)
|> Axon.dropout(rate: 0.2)
|> Axon.dense(10)
# Compile for training
compiled = ExBurn.Model.compile(model,
loss: :cross_entropy,
optimizer: :adam,
learning_rate: 0.001
)
# Train
ExBurn.Training.fit(compiled, {train_x, train_y},
epochs: 10,
batch_size: 32,
validation_data: {val_x, val_y},
callbacks: [&ExBurn.Training.LoggingCallback.log/1]
)Prerequisites
- Elixir ~> 1.18 and OTP 27+
- Rust stable toolchain (required for NIF compilation)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - For iOS development: Xcode +
aarch64-apple-iostargetrustup target add aarch64-apple-ios - For Android development: Android NDK +
aarch64-linux-androidtargetrustup target add aarch64-linux-android
Note: Precompiled NIF binaries are planned for v0.2.0. Until then, a Rust toolchain is required to build the NIF from source.
Installation
Add ex_burn to your mix.exs:
def deps do
[
{:ex_burn, github: "ohhi-vn/ex_burn"},
{:nx, ">= 0.7.0"},
{:axon, "~> 0.7"}
]
endNote: ExBurn is not yet published to Hex.pm. Install from GitHub until the first stable release.
Training on Mobile — Caveats
Burn's Autodiff backend is memory-intensive. On iOS/Android with limited RAM, training even small models may cause out-of-memory errors. Realistic expectations:
- Fine-tuning small models (< 10M parameters) is feasible on modern devices
- Full training of large models is not recommended on mobile
- Inference is the primary use case for mobile deployment
- Minimum recommended: 4GB RAM, A12+ chip (iOS) / Snapdragon 700+ (Android)
The training loop in ExBurn currently uses numerical gradients. Burn's autodiff integration is planned for v0.3.0.
Examples
# Linear regression (simplest possible ML workflow)
mix run examples/linear_regression.exs
# MNIST-like classifier (full deep learning pipeline)
mix run examples/mnist_simple.exs
# GPU-accelerated inference with ExCubecl
mix run examples/gpu_inference.exsProject Structure
lib/ex_burn/
ex_burn.ex — Main API (version, configure!, default_device)
backend.ex — Nx.Backend implementation (delegates to Burn via NIF)
nif.ex — Rustler NIF stubs (40+ functions)
tensor.ex — Nx ↔ Burn tensor conversion utilities
error.ex — Structured error type (ExBurn.Error)
burn_bridge.ex — High-level Burn API (direct tensor ops)
cubecl_bridge.ex — GPU compute via ExCubecl (buffers, kernels, pipelines)
model.ex — Model definition, compilation, save/load
training.ex — Training loop (optimizers, LR schedules, callbacks)
native/ex_burn_nif/
src/lib.rs — Rust NIF with real Burn Autodiff<CubeCL> operations
Cargo.toml — Burn 0.21 + CubeCL + Autodiff dependencies
examples/
linear_regression.exs — Simplest ML workflow
mnist_simple.exs — Full deep learning pipeline
guides/
01_getting_started.md — Installation, basic ops, GPU check
02_training.md — Models, training, callbacks, save/load
03_mobile_deployment.md — iOS/Android compilation, optimization
04_architecture.md — Deep-dive into the pipelineGPU Backends
| Platform | Backend | Status |
|---|---|---|
| iOS | Metal | ✅ |
| Android | Vulkan | ✅ |
| macOS | Metal | ✅ |
| Linux | Vulkan | ✅ |
| NVIDIA | CUDA | 🔜 |
Error Handling
All operations raise ExBurn.Error with structured context:
raise ExBurn.Error,
op: :matmul,
reason: "shape mismatch",
details: %{lhs: [3, 4], rhs: [5, 6]}Dependencies
- Burn — Deep learning framework (Rust)
- Nx — Numerical Elixir
- Axon — Neural network library
- CubeCL — GPU compute language
- ExCubecl v0.4+ — GPU compute runtime for Elixir (buffers, kernels, pipelines, media)
Topics: elixir · machine-learning · burn · ios · android · nx · rustler · gpu · deep-learning
License
Apache 2.0