From adadde87fdad62671fee41b943e2d495ebdae8b1 Mon Sep 17 00:00:00 2001
From: akashk4 <hashim.sharif91@gmail.com>
Date: Sat, 30 Jan 2021 11:03:45 -0600
Subject: [PATCH] Add scripts to run benchmarks

---
 hpvm/test/dnn_benchmarks/scripts/run_dnn.py  | 237 ++++++++++++-------
 hpvm/test/dnn_benchmarks/scripts/run_dnns.py |  26 +-
 2 files changed, 169 insertions(+), 94 deletions(-)

diff --git a/hpvm/test/dnn_benchmarks/scripts/run_dnn.py b/hpvm/test/dnn_benchmarks/scripts/run_dnn.py
index b4e4aa2b2b..db1a5bbb35 100644
--- a/hpvm/test/dnn_benchmarks/scripts/run_dnn.py
+++ b/hpvm/test/dnn_benchmarks/scripts/run_dnn.py
@@ -4,6 +4,10 @@ import sys
 
 binary_dir = "../../../build/tools/hpvm/test/dnn_benchmarks/"
 
+accuracy_file = "final_accuracy"
+profile_file = "profile_data.txt"
+profile_file_prefix = "profile_info_"
+
 temp_file_name = "temp.txt"
 pred_binary_prefix = "test_"
 pred_binary_suffix = "_pred" 
@@ -15,67 +19,141 @@ max_num_runs = 20
 def max_num_configs (config_file):
     num_configs = 0
     with open(config_file, "r") as f:
-    	for line in f:
-    		if "conf" in line:
-    			num_configs = num_configs + 1
+        for line in f:
+            if "conf" in line:
+                num_configs = num_configs + 1
     return (num_configs + 1)
 
 
 def read_and_write_config (config_file, config_num, temp_file):
     config = ""
+    print("--CONFIG FILE: " + config_file)
+    print("--CONFIG NUM: " + str(config_num))
+    print("--TEMP FILE: " + temp_file)
     with open(config_file, "r") as f:
-    	conf = "conf" + str(config_num)
-    	read_config = False
-    	read_first_line = False
-    	for line in f:
-    		if read_first_line == False:
-    			config = config + line
-    			read_first_line = True
-    			continue
-    		if "-----" in line and read_config == True:
-    			read_config = False
-    			config = config + line
-    			break
-    		if read_config == True:
-                        config = config + line
-                        continue
-    		if conf in line:
-    			read_config = True
-    			config = config + "+++++\n"
-    			config = config + line
+        conf = "conf" + str(config_num)
+        read_config = False
+        read_first_line = False
+        for line in f:
+            if read_first_line == False:
+                config = config + line
+                read_first_line = True
+                continue
+            if "-----" in line and read_config == True:
+                read_config = False
+                config = config + line
+                break
+            if read_config == True:
+                config = config + line
+                continue
+            if conf in line:
+                read_config = True
+                config = config + "+++++\n"
+                config = config + line
     print("config: ")
     print(config)
     with open(temp_file, "w") as f:
