Skip to main content

README.md

# OnnxRuntime

Elixir bindings for [Microsoft ONNX Runtime](https://github.com/microsoft/onnxruntime),
built with [Fine](https://github.com/elixir-nx/fine), `elixir_make`, and `Nx`.

The public API follows the shape of `elixir-nx/ortex`:

```elixir
model = OnnxRuntime.load("./model.onnx")
{output} = OnnxRuntime.run(model, Nx.broadcast(0.0, {1, 3, 224, 224}))
```

Inspecting a model shows its ONNX inputs and outputs:

```elixir
#OnnxRuntime.Model<
  inputs: [{"input", "Float32", [nil, 3, 224, 224]}]
  outputs: [{"output", "Float32", [nil, 1000]}]
>
```

## Installation

```elixir
def deps do
  [
    {:onnxruntime, "~> 0.1.0"}
  ]
end
```

Until precompiled artifacts are published, local compilation requires a C++17
compiler and either:

  * network access during `mix compile`, so `scripts/fetch_onnxruntime.sh` can
    download the ONNX Runtime CPU archive; or
  * `ORT_INCLUDE_DIR` and `ORT_LIB_DIR` pointing at an existing ONNX Runtime
    distribution.

The default ONNX Runtime version is `1.26.0`. Override it with:

```shell
ONNXRUNTIME_VERSION=1.26.0 mix compile
```

## Precompilation

This project is configured for `elixir_make` precompiled NIF artifacts through
`CCPrecompiler`.

For a release build:

```shell
MIX_ENV=prod mix elixir_make.precompile
MIX_ENV=prod mix elixir_make.checksum --all --ignore-unavailable
```

The precompiled archive includes the NIF and `libonnxruntime` runtime library
from `priv/`.

The default precompile targets follow the official ONNX Runtime CPU archives for
version `1.26.0`: macOS arm64, Linux x64, and Linux aarch64. macOS x86_64 is
not enabled by default because ONNX Runtime v1.26.0 does not publish an
`onnxruntime-osx-x86_64` archive.


Set `ONNXRUNTIME_ELIXIR_GITHUB_URL` or `ONNXRUNTIME_PRECOMPILE_URL` before
publishing if your release artifacts live somewhere other than the default
GitHub repository URL.

## Scope

The first implementation supports CPU execution and common tensor dtypes:
`f32`, `f64`, signed/unsigned integer tensors, and `bool`. Additional execution
providers can be added in the NIF by appending provider-specific session options.