Skip to content

Commit 9112761

Browse files
authored
Merge pull request #15 from rajeeja/rajeeja/p1b1_grid
Fixes to hard links and increase sweep space
2 parents 322cac3 + 07ce521 commit 9112761

File tree

6 files changed

+171
-42
lines changed

6 files changed

+171
-42
lines changed
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
{
22
"parameters":
33
{
4-
"1": [2,4],
5-
"2": [5]
4+
"1": [2,4,6],
5+
"2": [15, 25,50,75],
6+
"3": [2000, 1000],
7+
"4": [600, 400]
68
}
79
}
Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import sys
2-
import p1b1_baseline_keras2
3-
import p1b1
2+
import p1b1_runner
3+
import json
4+
45

56
if (len(sys.argv) < 3):
67
print('requires arg1=param and arg2=filename')
@@ -9,38 +10,27 @@
910
parameterString = sys.argv[1]
1011
filename = sys.argv[2]
1112

12-
print (parameterString)
13-
print ("filename is ", filename)
14-
15-
epochs = int(parameterString[0].strip())
16-
batch_size = int(parameterString[2].strip())
17-
print ("Running p1b1 for epochs ", epochs, batch_size)
13+
# print (parameterString)
14+
print ("filename is " + filename)
1815

19-
# N1 = int(parameterString[2].strip())
20-
# NE = int(parameterString[3].strip())
2116

22-
print("Set the correct paths for test and train file")
23-
test_path="/home/jain/Benchmarks/Data/Pilot1/P1B1.test.csv"
24-
train_path="/home/jain/Benchmarks/Data/Pilot1/P1B1.train.csv"
17+
integs = [int(x) for x in parameterString.split(',')]
18+
print (integs)
2519

26-
print ("Starting to loading Xtrain and Xtest")
27-
X_train, X_test = p1b1.load_data(test_path=test_path, train_path=train_path)
28-
print ("Done loading Xtrain and Xtest")
29-
30-
print ("Running p1b1 for epochs ", epochs)
31-
encoder, decoder, history = p1b1_baseline_keras2.run_p1b1(X_train, X_test, epochs=epochs, batch_size=batch_size)
32-
print ("Done running p1b1 for epochs ", epochs)
20+
hyper_parameter_map = {'epochs' : integs[0]}
21+
hyper_parameter_map['framework'] = 'keras'
22+
hyper_parameter_map['batch_size'] = integs[1]
23+
hyper_parameter_map['dense'] = [integs[2], integs[3]]
24+
hyper_parameter_map['save'] = './output'
3325

26+
val_loss = p1b1_runner.run(hyper_parameter_map)
27+
print (val_loss)
3428
# works around this error:
3529
# https://github.com/tensorflow/tensorflow/issues/3388
3630
from keras import backend as K
3731
K.clear_session()
3832

