From be9307822e637e9d55d5a71d4fc80d5e3bf16811 Mon Sep 17 00:00:00 2001 From: bohanjason Date: Sun, 1 Mar 2020 23:23:20 -0500 Subject: [PATCH] pipeline data view in results --- script/formatting/config/pylintrc | 2 +- .../0010_add_pipeline_data_field.py | 28 ++++++++ server/website/website/models.py | 68 ++++++++++--------- server/website/website/tasks/async_tasks.py | 21 ++++-- .../website/templates/task_status.html | 12 ++++ 5 files changed, 90 insertions(+), 41 deletions(-) create mode 100644 server/website/website/migrations/0010_add_pipeline_data_field.py diff --git a/script/formatting/config/pylintrc b/script/formatting/config/pylintrc index 9a70718..d0d4b14 100644 --- a/script/formatting/config/pylintrc +++ b/script/formatting/config/pylintrc @@ -13,7 +13,7 @@ profile=no # Add files or directories to the blacklist. They should be base names, not # paths. -ignore=CVS,.git,manage.py,0001_initial.py,0002_enable_compression.py,0003_load_initial_data.py,0004_add_lhs.py,0005_add_workload_field.py,0006_session_hyperparameters.py,0007_executiontime.py,0008_change_result_taskids_field.py,0009_change_executiontime_function_field.py,credentials.py,create_knob_settings.py +ignore=CVS,.git,manage.py,0001_initial.py,0002_enable_compression.py,0003_load_initial_data.py,0004_add_lhs.py,0005_add_workload_field.py,0006_session_hyperparameters.py,0007_executiontime.py,0008_change_result_taskids_field.py,0009_change_executiontime_function_field.py,0010_add_pipeline_data_field.py,credentials.py,create_knob_settings.py # ignore-patterns=**/migrations/*.py diff --git a/server/website/website/migrations/0010_add_pipeline_data_field.py b/server/website/website/migrations/0010_add_pipeline_data_field.py new file mode 100644 index 0000000..636a3fa --- /dev/null +++ b/server/website/website/migrations/0010_add_pipeline_data_field.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2020-03-02 03:44 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('website', '0009_change_executiontime_function_field'), + ] + + operations = [ + migrations.AddField( + model_name='result', + name='pipeline_knobs', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, + related_name='pipeline_knobs', to='website.PipelineData'), + ), + migrations.AddField( + model_name='result', + name='pipeline_metrics', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, + related_name='pipeline_metrics', to='website.PipelineData'), + ), + ] diff --git a/server/website/website/models.py b/server/website/website/models.py index 8a30d42..3226815 100644 --- a/server/website/website/models.py +++ b/server/website/website/models.py @@ -423,6 +423,39 @@ class Workload(BaseModel): # hw=hw_id) +class PipelineRunManager(models.Manager): + + def get_latest(self): + return self.all().exclude(end_time=None).first() + + +class PipelineRun(models.Model): + objects = PipelineRunManager() + + start_time = models.DateTimeField() + end_time = models.DateTimeField(null=True) + + def __unicode__(self): + return str(self.pk) + + def __str__(self): + return self.__unicode__() + + class Meta: # pylint: disable=no-init + ordering = ["-id"] + + +class PipelineData(models.Model): + pipeline_run = models.ForeignKey(PipelineRun, verbose_name='group') + task_type = models.IntegerField(choices=PipelineTaskType.choices()) + workload = models.ForeignKey(Workload) + data = models.TextField() + creation_time = models.DateTimeField() + + class Meta: # pylint: disable=no-init + unique_together = ("pipeline_run", "task_type", "workload") + + class ResultManager(models.Manager): def create_result(self, session, dbms, workload, @@ -461,44 +494,13 @@ class Result(BaseModel): observation_time = models.FloatField() task_ids = models.TextField(null=True) next_configuration = models.TextField(null=True) + pipeline_knobs = models.ForeignKey(PipelineData, null=True, related_name='pipeline_knobs') + pipeline_metrics = models.ForeignKey(PipelineData, null=True, related_name='pipeline_metrics') def __unicode__(self): return str(self.pk) -class PipelineRunManager(models.Manager): - - def get_latest(self): - return self.all().exclude(end_time=None).first() - - -class PipelineRun(models.Model): - objects = PipelineRunManager() - - start_time = models.DateTimeField() - end_time = models.DateTimeField(null=True) - - def __unicode__(self): - return str(self.pk) - - def __str__(self): - return self.__unicode__() - - class Meta: # pylint: disable=no-init - ordering = ["-id"] - - -class PipelineData(models.Model): - pipeline_run = models.ForeignKey(PipelineRun, verbose_name='group') - task_type = models.IntegerField(choices=PipelineTaskType.choices()) - workload = models.ForeignKey(Workload) - data = models.TextField() - creation_time = models.DateTimeField() - - class Meta: # pylint: disable=no-init - unique_together = ("pipeline_run", "task_type", "workload") - - class BackupData(BaseModel): result = models.ForeignKey(Result) raw_knobs = models.TextField() diff --git a/server/website/website/tasks/async_tasks.py b/server/website/website/tasks/async_tasks.py index 849ad32..1831ea7 100644 --- a/server/website/website/tasks/async_tasks.py +++ b/server/website/website/tasks/async_tasks.py @@ -485,6 +485,8 @@ def combine_workload(target_data): latest_pipeline_run = PipelineRun.objects.get(pk=target_data['pipeline_run']) session = newest_result.session params = JSONUtil.loads(session.hyperparameters) + pipeline_data_knob = None + pipeline_data_metric = None # Load mapped workload data if target_data['mapped_workload'] is not None: @@ -537,6 +539,11 @@ def combine_workload(target_data): pipeline_run=latest_pipeline_run, workload=mapped_workload, task_type=PipelineTaskType.RANKED_KNOBS) + pipeline_data_knob = ranked_knobs + pipeline_data_metric = PipelineData.objects.get( + pipeline_run=latest_pipeline_run, + workload=mapped_workload, + task_type=PipelineTaskType.PRUNED_METRICS) ranked_knobs = JSONUtil.loads(ranked_knobs.data)[:params['IMPORTANT_KNOB_NUMBER']] ranked_knob_idxs = [i for i, cl in enumerate(X_columnlabels) if cl in ranked_knobs] X_workload = X_workload[:, ranked_knob_idxs] @@ -666,7 +673,7 @@ def combine_workload(target_data): X_max[i] = col_max return X_columnlabels, X_scaler, X_scaled, y_scaled, X_max, X_min,\ - dummy_encoder, constraint_helper + dummy_encoder, constraint_helper, pipeline_data_knob, pipeline_data_metric @shared_task(base=ConfigurationRecommendation, name='configuration_recommendation') @@ -679,20 +686,17 @@ def configuration_recommendation(recommendation_input): params = JSONUtil.loads(session.hyperparameters) if target_data['bad'] is True: - if session.tuning_session == 'randomly_generate': - info = 'Randomly generated' - else: - info = 'WARNING: no training data, the config is generated by LHS' target_data_res = create_and_save_recommendation( recommended_knobs=target_data['config_recommend'], result=newest_result, - status='bad', info=info, + status='bad', info='WARNING: no training data, the config is generated by LHS', pipeline_run=target_data['pipeline_run']) LOG.debug('%s: Skipping configuration recommendation.\nData:\n%s\n\n', AlgorithmType.name(algorithm), target_data) return target_data_res X_columnlabels, X_scaler, X_scaled, y_scaled, X_max, X_min,\ - dummy_encoder, constraint_helper = combine_workload(target_data) + dummy_encoder, constraint_helper, pipeline_knobs,\ + pipeline_metrics = combine_workload(target_data) # FIXME: we should generate more samples and use a smarter sampling technique num_samples = params['NUM_SAMPLES'] @@ -796,6 +800,9 @@ def configuration_recommendation(recommendation_input): best_config = np.maximum(best_config, X_min_inv) conf_map = {k: best_config[i] for i, k in enumerate(X_columnlabels)} + newest_result.pipeline_knobs = pipeline_knobs + newest_result.pipeline_metrics = pipeline_metrics + conf_map_res = create_and_save_recommendation( recommended_knobs=conf_map, result=newest_result, status='good', info='INFO: training data size is {}'.format(X_scaled.shape[0]), diff --git a/server/website/website/templates/task_status.html b/server/website/website/templates/task_status.html index 0ed018e..43b0c5a 100644 --- a/server/website/website/templates/task_status.html +++ b/server/website/website/templates/task_status.html @@ -38,6 +38,18 @@
Total runtime:
{{ total_runtime }} + {% if result.pipeline_knobs %} + +
Ranked Knobs:
+ Ranked Knobs + + {% endif %} + {% if result.pipeline_metrics %} + +
Pruned Metrics:
+
Pruned Metrics + + {% endif %}