1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#!/usr/bin/python
# Copyright 2011 Google Inc. All Rights Reserved.
"""The experiment runner module."""
import getpass
import os
import time
from utils import command_executer
from utils import logger
from utils.email_sender import EmailSender
from utils.file_utils import FileUtils
import config
from experiment_status import ExperimentStatus
from results_report import HTMLResultsReport
from results_report import TextResultsReport
class ExperimentRunner(object):
"""ExperimentRunner Class."""
STATUS_TIME_DELAY = 30
THREAD_MONITOR_DELAY = 2
def __init__(self, experiment, logger=None, cmd_exec=None):
self._experiment = experiment
self.l = logger or logger.GetLogger(experiment.log_dir)
self._ce = cmd_exec or command_executer.GetCommandExecuter(self.l)
self._terminated = False
if experiment.log_level != "verbose":
self.STATUS_TIME_DELAY = 10
def _Run(self, experiment):
status = ExperimentStatus(experiment)
experiment.Run()
last_status_time = 0
last_status_string = ""
try:
if experiment.log_level != "verbose":
self.l.LogStartDots()
while not experiment.IsComplete():
if last_status_time + self.STATUS_TIME_DELAY < time.time():
last_status_time = time.time()
border = "=============================="
if experiment.log_level == "verbose":
self.l.LogOutput(border)
self.l.LogOutput(status.GetProgressString())
self.l.LogOutput(status.GetStatusString())
self.l.LogOutput(border)
else:
current_status_string = status.GetStatusString()
if (current_status_string != last_status_string):
self.l.LogEndDots()
self.l.LogOutput(border)
self.l.LogOutput(current_status_string)
self.l.LogOutput(border)
last_status_string = current_status_string
else:
self.l.LogAppendDot()
time.sleep(self.THREAD_MONITOR_DELAY)
except KeyboardInterrupt:
self._terminated = True
self.l.LogError("Ctrl-c pressed. Cleaning up...")
experiment.Terminate()
def _PrintTable(self, experiment):
self.l.LogOutput(TextResultsReport(experiment).GetReport())
def _Email(self, experiment):
# Only email by default if a new run was completed.
send_mail = False
for benchmark_run in experiment.benchmark_runs:
if not benchmark_run.cache_hit:
send_mail = True
break
if (not send_mail and not experiment.email_to
or config.GetConfig("no_email")):
return
label_names = []
for label in experiment.labels:
label_names.append(label.name)
subject = "%s: %s" % (experiment.name, " vs. ".join(label_names))
text_report = TextResultsReport(experiment, True).GetReport()
text_report = "<pre style='font-size: 13px'>%s</pre>" % text_report
html_report = HTMLResultsReport(experiment).GetReport()
attachment = EmailSender.Attachment("report.html", html_report)
email_to = [getpass.getuser()] + experiment.email_to
EmailSender().SendEmail(email_to,
subject,
text_report,
attachments=[attachment],
msg_type="html")
def _StoreResults (self, experiment):
if self._terminated:
return
results_directory = experiment.results_directory
FileUtils().RmDir(results_directory)
FileUtils().MkDirP(results_directory)
self.l.LogOutput("Storing experiment file in %s." % results_directory)
experiment_file_path = os.path.join(results_directory,
"experiment.exp")
FileUtils().WriteFile(experiment_file_path, experiment.experiment_file)
self.l.LogOutput("Storing results report in %s." % results_directory)
results_table_path = os.path.join(results_directory, "results.html")
report = HTMLResultsReport(experiment).GetReport()
FileUtils().WriteFile(results_table_path, report)
self.l.LogOutput("Storing results of each benchmark run.")
for benchmark_run in experiment.benchmark_runs:
if benchmark_run.result:
benchmark_run_name = filter(str.isalnum, benchmark_run.name)
benchmark_run_path = os.path.join(results_directory,
benchmark_run_name)
benchmark_run.result.CopyResultsTo(benchmark_run_path)
benchmark_run.result.CleanUp(benchmark_run.benchmark.rm_chroot_tmp)
def Run(self):
self._Run(self._experiment)
self._PrintTable(self._experiment)
if not self._terminated:
self._StoreResults(self._experiment)
self._Email(self._experiment)
class MockExperimentRunner(ExperimentRunner):
"""Mocked ExperimentRunner for testing."""
def __init__(self, experiment):
super(MockExperimentRunner, self).__init__(experiment)
def _Run(self, experiment):
self.l.LogOutput("Would run the following experiment: '%s'." %
experiment.name)
def _PrintTable(self, experiment):
self.l.LogOutput("Would print the experiment table.")
def _Email(self, experiment):
self.l.LogOutput("Would send result email.")
def _StoreResults(self, experiment):
self.l.LogOutput("Would store the results.")
|