From 392f2ba87b2c8e33db159a53c6fba2c3e921f5ee Mon Sep 17 00:00:00 2001 From: Hashim Sharif <hsharif3@tyler.cs.illinois.edu> Date: Sun, 26 Jul 2020 23:40:25 -0500 Subject: [PATCH] Keras: Creating top level class for all Benchmarks --- llvm/projects/keras/src/Benchmark.py | 25 +++ llvm/projects/keras/src/__init__.py | 0 llvm/projects/keras/src/alexnet.py | 280 ++++++++++++++------------- 3 files changed, 169 insertions(+), 136 deletions(-) create mode 100644 llvm/projects/keras/src/Benchmark.py create mode 100644 llvm/projects/keras/src/__init__.py diff --git a/llvm/projects/keras/src/Benchmark.py b/llvm/projects/keras/src/Benchmark.py new file mode 100644 index 0000000000..f37e4de6bc --- /dev/null +++ b/llvm/projects/keras/src/Benchmark.py @@ -0,0 +1,25 @@ + + + +class Benchmark: + + def __init__(self): + return + + def buildModel(self): + return + + def data_preprocess(self): + return + + def trainModel(self): + return + + def inference(self): + return + + def run(self): + return + + + diff --git a/llvm/projects/keras/src/__init__.py b/llvm/projects/keras/src/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/llvm/projects/keras/src/alexnet.py b/llvm/projects/keras/src/alexnet.py index 28bca02e89..d10bfa6b9b 100644 --- a/llvm/projects/keras/src/alexnet.py +++ b/llvm/projects/keras/src/alexnet.py @@ -18,176 +18,182 @@ import struct import keras import numpy as np import os +from Benchmark import Benchmark from frontend.approxhpvm_translator import translate_to_approxhpvm from frontend.weight_utils import dumpCalibrationData from frontend.weight_utils import dumpHPVMToKerasModel -def lr_schedule(epoch): - lrate = 0.001 - if epoch > 20: - lrate = 0.0005 - if epoch > 40: - lrate = 0.0003 - if epoch > 60: - lrate = 0.0001 - if epoch > 80: - lrate = 0.00005 - - return lrate +class AlexNet(Benchmark): -def buildModel(): + def __init__(self): + self.name = "AlexNet" + + + def lr_schedule(self, epoch): + lrate = 0.001 + if epoch > 20: + lrate = 0.0005 + if epoch > 40: + lrate = 0.0003 + if epoch > 60: + lrate = 0.0001 + if epoch > 80: + lrate = 0.00005 - activation_type = "tanh" - weight_decay = 1e-4 - - model = Sequential() - model.add(Conv2D(64, kernel_size=(11, 11), activation=activation_type, - input_shape=(3, 32, 32), padding = 'same', - kernel_regularizer=regularizers.l2(weight_decay) )) - model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2) )) - model.add(Dropout(0.2)) - model.add(Conv2D(192, kernel_size=(5, 5), activation=activation_type, padding = 'same', - kernel_regularizer=regularizers.l2(weight_decay))) - model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2) )) - model.add(Dropout(0.3)) - - model.add(Conv2D(384, kernel_size=(3, 3), activation=activation_type, padding = 'same', - kernel_regularizer=regularizers.l2(weight_decay) )) - model.add(Conv2D(256, kernel_size=(3, 3), activation=activation_type, padding = 'same', - kernel_regularizer=regularizers.l2(weight_decay) )) - model.add(Conv2D(256, kernel_size=(3, 3), activation=activation_type, padding = 'same', - kernel_regularizer=regularizers.l2(weight_decay) )) - model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2) )) - model.add(Dropout(0.4)) - - model.add(Flatten()) - #model.add(Flatten()) - #model.add(Dense(256)) - model.add(Dense(10)) - model.add(Activation('softmax')) - - return model + return lrate -def buildModel_old(): - - model = Sequential() - model.add(Conv2D(128, kernel_size=(3, 3), activation='tanh', input_shape=(3, 32, 32), padding = 'same')) - model.add(Conv2D(256, kernel_size=(3, 3), activation='tanh', padding = 'same')) - model.add(MaxPooling2D(pool_size=(2, 2))) - #model.add(Dropout(0.25)) - - model.add(Conv2D(256, kernel_size=(3, 3), activation='tanh', padding = 'same')) - model.add(MaxPooling2D(pool_size=(2, 2))) - - model.add(Conv2D(256, kernel_size=(3, 3), activation='tanh', padding = 'same')) - model.add(MaxPooling2D(pool_size=(2, 2))) - model.add(Conv2D(256, kernel_size=(3, 3), activation='tanh', padding = 'same')) - model.add(MaxPooling2D(pool_size=(2, 2))) - #model.add(Dropout(0.25)) - - model.add(Flatten()) - #model.add(Flatten()) - model.add(Dense(4096, activation='tanh')) - #model.add(Dropout(0.5)) - model.add(Dense(2048, activation='tanh')) - model.add(Dense(10, activation='tanh')) - model.add(Activation('softmax')) - - return model + def buildModel(self): + activation_type = "tanh" + weight_decay = 1e-4 + model = Sequential() + model.add(Conv2D(64, kernel_size=(11, 11), activation=activation_type, + input_shape=(3, 32, 32), padding = 'same', + kernel_regularizer=regularizers.l2(weight_decay) )) + model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2) )) + model.add(Dropout(0.2)) + model.add(Conv2D(192, kernel_size=(5, 5), activation=activation_type, padding = 'same', + kernel_regularizer=regularizers.l2(weight_decay))) + model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2) )) + model.add(Dropout(0.3)) + model.add(Conv2D(384, kernel_size=(3, 3), activation=activation_type, padding = 'same', + kernel_regularizer=regularizers.l2(weight_decay) )) + model.add(Conv2D(256, kernel_size=(3, 3), activation=activation_type, padding = 'same', + kernel_regularizer=regularizers.l2(weight_decay) )) + model.add(Conv2D(256, kernel_size=(3, 3), activation=activation_type, padding = 'same', + kernel_regularizer=regularizers.l2(weight_decay) )) + model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2) )) + model.add(Dropout(0.4)) + + model.add(Flatten()) + #model.add(Flatten()) + #model.add(Dense(256)) + model.add(Dense(10)) + model.add(Activation('softmax')) + + return model + + + + def buildModel_old(): + + model = Sequential() + model.add(Conv2D(128, kernel_size=(3, 3), activation='tanh', input_shape=(3, 32, 32), padding = 'same')) + model.add(Conv2D(256, kernel_size=(3, 3), activation='tanh', padding = 'same')) + model.add(MaxPooling2D(pool_size=(2, 2))) + #model.add(Dropout(0.25)) + + model.add(Conv2D(256, kernel_size=(3, 3), activation='tanh', padding = 'same')) + model.add(MaxPooling2D(pool_size=(2, 2))) + + model.add(Conv2D(256, kernel_size=(3, 3), activation='tanh', padding = 'same')) + model.add(MaxPooling2D(pool_size=(2, 2))) + model.add(Conv2D(256, kernel_size=(3, 3), activation='tanh', padding = 'same')) + model.add(MaxPooling2D(pool_size=(2, 2))) + #model.add(Dropout(0.25)) + + model.add(Flatten()) + #model.add(Flatten()) + model.add(Dense(4096, activation='tanh')) + #model.add(Dropout(0.5)) + model.add(Dense(2048, activation='tanh')) + model.add(Dense(10, activation='tanh')) + model.add(Activation('softmax')) + + return model -def trainModel(model): - (X_train, Y_train), (X_test, Y_test) = cifar10.load_data() - test_labels = Y_test - train_labels = Y_train - #X_train = X_train.astype('float32') - #X_test = X_test.astype('float32') - X_train = X_train / 255.0 - X_test = X_test / 255.0 - - mean = np.mean(X_train,axis=(0,1,2,3)) - std = np.std(X_train,axis=(0,1,2,3)) - X_train = (X_train-mean)/(std+1e-7) - X_test = (X_test-mean)/(std+1e-7) - - dir_prefix = "/home/hsharif3/Gitlab/hpvm/llvm/projects/hpvm-tensor-rt/model_params/alexnet_cifar10/" - #opt_rms = keras.optimizers.rmsprop(lr=0.001,decay=1e-6) - # Compile the model - model.compile(loss='categorical_crossentropy', - optimizer=Adam(lr=0.0001, decay=1e-6), - #optimizer = opt_rms, - metrics=['accuracy']) + def trainModel(self, model): - #print to_categorical(Y_train, 10) - print (to_categorical(Y_train)) + (X_train, Y_train), (X_test, Y_test) = cifar10.load_data() + test_labels = Y_test + train_labels = Y_train + #X_train = X_train.astype('float32') + #X_test = X_test.astype('float32') + X_train = X_train / 255.0 + X_test = X_test / 255.0 - datagen = ImageDataGenerator( + mean = np.mean(X_train,axis=(0,1,2,3)) + std = np.std(X_train,axis=(0,1,2,3)) + X_train = (X_train-mean)/(std+1e-7) + X_test = (X_test-mean)/(std+1e-7) + + dir_prefix = "/home/hsharif3/Gitlab/hpvm/llvm/projects/hpvm-tensor-rt/model_params/alexnet_cifar10/" + + #opt_rms = keras.optimizers.rmsprop(lr=0.001,decay=1e-6) + # Compile the model + model.compile(loss='categorical_crossentropy', + optimizer=Adam(lr=0.0001, decay=1e-6), + #optimizer = opt_rms, + metrics=['accuracy']) + + #print to_categorical(Y_train, 10) + print (to_categorical(Y_train)) + + + datagen = ImageDataGenerator( rotation_range=15, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True, - ) - datagen.fit(X_train) + ) + datagen.fit(X_train) - - model.fit(X_train, to_categorical(Y_train, 10), - batch_size=128, - shuffle=True, - epochs = 1, - #epochs=100, - validation_data=(X_test, to_categorical(Y_test, 10)), callbacks=[LearningRateScheduler(lr_schedule)]) - - # Evaluate the model - scores = model.evaluate(X_test, to_categorical(Y_test, 10)) - - print('Loss: %.3f' % scores[0]) - print('Accuracy: %.3f' % scores[1]) - print ("*** TRAINED MODEL ****\n") - - #dumpCalibrationData("calibration_data/alexnet_calib.bin", X_train, - # "calibration_data/alexnet_train_labels.bin", train_labels) + model.fit(X_train, to_categorical(Y_train, 10), + batch_size=128, + shuffle=True, + epochs = 1, + #epochs=100, + validation_data=(X_test, to_categorical(Y_test, 10)), callbacks=[LearningRateScheduler(self.lr_schedule)]) + # Evaluate the model + scores = model.evaluate(X_test, to_categorical(Y_test, 10)) - + print('Loss: %.3f' % scores[0]) + print('Accuracy: %.3f' % scores[1]) + print ("*** TRAINED MODEL ****\n") -def reloadKerasModel(model_path): + return model - model = load_model(model_path) - - score = model.evaluate(X_test, to_categorical(Y_test, 10), verbose=0) - print('Test loss2:', score[0]) - print('Test accuracy2:', score[1]) - -def data_preprocess(): + def reloadKerasModel(model_path): - (X_train, Y_train), (X_test, Y_test) = cifar10.load_data() + model = load_model(model_path) + + score = model.evaluate(X_test, to_categorical(Y_test, 10), verbose=0) + print('Test loss2:', score[0]) + print('Test accuracy2:', score[1]) + + + + def data_preprocess(self): + + (X_train, Y_train), (X_test, Y_test) = cifar10.load_data() + + X_train = X_train / 255.0 + X_test = X_test / 255.0 + + mean = np.mean(X_train,axis=(0,1,2,3)) + std = np.std(X_train,axis=(0,1,2,3)) + X_train = (X_train-mean)/(std+1e-7) + X_test = (X_test-mean)/(std+1e-7) + + return X_train, Y_train, X_test, Y_test - X_train = X_train / 255.0 - X_test = X_test / 255.0 - - mean = np.mean(X_train,axis=(0,1,2,3)) - std = np.std(X_train,axis=(0,1,2,3)) - X_train = (X_train-mean)/(std+1e-7) - X_test = (X_test-mean)/(std+1e-7) - return X_train, Y_train, X_test, Y_test - - if __name__ == "__main__": @@ -199,9 +205,11 @@ if __name__ == "__main__": # Changing to NCHW format K.set_image_data_format('channels_first') - model = buildModel() + alexnet = AlexNet() + + model = alexnet.buildModel() - X_train, Y_train, X_test, Y_test = data_preprocess() + X_train, Y_train, X_test, Y_test = alexnet.data_preprocess() reload_dir = "/home/hsharif3/Gitlab/hpvm/llvm/projects/hpvm-tensor-rt/model_params/alexnet_cifar10/" keras_model_file = "alexnet.h5" @@ -212,7 +220,7 @@ if __name__ == "__main__": model = load_model(keras_model_file) if sys.argv[1] == "train": - model = trainModel(model) + model = alexnet.trainModel(model) num_classes = 10 score = model.evaluate(X_test, to_categorical(Y_test, num_classes), verbose=0) @@ -220,7 +228,7 @@ if __name__ == "__main__": if len(sys.argv) > 2 and sys.argv[2] == "frontend": - if sys.argv[1] != "hpvm_reload": + if sys.argv[1] == "keras_reload": print("ERROR: Must load HPVM model to invoke frontend") sys.exit(1) -- GitLab