improve UI for visualizing SocGen sessions
This commit is contained in:
parent
97f49bad07
commit
4b0d452719
|
@ -58,6 +58,10 @@ function renderPlot(data, div_id) {
|
||||||
},
|
},
|
||||||
cursor: {show: true, zoom:true, showTooltip:false, clickReset:true}
|
cursor: {show: true, zoom:true, showTooltip:false, clickReset:true}
|
||||||
};
|
};
|
||||||
|
if (data.print_metric.endsWith("DB Time")) {
|
||||||
|
plotoptions.axes.yaxis.max = 20000;
|
||||||
|
}
|
||||||
|
|
||||||
//Render plot
|
//Render plot
|
||||||
$.jqplot(div_id + '_plot', plotdata, plotoptions);
|
$.jqplot(div_id + '_plot', plotdata, plotoptions);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,22 +11,22 @@
|
||||||
<th><input type="checkbox" onClick="toggle(this, 'sessions')" /></th>
|
<th><input type="checkbox" onClick="toggle(this, 'sessions')" /></th>
|
||||||
<th>{{ labels.name }}</th>
|
<th>{{ labels.name }}</th>
|
||||||
<th>{{ labels.dbms }}</th>
|
<th>{{ labels.dbms }}</th>
|
||||||
<th>{{ labels.hardware }}</th>
|
<th>{{ labels.description }}</th>
|
||||||
<th>{{ labels.tuning_session }}</th>
|
<th>{{ labels.result_count }}</th>
|
||||||
<th>{{ labels.algorithm }}</th>
|
<th>{{ labels.algorithm }}</th>
|
||||||
<!-- <th>{{ labels.creation_time }}</th> -->
|
<!-- <th>{{ labels.creation_time }}</th> -->
|
||||||
<th>{{ labels.last_update }}</th>
|
<!-- <th>{{ labels.last_update }}</th> -->
|
||||||
</tr>
|
</tr>
|
||||||
{% for session in sessions %}
|
{% for session in sessions %}
|
||||||
<tr>
|
<tr>
|
||||||
<td style="vertical-align:middle"><input type="checkbox" name="sessions" value="{{ session.pk }}" /></td>
|
<td style="vertical-align:middle"><input type="checkbox" name="sessions" value="{{ session.pk }}" /></td>
|
||||||
<td style="vertical-align:middle"><a href="{% url 'session' project.pk session.pk %}">{{ session.name }}</a></td>
|
<td style="vertical-align:middle"><a href="{% url 'session' project.pk session.pk %}">{{ session.name }}</a></td>
|
||||||
<td style="vertical-align:middle">{{ session.dbms.full_name }}</td>
|
<td style="vertical-align:middle">{{ session.dbms.full_name }}</td>
|
||||||
<td style="vertical-align:middle">{{ session.hardware }}</td>
|
<td style="vertical-align:middle">{{ session.description }}</td>
|
||||||
<td style="vertical-align:middle">{{ session.session_type_name }}</td>
|
<td style="vertical-align:middle">{{ session.result_count }}</td>
|
||||||
<td style="vertical-align:middle">{{ session.algorithm_name }}</td>
|
<td style="vertical-align:middle">{{ session.algorithm_name }}</td>
|
||||||
<!-- <td style="vertical-align:middle">{{ session.creation_time }}</td> -->
|
<!-- <td style="vertical-align:middle">{{ session.creation_time }}</td> -->
|
||||||
<td style="vertical-align:middle">{{ session.last_update }}</td>
|
<!-- td style="vertical-align:middle">{{ session.last_update }}</td> -->
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -16,6 +16,18 @@
|
||||||
<td><div class="text-right">{{ labels.creation_time }}</div></td>
|
<td><div class="text-right">{{ labels.creation_time }}</div></td>
|
||||||
<td>{{ result.creation_time }}</td>
|
<td>{{ result.creation_time }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div class="text-right">{{ labels.observation_start_time }}</div></td>
|
||||||
|
<td>{{ result.observation_start_time }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div class="text-right">{{ labels.observation_end_time }}</div></td>
|
||||||
|
<td>{{ result.observation_end_time }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div class="text-right">{{ labels.observation_time }} seconds</div></td>
|
||||||
|
<td>{{ obs_fmt }}</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><div class="text-right">{{ labels.session }}</div></td>
|
<td><div class="text-right">{{ labels.session }}</div></td>
|
||||||
<td><a href="{% url 'session' project_id session_id %}">{{ result.session.name }}</a></td>
|
<td><a href="{% url 'session' project_id session_id %}">{{ result.session.name }}</a></td>
|
||||||
|
|
|
@ -197,7 +197,7 @@ def delete_project(request):
|
||||||
|
|
||||||
@login_required(login_url=reverse_lazy('login'))
|
@login_required(login_url=reverse_lazy('login'))
|
||||||
def project_sessions_view(request, project_id):
|
def project_sessions_view(request, project_id):
|
||||||
sessions = Session.objects.filter(project=project_id)
|
sessions = Session.objects.filter(project=project_id).order_by('-name')
|
||||||
project = Project.objects.get(pk=project_id)
|
project = Project.objects.get(pk=project_id)
|
||||||
form_labels = Session.get_labels()
|
form_labels = Session.get_labels()
|
||||||
form_labels.update(LabelUtil.style_labels({
|
form_labels.update(LabelUtil.style_labels({
|
||||||
|
@ -205,9 +205,12 @@ def project_sessions_view(request, project_id):
|
||||||
'button_create': 'create a new session',
|
'button_create': 'create a new session',
|
||||||
}))
|
}))
|
||||||
form_labels['title'] = "Your Sessions"
|
form_labels['title'] = "Your Sessions"
|
||||||
|
form_labels['description'] = "description"
|
||||||
|
form_labels['result_count'] = "# result"
|
||||||
for session in sessions:
|
for session in sessions:
|
||||||
session.session_type_name = Session.TUNING_OPTIONS[session.tuning_session]
|
session.session_type_name = Session.TUNING_OPTIONS[session.tuning_session]
|
||||||
session.algorithm_name = AlgorithmType.name(session.algorithm)
|
session.algorithm_name = AlgorithmType.name(session.algorithm)
|
||||||
|
session.result_count = len(Result.objects.filter(session=session))
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
"sessions": sessions,
|
"sessions": sessions,
|
||||||
|
@ -276,7 +279,7 @@ def session_view(request, project_id, session_id):
|
||||||
'workloads': workloads,
|
'workloads': workloads,
|
||||||
'results_per_page': [10, 50, 100, 500, 1000],
|
'results_per_page': [10, 50, 100, 500, 1000],
|
||||||
'default_dbms': session.dbms.key,
|
'default_dbms': session.dbms.key,
|
||||||
'default_results_per_page': 10,
|
'default_results_per_page': 1000,
|
||||||
'default_equidistant': "on",
|
'default_equidistant': "on",
|
||||||
'default_workload': default_workload,
|
'default_workload': default_workload,
|
||||||
'defaultspe': default_confs,
|
'defaultspe': default_confs,
|
||||||
|
@ -439,6 +442,12 @@ def result_view(request, project_id, session_id, result_id):
|
||||||
LOG.exception("Failed to format the next config (type=%s): %s.\n\n%s\n",
|
LOG.exception("Failed to format the next config (type=%s): %s.\n\n%s\n",
|
||||||
type(cfg), cfg, e)
|
type(cfg), cfg, e)
|
||||||
|
|
||||||
|
obs_fmt = target.observation_time
|
||||||
|
if obs_fmt > 60:
|
||||||
|
obs_fmt = '{} minutes'.format(round(obs_fmt / 60., 1))
|
||||||
|
else:
|
||||||
|
obs_fmt = '{} seconds'.format(int(obs_fmt))
|
||||||
|
|
||||||
form_labels = Result.get_labels()
|
form_labels = Result.get_labels()
|
||||||
form_labels.update(LabelUtil.style_labels({
|
form_labels.update(LabelUtil.style_labels({
|
||||||
'status': 'status',
|
'status': 'status',
|
||||||
|
@ -453,7 +462,8 @@ def result_view(request, project_id, session_id, result_id):
|
||||||
'next_conf': next_conf,
|
'next_conf': next_conf,
|
||||||
'labels': form_labels,
|
'labels': form_labels,
|
||||||
'project_id': project_id,
|
'project_id': project_id,
|
||||||
'session_id': session_id
|
'session_id': session_id,
|
||||||
|
'obs_fmt': obs_fmt,
|
||||||
}
|
}
|
||||||
return render(request, 'result.html', context)
|
return render(request, 'result.html', context)
|
||||||
|
|
||||||
|
@ -1059,7 +1069,6 @@ def download_debug_info(request, project_id, session_id): # pylint: disable=unu
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
@login_required(login_url=reverse_lazy('login'))
|
|
||||||
def download_objectives(request, project_id, session_id): # pylint: disable=unused-argument
|
def download_objectives(request, project_id, session_id): # pylint: disable=unused-argument
|
||||||
session = Session.objects.get(pk=session_id)
|
session = Session.objects.get(pk=session_id)
|
||||||
response = HttpResponse(content_type='text/csv')
|
response = HttpResponse(content_type='text/csv')
|
||||||
|
@ -1067,9 +1076,13 @@ def download_objectives(request, project_id, session_id): # pylint: disable=unu
|
||||||
writer = csv.writer(response)
|
writer = csv.writer(response)
|
||||||
|
|
||||||
objectives = target_objectives.get_all(session.dbms.pk)
|
objectives = target_objectives.get_all(session.dbms.pk)
|
||||||
|
requested_metrics = ['global.dba_hist_osstat.iowait_time', 'global.dba_hist_osstat.busy_time',
|
||||||
|
'global.dba_hist_sys_time_model.db cpu']
|
||||||
labels = ['id']
|
labels = ['id']
|
||||||
for objective_name in objectives.keys():
|
for objective_name in objectives.keys():
|
||||||
labels.append(objective_name)
|
labels.append(objective_name)
|
||||||
|
for metric_name in requested_metrics:
|
||||||
|
labels.append(metric_name)
|
||||||
writer.writerow(labels)
|
writer.writerow(labels)
|
||||||
metric_files = MetricData.objects.filter(session=session)
|
metric_files = MetricData.objects.filter(session=session)
|
||||||
row_cnt = 0
|
row_cnt = 0
|
||||||
|
@ -1079,6 +1092,8 @@ def download_objectives(request, project_id, session_id): # pylint: disable=unu
|
||||||
row_data = [str(row_cnt)]
|
row_data = [str(row_cnt)]
|
||||||
for objective_name in objectives.keys():
|
for objective_name in objectives.keys():
|
||||||
row_data.append(metric_data.get(objective_name, -1))
|
row_data.append(metric_data.get(objective_name, -1))
|
||||||
|
for metric_name in requested_metrics:
|
||||||
|
row_data.append(metric_data.get(metric_name, -1))
|
||||||
writer.writerow(row_data)
|
writer.writerow(row_data)
|
||||||
row_cnt += 1
|
row_cnt += 1
|
||||||
return response
|
return response
|
||||||
|
@ -1457,6 +1472,22 @@ def alt_get_info(request, name): # pylint: disable=unused-argument
|
||||||
info['hostname'] = socket.gethostname()
|
info['hostname'] = socket.gethostname()
|
||||||
info['git_commit_hash'] = utils.git_hash()
|
info['git_commit_hash'] = utils.git_hash()
|
||||||
msg = "Successfully retrieved info for '{}'.".format(name)
|
msg = "Successfully retrieved info for '{}'.".format(name)
|
||||||
|
elif name == 'sessions':
|
||||||
|
sessions = Session.objects.filter()
|
||||||
|
for session in sessions:
|
||||||
|
if 'notuning' in session.name:
|
||||||
|
continue
|
||||||
|
results = Result.objects.filter(session=session)
|
||||||
|
if len(results) < 30:
|
||||||
|
continue
|
||||||
|
session_info = {}
|
||||||
|
session_info['name'] = session.name
|
||||||
|
session_info['project'] = session.project.pk
|
||||||
|
session_info['algorithm'] = session.name.split('_')[-2]
|
||||||
|
session_info['target_objective'] = session.target_objective
|
||||||
|
session_info['knob_count'] = int(session.name.split('_')[-1])
|
||||||
|
session_info['vm'] = session.name.split('_')[-3]
|
||||||
|
info[session.pk] = session_info
|
||||||
elif name in app_models.__dict__ and hasattr(app_models.__dict__[name], 'objects'):
|
elif name in app_models.__dict__ and hasattr(app_models.__dict__[name], 'objects'):
|
||||||
data = {k: v[0] for k, v in request.POST.lists()}
|
data = {k: v[0] for k, v in request.POST.lists()}
|
||||||
require_exists = data.pop('require_exists', False)
|
require_exists = data.pop('require_exists', False)
|
||||||
|
@ -1639,6 +1670,7 @@ def alt_create_or_edit_session(request):
|
||||||
session_knobs = data.pop('session_knobs', None)
|
session_knobs = data.pop('session_knobs', None)
|
||||||
disable_others = data.pop('disable_others', False)
|
disable_others = data.pop('disable_others', False)
|
||||||
hyperparams = data.pop('hyperparameters', None)
|
hyperparams = data.pop('hyperparameters', None)
|
||||||
|
description = data.pop('description', None)
|
||||||
return_ddpg_model = data.pop('return_ddpg_model', False)
|
return_ddpg_model = data.pop('return_ddpg_model', False)
|
||||||
ts = now()
|
ts = now()
|
||||||
|
|
||||||
|
@ -1697,6 +1729,9 @@ def alt_create_or_edit_session(request):
|
||||||
session_knobs = JSONUtil.loads(session_knobs)
|
session_knobs = JSONUtil.loads(session_knobs)
|
||||||
SessionKnob.objects.set_knob_min_max_tunability(
|
SessionKnob.objects.set_knob_min_max_tunability(
|
||||||
session, session_knobs, disable_others=disable_others)
|
session, session_knobs, disable_others=disable_others)
|
||||||
|
if description is not None:
|
||||||
|
session.description = description
|
||||||
|
session.save()
|
||||||
|
|
||||||
if hyperparams:
|
if hyperparams:
|
||||||
hyperparams = JSONUtil.loads(hyperparams)
|
hyperparams = JSONUtil.loads(hyperparams)
|
||||||
|
|
Loading…
Reference in New Issue