39-
# use the last validation_loss as the value to minimize
40-
val_loss = history.history['val_loss']
41-
r = val_loss[-1]
42-
4333
# writing the val loss to the output file
4434
with open(filename, 'w') as the_file:
45-
the_file.write(repr(r))
35+
the_file.write(repr(val_loss))
4636

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# tensoflow.__init__ calls _os.path.basename(_sys.argv[0])
2+
# so we need to create a synthetic argv.
3+
import sys
4+
if not hasattr(sys, 'argv'):
5+
sys.argv = ['p1b1']
6+
7+
import json
8+
import os
9+
import p1b1
10+
import numpy as np
11+
12+
DATA_TYPES = {type(np.float16): 'f16', type(np.float32): 'f32', type(np.float64): 'f64'}
13+
14+
def write_params(params, hyper_parameter_map):
15+
parent_dir = hyper_parameter_map['instance_directory'] if 'instance_directory' in hyper_parameter_map else '.'
16+
f = "{}/parameters_p1b1.txt".format(parent_dir)
17+
with open(f, "w") as f_out:
18+
f_out.write("[parameters]\n")
19+
for k,v in params.items():
20+
if type(v) in DATA_TYPES:
21+
v = DATA_TYPES[type(v)]
22+
if isinstance(v, basestring):
23+
v = "'{}'".format(v)
24+
f_out.write("{}={}\n".format(k, v))
25+
26+
def is_numeric(val):
27+
try:
28+
float(val)
29+
return True
30+
except ValueError:
31+
return False
32+
33+
def format_params(hyper_parameter_map):
34+
for k,v in hyper_parameter_map.items():
35+
vals = str(v).split(" ")
36+
if len(vals) > 1 and is_numeric(vals[0]):
37+
# assume this should be a list
38+
if "." in vals[0]:
39+
hyper_parameter_map[k] = [float(x) for x in vals]
40+
else:
41+
hyper_parameter_map[k] = [int(x) for x in vals]
42+
43+
44+
def run(hyper_parameter_map):
45+
framework = hyper_parameter_map['framework']
46+
if framework is 'keras':
47+
import p1b1_baseline_keras2
48+
pkg = p1b1_baseline_keras2
49+
elif framework is 'mxnet':
50+
import p1b1_baseline_mxnet
51+
pkg = p1b1_baseline_mxnet
52+
elif framework is 'neon':
53+
import p1b1_baseline_neon
54+
pkg = p1b1_baseline_neon
55+
else:
56+
raise ValueError("Invalid framework: {}".format(framework))
57+
58+
# params is python dictionary
59+
sys.argv = ['fail here', '--epochs', '54321']
60+
params = pkg.initialize_parameters()
61+
format_params(hyper_parameter_map)
62+
63+
for k,v in hyper_parameter_map.items():
64+
#if not k in params:
65+
# raise Exception("Parameter '{}' not found in set of valid arguments".format(k))
66+
params[k] = v
67+
68+
print(params)
69+
write_params(params, hyper_parameter_map)
70+
history = pkg.run(params)
71+
72+
if framework is 'keras':
73+
# works around this error:
74+
# https://github.com/tensorflow/tensorflow/issues/3388
75+
try:
76+
from keras import backend as K
77+
K.clear_session()
78+
except AttributeError: # theano does not have this function
79+
pass
80+
81+
# use the last validation_loss as the value to minimize
82+
val_loss = history.history['val_loss']
83+
return val_loss[-1]
84+
85+
def write_output(result, instance_directory):
86+
with open('{}/result.txt'.format(instance_directory), 'w') as f_out:
87+
f_out.write("{}\n".format(result))
88+
89+
def init(param_file, instance_directory):
90+
with open(param_file) as f_in:
91+
hyper_parameter_map = json.load(f_in)
92+
93+
hyper_parameter_map['framework'] = 'keras'
94+
hyper_parameter_map['save'] = '{}/output'.format(instance_directory)
95+
hyper_parameter_map['instance_directory'] = instance_directory
96+
97+
return hyper_parameter_map
98+
99+
if __name__ == '__main__':
100+
print('p1b1_runner main ' + str(argv))
101+
param_file = sys.argv[1]
102+
instance_directory = sys.argv[2]
103+
hyper_parameter_map = init(param_file, instance_directory)
104+
# clear sys.argv so that argparse doesn't object
105+
sys.argv = ['p1b1_runner']
106+
result = run(hyper_parameter_map)
107+
write_output(result, instance_directory)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#!/bin/bash
2-
filename=result-$1.txt
3-
python $APP_HOME/../python/evaluateOne.py $1 $filename
2+
filename=$TURBINE_OUTPUT/result-$1.txt
3+
python -u $APP_HOME/../python/evaluateOne.py $1 $filename

workflows/p1b1_grid/swift/run-sweep.swift renamed to workflows/p1b1_grid/swift/grid-sweep.swift

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,54 @@ import files;
33
import io;
44
import sys;
55

6-
// ===== Interface definitions for the three programs that we call ======
6+
// ===== Interface definitions for the programs that we call ======
7+
// Random values are created from bounds specified in data/settings.json file
78
app (file f)
89
determineParameters(string settingsFilename)
910
{
1011
(getenv("APP_HOME")+"/determineParameters.sh") settingsFilename f;
1112
}
1213

14+
// This is where the p1b1 runner is called
1315
app (file f)
1416
evaluateOne(string params)
1517
{
1618
(getenv("APP_HOME")+"/evaluateOne.sh") params f;
1719
}
1820

