benchmarking/platforms/platform_base.py (185 lines of code) (raw):
#!/usr/bin/env python
##############################################################################
# Copyright 2017-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
##############################################################################
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import abc
import json
import os
from six import string_types
from utils.custom_logger import getLogger
from utils.utilities import getFilename
class PlatformBase(object):
def __init__(
self,
tempdir,
tgt_dir,
platform_util,
hash_platform_mapping,
device_name_mapping,
):
self.tempdir = tempdir
self.platform = None
self.platform_hash = platform_util.device
self.platform_abi = None
self.platform_os_version = None
self.platform_model = None
self.type = None
self.util = platform_util
self.tgt_dir = tgt_dir
self.hash_platform_mapping = None
self.device_name_mapping = None
if isinstance(hash_platform_mapping, string_types):
# if the user provides filename, we will load it.
try:
with open(hash_platform_mapping) as f:
self.hash_platform_mapping = json.load(f)
except OSError as e:
getLogger().info("OSError: {}".format(e))
except ValueError as e:
getLogger().info("Invalid json: {}".format(e))
else:
# otherwise read from internal
try:
from aibench.specifications.hash_platform_mapping import (
hash_platform_mapping,
)
self.hash_platform_mapping = hash_platform_mapping
except Exception:
pass
if isinstance(device_name_mapping, string_types):
# if the user provides filename, we will load it.
try:
with open(device_name_mapping) as f:
self.device_name_mapping = json.load(f)
except OSError as e:
getLogger().info("OSError: {}".format(e))
except ValueError as e:
getLogger().info("Invalid json: {}".format(e))
else:
# otherwise read from internal
try:
from aibench.specifications.device_name_mapping import (
device_name_mapping,
)
self.device_name_mapping = device_name_mapping
except Exception:
pass
def getType(self):
return self.type
def setPlatform(self, platform):
self.platform = getFilename(platform)
def setPlatformHash(self, platform_hash):
self.platform_hash = platform_hash
if (
self.hash_platform_mapping
and self.platform_hash in self.hash_platform_mapping
):
self.platform = self.hash_platform_mapping[self.platform_hash]
@abc.abstractmethod
def getABI(self):
return self.platform_abi or "null"
@abc.abstractmethod
def getKind(self):
return self.platform
@abc.abstractmethod
def getOS(self):
pass
@abc.abstractmethod
def getName(self):
if self.device_name_mapping and self.getKind() in self.device_name_mapping:
return self.device_name_mapping[self.getKind()]
else:
return "null"
def getMangledName(self):
name = self.platform
if self.platform_hash:
name = name + " ({})".format(self.platform_hash)
return name
def rebootDevice(self):
pass
@abc.abstractmethod
def runBenchmark(self, cmd, *args, **kwargs):
return None, None
@abc.abstractmethod
def preprocess(self, *args, **kwargs):
pass
@abc.abstractmethod
def postprocess(self, *args, **kwargs):
pass
def copyFilesToPlatform(self, files, target_dir=None, copy_files=True):
target_dir = self.tgt_dir if target_dir is None else target_dir
if isinstance(files, string_types):
target_file = os.path.join(target_dir, os.path.basename(files))
if copy_files:
self.util.push(files, target_file)
return target_file
elif isinstance(files, list):
target_files = []
for f in files:
target_files.append(self.copyFilesToPlatform(f, target_dir, copy_files))
return target_files
elif isinstance(files, dict):
d = {}
for f in files:
d[f] = self.copyFilesToPlatform(files[f], target_dir, copy_files)
return d
else:
raise AssertionError("Cannot reach here")
return None
def moveFilesFromPlatform(self, files, target_dir=None):
assert target_dir is not None, "Target directory must be specified."
if isinstance(files, string_types):
basename = os.path.basename(files)
target_file = os.path.join(target_dir, basename)
self.util.pull(files, target_file)
self.util.deleteFile(files)
return target_file
elif isinstance(files, list):
output_files = []
for f in files:
output_files.append(self.moveFilesFromPlatform(f, target_dir))
return output_files
elif isinstance(files, dict):
output_files = {}
for f in files:
output_file = self.moveFilesFromPlatform(files[f], target_dir)
output_files[f] = output_file
return output_files
else:
raise AssertionError("Cannot reach here")
return None
def delFilesFromPlatform(self, files):
if isinstance(files, string_types):
self.util.deleteFile(files)
elif isinstance(files, list):
for f in files:
self.util.deleteFile(f)
elif isinstance(files, dict):
for f in files:
self.util.deleteFile(files[f])
else:
raise AssertionError("Cannot reach here")
def getOutputDir(self):
return self.tgt_dir
@abc.abstractmethod
def killProgram(self, program):
raise AssertionError("kill program is not implemented")
@abc.abstractmethod
def waitForDevice(self):
raise AssertionError("wait for device is not implemented")
@abc.abstractmethod
def currentPower(self):
raise AssertionError("current power is not implemented")
def getPairedArguments(self, cmd):
# do not support position arguments
arguments = {}
i = 0
while i < len(cmd):
entry = cmd[i]
if entry[:2] == "--":
key = entry[2:]
value = cmd[i + 1] if i < len(cmd) - 1 else "true"
if value[:2] == "--":
value = "true"
else:
i = i + 1
arguments[key] = value
elif entry != "{program}":
getLogger().warning("Failed to get argument {}".format(entry[i]))
i = i + 1
return arguments