33PIPELINES=${1:- 5}
44SCHEDULES=${2:- 32}
55START_FROM=${3:- 0}
6- HL_RANDOM_DROPOUT=${4:- 1}
6+ HL_RANDOM_DROPOUT=${4:- 50} # setting according to Adams2019 paper
77HL_BEAM_SIZE=${5:- 1}
88NUM_CORES=${6:- 8}
9+ EPOCHS=${7:- 4}
10+ LEARNING_RATE=${8:- 0.001}
911ADAMS2019_DIR=@adams2019_BINARY_DIR@
10- INITIAL_WEIGHTS=${7:- $ADAMS2019_DIR / baseline.weights}
12+ BINARY_DIR=@random_pipeline_BINARY_DIR@
13+ INITIAL_WEIGHTS=${9:- $ADAMS2019_DIR / baseline.weights}
1114PROGRAM_NAME=` basename $0 .sh`
12- LOGFILEBASE=${8 :- ${PROGRAM_NAME} .log}
13- TIME_ME=${9 :- true}
14- DATE=${10 :- `date +' %F-%H-%M-%S' `}
15+ LOGFILEBASE=${10 :- ${PROGRAM_NAME} .log}
16+ TIME_ME=${11 :- true}
17+ DATE=${12 :- `date +' %F-%H-%M-%S' `}
1518
16- LOG_DIR=" . /logs"
19+ LOG_DIR=" $BINARY_DIR /logs"
1720LOGFILE=" $LOG_DIR /$LOGFILEBASE .$DATE "
18- TIME_TMP_LOG=" $LOGFILEBASE .$DATE .tmp"
21+ TIME_TMP_LOG=" $LOG_DIR /$LOGFILEBASE .$DATE .tmp"
22+
23+ if [ ! -d $LOG_DIR ]; then
24+ mkdir $LOG_DIR
25+ fi
1926
2027if [ " $TIME_ME " = true ]; then
2128 time /usr/bin/time -f " \nreal\t%E\nuser\t%U\nsys\t%S" -o $TIME_TMP_LOG \
2229 $0 $PIPELINES $SCHEDULES $START_FROM $HL_RANDOM_DROPOUT $HL_BEAM_SIZE \
23- $NUM_CORES $INITIAL_WEIGHTS $LOGFILEBASE false $DATE
30+ $NUM_CORES $EPOCHS $LEARNING_RATE $ INITIAL_WEIGHTS $LOGFILEBASE false $DATE
2431 cat $TIME_TMP_LOG >> $LOGFILE
2532 rm $TIME_TMP_LOG
2633 exit
2734fi
2835
2936# Start a watchdog to kill any compilations that take too long
30- . /watchdog.sh &
37+ $BINARY_DIR /watchdog.sh $LOGFILE &
3138WATCHDOG_PID=$!
3239
3340function finish {
3441 kill $WATCHDOG_PID
42+ echo watchdog killed | tee -a $LOGFILE
3543}
3644trap finish EXIT
3745
@@ -41,71 +49,95 @@ printf "Running %s with the following parameters:\n\
4149 START_FROM=%d\n\
4250 HL_RANDOM_DROPOUT=%d\n\
4351 HL_BEAM_SIZE=%d\n\
44- NUM_CORES=%d\n\
52+ NUM_CORES=%d\n\
53+ EPOCHS=%d\n\
54+ LEARNING_RATE=%f\n\
4555 INITIAL_WEIGHTS=%s\n\
4656 LOGFILEBASE=%s\n " $PROGRAM_NAME $PIPELINES $SCHEDULES $START_FROM \
47- $HL_RANDOM_DROPOUT $HL_BEAM_SIZE $NUM_CORES $INITIAL_WEIGHTS \
48- $LOGFILEBASE | tee -a $LOGFILE
57+ $HL_RANDOM_DROPOUT $HL_BEAM_SIZE $NUM_CORES $EPOCHS $LEARNING_RATE \
58+ $INITIAL_WEIGHTS $ LOGFILEBASE | tee -a $LOGFILE
4959
5060b=0
5161HL_TARGET=$( $ADAMS2019_DIR /get_host_target)
5262WEIGHTS_OUT=./updated.weights
53- mkdir -p $LOG_DIR
5463
55- if [ -d " . /bin" ]; then
64+ if [ -d " $BINARY_DIR /bin" ]; then
5665 # Don't clobber existing samples
57- FIRST=$( ls . /bin | cut -d_ -f2 | sort -n | tail -n1)
66+ FIRST=$( ls $BINARY_DIR /bin | cut -d_ -f2 | sort -n | tail -n1)
5867 # Change initial weights to the updated.weights in FIRST directory
5968 P=$FIRST # ignore b*$PIPELINES term for now
6069 STAGES=$(( (P % 30 ) + 10 ))
61- INITIAL_WEIGHTS=` pwd ` /bin/pipeline_${P} _${STAGES} /updated.weights
70+ INITIAL_WEIGHTS=$BINARY_DIR /bin/pipeline_${P} _${STAGES} /updated.weights
6271else
63- mkdir -p bin
72+ mkdir -p $BINARY_DIR / bin
6473 FIRST=$(( START_FROM- 1 ))
6574fi
6675
6776# Build lots of pipelines
6877for (( p= $((FIRST+ 1 )) ; p< $(( FIRST+ PIPELINES+ 1 )) ; p++)); do
6978 P=$(( b * $PIPELINES + p))
7079 STAGES=$(( (P % 30 ) + 10 ))
71- mkdir -p bin/pipeline_${P} _${STAGES}
80+ mkdir -p $BINARY_DIR / bin/pipeline_${P} _${STAGES}
7281
73- # First, renerate and compile all the schedules
82+ # First, generate and compile all the schedules
7483 for (( s= 0 ;s< $SCHEDULES ;s++ )) ; do
7584 PIPELINE_DIR=./bin/pipeline_${P} _${STAGES} /schedule_${s} _${HL_RANDOM_DROPOUT} _${HL_BEAM_SIZE} _0
7685 echo " export HL_SEED=$s && \
7786 export HL_RANDOM_DROPOUT=$HL_RANDOM_DROPOUT && \
7887 export HL_BEAM_SIZE=$HL_BEAM_SIZE && \
7988 export HL_WEIGHTS_DIR=$INITIAL_WEIGHTS && \
8089 mkdir -p $PIPELINE_DIR && \
81- . /random_pipeline.generator -n random_pipeline -d 0 -g random_pipeline -f random_pipeline \
90+ $BINARY_DIR /random_pipeline.generator -n random_pipeline -d 0 -g random_pipeline -f random_pipeline \
8291 -e c_header,object,schedule,python_schedule,static_library,registration,featurization \
8392 -o $PIPELINE_DIR -p $ADAMS2019_DIR /libautoschedule_adams2019.so \
8493 target=${HL_TARGET} -no_runtime auto_schedule=true seed=$P max_stages=$STAGES && \
8594 @CMAKE_CXX_COMPILER@ -std=c++17 -O3 -DNDEBUG -I@Halide_BINARY_DIR@/include @Halide_SOURCE_DIR@/tools/RunGenMain.cpp \
8695 $PIPELINE_DIR /random_pipeline.registration.cpp \
87- $PIPELINE_DIR /random_pipeline.a librandom_pipeline.runtime.a \
96+ $PIPELINE_DIR /random_pipeline.a $BINARY_DIR / librandom_pipeline.runtime.a \
8897 -o $PIPELINE_DIR /bench -DHALIDE_NO_PNG -DHALIDE_NO_JPEG -pthread -ldl" | tee -a $LOGFILE
89- done | xargs -P16 -I{} bash -c " {}" | tee -a $LOGFILE
98+ done | xargs -P ${NUM_CORES} -I{} bash -c " {}" | tee -a $LOGFILE
9099
91100 echo Benchmarking schedules | tee -a $LOGFILE
92101 # Now let's benchmark them
93102 for (( s= 0 ;s< $SCHEDULES ;s++ )) ; do
94- PIPELINE_DIR=./bin/pipeline_${P} _${STAGES} /schedule_${s} _${HL_RANDOM_DROPOUT} _${HL_BEAM_SIZE} _0
95- echo $PIPELINE_DIR | tee -a $LOGFILE
96- benchmark_time=$( $PIPELINE_DIR /bench --estimate_all --benchmarks=all)
97- echo $benchmark_time | tee -a $LOGFILE
98- t=$( echo $benchmark_time | head -1 | awk ' {print $8}' )
99- id=$( printf " %04d%02d%02d%02d%02d" $P $STAGES $s $HL_RANDOM_DROPOUT $HL_BEAM_SIZE )
100- echo Producing featurization for ID: $id | tee -a $LOGFILE
101- $ADAMS2019_DIR /featurization_to_sample $PIPELINE_DIR /random_pipeline.featurization $t onnx $id $PIPELINE_DIR /random_pipeline.sample
103+ PIPELINE_DIR=$BINARY_DIR /bin/pipeline_${P} _${STAGES} /schedule_${s} _${HL_RANDOM_DROPOUT} _${HL_BEAM_SIZE} _0
104+ echo PIPELINE_DIR is $PIPELINE_DIR | tee -a $LOGFILE
105+ CMD=" $PIPELINE_DIR /bench --estimate_all --benchmarks=all --parsable_output --benchmark_min_time=1.0"
106+ echo Running benchmark | tee -a $LOGFILE
107+ echo $CMD | tee -a $LOGFILE
108+ benchmark_time=$( eval $CMD )
109+ echo " $benchmark_time " | tee -a $LOGFILE
110+ t=$( echo " $benchmark_time " | head -1 | awk ' {print $3}' )
111+ pid=$( printf " %04d%02d" $P $STAGES )
112+ sid=$( printf " %02d%02d%02d" $s $HL_RANDOM_DROPOUT $HL_BEAM_SIZE )
113+ if [ ! -z " $t " ]; then
114+ echo Producing featurization for pid: $pid sid: $sid | tee -a $LOGFILE
115+ CMD=" $ADAMS2019_DIR /featurization_to_sample $PIPELINE_DIR /random_pipeline.featurization $t $pid $sid $PIPELINE_DIR /random_pipeline.sample"
116+ echo $CMD | tee -a $LOGFILE
117+ eval $CMD | tee -a $LOGFILE
118+ else
119+ echo not running featurization_to_sample: benchmark was likely killed due to timeout | tee -a $LOGFILE
120+ fi
102121 done
103122
104123 echo Retraining weights | tee -a $LOGFILE
105124 cd bin/pipeline_${P} _${STAGES}
106- find . -name " *.sample" | $ADAMS2019_DIR /retrain_cost_model --epochs=4 --rates=0.001 --num_cores=$NUM_CORES \
107- --initial_weights=$INITIAL_WEIGHTS --weights_out=$WEIGHTS_OUT --best_benchmark=./best.onnx.benchmark.txt \
108- --best_schedule=./best.onnx.schedule.h --best_python_schedule=./best_onnx_schedule.py | tee -a ../../$LOGFILE
109- INITIAL_WEIGHTS=` pwd` /updated.weights
125+ CMD=" find . -name '*.sample'"
126+ echo Trying to find samples | tee -a $LOGFILE
127+ samples=$( eval $CMD )
128+ if [ ! -z " $samples " ]; then
129+ echo Found samples: $samples | tee -a $LOGFILE
130+ CMD=" echo $samples | $ADAMS2019_DIR /retrain_cost_model --epochs=$EPOCHS --rates=$LEARNING_RATE --num_cores=$NUM_CORES \
131+ --initial_weights=$INITIAL_WEIGHTS --weights_out=$WEIGHTS_OUT --best_benchmark=./best.onnx.benchmark.txt \
132+ --best_schedule=./best.onnx.schedule.h --best_python_schedule=./best_onnx_schedule.py"
133+ echo Retraining cost model with the following command: | tee -a $LOGFILE
134+ echo $CMD | tee -a $LOGFILE
135+ eval $CMD | tee -a $LOGFILE
136+ else
137+ echo Samples not found! skipping retraining cost model! | tee -a $LOGFILE
138+ fi
139+ if [ -e ` pwd` /updated.weights ]; then
140+ INITIAL_WEIGHTS=` pwd` /updated.weights
141+ fi
110142 cd ../..
111143done
0 commit comments