blob: 00b0fb4050c7316f410c25397702d3daf0ffca80 [file] [log] [blame]
# 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 benchmarks and saves results to a .csv file
Expects a directory structure of:
<root-benchmark-dir>/
└── ./benchmark_model (TFLite benchmark binary)
./iree-benchmark-module (IREE benchmark binary)
├── setup/
├── set_adreno_gpu_scaling_policy.sh
├── set_android_scaling_governor.sh
└── set_pixel6_gpu_scaling_policy.sh
├── test_data/
└── models/
├── tflite/*.tflite
└── iree/
└── <target>/*.vmfb e.g. llvm-cpu, vulkan, cuda.
"""
import argparse
import os
from common.benchmark_runner import *
from common.utils import *
from mobilebert_fp32_commands import *
from mobilebert_int8_commands import *
from simple_commands import *
def benchmark_desktop_cpu(device_name: str,
command_factories: list[BenchmarkCommandFactory],
results_path: str):
benchmarks = []
for factory in command_factories:
benchmarks.extend(factory.generate_benchmark_commands("desktop", "cpu"))
for num_threads in [1, 2, 4, 8]:
for benchmark in benchmarks:
results_array = [
device_name, benchmark.model_name, benchmark.runtime,
benchmark.driver, num_threads
]
benchmark.num_threads = num_threads
results_array.extend(run_command(benchmark))
write_benchmark_result(results_array, results_path)
def benchmark_desktop_gpu(device_name: str,
command_factories: list[BenchmarkCommandFactory],
results_path: str):
benchmarks = []
for factory in command_factories:
benchmarks.extend(factory.generate_benchmark_commands("desktop", "gpu"))
for benchmark in benchmarks:
results_array = [
device_name, benchmark.model_name, benchmark.runtime, benchmark.driver,
benchmark.num_threads
]
results_array.extend(run_command(benchmark))
write_benchmark_result(results_array, results_path)
def benchmark_mobile_cpu(device_name: str,
command_factories: list[BenchmarkCommandFactory],
results_path: str):
benchmarks = []
for factory in command_factories:
benchmarks.extend(factory.generate_benchmark_commands("mobile", "cpu"))
for _, tuple in enumerate([("80", 1), ("C0", 2), ("F0", 4), ("0F", 4),
("FF", 8)]):
taskset = tuple[0]
num_threads = tuple[1]
for benchmark in benchmarks:
results_array = [
device_name, benchmark.model_name, benchmark.runtime,
benchmark.driver, taskset, num_threads
]
benchmark.taskset = taskset
benchmark.num_threads = num_threads
results_array.extend(run_command(benchmark))
write_benchmark_result(results_array, results_path)
def benchmark_mobile_gpu(device_name: str,
command_factories: list[BenchmarkCommandFactory],
results_path: str):
benchmarks = []
for factory in command_factories:
benchmarks.extend(factory.generate_benchmark_commands("mobile", "gpu"))
taskset = "80"
num_threads = 1
for benchmark in benchmarks:
results_array = [
device_name, benchmark.model_name, benchmark.runtime, benchmark.driver,
taskset, num_threads
]
benchmark.taskset = taskset
benchmark.num_threads = num_threads
results_array.extend(run_command(benchmark))
write_benchmark_result(results_array, results_path)
def main(args):
# Create factories for all models to be benchmarked.
command_factory = []
command_factory.append(
MobilebertFP32CommandFactory(args.base_dir, "mobilebert_float_384_gpu"))
command_factory.append(MobilebertInt8CommandFactory(args.base_dir))
command_factory.append(
MobilebertFP32CommandFactory(args.base_dir, "albert_lite_base_squadv1_1"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "mobilenet_v2_1.0_224",
"1x224x224x3xf32"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "mobilenet_v2_224_1.0_uint8",
"1x224x224x3xui8"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "deeplabv3", "1x257x257x3xf32"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "person_detect", "1x96x96x1xi8"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "ssd_mobilenet_v2_static_1.0_int8",
"1x320x320x3xi8"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "resnet_v2_101_1_default_1",
"1x299x299x3xf32"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "ssd_mobilenet_v2_fpnlite_uint8",
"1x320x320x3xui8"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "ssd_mobilenet_v2_fpnlite_fp32",
"1x320x320x3xf32"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "efficientnet_lite0_int8_2",
"1x224x224x3xui8"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "efficientnet_lite0_fp32_2",
"1x224x224x3xf32"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "inception_v4_299_uint8",
"1x299x299x3xui8"))
command_factory.append(
SimpleCommandFactory(args.base_dir, "inception_v4_299_fp32",
"1x299x299x3xf32"))
if args.mode == "desktop":
results_path = os.path.join(args.output_dir, "results.csv")
with open(results_path, "w") as f:
f.write(
"device,model,runtime,driver/delegate,threads,latency (ms),vmhwm (KB),vmrss (KB),rssfile (KB)\n"
)
if not args.disable_cpu:
benchmark_desktop_cpu(args.device_name, command_factory, results_path)
if not args.disable_gpu:
benchmark_desktop_gpu(args.device_name, command_factory, results_path)
else:
assert (args.mode == "mobile")
results_path = os.path.join(args.output_dir, "results.csv")
with open(results_path, "w") as f:
f.write(
"device,model,runtime,driver/delegate,taskset,threads,latency (ms),vmhwm (KB),vmrss (KB),rssfile (KB)\n"
)
if not args.disable_cpu:
benchmark_mobile_cpu(args.device_name, command_factory, results_path)
if not args.disable_gpu:
benchmark_mobile_gpu(args.device_name, command_factory, results_path)
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--device_name",
type=str,
default=None,
help="The name of the device the benchmark is running on e.g. Pixel 6")
parser.add_argument(
"--base_dir",
type=str,
default=None,
help="The directory where all benchmarking artifacts are located.")
parser.add_argument("--output_dir",
type=str,
default=None,
help="The directory to save output artifacts into.")
parser.add_argument(
"--mode",
type=str,
choices=("desktop", "mobile"),
default="desktop",
help="The benchmarking mode to use. If mode is `mobile`, uses tasksets.")
parser.add_argument("--disable_cpu",
action="store_true",
help="Disables running benchmarks on CPU.")
parser.add_argument("--disable_gpu",
action="store_true",
help="Disables running benchmarks on GPU.")
return parser.parse_args()
if __name__ == '__main__':
main(parse_args())