From 9ae0b0d1344759dc67ced1417dd16452064b9ab1 Mon Sep 17 00:00:00 2001 From: Hashim Sharif <hsharif3@miranda.cs.illinois.edu> Date: Tue, 23 Mar 2021 20:39:36 -0500 Subject: [PATCH] Fixing paths to Keras h5 files based on new model params location --- hpvm/test/dnn_benchmarks/keras/alexnet.py | 3 +- hpvm/test/dnn_benchmarks/keras/alexnet2.py | 2 +- .../dnn_benchmarks/keras/alexnet_imagenet.py | 2 +- hpvm/test/dnn_benchmarks/keras/lenet.py | 2 +- .../dnn_benchmarks/keras/mobilenet_cifar10.py | 2 +- .../dnn_benchmarks/keras/resnet18_cifar10.py | 2 +- .../dnn_benchmarks/keras/resnet50_imagenet.py | 2 +- .../dnn_benchmarks/keras/test_benchmarks.py | 229 ++++++++++++++++++ .../dnn_benchmarks/keras/vgg16_cifar10.py | 2 +- .../dnn_benchmarks/keras/vgg16_cifar100.py | 2 +- .../dnn_benchmarks/keras/vgg16_imagenet.py | 2 +- 11 files changed, 239 insertions(+), 11 deletions(-) create mode 100644 hpvm/test/dnn_benchmarks/keras/test_benchmarks.py diff --git a/hpvm/test/dnn_benchmarks/keras/alexnet.py b/hpvm/test/dnn_benchmarks/keras/alexnet.py index 7adfd5be5f..86019e80e5 100644 --- a/hpvm/test/dnn_benchmarks/keras/alexnet.py +++ b/hpvm/test/dnn_benchmarks/keras/alexnet.py @@ -143,9 +143,8 @@ if __name__ == '__main__': # *** Below are Parameters specific to each benchmark ***** reload_dir = MODEL_PARAMS_DIR + '/alexnet_cifar10/' ## Either the HPVM weights are loaded (above) or the Keras Model from the path below - keras_model_file = MODEL_PARAMS_DIR + '/alexnet_cifar10/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/alexnet_cifar10.h5' data_dir = 'data/alexnet_cifar10_hpvm/' # if reloading weights, data_dir can be set to empty string (value is ignored) - src_dir = 'src/alexnet_cifar10_src_hpvm/' # Directory where HPVM sources are downloaded num_classes = 10 # Specify num out output classes - CIFAR10 has `10` classes batch_size = 500 # Batch Size set to 500 - Adjust this value based on your GPU memory diff --git a/hpvm/test/dnn_benchmarks/keras/alexnet2.py b/hpvm/test/dnn_benchmarks/keras/alexnet2.py index 447d9d32ad..16bd92b23e 100644 --- a/hpvm/test/dnn_benchmarks/keras/alexnet2.py +++ b/hpvm/test/dnn_benchmarks/keras/alexnet2.py @@ -136,7 +136,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/alexnet2_cifar10/' - keras_model_file = MODEL_PARAMS_DIR + '/alexnet2_cifar10/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/alexnet2_cifar10.h5' data_dir = 'data/alexnet2_cifar10/' src_dir = 'src/alexnet2_cifar10_src/' num_classes = 10 diff --git a/hpvm/test/dnn_benchmarks/keras/alexnet_imagenet.py b/hpvm/test/dnn_benchmarks/keras/alexnet_imagenet.py index 9be1ff648c..9f5bbe12c9 100644 --- a/hpvm/test/dnn_benchmarks/keras/alexnet_imagenet.py +++ b/hpvm/test/dnn_benchmarks/keras/alexnet_imagenet.py @@ -93,7 +93,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/alexnet_imagenet/' - keras_model_file = MODEL_PARAMS_DIR + '/alexnet_imagenet/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/alexnet_imagenet.h5' data_dir = 'data/alexnet_imagenet/' src_dir = 'src/alexnet_imagenet_src/' num_classes = 1000 diff --git a/hpvm/test/dnn_benchmarks/keras/lenet.py b/hpvm/test/dnn_benchmarks/keras/lenet.py index 9de3c28b15..e158d70913 100644 --- a/hpvm/test/dnn_benchmarks/keras/lenet.py +++ b/hpvm/test/dnn_benchmarks/keras/lenet.py @@ -102,7 +102,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/lenet_mnist/' - keras_model_file = MODEL_PARAMS_DIR + '/lenet_mnist/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/lenet_mnist.h5' data_dir = 'data/lenet_mnist/' src_dir = 'src/lenet_mnist_src/' num_classes = 10 diff --git a/hpvm/test/dnn_benchmarks/keras/mobilenet_cifar10.py b/hpvm/test/dnn_benchmarks/keras/mobilenet_cifar10.py index 4987f3235f..83b0444522 100644 --- a/hpvm/test/dnn_benchmarks/keras/mobilenet_cifar10.py +++ b/hpvm/test/dnn_benchmarks/keras/mobilenet_cifar10.py @@ -182,7 +182,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/mobilenet_cifar10/' - keras_model_file = MODEL_PARAMS_DIR + '/mobilenet_cifar10/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/mobilenet_cifar10.h5' data_dir = 'data/mobilenet_cifar10/' src_dir = 'src/mobilenet_cifar10_src/' num_classes = 10 diff --git a/hpvm/test/dnn_benchmarks/keras/resnet18_cifar10.py b/hpvm/test/dnn_benchmarks/keras/resnet18_cifar10.py index 1a77cf1b2c..8ef31e3ff6 100644 --- a/hpvm/test/dnn_benchmarks/keras/resnet18_cifar10.py +++ b/hpvm/test/dnn_benchmarks/keras/resnet18_cifar10.py @@ -554,7 +554,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/resnet18_cifar10/' - keras_model_file = MODEL_PARAMS_DIR + '/resnet18_cifar10/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/resnet18_cifar10.h5' data_dir = 'data/resnet18_cifar10/' src_dir = 'src/resnet18_cifar10_src/' num_classes = 10 diff --git a/hpvm/test/dnn_benchmarks/keras/resnet50_imagenet.py b/hpvm/test/dnn_benchmarks/keras/resnet50_imagenet.py index 6674faffab..c1632750a9 100644 --- a/hpvm/test/dnn_benchmarks/keras/resnet50_imagenet.py +++ b/hpvm/test/dnn_benchmarks/keras/resnet50_imagenet.py @@ -141,7 +141,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/resnet50_imagenet/' - keras_model_file = MODEL_PARAMS_DIR + '/resnet50_imagenet/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/resnet50_imagenet.h5' data_dir = 'data/resnet50_imagenet/' src_dir = 'src/resnet50_imagenet_src/' num_classes = 1000 diff --git a/hpvm/test/dnn_benchmarks/keras/test_benchmarks.py b/hpvm/test/dnn_benchmarks/keras/test_benchmarks.py new file mode 100644 index 0000000000..27fceb44d2 --- /dev/null +++ b/hpvm/test/dnn_benchmarks/keras/test_benchmarks.py @@ -0,0 +1,229 @@ + + +import os +import subprocess + +import site +from pathlib import Path + +import torch +from torch.utils.data.dataloader import DataLoader +from torch.utils.data.dataset import Subset + +#site.addsitedir(Path(__file__).parent.parent.absolute().as_posix()) +#from predtuner import PipedBinaryApp, config_pylogger + + + +class Benchmark: + + def __init__(self, binary_path, test_accuracy): + + self.binary_path = binary_path + self.test_accuracy = test_accuracy + self.epsilon = 0.05 # Adding some slack for accuracy difference + + + def getPath(self): + return self.binary_path + + + def readAccuracy(self, accuracy_file): + + f = open(accuracy_file, "r") # File with final benchmark accuracy + acc_str = f.read() + return float(acc_str) + + + def runKeras(self): + + # Test Bechmark accuracy with pretrained weights (hpvm_relaod) + run_cmd = "python3 " + self.binary_path + " keras_reload " + try: + subprocess.call(run_cmd, shell=True) + except: + return False + + accuracy = self.readAccuracy("final_accuracy") + + print ("accuracy = ", accuracy, " test_accuracy = ", self.test_accuracy) + + test_success = False + if (abs(self.test_accuracy - accuracy) < self.epsilon): + print ("Test for " + self. binary_path + " Passed ") + test_success = True + else: + print ("Test Failed for " + self.binary_path) + test_success = False + + return test_success + + + def runHPVM(self): + + # Test Bechmark accuracy with pretrained weights (hpvm_relaod) + run_cmd = "python3 " + self.binary_path + " keras_reload frontend compile compile_tuner" + try: + subprocess.call(run_cmd, shell=True) + except: + return False + + working_dir = open("working_dir.txt").read() + cur_dir = os.getcwd() + + os.chdir(working_dir) + binary_path = "./HPVM_binary" + + try: + subprocess.call(binary_path, shell=True) + except: + return False + + accuracy = self.readAccuracy("final_accuracy") + print ("accuracy = ", accuracy, " test_accuracy = ", self.test_accuracy) + + test_success = False + if (abs(self.test_accuracy - accuracy) < self.epsilon): + print ("Test for " + self. binary_path + " Passed ") + test_success = True + else: + print ("Test Failed for " + self.binary_path) + test_success = False + + os.chdir(cur_dir) # Change back to original working directory + + return test_success + + +""" + def runApproxTuner(self): + + working_dir = open("working_dir.txt").read() + cur_dir = os.getcwd() + + os.chdir(working_dir) + binary_path = "./HPVM_tuner_binary" + + full_binary_path = str(cur_dir) + "/" + working_dir + "/" + binary_path + full_json_path = str(cur_dir) + "/" + working_dir + "/tuner.json" + + app = PipedBinaryApp("TestHPVMApp", full_binary_path, full_json_path) + # Tuning procedure is exactly the same as that for PyTorch DNN. + # Please refer to `./tune_vgg16_cifar10.py` for details. + tuner = app.get_tuner() + tuner.tune(5000, 3.0, 3.0, True, 50, cost_model="cost_linear", qos_model="qos_p1") + + tuner.dump_configs("configs.json") + fig = tuner.plot_configs(show_qos_loss=True) + fig.savefig("configs.png", dpi=300) + app.dump_hpvm_configs(tuner.best_configs, "hpvm_confs.txt") + + os.chdir(cur_dir) # Change back to original working directory +""" + + + +class BenchmarkTests: + + def __init__(self): + + self.benchmarks = [] + self.passed_tests = [] + self.failed_tests = [] + self.passed_hpvm_tests = [] + self.failed_hpvm_tests = [] + + + def addBenchmark(self, benchmark): + + self.benchmarks.append(benchmark) + + + def runKerasTests(self): + + for benchmark in self.benchmarks: + test_success = benchmark.runKeras() + + if not test_success: + self.failed_tests.append(benchmark.getPath()) + else: + self.passed_tests.append(benchmark.getPath()) + + + def runHPVMTests(self): + + for benchmark in self.benchmarks: + test_success = benchmark.runHPVM() + + if not test_success: + self.failed_hpvm_tests.append(benchmark.getPath()) + else: + self.passed_hpvm_tests.append(benchmark.getPath()) + + + def printKerasSummary(self): + + failed_test_count = len(self.failed_tests) + passed_test_count = len(self.passed_tests) + + print (" Tests Passed = " + str(passed_test_count) + " / " + str(len(self.benchmarks))) + print ("******* Passed Tests ** \n") + for passed_test in self.passed_tests: + print ("Passed: " + passed_test) + + print (" Tests Failed = " + str(failed_test_count) + " / " + str(len(self.benchmarks))) + print ("****** Failed Tests *** \n") + for failed_test in self.failed_tests: + print ("Failed: " + failed_test) + + + def printHPVMSummary(self): + + failed_test_count = len(self.failed_hpvm_tests) + passed_test_count = len(self.passed_hpvm_tests) + + print (" Tests Passed = " + str(passed_test_count) + " / " + str(len(self.benchmarks))) + print ("******* Passed Tests ** \n") + for passed_test in self.passed_hpvm_tests: + print ("Passed: " + passed_test) + + print (" Tests Failed = " + str(failed_test_count) + " / " + str(len(self.benchmarks))) + print ("****** Failed Tests *** \n") + for failed_test in self.failed_hpvm_tests: + print ("Failed: " + failed_test) + + + + +if __name__ == "__main__": + + testMgr = BenchmarkTests() + AlexNet = Benchmark("alexnet.py", 79.28) + AlexNet_ImageNet = Benchmark("alexnet_imagenet.py", 56.30) + AlexNet2 = Benchmark("alexnet2.py", 84.98) + LeNet = Benchmark("lenet.py", 98.70) + MobileNet = Benchmark("mobilenet_cifar10.py", 84.42) + ResNet18 = Benchmark("resnet18_cifar10.py", 89.56) + ResNet50 = Benchmark("resnet50_imagenet.py", 75.10) + VGG16_cifar10 = Benchmark("vgg16_cifar10.py", 89.96) + VGG16_cifar100 = Benchmark("vgg16_cifar100.py", 66.50) + VGG16_ImageNet = Benchmark("vgg16_imagenet.py", 69.46) + + testMgr.addBenchmark(AlexNet) + #testMgr.addBenchmark(AlexNet_ImageNet) + testMgr.addBenchmark(AlexNet2) + testMgr.addBenchmark(LeNet) + testMgr.addBenchmark(MobileNet) + testMgr.addBenchmark(ResNet18) + #testMgr.addBenchmark(ResNet50) + testMgr.addBenchmark(VGG16_cifar10) + testMgr.addBenchmark(VGG16_cifar100) + #testMgr.addBenchmark(VGG16_ImageNet) + + #testMgr.runKerasTests() + #testMgr.printKerasSummary() + + testMgr.runHPVMTests() + testMgr.printHPVMSummary() + + diff --git a/hpvm/test/dnn_benchmarks/keras/vgg16_cifar10.py b/hpvm/test/dnn_benchmarks/keras/vgg16_cifar10.py index 53207a039c..9f298ebfa6 100644 --- a/hpvm/test/dnn_benchmarks/keras/vgg16_cifar10.py +++ b/hpvm/test/dnn_benchmarks/keras/vgg16_cifar10.py @@ -184,7 +184,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/vgg16_cifar10/' - keras_model_file = MODEL_PARAMS_DIR + '/vgg16_cifar10/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/vgg16_cifar10.h5' data_dir = 'data/vgg16_cifar10/' src_dir = 'src/vgg16_cifar10_src/' num_classes = 10 diff --git a/hpvm/test/dnn_benchmarks/keras/vgg16_cifar100.py b/hpvm/test/dnn_benchmarks/keras/vgg16_cifar100.py index 6fcfd3249e..4f6168d0f0 100644 --- a/hpvm/test/dnn_benchmarks/keras/vgg16_cifar100.py +++ b/hpvm/test/dnn_benchmarks/keras/vgg16_cifar100.py @@ -199,7 +199,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/vgg16_cifar100/' - keras_model_file = MODEL_PARAMS_DIR + '/vgg16_cifar100/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/vgg16_cifar100.h5' data_dir = 'data/vgg16_cifar100/' src_dir = 'src/vgg16_cifar100_src/' num_classes = 100 diff --git a/hpvm/test/dnn_benchmarks/keras/vgg16_imagenet.py b/hpvm/test/dnn_benchmarks/keras/vgg16_imagenet.py index a881d2340f..c84b429407 100644 --- a/hpvm/test/dnn_benchmarks/keras/vgg16_imagenet.py +++ b/hpvm/test/dnn_benchmarks/keras/vgg16_imagenet.py @@ -126,7 +126,7 @@ if __name__ == '__main__': ### Parameters specific to each benchmark reload_dir = MODEL_PARAMS_DIR + '/vgg16_imagenet/' - keras_model_file = MODEL_PARAMS_DIR + '/vgg16_imagenet/model.h5' + keras_model_file = MODEL_PARAMS_DIR + '/keras/vgg16_imagenet.h5' data_dir = 'data/vgg16_imagenet/' src_dir = 'src/vgg16_imagenet_src/' num_classes = 1000 -- GitLab