save dnn model into database
This commit is contained in:
parent
c37ef9c072
commit
25d0838376
|
@ -264,6 +264,8 @@ def clean_logs():
|
||||||
|
|
||||||
@task
|
@task
|
||||||
def lhs_samples(count=10):
|
def lhs_samples(count=10):
|
||||||
|
if not os.path.exists(CONF['lhs_save_path']):
|
||||||
|
os.makedirs(CONF['lhs_save_path'])
|
||||||
cmd = 'python3 lhs.py {} {} {}'.format(count, CONF['lhs_knob_path'], CONF['lhs_save_path'])
|
cmd = 'python3 lhs.py {} {} {}'.format(count, CONF['lhs_knob_path'], CONF['lhs_save_path'])
|
||||||
local(cmd)
|
local(cmd)
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ Created on Sep 16, 2019
|
||||||
@author: Bohan Zhang
|
@author: Bohan Zhang
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
import pickle
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import tensorflow as tf
|
import tensorflow as tf
|
||||||
from tensorflow import keras
|
from tensorflow import keras
|
||||||
|
@ -28,7 +29,6 @@ class NeuralNet(object):
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
n_input,
|
n_input,
|
||||||
weights_file,
|
|
||||||
learning_rate=0.01,
|
learning_rate=0.01,
|
||||||
debug=False,
|
debug=False,
|
||||||
debug_interval=100,
|
debug_interval=100,
|
||||||
|
@ -36,9 +36,6 @@ class NeuralNet(object):
|
||||||
explore_iters=500,
|
explore_iters=500,
|
||||||
noise_scale_begin=0.1,
|
noise_scale_begin=0.1,
|
||||||
noise_scale_end=0):
|
noise_scale_end=0):
|
||||||
# absolute path for the model weitghs file
|
|
||||||
# one model for each (project, session)
|
|
||||||
self.weights_file = weights_file
|
|
||||||
|
|
||||||
self.history = None
|
self.history = None
|
||||||
self.recommend_iters = 0
|
self.recommend_iters = 0
|
||||||
|
@ -58,7 +55,6 @@ class NeuralNet(object):
|
||||||
layers.Dense(64, activation=tf.nn.relu),
|
layers.Dense(64, activation=tf.nn.relu),
|
||||||
layers.Dense(1)
|
layers.Dense(1)
|
||||||
])
|
])
|
||||||
self.load_weights()
|
|
||||||
self.model.compile(loss='mean_squared_error',
|
self.model.compile(loss='mean_squared_error',
|
||||||
optimizer=self.optimizer,
|
optimizer=self.optimizer,
|
||||||
metrics=['mean_squared_error', 'mean_absolute_error'])
|
metrics=['mean_squared_error', 'mean_absolute_error'])
|
||||||
|
@ -66,17 +62,28 @@ class NeuralNet(object):
|
||||||
self.ops = {}
|
self.ops = {}
|
||||||
self.build_graph()
|
self.build_graph()
|
||||||
|
|
||||||
def save_weights(self):
|
def save_weights(self, weights_file):
|
||||||
self.model.save_weights(self.weights_file)
|
self.model.save_weights(weights_file)
|
||||||
|
|
||||||
def load_weights(self):
|
def load_weights(self, weights_file):
|
||||||
try:
|
try:
|
||||||
self.model.load_weights(self.weights_file)
|
self.model.load_weights(weights_file)
|
||||||
if self.debug:
|
if self.debug:
|
||||||
LOG.info('Neural Network Model weights file exists, load weights from the file')
|
LOG.info('Neural Network Model weights file exists, load weights from the file')
|
||||||
except Exception: # pylint: disable=broad-except
|
except Exception: # pylint: disable=broad-except
|
||||||
LOG.info('Weights file does not match neural network model, train model from scratch')
|
LOG.info('Weights file does not match neural network model, train model from scratch')
|
||||||
|
|
||||||
|
def get_weights_bin(self):
|
||||||
|
return pickle.dumps(self.model.get_weights())
|
||||||
|
|
||||||
|
def set_weights_bin(self, weights):
|
||||||
|
try:
|
||||||
|
self.model.set_weights(pickle.loads(weights))
|
||||||
|
if self.debug:
|
||||||
|
LOG.info('Neural Network Model weights exists, load the existing weights')
|
||||||
|
except Exception: # pylint: disable=broad-except
|
||||||
|
LOG.info('Weights does not match neural network model, train model from scratch')
|
||||||
|
|
||||||
# Build same neural network as self.model, But input X is variables,
|
# Build same neural network as self.model, But input X is variables,
|
||||||
# weights are placedholders. Find optimial X using gradient descent.
|
# weights are placedholders. Find optimial X using gradient descent.
|
||||||
def build_graph(self):
|
def build_graph(self):
|
||||||
|
@ -109,8 +116,6 @@ class NeuralNet(object):
|
||||||
def fit(self, X_train, y_train, fit_epochs=500):
|
def fit(self, X_train, y_train, fit_epochs=500):
|
||||||
self.history = self.model.fit(
|
self.history = self.model.fit(
|
||||||
X_train, y_train, epochs=fit_epochs, verbose=0)
|
X_train, y_train, epochs=fit_epochs, verbose=0)
|
||||||
# save model weights
|
|
||||||
self.save_weights()
|
|
||||||
if self.debug:
|
if self.debug:
|
||||||
mse = self.history.history['mean_squared_error']
|
mse = self.history.history['mean_squared_error']
|
||||||
i = 0
|
i = 0
|
||||||
|
|
|
@ -188,6 +188,7 @@ class Migration(migrations.Migration):
|
||||||
('ddpg_actor_model', models.BinaryField(null=True, blank=True)),
|
('ddpg_actor_model', models.BinaryField(null=True, blank=True)),
|
||||||
('ddpg_critic_model', models.BinaryField(null=True, blank=True)),
|
('ddpg_critic_model', models.BinaryField(null=True, blank=True)),
|
||||||
('ddpg_reply_memory', models.BinaryField(null=True, blank=True)),
|
('ddpg_reply_memory', models.BinaryField(null=True, blank=True)),
|
||||||
|
('dnn_model', models.BinaryField(null=True, blank=True)),
|
||||||
('creation_time', models.DateTimeField()),
|
('creation_time', models.DateTimeField()),
|
||||||
('last_update', models.DateTimeField()),
|
('last_update', models.DateTimeField()),
|
||||||
('upload_code', models.CharField(max_length=30, unique=True)),
|
('upload_code', models.CharField(max_length=30, unique=True)),
|
||||||
|
|
|
@ -191,6 +191,7 @@ class Session(BaseModel):
|
||||||
ddpg_actor_model = models.BinaryField(null=True, blank=True)
|
ddpg_actor_model = models.BinaryField(null=True, blank=True)
|
||||||
ddpg_critic_model = models.BinaryField(null=True, blank=True)
|
ddpg_critic_model = models.BinaryField(null=True, blank=True)
|
||||||
ddpg_reply_memory = models.BinaryField(null=True, blank=True)
|
ddpg_reply_memory = models.BinaryField(null=True, blank=True)
|
||||||
|
dnn_model = models.BinaryField(null=True, blank=True)
|
||||||
|
|
||||||
project = models.ForeignKey(Project)
|
project = models.ForeignKey(Project)
|
||||||
creation_time = models.DateTimeField()
|
creation_time = models.DateTimeField()
|
||||||
|
|
|
@ -33,9 +33,6 @@ CONFIG_DIR = join(PROJECT_ROOT, 'config')
|
||||||
# Where the log files are stored
|
# Where the log files are stored
|
||||||
LOG_DIR = join(PROJECT_ROOT, 'log')
|
LOG_DIR = join(PROJECT_ROOT, 'log')
|
||||||
|
|
||||||
# Where the model weight files are stored
|
|
||||||
MODEL_DIR = join(PROJECT_ROOT, 'model')
|
|
||||||
|
|
||||||
# File/directory upload permissions
|
# File/directory upload permissions
|
||||||
FILE_UPLOAD_DIRECTORY_PERMISSIONS = 0o664
|
FILE_UPLOAD_DIRECTORY_PERMISSIONS = 0o664
|
||||||
FILE_UPLOAD_PERMISSIONS = 0o664
|
FILE_UPLOAD_PERMISSIONS = 0o664
|
||||||
|
@ -57,13 +54,6 @@ try:
|
||||||
except OSError: # Invalid permissions
|
except OSError: # Invalid permissions
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Try to create the model directory
|
|
||||||
try:
|
|
||||||
if not exists(MODEL_DIR):
|
|
||||||
os.mkdir(MODEL_DIR)
|
|
||||||
except OSError: # Invalid permissions
|
|
||||||
pass
|
|
||||||
|
|
||||||
# ==============================================
|
# ==============================================
|
||||||
# DEBUG CONFIGURATION
|
# DEBUG CONFIGURATION
|
||||||
# ==============================================
|
# ==============================================
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2017-18, Carnegie Mellon University Database Group
|
# Copyright (c) 2017-18, Carnegie Mellon University Database Group
|
||||||
#
|
#
|
||||||
import os
|
|
||||||
import random
|
import random
|
||||||
import queue
|
import queue
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
@ -37,7 +36,6 @@ from website.settings import (DEFAULT_LENGTH_SCALE, DEFAULT_MAGNITUDE,
|
||||||
DNN_DEBUG, DNN_DEBUG_INTERVAL)
|
DNN_DEBUG, DNN_DEBUG_INTERVAL)
|
||||||
|
|
||||||
from website.settings import INIT_FLIP_PROB, FLIP_PROB_DECAY
|
from website.settings import INIT_FLIP_PROB, FLIP_PROB_DECAY
|
||||||
from website.settings import MODEL_DIR
|
|
||||||
from website.types import VarType
|
from website.types import VarType
|
||||||
|
|
||||||
|
|
||||||
|
@ -543,27 +541,27 @@ def configuration_recommendation(recommendation_input):
|
||||||
except queue.Empty:
|
except queue.Empty:
|
||||||
break
|
break
|
||||||
|
|
||||||
# one model for each (project, session)
|
session = newest_result.session
|
||||||
session = newest_result.session.pk
|
|
||||||
project = newest_result.session.project.pk
|
|
||||||
full_path = os.path.join(MODEL_DIR, 'p' + str(project) + '_s' + str(session) + '_nn.weights')
|
|
||||||
|
|
||||||
res = None
|
res = None
|
||||||
assert algorithm in ['gpr', 'dnn']
|
assert algorithm in ['gpr', 'dnn']
|
||||||
|
|
||||||
if algorithm == 'dnn':
|
if algorithm == 'dnn':
|
||||||
# neural network model
|
# neural network model
|
||||||
model_nn = NeuralNet(weights_file=full_path,
|
model_nn = NeuralNet(n_input=X_samples.shape[1],
|
||||||
n_input=X_samples.shape[1],
|
|
||||||
batch_size=X_samples.shape[0],
|
batch_size=X_samples.shape[0],
|
||||||
explore_iters=DNN_EXPLORE_ITER,
|
explore_iters=DNN_EXPLORE_ITER,
|
||||||
noise_scale_begin=DNN_NOISE_SCALE_BEGIN,
|
noise_scale_begin=DNN_NOISE_SCALE_BEGIN,
|
||||||
noise_scale_end=DNN_NOISE_SCALE_END,
|
noise_scale_end=DNN_NOISE_SCALE_END,
|
||||||
debug=DNN_DEBUG,
|
debug=DNN_DEBUG,
|
||||||
debug_interval=DNN_DEBUG_INTERVAL)
|
debug_interval=DNN_DEBUG_INTERVAL)
|
||||||
|
if session.dnn_model is not None:
|
||||||
|
model_nn.set_weights_bin(session.dnn_model)
|
||||||
model_nn.fit(X_scaled, y_scaled, fit_epochs=DNN_TRAIN_ITER)
|
model_nn.fit(X_scaled, y_scaled, fit_epochs=DNN_TRAIN_ITER)
|
||||||
res = model_nn.recommend(X_samples, X_min, X_max,
|
res = model_nn.recommend(X_samples, X_min, X_max,
|
||||||
explore=DNN_EXPLORE, recommend_epochs=MAX_ITER)
|
explore=DNN_EXPLORE, recommend_epochs=MAX_ITER)
|
||||||
|
session.dnn_model = model_nn.get_weights_bin()
|
||||||
|
session.save()
|
||||||
|
|
||||||
elif algorithm == 'gpr':
|
elif algorithm == 'gpr':
|
||||||
# default gpr model
|
# default gpr model
|
||||||
model = GPRGD(length_scale=DEFAULT_LENGTH_SCALE,
|
model = GPRGD(length_scale=DEFAULT_LENGTH_SCALE,
|
||||||
|
|
Loading…
Reference in New Issue