# IREE Benchmarks

This directory contains configuration definition for IREE's continuous
benchmarks suite. Benchmark results are posted to https://perf.iree.dev.

The https://buildkite.com/iree/iree-benchmark Buildkite pipeline runs on each
commit to the `main` branch and posts those results to the dashboard. The
pipeline also runs on pull requests with the `buildkite:benchmark-*` label,
posting results compared against their base commit as comments.

## Types of benchmarks

```
└── TFLite
      * Models originally in TensorFlow Lite Flatbuffer format and imported with `iree-import-tflite`
```

## Adding new benchmarks

### Machine learning model latency

1. Pick the model you want to benchmark and find its source, which could be
   a Python script, TensorFlow SavedModel from https://tfhub.dev/, TensorFlow
   Lite FlatBuffer, or some other format with a supported path into IREE. The
   model can optionally include trained weights if those are important for
   benchmarking.

2. If this is a TFLite Flatbuffer or a TensorFlow SavedModel, the benchmark flow
   can automatically import it into the corresponding MLIR file. Make sure the
   TFLite Flatbuffer ends with `.tflite` and TensorFlow SavedModel ends with
   `tf-model`. Otherwise, manually import the model into an MLIR file that IREE
   can compile using the corresponding import tool. Take notes for where the
   model came from and how it was imported in case the MLIR file needs to be
   regenerated in the future.

3. Package the source model or imported MLIR file file(s) for storage (see
   [iree_mlir_benchmark_suite.cmake](../build_tools/cmake/iree_mlir_benchmark_suite.cmake)
   and [download_file.py](../scripts/download_file.py)), then upload them to the
   `iree-model-artifacts` Google Cloud Storage bucket with the help of a team
   member. Files currently hosted in that bucket can be viewed at
   https://storage.googleapis.com/iree-model-artifacts/index.html.

4. Edit the appropriate `CMakeLists.txt` file under this directory to include
   your desired benchmark configuration with the `iree_mlir_benchmark_suite`
   function. You can test your change by running the
   https://buildkite.com/iree/iree-benchmark pipeline on a GitHub pull request
   with the `buildkite:benchmark-*` label.

5. Once your changes are merged to the `main` branch, results will start to
   appear on the benchmarks dashboard at https://perf.iree.dev.

### Other project metrics

TODO(#6161): Collect metrics for miscellaneous IREE system states

## Developer notes

These are ad-hoc notes added for developers to help triage errors.

### Repro of TFLite model errors

These steps help reproduce the failures in TFLite models.

1. Install `iree-import-tflite`.
   ```
   $ python -m pip install iree-tools-tflite -f https://iree-org.github.io/iree/pip-release-links.html
   ```

2. Expose and confirm the binary `iree-import-tflite` is in your path by running
   ```
   $ iree-import-tflite --help
   ```

3. Download the TFLite FlatBuffer for the failing benchmarks. The location can
   be found from [this CMakeLists.txt file](./TFLite/CMakeLists.txt).

4. Import the TFLite model into MLIR format using:
   ```
   $ iree-import-tflite <tflite-file> -o <mlir-output-file>
   ```

5. Then compile the input MLIR file with `iree-compile`. The exact flags used
   to compile and run the benchmarks can be found in
   [this CMakeLists.txt file](./TFLite/CMakeLists.txt).

### Running benchmark suites locally

First you need to have [`iree-import-tflite`](https://iree-org.github.io/iree/getting-started/tflite/),
[`iree-import-tf`](https://iree-org.github.io/iree/getting-started/tensorflow/),
and `requests` in your python environment. Then you can build the target
`iree-benchmark-suites` to generate the required files:

```sh
// Assume your IREE build directory is $IREE_BUILD_DIR.

cmake --build $IREE_BUILD_DIR --target iree-benchmark-suites
```

Once you built the `iree-benchmark-suites` target, you will have a
`benchmark-suites` directory under `$IREE_BUILD_DIR`. You can then use
`run_benchmarks_on_android.py` or `run_benchmarks_on_linux.py` scripts under
`build_tools/benchmarks` to run the benchmark suites. For example:

```sh
build_tools/benchmarks/run_benchmarks_on_linux.py \
  --normal_benchmark_tool_dir=$IREE_BUILD_DIR/tools \
  --output results.json $IREE_BUILD_DIR
```

The benchmark results will be saved in `results.json`. You can use
`build_tools/benchmarks/diff_local_benchmarks.py` script to compare two local
benchmark results and generate the report. More details can be found
[here](/build_tools/benchmarks/README.md).

#### Importing the models only

If you want to run custom benchmarks or do other work with the imported models,
without compiling the full benchmarks suites. You can run the following command
to get the imported `.mlir` files.

```sh
cmake --build $IREE_BUILD_DIR --target iree-benchmark-import-models
```
