Open-source project
iree-org/iree avatar
iree-org/iree

IREE: An MLIR-Based Compiler That Retargets One Model Across Datacenter and Edge

A retargetable MLIR-based machine learning compiler and runtime toolkit.

3,928 stars1,009 forksC++Apache-2.0

At a glance

What is it?
IREE lowers machine learning models to a unified intermediate representation and ships a matching runtime, so the same compiled artifact can target a server GPU or a mobile device. The trade-off is that you are adopting a compiler project, not a library, and its release cadence reflects that.
Who is it for?
Adopt IREE if you need one compiled artifact to run across several backends (CPU, CUDA, ROCm, Vulkan/SPIR-V) and you have engineers comfortable reading MLIR and filing issues against a compiler. Do not adopt it if you want a single-vendor inference API with a stable ABI and no interest in the compilation pipeline itself; a runtime like ONNX Runtime fits that shape better.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem IREE solves: one IR, many backends

Most ML deployment stacks are built around a single vendor's runtime. You train in PyTorch or JAX or TensorFlow, export to that vendor's format, and run it on that vendor's hardware. Moving the same model to a different accelerator usually means a different export path, a different runtime, and a different set of numerical quirks to chase. IREE takes the opposite position. The README describes it as "an MLIR-based end-to-end compiler and runtime that lowers Machine Learning (ML) models to a unified IR that scales up to meet the needs of the datacenter and down to satisfy the constraints and special considerations of mobile and edge deployments." The audience is therefore not the application developer who wants to call predict() on a tensor. It is the engineer who owns the deployment target: the person who has to make a model run on an AMD GPU, an ARM phone, and a Vulkan-capable embedded board without maintaining three separate inference stacks. The topic list on the repository (cuda, rocm, vulkan, spirv, onnx, pytorch, jax, tensorflow) is a reasonable proxy for the frontends and backends the project intends to cover. If your deployment surface is a single accelerator with a mature vendor runtime, IREE's main selling point does not apply to you.

How the compiler and runtime split works

IREE is two artifacts that meet at a compiled module. The compiler side is built on MLIR, the LLVM project's multi-level intermediate representation framework; the README states plainly that IREE "is enabled by and heavily relies on MLIR." Models arrive from the supported frontends, are progressively lowered through MLIR dialects, and emerge as a compiled artifact. The runtime side then executes that artifact against a hardware abstraction layer that maps onto the concrete backend: CUDA, ROCm, Vulkan/SPIR-V, or CPU. The repository's architecture diagram lives at docs/website/docs/assets/images/iree_architecture.svg (with a dark-mode variant alongside it), and the README points to iree.dev for the details rather than reproducing them. That split is the design decision worth noting. Because the runtime is a separate, comparatively small component from the compiler, deployment does not require shipping the whole toolchain. The cost is that the two halves must agree on the artifact format, which is why versioning between the compiler package and the runtime package matters more here than in a single-binary inference library. The project also publishes its own technical talks on the pipeline, including a 2025 session on data tiling and a 2025 introduction to the GPU codegen pipeline, both linked from the README; those are the fastest way to understand what the lowering actually does, since the README does not describe the pass pipeline itself.

Installing the compiler and runtime packages

The README's release table names two PyPI packages, iree-base-compiler and iree-base-runtime, each with its own version badge. Install them with pip install iree-base-compiler and pip install iree-base-runtime. Keeping them separate is deliberate: a build machine needs the compiler, a deployment image may only need the runtime. Alongside the PyPI channel, the repository publishes GitHub releases, and the release table distinguishes a stable channel from a nightly channel; the recent release list shows candidate tags such as iree-3.12.0rc20260910, iree-3.12.0rc20260909, and iree-3.12.0rc20260908, which are prereleases rather than stable versions. The README directs readers to https://iree.dev/developers/general/release-management/ for the release process and states that release notes are "published on GitHub releases" filtered to exclude prereleases. Building from source is possible but the README does not inline the instructions; it points to the website for "instructions on building from source." That is a real gap for anyone who needs a custom backend or a patched pass, because you will be following documentation outside the repository. Nightly CI covers Linux arm64 and macOS arm64 clang builds according to the badge table, so those are the platforms with visible continuous coverage.

Where IREE is the wrong tool

