benchmarking/platforms/host/host_platform.py (131 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 datetime
import os
import platform
import re
import shlex
import shutil
import socket
import sys
import time
from platforms.host.hdb import HDB
from platforms.platform_base import PlatformBase
from profilers.profilers import getProfilerByUsage
from utils.custom_logger import getLogger
from utils.subprocess_with_logger import processRun, processWait
from utils.utilities import getRunTimeout
class HostPlatform(PlatformBase):
def __init__(self, tempdir, args):
platform_hash = str(socket.gethostname())
if args.platform_sig is not None:
platform_name = str(args.platform_sig)
else:
platform_name = platform.platform() + "-" + self._getProcessorName()
self.tempdir = os.path.join(tempdir, platform_hash)
hdb = HDB(platform_hash, tempdir)
super(HostPlatform, self).__init__(
self.tempdir,
self.tempdir,
hdb,
args.hash_platform_mapping,
args.device_name_mapping,
)
# reset the platform and platform hash
self.setPlatform(platform_name)
self.setPlatformHash(platform_hash)
if os.path.exists(self.tempdir):
shutil.rmtree(self.tempdir)
os.makedirs(self.tempdir, 0o777)
self.type = "host"
def getOS(self):
return "{} {}".format(os.uname().sysname, os.uname().release)
def runBenchmark(self, cmd, *args, **kwargs):
if not isinstance(cmd, list):
cmd = shlex.split(cmd)
platform_args = {}
env = os.environ
if "platform_args" in kwargs:
platform_args = kwargs["platform_args"]
if "env" in platform_args:
customized_env = platform_args["env"]
for k in customized_env:
env[k] = str(customized_env[k])
platform_args["env"] = env
# enable async if profiling was requested
runAsync = False
if "enable_profiling" in platform_args:
runAsync = platform_args["enable_profiling"]
del platform_args["enable_profiling"]
if runAsync and not self._isGPUMachine():
if "env" not in platform_args:
platform_args["env"] = env
platform_args["env"]["GPUMON_CPU_ONLY_MODE"] = "y"
platform_args["async"] = runAsync
profiler_args = {}
if "profiler_args" in platform_args:
profiler_args = platform_args["profiler_args"]
del platform_args["profiler_args"]
# meta is used to store any data about the benchmark run
# that is not the output of the command
meta = {}
if not runAsync:
output, _ = processRun(cmd, **platform_args)
if not output and getRunTimeout():
getLogger().info("Terminating...")
sys.exit(0)
return output, meta
# from_time = datetime.datetime.now()
procAndTimeout, err = processRun(cmd, **platform_args)
if err:
return [], meta
ps, _ = procAndTimeout
# profiler_server = getProfilerByUsage("server", ps.pid)
# if profiler_server:
# profilerServerFuture = profiler_server.start(**profiler_args)
profiler_trace = getProfilerByUsage("trace", ps.pid)
if profiler_trace:
profiler_trace.start(**profiler_args)
platform_args["filter"] = profiler_trace.getFilter()
output, _ = processWait(procAndTimeout, **platform_args)
# if profiler_server:
# profilerRunId = profiler_server.getId(profilerServerFuture)
# meta["profiler_run_id"] = profilerRunId
# self._sleepHost(from_time)
if profiler_trace:
traceryLink = profiler_trace.getLink()
filePathes = profiler_trace.getFilePathes()
meta["tracery_link"] = traceryLink
meta["file_pathes"] = filePathes
return output, meta
def _sleepHost(self, from_time):
# Sleep the host to make sure there is no other process running
# if the duration of process is short
to_time = datetime.datetime.now()
duration = (to_time - from_time).total_seconds()
min_duration = 5
if duration < min_duration * 60:
diff = min_duration * 60 - duration
getLogger().info(
"Sleep for {} - {} = {} seconds".format(
min_duration * 60, duration, diff
)
)
time.sleep(diff)
def _getProcessorName(self):
if platform.system() == "Windows":
return platform.processor()
elif platform.system() == "Darwin":
processor_info, _ = processRun(["sysctl", "-n", "machdep.cpu.brand_string"])
if len(processor_info) > 0:
return processor_info[0].rstrip()
elif platform.system() == "Linux":
processor_info, _ = processRun(["cat", "/proc/cpuinfo"])
if processor_info:
for line in processor_info:
if "model name" in line:
return re.sub(r".*model name.*:", "", line, 1)
return ""
def getOutputDir(self):
out_dir = os.path.join(self.tempdir, "output")
if not os.path.isdir(out_dir):
os.makedirs(out_dir, 0o777)
return out_dir
def _isGPUMachine(self):
fbwhoami_file = "/etc/fbwhoami"
if not os.path.isfile(fbwhoami_file):
return False
with open(fbwhoami_file) as f:
for line in f.readlines():
pair = line.split("=", 1)
if len(pair) == 2 and pair[0] == "SERVER_TYPE":
return "GPU" in pair[1]
return False