-    	f.write(config)
-
-
-def predictive_tuning_exec():
-    num_args = len(sys.argv)
-    binary_files = list()
-    arg = 2
-    while arg < num_args:
-    	binary_files.append(sys.argv[arg])
-    	arg = arg + 1
-
-    for dnn_name in binary_files:
-    	dnn_dir = "../benchmarks/" + dnn_name
-    	binary_name = binary_dir + pred_binary_prefix + dnn_name + pred_binary_suffix
-    	pred_dir = dnn_dir + "/predictive"
-    	config_file = pred_dir + "/" + dnn_name + ".txt"
-    	temp_file = pred_dir + "/" + temp_file_name
-    	print("dnn_dir: " + dnn_dir)
-    	print("binary name: " + binary_name)
-    	print("pred_dir: " + pred_dir)
-    	print("config_file: " + config_file)
-    	print("temp_file: " + temp_file)
-    	config_num = 1
-    	max_configs = max_num_configs(config_file)
-    	while config_num < max_configs:
-    		read_and_write_config(config_file, config_num, temp_file)
-    		exec_command = binary_name
-    		print(exec_command) 
-    		os.system(exec_command)
-    		config_num = config_num + 1
+        f.write(config)
+
+
+def get_avg_exec_time(profile_file_path, config_num):
+    prof_file = profile_file_path + profile_file_prefix + str(config_num) + ".txt"
+    print("PROFILE FILE: " + prof_file)
+    with open(prof_file, "r") as f:
+            for line in f:
+                if "Total Time" in line:
+                    print("LINE: " + line)
+                    time = line.strip().split() [3]
+                    print("TIME: " + time)
+                    return float(time)
+    print("ERROR")
+    sys.exit()
+    return float(-1)
+
+def get_exec_time(config_file):
+    print("CONFIG FILE: " + config_file)
+    with open(config_file, "r") as f:
+        for line in f:
+            if "conf" in line:
+                print("LINE: " + line)
+                time = line.strip().split() [1]
+                print("TIME: " + time)
+                return float(time)
+    print("ERROR")
+    sys.exit()
+    return float(-1)
+
+def get_avg_exec_accuracy(file_name):
+    with open(file_name, "r") as f:
+        for line in f:
+            accuracy = line.strip().split() [0]
+            print("ACCURACY: " + accuracy)
+            return float(accuracy)
+    print("ERROR")
+    sys.exit()
+    return float(-1)
+
+def get_exec_accuracy(config_file):
+    with open(config_file, "r") as f:
+        for line in f:
+            if "conf" in line:
+                print("LINE: " + line)
+                acc = line.strip().split() [4]
+                print("ACCURACY: " + acc)
+                return float(acc)
+    print("ERROR")
+    sys.exit()
+    return float(-1)
+
+def predictive_tuning_exec(dnn_name):
+    #num_args = len(sys.argv)
+    #binary_files = list()
+    #arg = 2
+    #while arg < num_args:
+    #    binary_files.append(sys.argv[arg])
+    #    arg = arg + 1
+
+    #for dnn_name in binary_files:
+    dnn_dir = "../benchmarks/" + dnn_name
+    binary_name = binary_dir + pred_binary_prefix + dnn_name + pred_binary_suffix
+    pred_dir = dnn_dir + "/predictive/"
+    config_file = pred_dir + dnn_name + ".txt"
+    temp_file = pred_dir + temp_file_name
+    print("dnn_dir: " + dnn_dir)
+    print("binary name: " + binary_name)
+    print("pred_dir: " + pred_dir)
+    print("config_file: " + config_file)
+    print("temp_file: " + temp_file)
+    config_num = 1
+    max_configs = max_num_configs(config_file)
+    baseline_time = 0
+    baseline_acc = 0
+    print("MAX CONFIGS: " + str(max_configs))
+    while config_num < max_configs:
+        read_and_write_config(config_file, config_num, temp_file)
+        exec_command = binary_name
+        print(exec_command) 
+        os.system(exec_command)
+        time = get_avg_exec_time(pred_dir, config_num - 1)
+        acc = get_avg_exec_accuracy(accuracy_file)
+        config_time = get_exec_time(temp_file)
+        config_acc = get_exec_accuracy(temp_file)
+        if config_num == 1:
+            baseline_time = time
+            baseline_acc = acc 
+        else:
+            print("SPEEDUP: ")
+            print(baseline_time/time)
+            print("CONFIG TIME: ")
+            print(config_time)
+            print("ACC LOSS: ")
+            print(baseline_acc - acc)
+            print("CONFIG ACC: ")
+            print(config_acc)
+        config_num = config_num + 1
+    exec_command = "rm " + temp_file + " " + accuracy_file + " " + profile_file + " " + pred_dir + "profile*"
+    print(exec_command)
+    os.system(exec_command)
 
 
 def runtime_tuning_exec():
@@ -87,38 +165,35 @@ def runtime_tuning_exec():
         arg = arg + 1
 
     for dnn_name in binary_files:
