blob: 0866fb87c6dfe2487d4d0fd429a1367956983c15 [file] [log] [blame] [view]
# Developer Overview
This guide provides an overview of IREE's project structure and main tools for
developers.
## Project Code Layout
[iree/](https://github.com/google/iree/blob/main/iree/)
* Core IREE project
[integrations/](https://github.com/google/iree/blob/main/integrations/)
* Integrations between IREE and other frameworks, such as TensorFlow
[bindings/](https://github.com/google/iree/blob/main/bindings/)
* Language and platform bindings, such as Python
[colab/](https://github.com/google/iree/blob/main/colab/)
* Colab notebooks for interactively using IREE's Python bindings
## IREE Code Layout
[iree/base/](https://github.com/google/iree/blob/main/iree/base/)
* Common types and utilities used throughout IREE
[iree/compiler/](https://github.com/google/iree/blob/main/iree/compiler/)
* IREE's MLIR dialects, LLVM compiler passes, module translation code, etc.
Code here should not depend on anything in the runtime
[iree/hal/](https://github.com/google/iree/blob/main/iree/hal/)
* **H**ardware **A**bstraction **L**ayer for IREE's runtime, with
implementations for hardware and software backends
[iree/schemas/](https://github.com/google/iree/blob/main/iree/schemas/)
* Shared data storage format definitions, primarily using
[FlatBuffers](https://google.github.io/flatbuffers/)
[iree/tools/](https://github.com/google/iree/blob/main/iree/tools/)
* Assorted tools used to optimize, translate, and evaluate IREE
[iree/vm/](https://github.com/google/iree/blob/main/iree/vm/)
* Bytecode **V**irtual **M**achine used to work with IREE modules and invoke
IREE functions
## Developer Tools
IREE's compiler components accept programs and code fragments in several
formats, including high level TensorFlow Python code, serialized TensorFlow
[SavedModel](https://www.tensorflow.org/guide/saved_model) programs, and lower
level textual MLIR files using combinations of supported dialects like `mhlo`
and IREE's internal dialects. While input programs are ultimately compiled down
to modules suitable for running on some combination of IREE's target deployment
platforms, IREE's developer tools can run individual compiler passes,
translations, and other transformations step by step.
### iree-opt
`iree-opt` is a tool for testing IREE's compiler passes. It is similar to
[mlir-opt](https://github.com/llvm/llvm-project/tree/master/mlir/tools/mlir-opt)
and runs sets of IREE's compiler passes on `.mlir` input files. See "conversion"
in [MLIR's Glossary](https://mlir.llvm.org/getting_started/Glossary/#conversion)
for more information. Transformations performed by `iree-opt` can range from
individual passes performing isolated manipulations to broad pipelines that
encompass a sequence of steps.
Test `.mlir` files that are checked in typically include a `RUN` block at the
top of the file that specifies which passes should be performed and if
`FileCheck` should be used to test the generated output.
Here's an example of a small compiler pass running on a
[test file](https://github.com/google/iree/blob/main/iree/compiler/Dialect/Util/Transforms/test/drop_compiler_hints.mlir):
```shell
$ ../iree-build/iree/tools/iree-opt \
-split-input-file \
-mlir-print-ir-before-all \
-iree-drop-compiler-hints \
$PWD/iree/compiler/Dialect/Util/Transforms/test/drop_compiler_hints.mlir
```
For a more complex example, here's how to run IREE's complete transformation
pipeline targeting the VMVX backend on the
[fullyconnected.mlir](https://github.com/google/iree/blob/main/iree/test/e2e/models/fullyconnected.mlir)
model file:
```shell
$ ../iree-build/iree/tools/iree-opt \
-iree-transformation-pipeline \
-iree-hal-target-backends=vmvx \
$PWD/iree/test/e2e/models/fullyconnected.mlir
```
Custom passes may also be layered on top of `iree-opt`, see
[samples/iree_custom_modules/dialect](https://github.com/google/iree/blob/main/samples/iree_custom_modules/dialect)
for a sample.
### iree-compile
`iree-compile` is IREE's main compiler driver for generating binaries from
supported input MLIR assembly.
For example, to translate `simple.mlir` to an IREE module:
```shell
$ ../iree-build/iree/tools/iree-compile \
-iree-hal-target-backends=vmvx \
$PWD/samples/models/simple_abs.mlir \
-o /tmp/simple_abs_vmvx.vmfb
```
# iree-translate
This is the IREE equivalent of MLIR's translation tool, which is used for
testing translations between supported formats. It is used by various unit
tests which are testing these features in isolation (outside of the main
compiler driver).
See
[mlir-translate](https://github.com/llvm/llvm-project/tree/master/mlir/tools/mlir-translate),
see "translation" in
[MLIR's Glossary](https://mlir.llvm.org/getting_started/Glossary/#translation)
for more information.
Custom translations may also be layered on top of `iree-translate`, see
[samples/iree_custom_modules/dialect](https://github.com/google/iree/blob/main/samples/iree_custom_modules/dialect)
for a sample.
### iree-run-module
The `iree-run-module` program takes an already translated IREE module as input
and executes an exported main function using the provided inputs.
This program can be used in sequence with `iree-compile` to translate a
`.mlir` file to an IREE module and then execute it. Here is an example command
that executes the simple `simple_abs_vmvx.vmfb` compiled from `simple_abs.mlir`
above on IREE's VMVX driver:
```shell
$ ../iree-build/iree/tools/iree-run-module \
--module_file=/tmp/simple_abs_vmvx.vmfb \
--driver=vmvx \
--entry_function=abs \
--function_input=f32=-2
```
### iree-check-module
The `iree-check-module` program takes an already translated IREE module as input
and executes it as a series of
[googletest](https://github.com/google/googletest) tests. This is the test
runner for the IREE
[check framework](https://github.com/google/iree/tree/main/docs/developing_iree/testing_guide.md#end-to-end-tests).
```shell
$ ../iree-build/iree/tools/iree-compile \
-iree-input-type=mhlo \
-iree-mlir-to-vm-bytecode-module \
-iree-hal-target-backends=vmvx \
$PWD/iree/test/e2e/xla_ops/abs.mlir \
-o /tmp/abs.vmfb
```
```shell
$ ../iree-build/iree/tools/iree-check-module \
/tmp/abs.vmfb \
--driver=vmvx
```
### iree-run-mlir
The `iree-run-mlir` program takes a `.mlir` file as input, translates it to an
IREE bytecode module, and executes the module.
It is designed for testing and debugging, not production uses, and therefore
does some additional work that usually must be explicit, like marking every
function as exported by default and running all of them.
For example, to execute the contents of
[samples/models/simple_abs.mlir](https://github.com/google/iree/blob/main/samples/models/simple_abs.mlir):
```shell
$ ../iree-build/iree/tools/iree-run-mlir \
$PWD/samples/models/simple_abs.mlir \
-function-input="f32=-2" \
-iree-hal-target-backends=vmvx
```
### iree-dump-module
The `iree-dump-module` program prints the contents of an IREE module FlatBuffer
file.
For example, to inspect the module translated above:
```shell
$ ../iree-build/iree/tools/iree-dump-module /tmp/simple_abs_vmvx.vmfb
```
### Useful generic flags
There are a few useful generic flags when working with IREE tools:
#### `--iree_minloglevel` and `--iree_v`
These flags can control IREE tool output verbosity. `--iree_minloglevel` and
`--iree_v` set the minimal and maximal verbosity levels respectively. They both
accept a number where 0, 1, 2, 3 stands for info, warning, error, and fatal
error respectively.
#### Read inputs from a file
All the IREE tools support reading input values from a file. This is quite
useful for debugging. Use `-help` for each tool to see what the flag to set. The
inputs are expected to be newline-separated. Each input should be either a
scalar or a buffer. Scalars should be in the format `type=value` and buffers
should be in the format `[shape]xtype=[value]`. For example:
```
1x5xf32=1,-2,-3,4,-5
1x5x3x1xf32=15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
```
#### `iree-flow-trace-dispatch-tensors`
This flag will enable tracing inputs and outputs for each dispatch function. It
is easier to narrow down test cases, since IREE breaks a ML workload into
multiple dispatch function. When the flag is on, IREE will insert trace points
before and after each dispatch function. The first trace op is for inputs, and
the second trace op is for outputs. There will be two events for one dispatch
function.
### Useful Vulkan driver flags
For IREE's Vulkan runtime driver, there are a few useful flags defined in
[driver_module.cc](https://github.com/google/iree/blob/main/iree/hal/vulkan/registration/driver_module.cc):