Browse Source

Script to run all experiments

Sajin 1 year ago
parent
commit
7a5733f7e4
2 changed files with 157 additions and 142 deletions
  1. 54 0
      run_all_experiments.py
  2. 103 142
      run_experiments.py

+ 54 - 0
run_all_experiments.py

@@ -0,0 +1,54 @@
+#!/usr/bin/python3
+'''
+  NOTE: This script is tailored for a machine with 2 40-core processors.
+  Currently assumes 8 threads (C36-39,76-79) are set aside for client
+  simulator; change this by setting "prefix" in Client/clientlaunch and
+  the -t option to clientlaunch below.
+  Similarly, the use of cores C0-35,40-75 for the TEEMS servers can be
+  changed in the gen_manifest.py program.
+  If you have a different number of cores available for servers, also
+  change M_MAX below.
+'''
+from run_experiments import run_exp
+
+LOG_FOLDER = "Experiments/"
+
+NUM_EPOCHS = 10
+PRIV_OUT = 1
+PRIV_IN = 1
+PUB_OUT = 1
+PUB_IN = 1
+# B = message size (bytes)
+B = 256
+
+## Figure 7 Public
+PRIVATE_ROUTE = False
+N = [1<<15, 1<<16, 1<<17, 1<<18, 1<<19, 1<<20]
+M = [4]
+T = [4]
+
+run_exp(LOG_FOLDER, PRIVATE_ROUTE, NUM_EPOCHS, N, M, T, B, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
+
+## Figure 8 Public
+PRIVATE_ROUTE = False
+N = [1<<20]
+M = [72, 64, 48, 36, 32, 24, 16, 8, 4, 2, 1]
+T = [1]
+
+run_exp(LOG_FOLDER, PRIVATE_ROUTE, NUM_EPOCHS, N, M, T, B, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
+
+## Figure 7 Private
+PRIVATE_ROUTE = True
+N = [1<<15, 1<<16, 1<<17, 1<<18, 1<<19, 1<<20]
+M = [4]
+T = [4]
+
+run_exp(LOG_FOLDER, PRIVATE_ROUTE, NUM_EPOCHS, N, M, T, B, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
+
+## Figure 8 Private
+PRIVATE_ROUTE = True
+N = [1<<20]
+M = [72, 64, 48, 36, 32, 24, 16, 8, 4, 2, 1]
+T = [1]
+
+run_exp(LOG_FOLDER, PRIVATE_ROUTE, NUM_EPOCHS, N, M, T, B, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)

+ 103 - 142
run_experiments.py

@@ -24,48 +24,7 @@ from logs_to_csv import parse_output_logs
 
 # CONFIGS TO SET:
 
-MANIFEST_FILE = "App/manifest.yaml"
-LOG_FOLDER = "Test/"
-
-NUM_EPOCHS = 10
-PRIVATE_ROUTE = False
-PRIV_OUT = 1
-PRIV_IN = 1
-PUB_OUT = 1
-PUB_IN = 1
-
-# N = number of clients
-# M = number of servers
-# T = threads per server instance
-
-## A large grid of many combinations
-# N = [1<<16, 1<<17, 1<<18, 1<<19, 1<<20]
-# M = [72, 64, 48, 36, 32, 24, 16, 8, 4, 2, 1]
-# T = [16, 8, 4, 2, 1]
-
-## Figure 7
-#N = [1<<15, 1<<16, 1<<17, 1<<18, 1<<19, 1<<20]
-#M = [4]
-#T = [4]
-
-## Figure 8
-N = [1<<20]
-M = [72, 64, 48, 36, 32, 24, 16, 8, 4, 2, 1]
-T = [1]
-
-# Max servers depending on number of threads (assuming 72 available
-# cores for servers)
-M_MAX = {
-    1:72,
-    2:36,
-    4:18,
-    8:9,
-    16:4
-}
-
-# B = message size (bytes)
-B = 256
-NUM_DIAGNOSTIC_EPOCHS = 4
+# NUM_DIAGNOSTIC_EPOCHS = 4
 
 ###############################################################################
 
@@ -91,8 +50,14 @@ def epoch_time_estimate(n, m, t, b):
     return int(etime)
 
 
-if __name__ == "__main__":
+def run_exp(LOG_FOLDER, PRIVATE_ROUTE, NUM_EPOCHS, N, M, T, B, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN):
 
+    if not os.path.exists(LOG_FOLDER):
+        os.mkdir(LOG_FOLDER)
+    if(PRIVATE_ROUTE):
+        LOG_FOLDER = LOG_FOLDER + "Private/"
+    else:
+        LOG_FOLDER = LOG_FOLDER + "Public/"
     if not os.path.exists(LOG_FOLDER):
         os.mkdir(LOG_FOLDER)
 
@@ -102,103 +67,99 @@ if __name__ == "__main__":
 
     for t in T:
         b = B
-        m_start = 1
-        # Set M_MAX depending on t
-        m_end = M_MAX[t]
         for m in M:
-            if(m <= m_end):
-                for n in N:
-                    #for run in ["diagnostic", "experiment"]:
-                    for run in ["experiment"]:
-                        num_WN_to_precompute = 0
-                        if(PRIVATE_ROUTE):
-                            num_WN_to_precompute = 2 * 3
-                        else:
-                            num_WN_to_precompute = 2 * 8
-
-                        # Make the correct output folder for diagnostic/experiment
-                        experiment_name = str(n) + "_" + str(m) + "_" + str(t) + "_" + str(b) + "/"
-                        if(run == "diagnostic"):
-                            log_subfolder = DIAGNOSTIC_FOLDER
-                        elif(run == "experiment"):
-                            log_subfolder = LOG_FOLDER
-                        log_subfolder = log_subfolder + experiment_name
-                        if not os.path.exists(log_subfolder):
-                            os.mkdir(log_subfolder)
-
-                        if(run == "diagnostic"):
-                            print("\n\n   Running DIAGNOSTIC t = %d, m = %d, n = %d \n\n" % (t, m, n))
-                            # Manifest generated by diagnostic can be reused by the actual experiment
-                            generate_manifest(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
-                            generate_config(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN, num_WN_to_precompute)
-                            epoch_param = epoch_time_estimate(n, m, t, b)
-                        elif(run == "experiment"):
-                            #print("Waiting for 2 mins to reset sockets")
-                            #time.sleep(120)
-                            #num_sizes, pwn_max, epoch_max, scm_max = parse_output_logs(DIAGNOSTIC_FOLDER, experiment_name)
-                            #print("From logs_to_csv: num_sizes = %d, pwn_max = %f, epoch_max = %f, scm_max = %f"
-                            #% (num_sizes, pwn_max, epoch_max, scm_max))
-                            print("\n\n   Running EXPERIMENT t = %d, m = %d, n = %d \n\n" % (t, m, n))
-                            #num_WN_to_precompute = math.ceil((num_sizes * pwn_max)/epoch_max)
-                            #print("num_WN_to_precompute = %d" %(num_WN_to_precompute))
-                            #if(num_WN_to_precompute < 2 * num_sizes):
-                            #    num_WN_to_precompute = 2 * num_sizes
-                            #print("num_WN_to_precompute (pushed up to min 2 sets) = %d" %(num_WN_to_precompute))
-                            #epoch_param = math.ceil(epoch_max + 10 * m * scm_max)
-                            generate_manifest(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
-                            epoch_param = epoch_time_estimate(n, m, t, b)
-                            generate_config(n, m, t, b, PRIVATE_ROUTE, PRIV_IN, PUB_OUT, PUB_IN, num_WN_to_precompute)
-
-                        # Either estimate from epoch_time_estimate for diagnostic
-                        # or the one we got from diagnostic run
-                        epoch_duration = math.ceil(epoch_param)
-                        print("Epoch_duration = %d" % epoch_duration)
-
-                        # Since launch is invoked from App/ ; we add a ../ to subfolder before
-                        # passing it to slaunch
-                        log_subfolder = "../" + log_subfolder
-
-                        slaunch = []
-                        slaunch.append("./launch")
-                        slaunch.append("route_clients")
-                        slaunch.append("-l")
-                        slaunch.append(log_subfolder)
-                        slaunch.append("-n")
-                        nodes_to_include = ["-n"]
-                        for i in range(1, m+1):
-                            nodes_to_include.append("s"+str(i))
-                            slaunch.append("s"+str(i))
-                        slaunch.append("-d")
-                        slaunch.append(str(epoch_duration))
-                        slaunch.append("-e")
-                        if(run == "experiment"):
-                            slaunch.append(str(NUM_EPOCHS))
-                        else:
-                            slaunch.append(str(NUM_DIAGNOSTIC_EPOCHS))
-                        if(run == "experiment"):
-                            slaunch.append("-w")
-                            slaunch.append(str(num_WN_to_precompute))
-
-
-                        os.chdir("./App")
-                        # Server outputs are captured by log files provided to each of the server
-                        # launch calls made by App/launch
-                        make = subprocess.call(["make", "-C", "..", "-j"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
-                        try:
-                            os.mkdir("keys")
-                        except:
-                            # It's OK if it already exists
-                            pass
-                        pubkeys = subprocess.call(["./getpubkeys"])
-                        server_process = subprocess.run(slaunch)
-
-                        claunch = []
-                        claunch.append("./clientlaunch")
-                        claunch.append("-t")
-                        claunch.append("8")
-                        claunch.append("-l")
-                        claunch.append(log_subfolder+"clients.log")
-                        os.chdir("./../Client/")
-                        client_process = subprocess.call(claunch)
-
-                        os.chdir("./../")
+            for n in N:
+                #for run in ["diagnostic", "experiment"]:
+                for run in ["experiment"]:
+                    num_WN_to_precompute = 0
+                    if(PRIVATE_ROUTE):
+                        num_WN_to_precompute = 2 * 3
+                    else:
+                        num_WN_to_precompute = 2 * 8
+
+                    # Make the correct output folder for diagnostic/experiment
+                    experiment_name = str(n) + "_" + str(m) + "_" + str(t) + "_" + str(b) + "/"
+                    if(run == "diagnostic"):
+                        log_subfolder = DIAGNOSTIC_FOLDER
+                    elif(run == "experiment"):
+                        log_subfolder = LOG_FOLDER
+                    log_subfolder = log_subfolder + experiment_name
+                    if not os.path.exists(log_subfolder):
+                        os.mkdir(log_subfolder)
+
+                    if(run == "diagnostic"):
+                        print("\n\n   Running DIAGNOSTIC t = %d, m = %d, n = %d \n\n" % (t, m, n))
+                        # Manifest generated by diagnostic can be reused by the actual experiment
+                        generate_manifest(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
+                        generate_config(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN, num_WN_to_precompute)
+                        epoch_param = epoch_time_estimate(n, m, t, b)
+                    elif(run == "experiment"):
+                        #print("Waiting for 2 mins to reset sockets")
+                        #time.sleep(120)
+                        #num_sizes, pwn_max, epoch_max, scm_max = parse_output_logs(DIAGNOSTIC_FOLDER, experiment_name)
+                        #print("From logs_to_csv: num_sizes = %d, pwn_max = %f, epoch_max = %f, scm_max = %f"
+                        #% (num_sizes, pwn_max, epoch_max, scm_max))
+                        print("\n\n   Running EXPERIMENT t = %d, m = %d, n = %d \n\n" % (t, m, n))
+                        #num_WN_to_precompute = math.ceil((num_sizes * pwn_max)/epoch_max)
+                        #print("num_WN_to_precompute = %d" %(num_WN_to_precompute))
+                        #if(num_WN_to_precompute < 2 * num_sizes):
+                        #    num_WN_to_precompute = 2 * num_sizes
+                        #print("num_WN_to_precompute (pushed up to min 2 sets) = %d" %(num_WN_to_precompute))
+                        #epoch_param = math.ceil(epoch_max + 10 * m * scm_max)
+                        generate_manifest(n, m, t, b, PRIVATE_ROUTE, PRIV_OUT, PRIV_IN, PUB_OUT, PUB_IN)
+                        epoch_param = epoch_time_estimate(n, m, t, b)
+                        generate_config(n, m, t, b, PRIVATE_ROUTE, PRIV_IN, PUB_OUT, PUB_IN, num_WN_to_precompute)
+
+                    # Either estimate from epoch_time_estimate for diagnostic
+                    # or the one we got from diagnostic run
+                    epoch_duration = math.ceil(epoch_param)
+                    print("Epoch_duration = %d" % epoch_duration)
+
+                    # Since launch is invoked from App/ ; we add a ../ to subfolder before
+                    # passing it to slaunch
+                    log_subfolder = "../" + log_subfolder
+
+                    slaunch = []
+                    slaunch.append("./launch")
+                    slaunch.append("route_clients")
+                    slaunch.append("-l")
+                    slaunch.append(log_subfolder)
+                    slaunch.append("-n")
+                    nodes_to_include = ["-n"]
+                    for i in range(1, m+1):
+                        nodes_to_include.append("s"+str(i))
+                        slaunch.append("s"+str(i))
+                    slaunch.append("-d")
+                    slaunch.append(str(epoch_duration))
+                    slaunch.append("-e")
+                    if(run == "experiment"):
+                        slaunch.append(str(NUM_EPOCHS))
+                    else:
+                        slaunch.append(str(NUM_DIAGNOSTIC_EPOCHS))
+                    if(run == "experiment"):
+                        slaunch.append("-w")
+                        slaunch.append(str(num_WN_to_precompute))
+
+
+                    os.chdir("./App")
+                    # Server outputs are captured by log files provided to each of the server
+                    # launch calls made by App/launch
+                    make = subprocess.call(["make", "-C", "..", "-j"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
+                    try:
+                        os.mkdir("keys")
+                    except:
+                        # It's OK if it already exists
+                        pass
+                    pubkeys = subprocess.call(["./getpubkeys"])
+                    server_process = subprocess.run(slaunch)
+
+                    claunch = []
+                    claunch.append("./clientlaunch")
+                    claunch.append("-t")
+                    claunch.append("8")
+                    claunch.append("-l")
+                    claunch.append(log_subfolder+"clients.log")
+                    os.chdir("./../Client/")
+                    client_process = subprocess.call(claunch)
+
+                    os.chdir("./../")