def multiAcc_dse(): # define the network parameter containers conv_N = [] conv_M = [] conv_r = [] conv_R = [] conv_K = [] conv_S = [] flag = [] cut_flag = [] pool_N = [] sub_conv_N = [] sub_conv_M = [] sub_conv_r = [] sub_conv_R = [] sub_conv_K = [] sub_conv_S = [] sub_flag = [] pair_1 = [] pair_2 = [] pair_3 = [] lat_1 = 0 lat_2 = 0 lat_3 = 0 sub_lat_list = [] lat_list = [] util_1 = 0 util_2 = 0 util_3 = 0 sub_util_list = [] util_list = [] OPs = 0 sub_pair_list = [] item_list = [] pair_list = [] overall_lat = 60551400 layer_list = [] gop_list = [] """ step 1: extract model from txt file with parameter no_include_fc / include_fc """ conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, conv_G, flag, cut_flag, pool_N = model_extract( 'no_include_fc') # print("Extracted cut flag: ", cut_flag) # print("Extracted pool flag:", flag) OPs = gop_calculate(conv_N, conv_M, conv_R, conv_K) max_layerout = max_layer_dataout(conv_N, conv_M, conv_R, conv_K) print_line("Model extract phase") print("1: ", "Model extracted") print("1: ", "Overall convolution operation required: ", OPs) print("1: ", "Max layer output data: ", max_layerout) # print_line("Model split finish") """ step 2: randomly cluster, param k=4, layer label results are in item """ print_line("Model partition phase") for i in range(0, len(conv_N)): layer_list.append(i) # kmeans=clusters_layers_kmeans(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, 2) # print kmeans partition_location, diff_ratio = model_partition_by_gop( conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, conv_G, flag, cut_flag) print("2: layers extracted", conv_N) print("2: layers cutable ", cut_flag) print("2: partition location", partition_location) print("2: diff_ratio: ", diff_ratio) sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag \ =model_partition_ordered(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, conv_G, flag, partition_location[0]+1, partition_location[1]+1) # print "2: Best partition output: ", partition_location, diff_ratio print("2:", sub_conv_N) sub_gop_list = [] for i in range(0, len(sub_conv_N)): sub_gop_list.append( gop_calculate(sub_conv_N[i], sub_conv_M[i], sub_conv_R[i], sub_conv_K[i])) print("2: gop of sub_nets", sub_gop_list) print("2: length of sub_conv_N", len(sub_conv_N[0]), len(sub_conv_N[1]), len(sub_conv_N[2])) print("2", sub_flag) print("2: length of sub_flag", len(sub_flag[0]), len(sub_flag[1]), len(sub_flag[2])) sub_pair_list = [] sub_lat_list = [] sub_util_list = [] print_line("Best Configuration Search") overall_start = time.time() # acc_cluster_num = 3 # pair_list, item_list, gop_list, util_list = global_search(layer_list, acc_cluster_num, conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, flag, overall_lat) # pair_list, gop_list, util_list = per_die_config_dse_multiAcc(sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, # sub_conv_S, sub_flag) pair_list = per_die_config_dse_multiAcc_flex(sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag) overall_end = time.time() print_line("DSE Output") print("Best Configuration Search Results for layer accelerators: ") for i in range(0, len(pair_list)): print(pair_list[i]) acc_task_list, total_acc_num = acc_task_analysis(pair_list, sub_conv_N, sub_conv_M, sub_conv_r, \ sub_conv_R, sub_conv_K, sub_conv_S, sub_flag) print("Accelerator task list: ") for acc_num in range(0, len(acc_task_list)): print("acc core", acc_num, " task list: ", acc_task_list[acc_num]) print_line("Subnet Task Out") subnet_task_list = subnet_task_analysis(pair_list, acc_task_list, sub_conv_N, sub_conv_M, sub_conv_r, \ sub_conv_R, sub_conv_K, sub_conv_S, sub_flag) print("sub net interface list:") for i in range(0, len(subnet_task_list)): print(subnet_task_list[i]) print_line("Write out configurations") print(len(pair_list), "sub-nets are generated") print(total_acc_num, "accelerators are written into the cofig file") generate_param_file(pair_list, pool_N, acc_task_list, subnet_task_list, "acc_ins_params.txt") print_line("netGen run time system info") print("Overall time cost:", overall_end - overall_start, "s") print_line("line") print_line("test") print( conv_net_perf(sub_conv_N[2], sub_conv_M[2], sub_conv_R[2], sub_conv_S[2], sub_conv_K[2], sub_flag[2], 8, 274, 37, 4, 4))
def multiAcc_dse(): # define the network parameter containers conv_N = [] conv_M = [] conv_r = [] conv_R = [] conv_K = [] conv_S = [] flag = [] cut_flag = [] sub_conv_N = [] sub_conv_M = [] sub_conv_r = [] sub_conv_R = [] sub_conv_K = [] sub_conv_S = [] sub_flag = [] pair_1 = [] pair_2 = [] pair_3 = [] lat_1 = 0 lat_2 = 0 lat_3 = 0 sub_lat_list = [] lat_list = [] util_1 = 0 util_2 = 0 util_3 = 0 sub_util_list = [] util_list = [] OPs = 0 sub_pair_list = [] item_list = [] pair_list = [] overall_lat = 60551400 layer_list = [] gop_list = [] """ step 1: extract model from txt file with parameter no_include_fc / include_fc """ conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, conv_G, flag, cut_flag = model_extract( 'no_include_fc') print("Extracted cut flag: ", cut_flag) OPs = gop_calculate(conv_N, conv_M, conv_R, conv_K) max_layerout = max_layer_dataout(conv_N, conv_M, conv_R, conv_K) print_line("Model extract phase") print "1: ", "Model extracted" print "1: ", "Overall convolution operation required: ", OPs print "1: ", "Max layer output data: ", max_layerout # print_line("Model split finish") """ step 2: randomly cluster, param k=4, layer label results are in item """ print_line("Model partition phase") for i in range(0, len(conv_N)): layer_list.append(i) # kmeans=clusters_layers_kmeans(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, 2) # print kmeans partition_location, diff_ratio = model_partition_by_gop( conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, conv_G, flag, cut_flag) print "2: layers extracted", conv_N print "2: layers cutable ", cut_flag print "2: partition location", partition_location print "2: diff_ratio: ", diff_ratio sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag \ =model_partition_ordered(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, conv_G, flag, partition_location[0]+1, partition_location[1]+1) # print "2: Best partition output: ", partition_location, diff_ratio print "2:", sub_conv_N sub_gop_list = [] for i in range(0, len(sub_conv_N)): sub_gop_list.append( gop_calculate(sub_conv_N[i], sub_conv_M[i], sub_conv_r[i], sub_conv_K[i])) print "2: gop of sub_nets", sub_gop_list print "2: length of sub_conv_N", len(sub_conv_N[0]), len( sub_conv_N[1]), len(sub_conv_N[2]) print "2", sub_flag print "2: length of sub_flag", len(sub_flag[0]), len(sub_flag[1]), len( sub_flag[2]) sub_pair_list = [] sub_lat_list = [] sub_util_list = [] print_line("Best Configuration Search") overall_start = time.time() # acc_cluster_num = 3 # pair_list, item_list, gop_list, util_list = global_search(layer_list, acc_cluster_num, conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, flag, overall_lat) # pair_list, gop_list, util_list = per_die_config_dse_multiAcc(sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, # sub_conv_S, sub_flag) pair_list = per_die_config_dse_multiAcc_flex(sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag) overall_end = time.time() print_line("DSEoutpout") print "Best Configuration Search Results: " for i in range(0, len(pair_list)): print pair_list[i] # print item_list #print "gop_list: ", gop_list #print "pair_list: ", pair_list #print "util_list: ", util_list # for i in range(0, len(util_list)): # print util_list[i], sum(util_list[i]) print "------------------------Final optimal configuration-------------------------------" # print "Network clustered results =", item_list[util_list.index(min(util_list))] # print "<Tm, Tn> = ", pair_list[util_list.index(min(util_list))] # print "Estimated overall latency = ", min(util_list) print "Overall time cost:", overall_end - overall_start, "s" print "----------------------------------------------------------------------------------" # item = return_partition(layer_list, 4, False) # # '''step 3: split the layers based on label clustering results''' # print("layer number is: ", int(len(conv_N))) # sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag \ # = model_split_by_list(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, flag, item) # print sub_conv_N # print "model clustering test done!!!" # # '''step 4: do local search for all sub-models and find optimial <Tm, Tn> pair, lat, and util''' # sub_pair_list, sub_lat_list, sub_util_list = \ # local_search(sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag) # print sub_pair_list, sub_lat_list, sub_util_list # # if max(sub_lat_list) < overall_lat: # overall_lat = max(sub_lat_list) # if len(pair_list) < 10: # pair_list.append(sub_pair_list) # pair_list.append([overall_lat]) # else: # max_among_mins = pair_list.index(max(overall_lat)) # pair_list.remove(pair_list[max_among_mins]) # pair_list.append(sub_pair_list) # pair_list.append([overall_lat]) # print(pair_1, "%.2f" % util_1, pair_2, "%.2f" % util_2, pair_3, "%.2f" % util_3, lat_1, lat_2, lat_3) # for i in range(1, int(len(conv_N)-1)): # for j in range(int(i+1), int(len(conv_N))): # for i in range(1, 10): # for j in range(1, 10): # sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag = model_split_ordered(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, flag, i, j) # sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag = model_split_unordered(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, flag) # sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag = model_split_by_label(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, flag, kmeans.labels_) # print(sub_conv_N) # pair_1, lat_1, pair_2, lat_2, pair_3, lat_3, util_1, util_2, util_3 = local_search(sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag) # # print(i, j, pair_1, "%.2f" % util_1, pair_2, "%.2f" % util_2, pair_3, "%.2f" % util_3, lat_1, lat_2, lat_3) # # if max(lat_1, lat_2, lat_3) < overall_lat: # overall_lat = max(lat_1, lat_2, lat_3) # # if len(pair_list) < 50: # pair_list.append([i, j]) # pair_list.append(pair_1) # pair_list.append(pair_2) # pair_list.append(pair_3) # pair_list.append([overall_lat]) # # else: # # max_among_mins = pair_list.index(max(overall_lat)) # # pair_list.remove(pair_list[max_among_mins]) # # pair_list.append(pair_1) # # pair_list.append(pair_2) # # pair_list.append(pair_3) # # pair_list.append(overall_lat) # print(pair_list) # #step 3: # find_min_in_pairs() # min_among_mins = pair_list.index(min(overall_lat)) # print(pair_list[min_among_mins]) print "---------------------------- test part -------------------------------------------" print conv_net_perf(sub_conv_N[2], sub_conv_M[2], sub_conv_R[2], sub_conv_S[2], sub_conv_K[2], sub_flag[2], 8, 274, 37, 4, 4)
def model_partition_by_gop(conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, conv_G, flag, cut_flag): sub_conv_N = [] sub_conv_M = [] sub_conv_r = [] sub_conv_R = [] sub_conv_K = [] sub_conv_S = [] sub_flag = [] balance_ratio = 0 min_ration = 0.5 min_pair = [0, 0] sub_gops = [[], [], []] model_len = int(len(conv_N)) for i in range(0, model_len - 2): for j in range(i + 1, model_len - 1): sub_conv_N, sub_conv_M, sub_conv_r, sub_conv_R, sub_conv_K, sub_conv_S, sub_flag = model_partition_ordered( conv_N, conv_M, conv_r, conv_R, conv_K, conv_S, conv_G, flag, i + 1, j + 1) # print sub_conv_N for k in range(0, 3): sub_gops[k] = gop_calculate(sub_conv_N[k], sub_conv_M[k], sub_conv_R[k], sub_conv_K[k]) # sub_gops[k] = conv_net_perf_theo(sub_conv_N[k], sub_conv_M[k], sub_conv_R[k], sub_conv_K[k]) balance_ratio = (max(sub_gops) - min(sub_gops)) / float( min(sub_gops)) # print sub_gops # print "2: ", i, j, sub_gops, balance_ratio, sub_conv_N, sub_conv_M print("Verigy cut status: ", i, j, cut_flag[i], cut_flag[j]) if i == 0 and j == 1: min_ration = balance_ratio print("initial balance ratio: ", balance_ratio) min_pair = [i, j] else: if cut_flag[i] == 1 & cut_flag[j] == 1: if balance_ratio < min_ration: min_ration = balance_ratio min_pair = [i, j] print "min_ratio: ", min_ration, min_pair return min_pair, min_ration