| # 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()) |