benchmark_train.sh 9.1 KB
Newer Older
1 2 3 4 5
#!/bin/bash
source test_tipc/common_func.sh

# run benchmark sh 
# Usage:
L
LDOUBLEV 已提交
6
# bash run_benchmark_train.sh config.txt params
L
LDOUBLEV 已提交
7 8
# or 
# bash run_benchmark_train.sh config.txt
9 10 11 12 13 14 15 16 17

function func_parser_params(){
    strs=$1
    IFS="="
    array=(${strs})
    tmp=${array[1]}
    echo ${tmp}
}

L
LDOUBLEV 已提交
18 19 20 21 22 23 24 25 26 27 28 29
function set_dynamic_epoch(){
    string=$1
    num=$2
    _str=${string:1:6}
    IFS="C"
    arr=(${_str})
    M=${arr[0]}
    P=${arr[1]}
    ep=`expr $num \* $M \* $P`
    echo $ep
}

30 31 32 33 34 35 36 37 38
function func_sed_params(){
    filename=$1
    line=$2
    param_value=$3
    params=`sed -n "${line}p" $filename`
    IFS=":"
    array=(${params})
    key=${array[0]}
    value=${array[1]}
L
fix bug  
LDOUBLEV 已提交
39

40 41 42 43 44 45 46 47 48
    new_params="${key}:${param_value}"
    IFS=";"
    cmd="sed -i '${line}s/.*/${new_params}/' '${filename}'"
    eval $cmd
}

function set_gpu_id(){
    string=$1
    _str=${string:1:6}
L
LDOUBLEV 已提交
49
    IFS="C"
50
    arr=(${_str})
L
LDOUBLEV 已提交
51
    M=${arr[0]}
52
    P=${arr[1]}
L
LDOUBLEV 已提交
53 54
    gn=`expr $P - 1`
    gpu_num=`expr $gn / $M`
55 56 57 58
    seq=`seq -s "," 0 $gpu_num`
    echo $seq
}

L
LDOUBLEV 已提交
59 60 61 62 63 64 65
function get_repo_name(){
    IFS=";"
    cur_dir=$(pwd)
    IFS="/"
    arr=(${cur_dir})
    echo ${arr[-1]}
}
66

L
LDOUBLEV 已提交
67
FILENAME=$1
L
LDOUBLEV 已提交
68 69 70 71 72
# copy FILENAME as new
new_filename="./test_tipc/benchmark_train.txt"
cmd=`yes|cp $FILENAME $new_filename`
FILENAME=$new_filename
# MODE must be one of ['benchmark_train']
L
LDOUBLEV 已提交
73
MODE=$2
L
LDOUBLEV 已提交
74
PARAMS=$3
L
LDOUBLEV 已提交
75
# bash test_tipc/benchmark_train.sh test_tipc/configs/det_mv3_db_v2_0/train_benchmark.txt  benchmark_train dynamic_bs8_null_DP_N1C1
L
LDOUBLEV 已提交
76
IFS=$'\n'
L
LDOUBLEV 已提交
77 78 79 80 81 82
# parser params from train_benchmark.txt
dataline=`cat $FILENAME`
# parser params
IFS=$'\n'
lines=(${dataline})
model_name=$(func_parser_value "${lines[1]}")
83 84 85 86 87 88 89
python_name=$(func_parser_value "${lines[2]}")

# set env
python=${python_name}
export str_tmp=$(echo `pip list|grep paddlepaddle-gpu|awk -F ' ' '{print $2}'`)
export frame_version=${str_tmp%%.post*}
export frame_commit=$(echo `${python} -c "import paddle;print(paddle.version.commit)"`)
L
LDOUBLEV 已提交
90 91

# 获取benchmark_params所在的行数
L
LDOUBLEV 已提交
92
line_num=`grep -n "train_benchmark_params" $FILENAME  | cut -d ":" -f 1`
L
LDOUBLEV 已提交
93
# for train log parser
L
LDOUBLEV 已提交
94
batch_size=$(func_parser_value "${lines[line_num]}")
L
LDOUBLEV 已提交
95
line_num=`expr $line_num + 1`
L
LDOUBLEV 已提交
96
fp_items=$(func_parser_value "${lines[line_num]}")
L
LDOUBLEV 已提交
97
line_num=`expr $line_num + 1`
L
LDOUBLEV 已提交
98
epoch=$(func_parser_value "${lines[line_num]}")
L
LDOUBLEV 已提交
99 100

