Skip to content

Commit f80f906

Browse files
committed
o Adding simple parameter grid search with swift for P1B1
o See README for details
1 parent 56bde21 commit f80f906

File tree

10 files changed

+244
-0
lines changed

10 files changed

+244
-0
lines changed

workflows/p1b1_grid/README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Simple parameter sweep with Swift, using command line programs
2+
**run** runs **run-sweep.swift**, which runs a parameter sweep. It calls command-line programs as follows:
3+
- determineParameters.{sh,py}: Read data/ **settings.json** for sweep parameters, and return as a string for use by Swift program
4+
- evaluateOne.{sh,py}: Runs a single experiment. (Calls p1b1_baseline).
5+
- computeStats.{sh,py}: Ingests data from all of the experiments and computes simple stats.
6+
7+
Usage: ./run
8+
9+
Notes:
10+
- **settings.json**: sweep parameters. Parameters must be labeled "1", "2", "3", "4", ...
11+
1: epochs
12+
2. batch_size
13+
3. N1
14+
4. NE
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"parameters":
3+
{
4+
"1": [2,4],
5+
"2": [5, 6, 7]
6+
}
7+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import sys
2+
from collections import defaultdict
3+
import json, os
4+
5+
def extractVals(A):
6+
B = defaultdict(dict)
7+
A1 = A.split()
8+
for n, val in zip(A1[0::2], A1[1::2]):
9+
B[n] = float(val)
10+
return(B)
11+
12+
def computeStats(swiftArrayAsString):
13+
A = extractVals(swiftArrayAsString)
14+
vals = []
15+
for a in A:
16+
vals += [A[a]]
17+
print('%d values, with min=%f, max=%f, avg=%f\n'%(len(vals),min(vals),max(vals),sum(vals)/float(len(vals))))
18+
19+
20+
if (len(sys.argv) < 2):
21+
print('requires arg=dataFilename')
22+
sys.exit(1)
23+
24+
dataFilename = sys.argv[1]
25+
26+
try:
27+
with open(dataFilename, 'r') as the_file:
28+
data = the_file.read()
29+
except IOError as e:
30+
print("Could not open: %s" % dataFilename)
31+
print("PWD is: '%s'" % os.getcwd())
32+
33+
computeStats(data)
34+
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import sys, json, os
2+
3+
# ===== Definitions =========================================================
4+
5+
def loadSettings(settingsFilename):
6+
print("Reading settings: %s" % settingsFilename)
7+
try:
8+
with open(settingsFilename) as fp:
9+
settings = json.load(fp)
10+
except IOError as e:
11+
print("Could not open: %s" % settingsFilename)
12+
print("PWD is: '%s'" % os.getcwd())
13+
sys.exit(1)
14+
try:
15+
params = settings['parameters']
16+
except KeyError as e:
17+
print("Settings file (%s) does not contain key: %s" % (settingsFilename, str(e)))
18+
sys.exit(1)
19+
return(params)
20+
21+
def expand(Vs, fr, to, soFar):
22+
soFarNew = []
23+
for s in soFar:
24+
for v in Vs[fr]:
25+
if s == '':
26+
soFarNew += [str(v)]
27+
else:
28+
soFarNew += [s+','+str(v)]
29+
if fr==to:
30+
return(soFarNew)
31+
else:
32+
return expand(Vs, fr+1, to, soFarNew)
33+
34+
# ===== Main program ========================================================
35+
36+
if (len(sys.argv) < 3):
37+
print('requires arg1=settingsFilename and arg2=paramsFilename')
38+
sys.exit(1)
39+
40+
settingsFilename = sys.argv[1]
41+
paramsFilename = sys.argv[2]
42+
43+
params = loadSettings(settingsFilename)
44+
values = {}
45+
for i in range(1, len(params)+1):
46+
try:
47+
As = params[str(i)]
48+
except:
49+
print('Did not find parameter %i in settings file'%i)
50+
sys.exit(1)
51+
values[i] = As
52+
results = expand(values, 1, len(params), [''])
53+
result = ':'.join(results)
54+
55+
with open(paramsFilename, 'w') as the_file:
56+
the_file.write(result)
57+
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import sys
2+
import p1b1_baseline
3+
import p1b1
4+
5+
if (len(sys.argv) < 3):
6+
print('requires arg1=param and arg2=filename')
7+
sys.exit(1)
8+
9+
parameterString = sys.argv[1]
10+
filename = sys.argv[2]
11+
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)
18+
19+
# N1 = int(parameterString[2].strip())
20+
# NE = int(parameterString[3].strip())
21+
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"
25+
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.run_p1b1(X_train, X_test, epochs=epochs, batch_size=batch_size)
32+
print ("Done running p1b1 for epochs ", epochs)
33+
34+
# works around this error:
35+
# https://github.com/tensorflow/tensorflow/issues/3388
36+
from keras import backend as K
37+
K.clear_session()
38+
39+
# use the last validation_loss as the value to minimize
40+
val_loss = history.history['val_loss']
41+
r = val_loss[-1]
42+
43+
# writing the val loss to the output file
44+
with open(filename, 'w') as the_file:
45+
the_file.write(repr(r))
46+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/bash
2+
python $APP_HOME/../python/computeStats.py $1
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
echo $APP_HOME
3+
python $APP_HOME/../python/determineParameters.py $1 $2
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
filename=result-$1.txt
3+
python $APP_HOME/../python/evaluateOne.py $1 $filename