21+
// call this to read all the resultsFiles and compute stats
1922
app ()
2023
computeStats(string resultsFile)
2124
{
2225
(getenv("APP_HOME")+"/computeStats.sh") resultsFile;
2326
}
2427

28+
// call this to create any required directories
29+
app (void o) make_dir(string dirname) {
30+
"mkdir" "-p" dirname;
31+
}
32+
2533

2634
// ===== The program proper ==============================================
35+
string turbine_output = getenv("TURBINE_OUTPUT");
2736
float results[string];
2837

38+
//make the experiments dir
39+
make_dir(turbine_output);
40+
2941
// Get parameters
3042
settingsFilename = argv("settings");
31-
printf(settingsFilename);
32-
file parametersFile<"parameters.txt"> = determineParameters(settingsFilename);
43+
string sweepParamFile = turbine_output+"/sweep-parameters.txt";
44+
file parametersFile<sweepParamFile> = determineParameters(settingsFilename);
3345
parametersString = read(parametersFile);
3446
parameters = split(parametersString, ":");
3547

3648
// Run experiments in parallel, passing each a different parameter set
3749
foreach param in parameters
3850
{
39-
file resultFile<"result-%s.txt"%param> = evaluateOne(param);
51+
string rName = turbine_output+"/result-"+param+".txt";
52+
printf(rName);
53+
file resultFile<rName> = evaluateOne(param);
4054
results[param] = string2float(read(resultFile));
4155
}
4256

@@ -48,3 +62,4 @@ file tmp = write(repr(results));
4862
//trace("Temporary filename is: " + filename(tmp));
4963

5064
computeStats(filename(tmp));
65+

workflows/p1b1_grid/swift/run

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,42 @@
33
# Usage: ./run
44
#
55

6-
#### set this variable to your P1B1 benchmark directory (supervisor branch)
7-
P1B1_DIR=/home/jain/newCANDLE/Benchmarks/Pilot1/P1B1
6+
if [ "$#" -ne 1 ]; then
7+
script_name=$(basename $0)
8+
echo "Usage: ${script_name} EXPERIMENT_ID (e.g. ${script_name} experiment_1)"
9+
exit 1
10+
fi
11+
12+
#### set this variable to your P1B1 benchmark directory (frameworks branch)
13+
P1B1_DIR=../../../../Benchmarks/Pilot1/P1B1
814
###
915

1016
THIS=$( cd $( dirname $0 ); /bin/pwd )
1117
export APP_HOME=$THIS
1218

1319
PROJECT_ROOT=$APP_HOME/..
1420

15-
### set
16-
export PYTHONPATH=/usr/local/lib/python2.7/
17-
###
18-
export PYTHONPATH=$PYTHONPATH:$PROJECT_ROOT/python:$P1B1_DIR
21+
export PYTHONPATH=$PYTHONPATH:$PROJECT_ROOT/python:$P1B1_DIR:$PYTHONPATH
22+
23+
export EXPID=$1
24+
export TURBINE_OUTPUT=$APP_HOME/../experiments/$EXPID
25+
26+
27+
# TODO edit QUEUE, WALLTIME, PPN, AND TURNBINE_JOBNAME
28+
# as required. Note that QUEUE, WALLTIME, PPN, AND TURNBINE_JOBNAME will
29+
# be ignored if MACHINE flag (see below) is not set
30+
export QUEUE=batch
31+
export WALLTIME=00:10:00
32+
export PPN=16
33+
export TURBINE_JOBNAME="${EXPID}_job"
1934

2035
echo $PYTHONPATH
2136

2237
### set the desired number of processors
23-
PROCS=3
38+
PROCS=2
2439
###
2540

2641
# remove -l option for removing printing processors ranks
2742
# settings.json file has all the parameter combinations to be tested
28-
echo swift-t -n $PROCS $APP_HOME/run-sweep.swift $*
29-
swift-t -l -n $PROCS $APP_HOME/run-sweep.swift $* --settings=$PWD/../data/settings.json
43+
echo swift-t -n $PROCS $APP_HOME/grid-sweep.swift $*
44+
swift-t -l -n $PROCS $APP_HOME/grid-sweep.swift $* --settings=$PWD/../data/settings.json

0 commit comments

Comments
 (0)