-    	binary_dir = "../benchmarks/" + dnn_name
-    	binary_name = binary_dir + rt_binary_suffix
-    	conf_dir = binary_dir + "/data"
-    	print("binary_dir: " + binary_dir)
-    	print("binary name: " + binary_name)
-    	run = 0
-    	while run < max_num_runs:
-    		exec_command = binary_name
-    		print(exec_command)
-    		os.system(exec_command)
-    		exec_command = "/home/nvidia/poll 13"
-    		print(exec_command)
-    		os.system(exec_command)
-    		exec_command = "mv " + conf_dir + "/profile_info_0.txt " + conf_dir + "/profile_info_out-run-" + str(run) + ".txt"
-    		print(exec_command)
-    		os.system(exec_command)
-    		run = run + 1
-    	exec_command = "rm -rf " + conf_dir +  "/run_data"
-    	print(exec_command)
-    	os.system(exec_command)
-    	exec_command = "mkdir " + conf_dir + "/run_data"  
-    	print(exec_command)
-    	os.system(exec_command)  
-    		
+        binary_dir = "../benchmarks/" + dnn_name
+        binary_name = binary_dir + rt_binary_suffix
+        conf_dir = binary_dir + "/data"
+        print("binary_dir: " + binary_dir)
+        print("binary name: " + binary_name)
+        run = 0
+        while run < max_num_runs:
+            exec_command = binary_name
+            print(exec_command)
+            os.system(exec_command)
+            exec_command = "/home/nvidia/poll 13"
+            print(exec_command)
+            os.system(exec_command)
+            exec_command = "mv " + conf_dir + "/profile_info_0.txt " + conf_dir + "/profile_info_out-run-" + str(run) + ".txt"
+            print(exec_command)
+            os.system(exec_command)
+            run = run + 1
+        exec_command = "rm -rf " + conf_dir +  "/run_data"
+        print(exec_command)
+        os.system(exec_command)
+        exec_command = "mkdir " + conf_dir + "/run_data"  
+        print(exec_command)
+        os.system(exec_command)  
+            
 
 
 if __name__ == "__main__":
     if sys.argv[1] == "--runtime_tuning":
-    	runtime_tuning_exec()
-    elif sys.argv[1] == "--predictive_tuning":
-    	predictive_tuning_exec()
+        runtime_tuning_exec()
     else:
-    	print("Error: Use --runtime_tuning or --predictive_tuning flags!")
-    	sys.exit()
+        predictive_tuning_exec(sys.argv[1])
 
diff --git a/hpvm/test/dnn_benchmarks/scripts/run_dnns.py b/hpvm/test/dnn_benchmarks/scripts/run_dnns.py
index 990fd67246..e827f6bc82 100644
--- a/hpvm/test/dnn_benchmarks/scripts/run_dnns.py
+++ b/hpvm/test/dnn_benchmarks/scripts/run_dnns.py
@@ -1,17 +1,17 @@
 import os
 import sys
 
-#dnns = "alexnet alexnet2 vgg16_cifar10 vgg16_cifar100 resnet18 mobilenet lenet_mnist"
-dnns = "alexnet"
+#dnns = ["alexnet", "alexnet2", "vgg16_cifar10", "vgg16_cifar100", "resnet18", "mobilenet", "lenet_mnist"]
+dnns = ["resnet18"]
+
+#if sys.argv[1] == "--runtime":
+#	exec_command = "python3 run_dnn.py" + " --runtime_tuning  "  + dnns
+#	print(exec_command)
+#	os.system(exec_command)
+#else:
+if __name__ == "__main__":
+    for dnn in dnns:
+        exec_command = "python3 run_dnn.py " + dnn 
+        print(exec_command)
+        os.system(exec_command)
 
-if sys.argv[1] == "--runtime":
-	exec_command = "python3 run_dnn.py" + " --runtime_tuning  "  + dnns
-	print(exec_command)
-	os.system(exec_command)
-elif sys.argv[1] == "--predictive":
-	exec_command = "python3 run_dnn.py" + " --predictive_tuning  " + dnns 
-	print(exec_command)
-	os.system(exec_command)
-else:
-	print("Error: Use --runtime_tuning or --predictive_tuning flags!")
-	sys.exit()
-- 
GitLab