#!/bin/bash

# Copyright 2022 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
# Runs SHARK tank using both SHARK-Runtime and IREE-Runtime, producing benchmark
# numbers.
#
# Usage:
#    ./run_shark.sh \
#        --sha <SHA of https://github.com/nod-ai/SHARK.git to pin to> \
#        --pytest-regex e.g. "cpu", "cuda", "cuda and torch". \
#        --driver e.g. "cpu", "cuda", "vulkan" \
#        --save-version-info <true|false> \
#        --iree-source-dir <source directory IREE if a local version is used> \
#        --output-dir <local output dir>

set -xeuo pipefail

export SAVE_VERSION_INFO=false
export BENCHMARK_REGEX="cpu"
export DRIVER="cpu"
export IREE_SOURCE_DIR=""

while [[ "$#" -gt 0 ]]; do
  case $1 in
    --sha)
      SHARK_SHA="$2"
      shift;;
    --pytest-regex)
      BENCHMARK_REGEX="$2"
      shift;;
    -d|--driver)
      DRIVER="$2"
      shift;;
    --save-version-info)
      SAVE_VERSION_INFO="$2"
      shift;;
    -o|--output-dir)
      SHARK_OUTPUT_DIR="$(realpath $2)"
      shift;;
    --iree-source-dir)
      if [[ ! -z "$2" ]]; then
        IREE_SOURCE_DIR="$(realpath $2)"
      fi
      shift;;
    *)
      echo "Unknown parameter passed: $1"
      exit 1;;
esac
shift
done

mkdir "${SHARK_OUTPUT_DIR}"

git clone https://github.com/nod-ai/SHARK.git
pushd SHARK
git reset --hard ${SHARK_SHA}

# Remove existing data.
rm -rf ./shark_tmp
rm -rf ~/.local/shark_tank

declare -a args=(
  --benchmark
  --update_tank
  --maxfail=500
  -k "${BENCHMARK_REGEX}"
)

if [[ ${DRIVER} == "cuda" ]]; then
  args+=(--tf32)
fi

# Run with SHARK-Runtime.
PYTHON=python3.11 VENV_DIR=shark.venv BENCHMARK=1 IMPORTER=1 ./setup_venv.sh
source shark.venv/bin/activate

export SHARK_VERSION=`pip show iree-compiler | grep Version | sed -e "s/^Version: \(.*\)$/\1/g"`
pytest "${args[@]}" tank/test_models.py || true

echo "######################################################"
echo "Benchmarks for SHARK-Runtime Complete"
cat bench_results.csv
mv bench_results.csv "${SHARK_OUTPUT_DIR}/${DRIVER}_shark_${SHARK_VERSION}.csv"
echo "######################################################"
deactivate

# Remove existing data.
rm -rf ./shark_tmp
rm -rf ~/.local/shark_tank

# Run with IREE.
PYTHON=python3.11 VENV_DIR=iree.venv BENCHMARK=1 IMPORTER=1 USE_IREE=1 ./setup_venv.sh
source iree.venv/bin/activate

export IREE_VERSION=$(pip show iree-compiler | grep Version | sed -e "s/^Version: \(.*\)$/\1/g")

if [[ ! -z "${IREE_SOURCE_DIR}" ]]; then
  # `setup_venv.sh` would have installed a nightly release of IREE so we uninstall here.
  pip uninstall -y iree-compiler iree-runtime

  pushd "${IREE_SOURCE_DIR}"

  git submodule update --init
  pip install -r ./runtime/bindings/python/iree/runtime/build_requirements.txt

  export IREE_VERSION="sha_$(git rev-parse --short=10 HEAD)"

  # We build using the same Python Virtual Environment as SHARK to ensure compatibility.
  cmake -GNinja -B iree-build -S . \
      -DCMAKE_BUILD_TYPE=RelWithDebInfo \
      -DIREE_ENABLE_ASSERTIONS=ON \
      -DCMAKE_C_COMPILER=clang \
      -DCMAKE_CXX_COMPILER=clang++ \
      -DIREE_ENABLE_LLD=ON \
      -DIREE_BUILD_PYTHON_BINDINGS=ON \
      -DPython3_EXECUTABLE="$(which python)" \
      -DIREE_HAL_DRIVER_CUDA=ON \
      -DIREE_TARGET_BACKEND_CUDA=ON

  cmake --build iree-build

  # Install Python bindings.
  pushd iree-build
  pip install -e compiler/
  pip install -e runtime/
  popd # iree-build
  popd # ${IREE_SOURCE_DIR}
fi

pytest "${args[@]}" tank/test_models.py || true

echo "######################################################"
echo "Benchmarks for IREE Complete"
cat bench_results.csv
mv bench_results.csv "${SHARK_OUTPUT_DIR}/${DRIVER}_iree_${IREE_VERSION}.csv"
echo "######################################################"

# Save version info.
if [[ "${SAVE_VERSION_INFO}" == true ]]; then
  touch "${SHARK_OUTPUT_DIR}/version_info.txt"
  echo "iree=${IREE_VERSION}" >> "${SHARK_OUTPUT_DIR}/version_info.txt"
  echo "shark=${SHARK_VERSION}" >> "${SHARK_OUTPUT_DIR}/version_info.txt"

  export TF_VERSION=$(pip show tensorflow | grep "Version" | awk '{print $NF}')
  echo "tf=Tensorflow XLA ${TF_VERSION}" >> "${SHARK_OUTPUT_DIR}/version_info.txt"

  export TORCH_VERSION=$(pip show torch | grep "Version" | awk '{print $NF}')
  echo "torch=Torch Inductor ${TORCH_VERSION}" >> "${SHARK_OUTPUT_DIR}/version_info.txt"
fi

deactivate