The most obvious failure mode is expecting a stable, frozen artifact format. A compiler-centric project changes its intermediate representations as the compiler improves, and IREE's release naming (candidate builds on consecutive days, a separate nightly channel) signals an active development cadence rather than a long-term-support product. If your deployment model is "compile once, ship for five years, never rebuild," pinning a specific stable GitHub release and treating the compiler as a build-time dependency you control is the only workable approach. The second limitation is expertise. Debugging a model that compiles but produces wrong numbers means reading MLIR and understanding which lowering stage lost the semantics; that is a different skill set from reading a Python traceback in a runtime library. The third is coverage. The README lists frontends and backends as topics, but the repository does not enumerate which operators or which model families are fully supported, and I cannot confirm from this material how complete any given frontend is. Treat the topic list as intent, not as a compatibility matrix, and test your specific model graph before planning around it.

IREE against ONNX Runtime and vendor-specific runtimes

The natural comparison is ONNX Runtime. Both consume exported models and execute them on multiple accelerators, but the difference in approach is where the work happens. ONNX Runtime is primarily a runtime with an execution-provider interface: you export a graph to ONNX, and each provider implements the operators it supports, with the graph structure largely fixed at export time. IREE is primarily a compiler: the graph is not the unit of deployment, the compiled module is, and the lowering pipeline is free to transform, tile, and retarget the computation before the runtime ever sees it. That is why IREE can target Vulkan and SPIR-V through a code generation path rather than through a hand-written provider, and why the project publishes talks about GPU codegen pipelines and data tiling. The practical consequence is that IREE's ceiling is higher for unusual hardware and its floor is higher for teams that just want a supported operator set on a mainstream GPU. A vendor runtime such as the CUDA or ROCm stack sits at the other extreme: maximum performance on one vendor's silicon, zero portability. IREE's bet is that the middle position is worth the compiler complexity.

Governance, licence, and what that means for redistribution

IREE is licensed under Apache-2.0 with LLVM Exceptions, and the README's licence section states this explicitly. The LLVM exception matters if you redistribute compiled binaries, because it modifies the standard Apache-2.0 patent-termination behaviour; the exact text is in the repository's licence file, and I am not restating it as legal advice. Read the file and, if you are shipping IREE-derived binaries in a product, have counsel read it too. On governance, the README's project news records that IREE joined the LF AI & Data Foundation as a sandbox-stage project on 2024-05-23, and that AMD submitted an IREE-based SDXL implementation to the MLPerf benchmark suite on 2025-04-02. Sandbox stage is an early foundation tier, so the neutral-governance argument is real but not yet equivalent to a graduated project. The repository also carries an OpenSSF Best Practices badge, which the README links. For a compiler that vendors may want to embed, the combination of a permissive licence, a foundation home, and a public CI matrix is the relevant diligence surface, not the size of the community.

Maintenance cost and upgrade cadence

The upgrade cost here is not the pip install, it is the recompile. Because the compiler and runtime are versioned separately and the artifact format is a compiler output, moving to a new IREE release means rebuilding your models and revalidating numerics on every backend you ship. The release list shows candidates landing on consecutive days, so the nightly channel is genuinely nightly; the README's release table keeps stable and nightly as distinct badges for a reason. Budget for a pinned version in production and a separate track for evaluating upgrades, and expect the evaluation to include output comparison rather than just a smoke test. The other recurring cost is tracking MLIR itself. IREE depends on MLIR, and MLIR evolves on LLVM's schedule, not IREE's. The README points to the MLIR topic on LLVM Discourse for that reason. If your team already follows LLVM development, this is familiar overhead. If it does not, that is a standing subscription you are taking on. Neither cost appears in the README as a warning, which is itself worth noting: the project documents its release process at iree.dev but does not document an upgrade playbook in the repository.

Editorial conclusion

Adopt IREE if you need one compiled artifact to run across several backends (CPU, CUDA, ROCm, Vulkan/SPIR-V) and you have engineers comfortable reading MLIR and filing issues against a compiler. Do not adopt it if you want a single-vendor inference API with a stable ABI and no interest in the compilation pipeline itself; a runtime like ONNX Runtime fits that shape better. Before committing, verify three things from the repository itself: which release channel you will pin (the stable GitHub release versus the iree-base-compiler and iree-base-runtime packages on PyPI), whether your target backend appears in the topics and release notes, and what the Apache-2.0-with-LLVM-Exceptions licence file actually says about the components you plan to redistribute.

Official sources

  1. iree-org/iree on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Community notes

Community notes