workflows/p1b1_grid/swift/run

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/bin/bash
2+
#
3+
# Usage: ./run
4+
#
5+
6+
#### set this variable to your P1B1 benchmark directory
7+
P1B1_DIR=/home/jain/Benchmarks/Pilot1/P1B1
8+
###
9+
10+
THIS=$( cd $( dirname $0 ); /bin/pwd )
11+
export APP_HOME=$THIS
12+
13+
PROJECT_ROOT=$APP_HOME/..
14+
15+
### set
16+
export PYTHONPATH=/usr/local/lib/python2.7/
17+
###
18+
export PYTHONPATH=$PYTHONPATH:$PROJECT_ROOT/python:$P1B1_DIR
19+
20+
echo $PYTHONPATH
21+
22+
### set the desired number of processors
23+
PROCS=2
24+
###
25+
26+
# remove -l option for removing printing processors ranks
27+
echo swift-t -n $PROCS $APP_HOME/run-sweep.swift $*
28+
swift-t -l -n $PROCS $APP_HOME/run-sweep.swift $* --settings=$PWD/../data/settings.json
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import string;
2+
import files;
3+
import io;
4+
import sys;
5+
6+
// ===== Interface definitions for the three programs that we call ======
7+
app (file f)
8+
determineParameters(string settingsFilename)
9+
{
10+
(getenv("APP_HOME")+"/determineParameters.sh") settingsFilename f;
11+
}
12+
13+
app (file f)
14+
evaluateOne(string params)
15+
{
16+
(getenv("APP_HOME")+"/evaluateOne.sh") params f;
17+
}
18+
19+
app ()
20+
computeStats(string resultsFile)
21+
{
22+
(getenv("APP_HOME")+"/computeStats.sh") resultsFile;
23+
}
24+
25+
26+
// ===== The program proper ==============================================
27+
float results[string];
28+
29+
// Get parameters
30+
settingsFilename = argv("settings");
31+
printf(settingsFilename);
32+
file parametersFile<"parameters.txt"> = determineParameters(settingsFilename);
33+
parametersString = read(parametersFile);
34+
parameters = split(parametersString, ":");
35+
36+
// Run experiments in parallel, passing each a different parameter set
37+
foreach param in parameters
38+
{
39+
file resultFile<"result-%s.txt"%param> = evaluateOne(param);
40+
results[param] = string2float(read(resultFile));
41+
}
42+
43+
// Compute stats of this array of results
44+
// Write directly to a file with write
45+
file tmp = write(repr(results));
46+
47+
// Find the name of a file with filename
48+
//trace("Temporary filename is: " + filename(tmp));
49+
50+
computeStats(filename(tmp));

0 commit comments

Comments
 (0)