line_num=`expr $line_num + 1`
L
LDOUBLEV 已提交
101 102 103
profile_option_key=$(func_parser_key "${lines[line_num]}")
profile_option_params=$(func_parser_value "${lines[line_num]}")
profile_option="${profile_option_key}:${profile_option_params}"
L
LDOUBLEV 已提交
104 105 106

line_num=`expr $line_num + 1`
flags_value=$(func_parser_value "${lines[line_num]}")
L
LDOUBLEV 已提交
107
# set flags
L
LDOUBLEV 已提交
108 109 110 111 112 113 114
IFS=";"
flags_list=(${flags_value})
for _flag in ${flags_list[*]}; do
    cmd="export ${_flag}"
    eval $cmd
done

L
LDOUBLEV 已提交
115 116 117 118 119
# set log_name
repo_name=$(get_repo_name )
SAVE_LOG=${BENCHMARK_LOG_DIR:-$(pwd)}   # */benchmark_log
mkdir -p "${SAVE_LOG}/benchmark_log/"
status_log="${SAVE_LOG}/benchmark_log/results.log"
L
set env  
LDOUBLEV 已提交
120

L
LDOUBLEV 已提交
121 122 123 124 125 126 127 128 129
# The number of lines in which train params can be replaced.
line_python=3
line_gpuid=4
line_precision=6
line_epoch=7
line_batchsize=9
line_profile=13
line_eval_py=24
line_export_py=30
L
set env  
LDOUBLEV 已提交
130

L
LDOUBLEV 已提交
131 132 133
func_sed_params "$FILENAME" "${line_eval_py}" "null"
func_sed_params "$FILENAME" "${line_export_py}" "null"
func_sed_params "$FILENAME" "${line_python}"  "$python"
L
LDOUBLEV 已提交
134

L
LDOUBLEV 已提交
135 136 137 138 139 140 141 142
# if params
if  [ ! -n "$PARAMS" ] ;then
    # PARAMS input is not a word.
    IFS="|"
    batch_size_list=(${batch_size})
    fp_items_list=(${fp_items})
    device_num_list=(N1C4)
    run_mode="DP"
L
LDOUBLEV 已提交
143
else
L
LDOUBLEV 已提交
144
    # parser params from input: modeltype_bs${bs_item}_${fp_item}_${run_mode}_${device_num}
L
LDOUBLEV 已提交
145 146 147 148 149 150
    IFS="_"
    params_list=(${PARAMS})
    model_type=${params_list[0]}
    batch_size=${params_list[1]}
    batch_size=`echo  ${batch_size} | tr -cd "[0-9]" `
    precision=${params_list[2]}
L
LDOUBLEV 已提交
151 152
    run_mode=${params_list[3]}
    device_num=${params_list[4]}
L
LDOUBLEV 已提交
153 154
    IFS=";"

L
LDOUBLEV 已提交
155 156
    if [ ${precision} = "fp16" ];then
        precision="amp"
L
LDOUBLEV 已提交
157
    fi
L
LDOUBLEV 已提交
158

L
LDOUBLEV 已提交
159
    epoch=$(set_dynamic_epoch $device_num $epoch)
L
LDOUBLEV 已提交
160 161 162
    fp_items_list=($precision)
    batch_size_list=($batch_size)
    device_num_list=($device_num)
L
LDOUBLEV 已提交
163
fi
164

L
LDOUBLEV 已提交
165 166
IFS="|"
for batch_size in ${batch_size_list[*]}; do 
L
LDOUBLEV 已提交
167
    for train_precision in ${fp_items_list[*]}; do
L
LDOUBLEV 已提交
168 169
        for device_num in ${device_num_list[*]}; do
            # sed batchsize and precision
L
LDOUBLEV 已提交
170 171 172 173 174 175 176
            if [ ${train_precision} = "amp" ];then
                precision="fp16"
            else
                precision="fp32"
            fi

            func_sed_params "$FILENAME" "${line_precision}" "$train_precision"
