# IREE Benchmarks (Legacy)

**We are migrating to the new benchmark suites. Currently IREE benchmark CI
(https://perf.iree.dev) is using the new one for x86_64, CUDA, and all
compilation statistics targets. To reproduce those results, please see the
[docs for IREE new benchmark suites](/docs/developers/developing_iree/benchmark_suites.md)**.

This directory contains configuration definition for IREE's legacy benchmarks
suite.

The https://buildkite.com/iree/iree-benchmark-android Buildkite pipeline has not yet been migrated and runs
Android benchmarks defined here on each commit to the `main` branch and posts
results to the dashboard https://perf.iree.dev. The pipeline also runs on pull
requests with the `buildkite:benchmark-android` 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://openxla.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).

### <a name="run-benchmark-locally"></a> Running benchmark suites locally

First you need to have [`iree-import-tflite`](https://openxla.github.io/iree/getting-started/tflite/),
[`iree-import-tf`](https://openxla.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. Note that this target
requires the `IREE_BUILD_LEGACY_BENCHMARKS` CMake option.

```sh
# Assume your IREE build directory is $IREE_BUILD_DIR and that cmake build was
# configured with `-DIREE_BUILD_LEGACY_BENCHMARKS=On`.

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).

### <a name="collect-compile-stats"></a> Check compilation statistics on benchmark suites locally

Similar to [running benchmarks locally](#run-benchmark-locally), you need to
first build the target `iree-benchmark-suites`. But in addition to
`-DIREE_BUILD_LEGACY_BENCHMARKS=ON`,
`-DIREE_ENABLE_LEGACY_COMPILATION_BENCHMARKS=ON` is also required.
**Note that using [Ninja](https://ninja-build.org/) to build the
project is mandatory**, becuase the tools rely on `.ninja_log` to collect the
compilation time. For example:

```sh
cmake -GNinja -S ${IREE_SOURCE_DIR} -B ${IREE_BUILD_DIR}
  -DCMAKE_BUILD_TYPE=RelWithDebInfo \
   -DCMAKE_C_COMPILER=clang \
   -DCMAKE_CXX_COMPILER=clang++ \
   -DIREE_ENABLE_LLD=ON \
   -DIREE_BUILD_LEGACY_BENCHMARKS=ON \
   -DIREE_ENABLE_LEGACY_COMPILATION_BENCHMARKS=ON
```

Then run the command below to collect the statistics:

```sh
build_tools/benchmarks/collect_compilation_statistics.py \
  legacy \
  --output "compile-stats.json" \
  "${IREE_BUILD_DIR}"
```

Then `build_tools/benchmarks/diff_local_benchmarks.py` can also compare the
compilation statistics. More details can be found
[here](/build_tools/benchmarks/README.md). For example:

```sh
build_tools/benchmarks/diff_local_benchmarks.py \
  --base-compile-stats "compile-stats-before.json" \
  --target-compile-stats "compile-stats-after.json"
```

### 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
```
