Efficiency-of-Neural-Archit.../run_service.py

137 lines
3.7 KiB
Python
Executable File

import psutil
import pickle
import arguments
from time import sleep
from pathlib import Path
import subprocess as sub
from arguments import makeArguments
def kill(proc_pid):
process = psutil.Process(proc_pid)
for proc in process.children(recursive=True):
proc.kill()
process.kill()
cfg = {
"model": {"net_type": None, "type": None, "size": None, "layer_type":
"lrt", "activation_type": "softplus", "priors": {
'prior_mu': 0,
'prior_sigma': 0.1,
'posterior_mu_initial': (0, 0.1), # (mean,std) normal_
'posterior_rho_initial': (-5, 0.1), # (mean,std) normal_
},
"n_epochs": 100,
"sens": 1e-9,
"energy_thrs": 10000,
"acc_thrs": 0.99,
"lr": 0.001,
"num_workers": 4,
"valid_size": 0.2,
"batch_size": 256,
"train_ens": 1,
"valid_ens": 1,
"beta_type": 0.1, # 'Blundell','Standard',etc.
# Use float for const value
},
"data": None,
"stopping_crit": None,
"save": None,
"pickle_path": None,
}
args = makeArguments(arguments.all_args)
check = list(args.values())
if all(v is None for v in check):
raise Exception("One argument required")
elif None in check:
if args['f'] is not None:
cmd = ["python", "main_frequentist.py"]
cfg["model"]["type"] = "freq"
elif args['b'] is not None:
cmd = ["python", "main_bayesian.py"]
cfg["model"]["type"] = "bayes"
else:
raise Exception("Only one argument allowed")
wide = args["f"] or args["b"]
cfg["model"]["size"] = wide
cfg["data"] = args["dataset"]
cfg["model"]["net_type"] = args["net_type"]
if args['EarlyStopping']:
cfg["stopping_crit"] = 2
elif args['EnergyBound']:
cfg["stopping_crit"] = 3
elif args['AccuracyBound']:
cfg["stopping_crit"] = 4
else:
cfg["stopping_crit"] = 1
if args['Save']:
cfg["save"] = 1
else:
cfg["save"] = 0
cfg["pickle_path"] = "{}_wattdata_{}.pkl".format(cfg["model"]["type"],
cfg["model"]["size"])
with open("configuration.pkl", "wb") as f:
pickle.dump(cfg, f)
# print(args)
# print(cfg)
sleep(3)
cpu_watt = "cpu_watt.sh"
ram = "mem_free.sh"
gpu = "radeontop.sh"
path_cpu_watt = Path(cpu_watt)
path_ram = Path(ram)
path_gpu = Path(gpu)
path_cpu_watt = str(Path(cpu_watt).absolute()) + '/' + cpu_watt
path_ram = str(Path(ram).absolute()) + '/' + ram
path_gpu = str(Path(gpu).absolute()) + '/' + gpu
if cmd[1] == "main_frequentist.py":
cmd2 = [path_cpu_watt, "freq_{}_cpu_watts".format(wide)]
cmd3 = [path_ram, "freq_{}_ram_use".format(wide)]
cmd4 = [path_gpu, "freq_{}_flop_app".format(wide)]
elif cmd[1] == "main_bayesian.py":
cmd2 = [path_cpu_watt, "bayes_{}_cpu_watts".format(wide)]
cmd3 = [path_ram, "bayes_{}_ram_use".format(wide)]
cmd4 = [path_gpu, "bayes_{}_flop_app".format(wide)]
path = sub.check_output(['pwd'])
path = path.decode()
path = path.replace('\n', '')
startWattCounter = 'python ' + path + '/amd_sample_draw.py'
p1 = sub.Popen(cmd)
p2 = sub.Popen(startWattCounter.split(), stdin=sub.PIPE, stdout=sub.PIPE,
stderr=sub.PIPE)
p3 = sub.Popen(cmd2, stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE)
p4 = sub.Popen(cmd3, stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE)
p5 = sub.Popen(cmd4, stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE)
retcode = p1.wait()
print("Return code: {}".format(retcode))
p1.kill()
kill(p2.pid)
kill(p3.pid)
kill(p4.pid)
kill(p5.pid)