L
LDOUBLEV 已提交
177 178 179 180 181 182 183
            func_sed_params "$FILENAME" "${line_batchsize}" "$MODE=$batch_size"
            func_sed_params "$FILENAME" "${line_epoch}" "$MODE=$epoch"
            gpu_id=$(set_gpu_id $device_num)

            if [ ${#gpu_id} -le 1 ];then
                log_path="$SAVE_LOG/profiling_log"
                mkdir -p $log_path
M
mmglove 已提交
184
                log_name="${repo_name}_${model_name}_bs${batch_size}_${precision}_${run_mode}_${device_num}_profiling"
L
LDOUBLEV 已提交
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
                func_sed_params "$FILENAME" "${line_gpuid}" "0"  # sed used gpu_id 
                # set profile_option params
                tmp=`sed -i "${line_profile}s/.*/${profile_option}/" "${FILENAME}"`

                # run test_train_inference_python.sh
                cmd="bash test_tipc/test_train_inference_python.sh ${FILENAME} benchmark_train > ${log_path}/${log_name} 2>&1 "
                echo $cmd
                eval $cmd
                eval "cat ${log_path}/${log_name}"

                # without profile
                log_path="$SAVE_LOG/train_log"
                speed_log_path="$SAVE_LOG/index"
                mkdir -p $log_path
                mkdir -p $speed_log_path
M
mmglove 已提交
200 201
                log_name="${repo_name}_${model_name}_bs${batch_size}_${precision}_${run_mode}_${device_num}_log"
                speed_log_name="${repo_name}_${model_name}_bs${batch_size}_${precision}_${run_mode}_${device_num}_speed"
L
LDOUBLEV 已提交
202 203 204 205 206 207 208 209 210 211
                func_sed_params "$FILENAME" "${line_profile}" "null"  # sed profile_id as null
                cmd="bash test_tipc/test_train_inference_python.sh ${FILENAME} benchmark_train > ${log_path}/${log_name} 2>&1 "
                echo $cmd
                job_bt=`date '+%Y%m%d%H%M%S'`
                eval $cmd
                job_et=`date '+%Y%m%d%H%M%S'`
                export model_run_time=$((${job_et}-${job_bt}))
                eval "cat ${log_path}/${log_name}"

                # parser log
M
mmglove 已提交
212
                _model_name="${model_name}_bs${batch_size}_${precision}_${run_mode}"
L
LDOUBLEV 已提交
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
                cmd="${python} ${BENCHMARK_ROOT}/scripts/analysis.py --filename ${log_path}/${log_name} \
                        --speed_log_file '${speed_log_path}/${speed_log_name}' \
                        --model_name ${_model_name} \
                        --base_batch_size ${batch_size} \
                        --run_mode ${run_mode} \
                        --fp_item ${precision} \
                        --keyword ips: \
                        --skip_steps 2 \
                        --device_num ${device_num} \
                        --speed_unit samples/s \
                        --convergence_key loss: "
                echo $cmd
                eval $cmd
                last_status=${PIPESTATUS[0]}
                status_check $last_status "${cmd}" "${status_log}"
            else
                IFS=";"
                unset_env=`unset CUDA_VISIBLE_DEVICES`
                log_path="$SAVE_LOG/train_log"
                speed_log_path="$SAVE_LOG/index"
                mkdir -p $log_path
                mkdir -p $speed_log_path
M
mmglove 已提交
235 236
                log_name="${repo_name}_${model_name}_bs${batch_size}_${precision}_${run_mode}_${device_num}_log"
                speed_log_name="${repo_name}_${model_name}_bs${batch_size}_${precision}_${run_mode}_${device_num}_speed"
L
LDOUBLEV 已提交
237 238 239 240 241 242 243 244 245 246
                func_sed_params "$FILENAME" "${line_gpuid}" "$gpu_id"  # sed used gpu_id 
                func_sed_params "$FILENAME" "${line_profile}" "null"  # sed --profile_option as null
                cmd="bash test_tipc/test_train_inference_python.sh ${FILENAME} benchmark_train > ${log_path}/${log_name} 2>&1 "
                echo $cmd
                job_bt=`date '+%Y%m%d%H%M%S'`
                eval $cmd
                job_et=`date '+%Y%m%d%H%M%S'`
                export model_run_time=$((${job_et}-${job_bt}))
                eval "cat ${log_path}/${log_name}"
                # parser log
M
mmglove 已提交
247
                _model_name="${model_name}_bs${batch_size}_${precision}_${run_mode}"
L
LDOUBLEV 已提交
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
                
                cmd="${python} ${BENCHMARK_ROOT}/scripts/analysis.py --filename ${log_path}/${log_name} \
                        --speed_log_file '${speed_log_path}/${speed_log_name}' \
                        --model_name ${_model_name} \
                        --base_batch_size ${batch_size} \
                        --run_mode ${run_mode} \
                        --fp_item ${precision} \
                        --keyword ips: \
                        --skip_steps 2 \
                        --device_num ${device_num} \
                        --speed_unit images/s \
                        --convergence_key loss: "
                echo $cmd
                eval $cmd
                last_status=${PIPESTATUS[0]}
                status_check $last_status "${cmd}" "${status_log}"
            fi
        done
    done
L
fix bug  
LDOUBLEV 已提交
267
done