{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\nimport os\n'''\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n'''\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-11T09:32:14.370095Z","iopub.execute_input":"2023-09-11T09:32:14.370546Z","iopub.status.idle":"2023-09-11T09:32:14.812203Z","shell.execute_reply.started":"2023-09-11T09:32:14.370513Z","shell.execute_reply":"2023-09-11T09:32:14.810328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install torch_geometric","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:32:15.838161Z","iopub.execute_input":"2023-09-11T09:32:15.838965Z","iopub.status.idle":"2023-09-11T09:32:49.736834Z","shell.execute_reply.started":"2023-09-11T09:32:15.838902Z","shell.execute_reply":"2023-09-11T09:32:49.735494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(action='ignore')\n\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport networkx as nx\n\nfrom tqdm import tqdm ; tqdm.pandas()\nimport time\n\nfrom sklearn.linear_model import LinearRegression\n\nimport torch\nfrom torch import nn\nfrom torch import Tensor\nfrom torch_geometric.nn import GCNConv # Graph Neural Network\n\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:33:03.950688Z","iopub.execute_input":"2023-09-11T09:33:03.951784Z","iopub.status.idle":"2023-09-11T09:33:03.960953Z","shell.execute_reply.started":"2023-09-11T09:33:03.951741Z","shell.execute_reply":"2023-09-11T09:33:03.959471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Google - Fast or Slow? Predict AI Model Runtime\n#### ■ 어떤 예측문제 일까요?\n- Alice는 AI 모델 개발자 입니다. 그녀의 팀이 개발한 일부 모델은 속도가 매우 느렸습니다. \n- 그녀는 Compiler를 통해 모델을 compile 하고 최적화하는 방식을 변경하여 모델이 더 빠르게 실행되도록 하는 구성을 찾고 있습니다. \n- 즉, Alice가 각 모델에 가장 적합한 구성을 찾도록 돕는 것입니다.\n- **목표: Train set에 제공된 runtime 데이터를 기반으로 기계 학습 모델을 학습하고 Test set에서 runtime을 예측, runtime을 최소화 하는 best 구성방식들을 찾아내는 것입니다.**\n","metadata":{"execution":{"iopub.status.busy":"2023-09-10T08:40:58.104397Z","iopub.execute_input":"2023-09-10T08:40:58.104834Z","iopub.status.idle":"2023-09-10T08:40:58.116181Z","shell.execute_reply.started":"2023-09-10T08:40:58.104803Z","shell.execute_reply":"2023-09-10T08:40:58.114555Z"}}},{"cell_type":"markdown","source":"# 1. 데이터 로드","metadata":{}},{"cell_type":"markdown","source":"#### ■ 데이터는 어떤 구조일까요?\n\n- 데이터가 꽤 복잡합니다.\n- 각각의 npz 파일(관측치)이 Model 그래프(Kernel을 지칭)를 저장하고 있습니다.\n- 또한, 그래프 수준에서 각각을 TPU(Tensor process unit)에서 실행하고 c개의 다른 구성으로 컴파일 했습니다.\n\n** TPU에 대해선 여기서 확인할 수 있습니다 : https://cloud.google.com/tpu/docs/intro-to-tpu?hl=ko","metadata":{"execution":{"iopub.status.busy":"2023-09-10T08:41:23.400560Z","iopub.execute_input":"2023-09-10T08:41:23.400966Z","iopub.status.idle":"2023-09-10T08:41:23.409038Z","shell.execute_reply.started":"2023-09-10T08:41:23.400935Z","shell.execute_reply":"2023-09-10T08:41:23.407228Z"}}},{"cell_type":"markdown","source":"##### 백문이 불여일견, 일단 데이터 1개(Model 그래프 1개)를 불러와보겠습니다.","metadata":{}},{"cell_type":"code","source":"os.chdir('/kaggle/input/predict-ai-model-runtime/npz_all/npz/') # work directory 설정","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:33:23.098324Z","iopub.execute_input":"2023-09-11T09:33:23.098772Z","iopub.status.idle":"2023-09-11T09:33:23.104992Z","shell.execute_reply.started":"2023-09-11T09:33:23.098739Z","shell.execute_reply":"2023-09-11T09:33:23.103727Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# npz 개별 파일을 1개 불러와서 shape을 탐색\nd = dict(np.load(\"tile/xla/train/alexnet_train_batch_32_-1bae27a41d70f4dc.npz\"))\n\nfor key,val in d.items() : print(key, val.shape )\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:33:24.611973Z","iopub.execute_input":"2023-09-11T09:33:24.612797Z","iopub.status.idle":"2023-09-11T09:33:24.632908Z","shell.execute_reply.started":"2023-09-11T09:33:24.612742Z","shell.execute_reply":"2023-09-11T09:33:24.631622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### ■ 데이터 구성요소 설명\n각 npz 파일은 모델 그래프를 저장하고 있다고 했습니다. 해당 그래프에는 n개의 노드와 m개의 엣지가 있습니다.\n\n- **node_feat (n, 140)** : 각 노드에 대한 속성을 나타내는 feature vector 입니다.\n- **node_opcode (n,)** : 각 노드의 오프코드(op-code) 입니다. 각 노드는 모델그래프에서 연산자 기능을 수행하며, op-code는 기능에 대한 유효값 입니다.\n- **edge_index (m, 2)** : 각 노드 간 방향성 있는 연결관계를 나타냅니다. (ex. A노드 -> B노드 ...)\n\n각 그래프를 c개의 방법으로 compile 할 수 있습니다.\n\n- **config_feat (c, 24)** : 각 compile 방식의 feature vector 입니다.\n\n- **config_runtime (c,)** : 각 compile 방식으로 run 했을때, runtime 입니다. 본 문제에서 예측해야하는 대상 입니다.\n- **config_runtime_normalizers (c,)** : runtime을 normalization 위한 부가 정보입니다.\n\n결론적으로 머신러닝을 통해 예측해야 하는 **Y = config_runtime / config_runtime_normalizers**\n\nX는 일반적인 유클리드 벡터가 아니지만 간단하게 생각했을때, **가용한 정보는 크게 2가지로 분류할 수 있습니다. 1)그래프의 구성요소와 2)컴파일의 구성요소** 입니다.\n1과 2를 정형화 하고 Feature화 하는 것이 주요한 Task가 될 것입니다.\n","metadata":{}},{"cell_type":"code","source":"# load files as DataFrame\ndef getData(kind_dir, splits = [\"train\", \"valid\", \"test\"]) :\n    ''' \n    예시 )\n    kind_dir = './tile/xla/'\n    '''\n    results = []\n    for split in splits :\n        path = kind_dir + split + '/'\n        print(path)\n        \n        filelst = os.listdir(path)\n        \n        for file in tqdm(filelst) :\n            # file = filelst[0]\n            d = dict(np.load(os.path.join(path,file)))\n            d['id'] = file\n            d['split'] = split\n            results.append(d)\n    \n    df = pd.DataFrame.from_dict(results)\n        \n    return df\n\ndf = getData(kind_dir = './tile/xla/', splits = [\"train\", \"valid\"])","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:33:27.786794Z","iopub.execute_input":"2023-09-11T09:33:27.787805Z","iopub.status.idle":"2023-09-11T09:34:16.536857Z","shell.execute_reply.started":"2023-09-11T09:33:27.787763Z","shell.execute_reply":"2023-09-11T09:34:16.535789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(df)","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:35:15.217028Z","iopub.execute_input":"2023-09-11T09:35:15.217441Z","iopub.status.idle":"2023-09-11T09:35:16.538954Z","shell.execute_reply.started":"2023-09-11T09:35:15.217412Z","shell.execute_reply":"2023-09-11T09:35:16.537735Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. EDA 및 Feature Engineering","metadata":{}},{"cell_type":"markdown","source":"## (1) runtime 특성 탐색","metadata":{}},{"cell_type":"markdown","source":"##### 아래는 무작위로 추출된 표본 Model들의 그래프와 그 것의 runtime 분포 입니다.\n##### - 모델 그래프의 각 Node는 연산자 역할을 수행하는 것이고, (ex. add/minus/multiple/concat ... )\n##### - 간선은 결과 값을 전송합니다.","metadata":{}},{"cell_type":"markdown","source":"##### - runtime이 대체로 어떤 분포를 가지는지 탐색합니다. \n\n##### - runtime의 길이는 Model 수 * c(Compile configure) 입니다. 1개의 Model에 다양한 compile 방식을 적용할 수 있기 때문입니다.\n##### - 따라서, Graph level에서 집계된 통계(node의 수, network상 집중도 등)와 runtime의 관계를 분석하려면, runtime은 평균 등의 요약통계 레벨로 집계해야 합니다.","metadata":{}},{"cell_type":"code","source":"# 그래프 그려보기.\nfor i in np.arange(2, len(df), 1000 ) : # 샘플 5~6개\n    d = df.iloc[i]\n    \n    fig, axlst = plt.subplots(nrows = 3, figsize = [6,8])\n    \n    # (1) nx graph\n    # 그래프의 생김새를 탐색한다. 이 것을 Feature로써 정량화 하는 것이 주요 Task가 될 것이다.\n    g1 = nx.DiGraph()\n    g1.add_edges_from( d['edge_index'] )\n    \n    ax = axlst[0]\n    nx.draw(g1, with_labels = True, node_color =  d['node_opcode'], cmap = 'gnuplot', ax = ax)\n    ax.set_title(d['id'])\n    \n    # (2) runtime (y)\n    # 그래프 레벨에서의 Stats(전체 노드의 수, 엣지의 수 등) <-> runtime 을 비교 하고자 한다.\n    # runtime이 config. 방법에 따라 변동이 크므로, log를 취하는 것이 적정해보인다.\n\n    rawval = d[\"config_runtime\"] / d[\"config_runtime_normalizers\"]\n    logval = np.log(rawval)\n    \n    axlst[1].hist(rawval, color = 'grey' , alpha= .8, label = 'runtime', bins = 100) \n    axlst[1].axvline( np.mean(rawval), color = 'red', linestyle = '--' ,label ='mean')\n    axlst[1].axvline( np.median(rawval), color = 'green', linestyle = '--' ,label ='median')\n    axlst[1].legend()\n    \n    axlst[2].hist(logval, color = 'blue' , alpha= .8, label = 'log(runtime)', bins = 100) \n    axlst[2].axvline( np.mean(logval), color = 'red', linestyle = '--' ,label ='mean')\n    axlst[2].axvline( np.median(logval), color = 'green', linestyle = '--' ,label ='median')\n    axlst[2].legend()\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:40:09.738965Z","iopub.execute_input":"2023-09-11T09:40:09.739421Z","iopub.status.idle":"2023-09-11T09:40:22.255512Z","shell.execute_reply.started":"2023-09-11T09:40:09.739390Z","shell.execute_reply":"2023-09-11T09:40:22.254190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### - 모델 그래프의 복잡도가 증가할수록, Compile 케이스도 많아지며 runtime의 분산도 커집니다. \n##### - runtime의 극단값이 많으므로, log scale 로 변환한뒤 Graph level 통계와 비교하는 것이 용이할 것입니다.","metadata":{}},{"cell_type":"code","source":"# runtime 1) log 변환 > 2) average\ndef avglog_runtime(d) :\n    return np.mean(np.log( d[\"config_runtime\"] / d[\"config_runtime_normalizers\"] ))\n\navglog_runt = df.apply(avglog_runtime, axis = 1) # avg of log(runtime)","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:43:44.692492Z","iopub.execute_input":"2023-09-11T09:43:44.692948Z","iopub.status.idle":"2023-09-11T09:43:45.096460Z","shell.execute_reply.started":"2023-09-11T09:43:44.692896Z","shell.execute_reply":"2023-09-11T09:43:45.095333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## (2) Graph Network 파생변수 생성","metadata":{}},{"cell_type":"markdown","source":"그래프를 하나의 **네트워크**로 보고 정보를 추출하여 feature화 합니다.\n아래는 일반적인 네트워크 분석에 사용되는 파생변수 입니다. \n\n1. node_n  = 그래프 내 노드의 수\n2. edge_n  = 그래프 내 엣지(연결선)의 수\n3. Average Degree (네트워크밀도) = edge_n / node_n\n4. 평균 경로 길이 : 모든 노드 쌍 간의 최단 경로 길이를 평균화한 값\n5. 군집 계수 : 네트워크 내의 군집화 정도를 측정하는 지표\n6. 네트워크 Size(지름) : 네트워크 내에서 가장 먼 두 노드 간의 최단 경로 길이","metadata":{}},{"cell_type":"code","source":"def Generate_NStats(d) :\n    '''\n    # 파생변수 만들기 (in Grpah lvl) \n    # 1. node_n  = len(d['node_feat'])\n    # 2. edge_n  = len(d['edge_index'])\n    # 3. Average Degree (네트워크밀도) = edge_n / node_n\n    # 4. 평균 경로 길이 : 모든 노드 쌍 간의 최단 경로 길이를 평균화한 값\n    # 5. 군집 계수\t네트워크 내의 군집화 정도를 측정하는 지표\n    # 6. 네트워크 Size(지름) : 네트워크 내에서 가장 먼 두 노드 간의 최단 경로 길이\n    '''\n    \n    def clustering_coefficient(node, edge_index):\n        neighbors = [edge[1] for edge in edge_index if edge[0] == node or edge[1] == node]\n        num_triangles = 0\n        num_possible_triangles = len(neighbors) * (len(neighbors) - 1) / 2\n        if num_possible_triangles == 0:\n            return 0\n        for i in range(len(neighbors)):\n            for j in range(i + 1, len(neighbors)):\n                if [neighbors[i], neighbors[j]] in edge_index or [neighbors[j], neighbors[i]] in edge_index:\n                    num_triangles += 1\n        return num_triangles / num_possible_triangles\n    \n    def average_shortest_path_length(edge_index):\n        graph = {}\n        for edge in edge_index:\n            u, v = edge\n            if u not in graph:\n                graph[u] = []\n            if v not in graph:\n                graph[v] = []\n            graph[u].append(v)\n            graph[v].append(u)\n    \n        total_shortest_path_length = 0\n        total_pairs = 0\n    \n        for start_node in graph.keys():\n            visited = set()\n            queue = [(start_node, 0)]\n            while queue:\n                node, distance = queue.pop(0)\n                visited.add(node)\n    \n                for neighbor in graph[node]:\n                    if neighbor not in visited:\n                        queue.append((neighbor, distance + 1))\n                        total_shortest_path_length += distance + 1\n                        total_pairs += 1\n        if total_pairs == 0:\n            return 0\n    \n        avg_shortest_path_length = total_shortest_path_length / total_pairs\n        return avg_shortest_path_length\n    \n    def network_diameter(edge_index):\n        def bfs(start):\n            visited = set()\n            queue = [(start, 0)]\n            while queue:\n                node, depth = queue.pop(0)\n                visited.add(node)\n                for edge in edge_index:\n                    if edge[0] == node and edge[1] not in visited:\n                        queue.append((edge[1], depth + 1))\n                    elif edge[1] == node and edge[0] not in visited:\n                        queue.append((edge[0], depth + 1))\n            return depth\n    \n        diameters = []\n        for i in range(num_nodes):\n            diameter = bfs(i)\n            diameters.append(diameter)\n        return max(diameters)\n    \n    edge_index = d['edge_index'].copy() # input\n    \n    # 1. 노드 수 계산\n    num_nodes = len(d['node_feat'])\n    \n    # 2. 링크 수 계산\n    num_edges = len(edge_index)\n    \n    # 3. 밀도\n    net_density = num_edges / num_nodes\n    \n    # 4. 평균 경로 길이 계산    \n    avg_shortest_path_length = average_shortest_path_length(edge_index)\n    \n    # 5. 군집 계수 계산\n    clustering_coefficients = [clustering_coefficient(i, edge_index) for i in range(num_nodes)] # 각 노드의 군집 계수 계산\n    avg_clustering_coefficient = sum(clustering_coefficients) / num_nodes # 평균 군집 계수 계산\n    \n    # 6. 네트워크 지름 계산\n    # network_diameter = network_diameter(edge_index) # (!)too much time taken\n    \n    # 결과 취합\n    result_dict = {'num_nodes':num_nodes,\n                   'num_edges':num_edges,\n                   'net_dense':net_density,\n                   'avg_nodes_shortest_dist': avg_shortest_path_length,\n                   'clust_coeff' : avg_clustering_coefficient,\n                   #'net_size' : network_diameter\n                   }\n\n    return result_dict\n\ndef Generate_NStats_forapply(d) :\n    return pd.Series(Generate_NStats(d))\n\ndf_stats = df.progress_apply(Generate_NStats_forapply, axis = 1)\ndf_stats['split'] = df['split']\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:43:48.220536Z","iopub.execute_input":"2023-09-11T09:43:48.220946Z","iopub.status.idle":"2023-09-11T09:44:47.640061Z","shell.execute_reply.started":"2023-09-11T09:43:48.220895Z","shell.execute_reply":"2023-09-11T09:44:47.639049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_stats['avg_log_runtime'] = avglog_runt # runtime 데이터 가져오기","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:44:53.368339Z","iopub.execute_input":"2023-09-11T09:44:53.368737Z","iopub.status.idle":"2023-09-11T09:44:53.374816Z","shell.execute_reply.started":"2023-09-11T09:44:53.368709Z","shell.execute_reply":"2023-09-11T09:44:53.373692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### 위 feature set은 종단면(longitudinal) 관점에서, 개별 그래프의 특성입니다.\n##### 그래프 관측치(obs) 간 차이의 통계도 생성하겠습니다. \n- 예측 문제가 runtime이 상대적으로 적게 걸리는 setting을 find 하는 것이므로, 관측치 간 통계적차이가 유효할 수 있음.\n- 변수 특질상 종단면 값이 더 유효한 변수도 있을 수 있음","metadata":{}},{"cell_type":"code","source":"# 횡단면 feature는 간단하게 관측치(Obs) 간 rank 로 생성한다.\nlongitudinal_fs = ['num_nodes', 'num_edges', 'net_dense', 'avg_nodes_shortest_dist','clust_coeff']\ncrosssec_fs = []\nfor each_x in longitudinal_fs :\n    newname = 'Rank_' + each_x\n    df_stats[newname] = df_stats[each_x].rank(pct = True) # rank 방식\n    # df_stats[newname] = (df_stats[each_x] - df_stats[each_x].mean() ) / df_stats[each_x].std() # Z-score\n    crosssec_fs.append(newname)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:44:55.786676Z","iopub.execute_input":"2023-09-11T09:44:55.787889Z","iopub.status.idle":"2023-09-11T09:44:55.807113Z","shell.execute_reply.started":"2023-09-11T09:44:55.787844Z","shell.execute_reply":"2023-09-11T09:44:55.806147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Joint plot\n- 이제 생성한 Network feature와 runtime(log의 평균) 간의 관계를 탐색해보겠습니다.","metadata":{}},{"cell_type":"code","source":"y_variable = \"avg_log_runtime\"\n\n# joint plot\nfor raw_x, rank_x in dict(zip(longitudinal_fs, crosssec_fs)).items() :\n    # a. 종단면변수\n    g0 = sns.jointplot(data = df_stats.loc[df_stats['split']=='train'],\n                  x = raw_x,\n                  y = y_variable,\n                  kind = \"reg\",\n                  joint_kws = {'scatter_kws': {'alpha':.05, 'color':'grey'} }\n                  )\n    # b. 횡단면변수\n    g1= sns.jointplot(data = df_stats.loc[df_stats['split']=='train'],\n                  x = rank_x,\n                  y = y_variable,\n                  kind = \"reg\",\n                  joint_kws = {'scatter_kws': {'alpha':.05, 'color':'grey'} }\n                  )\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:44:58.239660Z","iopub.execute_input":"2023-09-11T09:44:58.240115Z","iopub.status.idle":"2023-09-11T09:45:15.936310Z","shell.execute_reply.started":"2023-09-11T09:44:58.240078Z","shell.execute_reply":"2023-09-11T09:45:15.935183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Correlation","metadata":{}},{"cell_type":"code","source":"# corr\ny_variable = \"avg_log_runtime\"\n\nfor eachset in [longitudinal_fs, crosssec_fs] :\n    collst = list(np.append(eachset, y_variable))\n    fig, ax = plt.subplots()\n    sns.heatmap( df_stats.loc[df_stats['split']=='train', collst].corr(), \n                cmap = sns.cubehelix_palette(as_cmap=True),\n                annot = True, fmt=\".2f\", linewidth=.5)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:45:36.769448Z","iopub.execute_input":"2023-09-11T09:45:36.769874Z","iopub.status.idle":"2023-09-11T09:45:37.815533Z","shell.execute_reply.started":"2023-09-11T09:45:36.769843Z","shell.execute_reply":"2023-09-11T09:45:37.814285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### - 기본적으로 노드의 수/엣지 등의 증가는 네트워크의 복잡성 증가를 의미하며, 이 것이 runtime(\"avg_log_runtime\") 증가에 positive 하게 작용하는 것으로 보입니다.\n##### - 노드의 수/엣지 등은 rank 변환이 기존 변수 보다 runtime에 대해 더 높은 상관계수를 보입니다. **상대적인 척도**가 중요한 변수들입니다. \n##### - 군집계수/네트워크 밀도 등은 rank 변환이 큰 의미 없습니다. **절대적인 척도**가 중요한 변수들입니다.","metadata":{}},{"cell_type":"code","source":"stat_collst = list(np.append(longitudinal_fs, crosssec_fs)) # 위에서 생성한 변수 리스트","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:45:43.191968Z","iopub.execute_input":"2023-09-11T09:45:43.192378Z","iopub.status.idle":"2023-09-11T09:45:43.199072Z","shell.execute_reply.started":"2023-09-11T09:45:43.192345Z","shell.execute_reply":"2023-09-11T09:45:43.197556Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### network의 stats.을 통해 모델 그래프들을 클러스터링 해보겠습니다. \n(클러스터 Label 별로 통계를 산출하는 등 탐색적 분석 목적에 활용하기 위함)\n","metadata":{}},{"cell_type":"code","source":"\nfrom sklearn.cluster import KMeans\n\n# 적정 군집수 탐색\nx = df_stats[stat_collst].copy()\ndistorsions = []\nfor k in range(2, 10):\n    kmeans = KMeans(n_clusters=k)\n    kmeans.fit(x)\n    distorsions.append(kmeans.inertia_)\n\nfig = plt.figure(figsize=(15, 5))\nplt.plot(range(2, 10), distorsions)\nplt.grid(True)\nplt.title('Elbow curve')","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:45:49.671560Z","iopub.execute_input":"2023-09-11T09:45:49.671999Z","iopub.status.idle":"2023-09-11T09:45:59.741916Z","shell.execute_reply.started":"2023-09-11T09:45:49.671959Z","shell.execute_reply":"2023-09-11T09:45:59.740582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 군집수 = 5로 클러스터링\nkmeans = KMeans(n_clusters=5, random_state=0).fit(df_stats[stat_collst])\n\ncl_lab= kmeans.labels_","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:46:47.033452Z","iopub.execute_input":"2023-09-11T09:46:47.033897Z","iopub.status.idle":"2023-09-11T09:46:48.388092Z","shell.execute_reply.started":"2023-09-11T09:46:47.033861Z","shell.execute_reply":"2023-09-11T09:46:48.387129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Graph 통계데이터 저장\ndf = pd.concat([df, df_stats[stat_collst]],axis = 1)","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:46:48.539032Z","iopub.execute_input":"2023-09-11T09:46:48.539863Z","iopub.status.idle":"2023-09-11T09:46:48.548803Z","shell.execute_reply.started":"2023-09-11T09:46:48.539821Z","shell.execute_reply":"2023-09-11T09:46:48.547169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## (3) Config. Feature 탐색","metadata":{}},{"cell_type":"markdown","source":"##### - Tile Config Features","metadata":{}},{"cell_type":"code","source":"# 한 개만 sample로 추출해서 탐색해봅니다.\nd = df.iloc[0] \nprint(d['config_feat']) \nprint('shape:',d['config_feat'].shape,'=(c, 24)')","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:46:51.947961Z","iopub.execute_input":"2023-09-11T09:46:51.948365Z","iopub.status.idle":"2023-09-11T09:46:51.956996Z","shell.execute_reply.started":"2023-09-11T09:46:51.948333Z","shell.execute_reply":"2023-09-11T09:46:51.955979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### ■ Config Feat.(c*24) 에서 각 24개 컬럼이 의미하는 바는?\n- Tile 구성 feature vector의 특정 인덱스에 있는 각 요소를 설명합니다.\n\n- 0–7: Tile sizes of the convolution kernel, only for a convolution operation.\n\n0: kernel_bounds_0\n1: kernel_bounds_1\n2: kernel_bounds_2\n3: kernel_bounds_3\n4: kernel_bounds_4\n5: kernel_bounds_5\n**6: kernel_bounds_sum**\n7: kernel_bounds_product\n\n- 8–15: Output tile sizes.\n\n8: output_bounds_0\n9: output_bounds_1\n10: output_bounds_2\n11: output_bounds_3\n12: output_bounds_4\n13: output_bounds_5\n**14: output_bounds_sum**\n15: output_bounds_product\n\n- 16-23: Input tile sizes.\n*input_bounds는 컴파일러가 output_bounds(및 kernel_bounds)에서 추론할 수 있기 때문에 일반적으로 0으로 설정됩니다.\n\n16: input_bounds_0\n17: input_bounds_1\n18: input_bounds_2\n19: input_bounds_3\n20: input_bounds_4\n21: input_bounds_5\n**22: input_bounds_sum**\n23: input_bounds_product","metadata":{}},{"cell_type":"code","source":"fig, ax = plt.subplots()\nsns.heatmap(d['config_feat'], cmap = 'mako_r', ax = ax) # c,24    ","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:46:54.469033Z","iopub.execute_input":"2023-09-11T09:46:54.469588Z","iopub.status.idle":"2023-09-11T09:46:55.259731Z","shell.execute_reply.started":"2023-09-11T09:46:54.469531Z","shell.execute_reply":"2023-09-11T09:46:55.258434Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### **간단하게** 생각하면, \n- 전체 Model Graph 는 Optimization시, Kernel/Output/Input 3가지 바운더리로 나뉩니다. \n- 다시 말하면 3영역이 각각 fused subgraph 이고, Model Graph 는 multiple tensor oprations을 통합한 것입니다.\n- 위에서 **0-7까지는 Kernel, 8-15는 Output, 16-23은 Input의 타일 사이즈**를 나타냅니다.\n- 컴파일시, 위 3개 영역 각각의 Size를 다르게 조정할 수 있습니다.\n\n- 그 중 **6,14,22번째 index들은 각각 Kernel/Output/Input 타일 사이즈의 SUM을 집계한 것**입니다.","metadata":{}},{"cell_type":"markdown","source":"#### Compile Feature를 모델에 맞게 가공하기 (비중 변환)\n- 각 모델 Graph 는 C개의 Compile feature vector를 가지고 있습니다. \n- Compile feature vector는 kernel/output/input 간 바운더리 사이즈를 나타냅니다. 즉, 모델 내 각 바운더리 요소가 차지하는 크기입니다.\n- Size 총량은 Complier에 따라 가변할 수 있습니다.\n- 머신러닝 모델 학습시 Kernel(또는 Output)의 절대적인 size가 몇인지 보다, 다른 바운더리(Output, Input) 대비 Kernel(또는 Output) size가 **상대적으로** 얼마나 큰 지, **비중이 중요한 정보**를 제공할 수 있습니다.\n\n- 아래에서 **'비중' 정보가 중요하다**는 가설을 검증하려 합니다.\n- 먼저 간단하게 몇 개의 sample 을 뽑고, (1) runtime<->'절대값' / (2) runtime<->'비중' 관계를 plot으로 비교해봅니다.","metadata":{}},{"cell_type":"markdown","source":"#### 4개 모델을 샘플링 하고 plot 했습니다. 각 모델 별로 5개의 figure가 있습니다.\n#### figure가 각각 지칭하는 바는 다음과 같습니다.\n\n- FIG1. 행렬 히트맵\n- FIG2. Config feature - Absolute Value : **x축은 '절대값'** 으로 구성된 Config feature vector, y축은 'runtime', 각 색상라벨은 kernel/output/input 바운더리 size 입니다.\n- FIG3. Kernel's Absolute Value : x축은 'Kernel' size의 **절대값**, y축은 'runtime'\n\n- FIG4. Config feature - Ratio Value : **x축은 '비율'** 로 구성된 Config feature vector, 이하는 Fig2과 동일\n- FIG5. Kernel's Ratio Value : x축은 'Kernel' size의 **비중값**, 이하 Fig3과 동일","metadata":{}},{"cell_type":"code","source":"for i in [113,123,3211,5000] : # 4개의 무작위 sample obs를 뽑습니다\n    \n    d = df.iloc[i] \n    \n    fig, ax = plt.subplots()\n    sns.heatmap(d['config_feat'], cmap = 'mako_r', ax = ax) # c,24\n    ax.set_title(d['id'])\n    \n    # <Tile Config Features>\n    # 6: kernel_bounds_sum 은 0~5 까지의 SUM이다.\n    # 즉, np.sum(d['config_feat'][:,0:6] ,axis = 1) == d['config_feat'][:,6] # equal\n    \n    # => kernel/output/input의 전체 대비 비율을 구하는 것이 의미 있을 수 있다.\n    tile_eachsums = d['config_feat'][:,[6,14,22]]\n    \n    tile_total_sum = np.sum(tile_eachsums, axis = 1)[:, np.newaxis]\n    \n    cf_ratio = d['config_feat'] / tile_total_sum # config_feat의 비율화 (=x/x.sum()), 학습시 상대비율 정보가 용이할 것이라는 가설\n    \n    # y와 관계는?\n    y_vec = d['config_runtime'] / d['config_runtime_normalizers']\n    \n    allstacked = []\n    for key, each_idx in dict(zip(['kernel','output','input'],[6,14,22])).items() :\n        tmp = pd.DataFrame(d['config_feat'][:,each_idx], columns = ['boundsum'])\n        \n        tmp['boundsum_ratio_to_total'] = cf_ratio[:,each_idx]\n        \n        tmp['CONFIG'] = key\n        tmp['config_runtime(norm)'] = y_vec\n        allstacked.append(tmp)\n    alldats = pd.concat(allstacked,axis = 0 )\n    alldats = alldats.fillna(0)\n    try :\n        if len(alldats) <= 20000  :\n\n            g0 = sns.jointplot(data = alldats,\n                          x = 'boundsum',\n                          y = 'config_runtime(norm)',\n                          hue=\"CONFIG\",\n                          kind = \"kde\"\n                          )\n            g0.fig.suptitle(\"Config feature - Absolute Value\")\n            \n            g0 = sns.jointplot(\n                          x = d['config_feat'][:,6], #kernel\n                          y = y_vec,\n                          kind = \"reg\",\n                          joint_kws = {'scatter_kws': {'alpha':.05, 'color':'grey'} }\n                          )\n            g0.fig.suptitle(\"Kernel's Absolute Value\")\n            \n            g0 = sns.jointplot(data = alldats,\n                          x = 'boundsum_ratio_to_total',\n                          y = 'config_runtime(norm)',\n                          hue=\"CONFIG\",\n                          kind = \"kde\"\n                          )\n            g0.fig.suptitle(\"Config feature - Ratio Value\")\n\n\n            g0 = sns.jointplot(\n                          x = cf_ratio[:,6],\n                          y = y_vec,\n                          kind = \"reg\",\n                          joint_kws = {'scatter_kws': {'alpha':.05, 'color':'grey'} }\n                          )\n            g0.fig.suptitle(\"Kernel's Ratio Value\")\n\n        else :\n            print(i, 'skip')\n    except Exception as e : pass\n        ","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:48:33.300054Z","iopub.execute_input":"2023-09-11T09:48:33.300451Z","iopub.status.idle":"2023-09-11T09:49:17.872359Z","shell.execute_reply.started":"2023-09-11T09:48:33.300422Z","shell.execute_reply":"2023-09-11T09:49:17.871128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### - 기존 raw형 데이터의 확률밀도는 sparse 하게 나타나 over-fit에 취약할 수 있으나, '비중' 정보는 비교적 높은 밀도의 분포를 보입니다.\n#### - 기존 raw형 데이터는 out-lier에 의해 분포가 크게 가변해 over-fit에 취약할 수 있으나, '비중' 정보는 그렇지 않습니다.\n#### - '비중' 정보는 tile size의 총량에 의해 좌우되지 않아, 좀 더 stable 하게 보입니다.","metadata":{}},{"cell_type":"code","source":"# config_feat 의 비율화 적용\ndef get_ConfigRatio(d) :\n    tile_eachsums = d['config_feat'][:,[6,14,22]] # 6: kernel_bounds_sum / 14: output_bounds_sum / 22: input_bounds_sum\n    \n    tile_total_sum = np.sum(tile_eachsums, axis = 1)[:, np.newaxis]\n    \n    cf_ratio = d['config_feat'] / tile_total_sum # config_feat의 비율화 (=x/x.sum())\n    \n    cf_ratio = np.concatenate((cf_ratio, tile_total_sum),axis= 1) # 절대치도 의미 있으므로 tot_sum은 유지\n    \n    cf_ratio[np.isnan(cf_ratio)] = 0 # fillna\n    return cf_ratio\n\n\ndf['config_feat_ratio'] = df[['config_feat']].progress_apply(get_ConfigRatio, axis = 1)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:55:36.900288Z","iopub.execute_input":"2023-09-11T09:55:36.900892Z","iopub.status.idle":"2023-09-11T09:55:39.414726Z","shell.execute_reply.started":"2023-09-11T09:55:36.900846Z","shell.execute_reply":"2023-09-11T09:55:39.413507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(df[['config_feat','config_feat_ratio']].head(5))","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:55:40.617327Z","iopub.execute_input":"2023-09-11T09:55:40.617753Z","iopub.status.idle":"2023-09-11T09:55:41.147864Z","shell.execute_reply.started":"2023-09-11T09:55:40.617723Z","shell.execute_reply":"2023-09-11T09:55:41.146540Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 선형회귀를 적용해서, Feature 변환 전/후의 R^2 를 관찰 해보겠습니다.\n- 전체 모델 그래프 N개 일때, 각 그래프 i(i<N)는 c길이의 config feature와 c길이의 runtime을 가지고 있습니다.\n- 각각 모델 그래프에서 y(runtime)~x(config feature) 선형회귀를 적합합니다.\n- 전체 모델 그래프의 R^2의 평균 및 분포를 보고, x의 분포 변환이 어느정도 예측력에 개선이 있을지 가늠해보고자 합니다.\n\n비교하고자 하는 CASE는 아래 3가지 입니다.\n\n- **CASE1** : y ~ x1:Config. feature(i)의 **raw 값** \n- **CASE2** : y ~ x2:Config. feature(i)의 **ratio 값** \n- **CASE3** : y ~ **x1(i),x2(i)**\n\n** i = (c,k), k=(3) : kernel/output/input의 SUM, y = (c)\n","metadata":{}},{"cell_type":"code","source":"import statsmodels.api as sm\n\nresults_raw = [] \nresults_ratio = [] \nresults_total = [] \nfor i in tqdm(range(len(df))) :\n    d = df.iloc[i]\n    \n    x_raw = d['config_feat'][:,[6,14,22]]\n    x_ratio = d['config_feat_ratio'][:,[6,14,22]]\n    x_tot = np.concatenate([x_raw, x_ratio],axis=1)\n    y = d['config_runtime'] / d['config_runtime_normalizers']\n\n    result_raw = sm.OLS(y, sm.add_constant(x_raw)).fit()\n    result_ratio = sm.OLS(y, sm.add_constant(x_ratio)).fit()\n    result_tot = sm.OLS(y, sm.add_constant(x_tot)).fit()\n    \n    results_raw.append( result_raw.rsquared )\n    results_ratio.append( result_ratio.rsquared )\n    results_total.append( result_tot.rsquared)\n\nresults = pd.DataFrame({'C1:raw_r2':results_raw, 'C2:ratio_r2':results_ratio, 'C3:tot_r2':results_total})","metadata":{"execution":{"iopub.status.busy":"2023-09-11T09:55:47.022297Z","iopub.execute_input":"2023-09-11T09:55:47.022717Z","iopub.status.idle":"2023-09-11T09:56:27.011952Z","shell.execute_reply.started":"2023-09-11T09:55:47.022683Z","shell.execute_reply":"2023-09-11T09:56:27.010250Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"results[results<=0] = 0","metadata":{"execution":{"iopub.status.busy":"2023-09-11T10:00:41.534221Z","iopub.execute_input":"2023-09-11T10:00:41.534624Z","iopub.status.idle":"2023-09-11T10:00:41.541305Z","shell.execute_reply.started":"2023-09-11T10:00:41.534593Z","shell.execute_reply":"2023-09-11T10:00:41.540443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, ax = plt.subplots()\nax.bar(x = results.mean().index, height =  results.mean())\nax.set_ylabel('AVG(R^2)')\nax.set_title('Average of R-squared by case')","metadata":{"execution":{"iopub.status.busy":"2023-09-11T10:00:43.491507Z","iopub.execute_input":"2023-09-11T10:00:43.492167Z","iopub.status.idle":"2023-09-11T10:00:43.793958Z","shell.execute_reply.started":"2023-09-11T10:00:43.492117Z","shell.execute_reply":"2023-09-11T10:00:43.793007Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axlst = plt.subplots(sharex = True, sharey = True, nrows = 3)\nplt.ylim(0, 500)\n\nrawval = results['C1:raw_r2']\naxlst[0].hist(rawval, color = 'grey' , alpha= .8, label = 'C1:RAW', bins = 100) \naxlst[0].axvline( np.mean(rawval), color = 'red', linestyle = '--' ,label ='mean')\naxlst[0].axvline( np.median(rawval), color = 'green', linestyle = '--' ,label ='median')\naxlst[0].legend()\naxlst[0].set_title('Distribution of R-squared by case')\n\nrawval = results['C2:ratio_r2']\naxlst[1].hist(rawval, color = 'grey' , alpha= .8, label = 'C2:RATIO', bins = 100) \naxlst[1].axvline( np.mean(rawval), color = 'red', linestyle = '--' ,label ='mean')\naxlst[1].axvline( np.median(rawval), color = 'green', linestyle = '--' ,label ='median')\naxlst[1].legend()\n\nrawval = results['C3:tot_r2']\naxlst[2].hist(rawval, color = 'blue' , alpha= .8, label = 'C3:TOTAL', bins = 100) \naxlst[2].axvline( np.mean(rawval), color = 'red', linestyle = '--' ,label ='mean')\naxlst[2].axvline( np.median(rawval), color = 'green', linestyle = '--' ,label ='median')\naxlst[2].legend()\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T10:00:46.618058Z","iopub.execute_input":"2023-09-11T10:00:46.618455Z","iopub.status.idle":"2023-09-11T10:00:48.328795Z","shell.execute_reply.started":"2023-09-11T10:00:46.618425Z","shell.execute_reply":"2023-09-11T10:00:48.327392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- RAW 변수(C1)의 R^2가 RATIO 변수(C2) 보다 높습니다.\n- 그러나 RAW, RATIO를 모두 합친 C3이 가장 높습니다. \n- C3의 R^2 평균치는 약 0.36인데, 이는 C1(0.26)과 C2(0.10) 를 합한 것과 흡사합니다.\n#### => RATIO 와 RAW 변수가 가지는 정보의 성격이 상호간 독립적임을 의미하고, 두 Set을 함께 사용하는 것이 예측력 개선에 효과가 있을 수 있습니다.","metadata":{}},{"cell_type":"markdown","source":"#### 위에서 네트워크 통계(노드 수/밀집도 등)를 이용해 군집화를 했었습니다. 군집 별로 Compile feature의 R^2 어떤지 살펴봅니다.","metadata":{"execution":{"iopub.status.busy":"2023-09-11T10:30:55.986811Z","iopub.execute_input":"2023-09-11T10:30:55.987485Z","iopub.status.idle":"2023-09-11T10:30:55.996898Z","shell.execute_reply.started":"2023-09-11T10:30:55.987446Z","shell.execute_reply":"2023-09-11T10:30:55.995156Z"}}},{"cell_type":"code","source":"# [plot]\nfig, axlst = plt.subplots(ncols = 2, figsize =[8,4] )\n\n# (1) 군집 별 r2\nsns.heatmap( np.round( results.groupby(cl_lab).mean(), 4), \n            cmap = sns.cubehelix_palette(as_cmap=True),\n            annot = True, fmt=\".2f\", linewidth=.5,\n            ax=axlst[0])\naxlst[0].set_ylabel('K-means Cluster label')\naxlst[0].set_title('R^2 by Cluster')\n\n# (2) 군집 별 특성\nsns.heatmap( df_stats[['num_nodes', 'num_edges', 'net_dense']].groupby(cl_lab).mean(), \n            cmap = sns.cubehelix_palette(as_cmap=True),\n            annot = True, fmt=\".2f\", linewidth=.5,\n            ax=axlst[1])\naxlst[1].set_title('Cluster attribution')","metadata":{"execution":{"iopub.status.busy":"2023-09-11T10:13:08.441197Z","iopub.execute_input":"2023-09-11T10:13:08.441661Z","iopub.status.idle":"2023-09-11T10:13:09.250710Z","shell.execute_reply.started":"2023-09-11T10:13:08.441627Z","shell.execute_reply":"2023-09-11T10:13:09.249550Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### - 노드와 엣지의 수가 굉장히 많은 복잡한 Cluster에서, Compile feature의 설명력(R^2)이 가장 낮게 나타나고 있습니다.\n##### - 이 부분은 Graph 형태를 모델링 함으로써 해결해야하는 영역 입니다.\n#### => 즉, **Grpah의 형태가 복잡할수록 Compile feature의 기여도는 낮아짐.** 보완하기 위해선 Graph Feature vector를 잘 만드는 것이 중요하며, 그러한 모델링 method를 선택해야 합니다. ","metadata":{}},{"cell_type":"markdown","source":"# 3. 모델링","metadata":{}},{"cell_type":"markdown","source":"#### GCN(Graph Convolution Network)을 통해 Graph feature vector를 모델링을 할 것입니다.\n- 데이터 각각 obs는 머신러닝 모델 그래프를 나타냅니다.\n- 이미지 객체를 수치 벡터로 표현하는 CNN 과 유사하게, GCN은 그래프 객체를 수치 벡터로 표현할 수 있습니다.\n- GCN은 그래프에서 각 Node의 속성을 나타내는 Feature Vector와 Node 를 연결 하는 간선을 정의한 Edge Index를 주요 Input으로 사용합니다. (Input으로 adjaency matrix 및 degree maxtirx 수치벡터를 생성하고, hidden state를 업데이트)\n- 모델은 최종적으로 Graph의 특징을 압축화한 1D Graph feature를 만들 것입니다. (CNN의 Pooling과 유사)","metadata":{}},{"cell_type":"markdown","source":"### 모델링 프로세스\n##### Step 1. Graph 로 부터 정보를 추출\n- graph level의 통계치를 이용한 1D Network feature vector 생성\n- node feature vector, op-code embedding, edge index 이용해 GCN 모델링 --> 1D Graph feature 생성\n\n##### Step 2. Compile feature 모델링\n- Compile feature vector 와, 위 (1)을 통해 얻어진 Graph / Network feature 를 함께 사용,\n- Fully-connected layer 통해 target(runtime) 예측\n- Graph / Network feature는 c만큼 복제","metadata":{}},{"cell_type":"markdown","source":"![image.png](attachment:3f26b2b5-e070-46e2-a9b4-59d5f5de7a21.png)","metadata":{},"attachments":{"3f26b2b5-e070-46e2-a9b4-59d5f5de7a21.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABMkAAAKdCAYAAAA5nz5PAAAgAElEQVR4AeydCZgU1dX+ix3FXVBUUBQXVET/imvUzx0TjVGjRnH/JApKjF+CGxr3GBEFFQUUXFGJopIosm86KigquC9syjIDzMBAz76e//NWc2buVFf1VPf0Ut393udpqrrq1rnn/u6tmr4v596yhIkESIAESIAESIAESIAESIAESIAESIAESIAEcpyAleP1Z/VJgARIgARIgARIgARIgARIgARIgARIgARIQCiSsROQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnkPAGKZDnfBQiABEiABEiABEiABEiABEiABEiABEiABEiAIhn7AAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQM4ToEiW812AAEiABEiABEiABEiABEiABEiABEiABEiABCiSsQ+QAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnkPAGKZDnfBRIDYOzYsWJZlvTr1y8xBltg5U9/+pPty7Bhw1pgRWT58uWitlC3QYMGtcheUC8uKiqSnj17ys477yzvv/9+INzMy8uTvn372u0I9hMnTgyEX9niBO4NcMUHrJlIgARIgARIgARIgARIgARIgAQkcW+3xEAbQok5sMXAG4MxnAt6wkAR/iZi0GgOQHUgam6zcVAKcUzrmO76qR/YxpvQZyEambaCIADGW59o16G9tJ5BqKPpj/rVUsEzWv1z8Zz5jEr3/ZqL/FlnEiABEiABEiABEiABEiCBYBKIX0Uw6gNBwRTHdGCrW0TjaMKADBE5EKTSneA3ImdMgQc+t3TQaA5AlYG5jcc+ImnA0WSZan7gBSEUvJyiRbZFkml90G7YR0JkWSYn+D906FD7XjX7INo1SJFkZvTekiVLsoJ90PqN+Ywy+0LQ/KQ/JEACJEACJEACJEACJEACJJBKAgkRycwBFwQwFROwxTlT2DEFqVRW1K0sDA5N8Ur3WzpoNHm01Jb6rb6lM9LH5IU6ZnOCmKTMs6WeyeiXyWCjgns6+3oy6hUkm5nSF4LEjL6QAAmQAAmQAAmQAAmQAAlkP4GEiGTNCV+IVNHUXF7Nl4otRB9E0EDYQ6SWiiItFbaSMQBV39IpHOSSSBakfpqoeyEZ/TJRvpl2gtDXTX+ycT9T+kI2smedSIAESIAESIAESIAESIAEgksg4SKZl8BkDsp0EKxb8xrk07XBcB5RaDrlSjHqdRAycM6cnuWWX6+LtjUFINOfaNd4nTPr6mVLo2VQF2f9zOuPPPLIBvFO661blG/mxdRRCH44r9F75hQ7vQ7n3PxCXp0Ki7xYkwsRVUh6rXOrop2bqGT6hvLwXdsWW7dF4jG1UfOgfFxj2vFibh5XH9U303+3PoM6q5ALP/V659ZkBlHVbEP4bNpRf9QGykV9tW5oc5MZysf1ug4a2gjHnMdRprO/wC9nu+G7RnRGqxPYmufx3UzaJ9Qv1EfrYuYz2wj28F3riq1bW5vXY9+0odx0i/MmL5OfTodFnnjaBbbAG2WZfd48jnPaJk6/vb777cvN1cvPPexsQ/DW/ok6OfumyVrbS9vYb3t51ZvHSYAESIAESIAESIAESIAESCBTCSREJMNgUAez2GIApqKDgjEHZWZe7GOQhoSBnPMcvmPwpgN+5NM8GATqwE6PueVXH6JtzUGm+hMtf7RzZl29bKE+6jsGyZpMP8DVHECbdcQ+klmWDopxTm1qGc5r8d0UW7Dvldf0yWlHyzH91LqYvpnnTRumD+YURzOP6ZfajrbVa9U35NVjXn0GAghStLpqW3r1U5QBX936KoQHsx6wZTIx2059xXm347Cj9xf4aX7nFmUiX7Q6oY3M8/iuKVqfQFkqoCJ/rG2tZZhb04azLsjnxUt9TkS7aLmwZbaXHjf7lOm7cz+Wvtxcvdz8UH/0/jHb0LSn+bBFX9JksnbrY8hv9mO9jlsSIAESIAESIAESIAESIAESyGYCCRHJAMg5QMXADgNFHcwrRHMAp8ewNac7amQIBmk6gIN9TebAD8e1DFOsM/PrddG25iAT+y1J5gDU9FX31bZZZ0R+mMKZ03+91jlIN8sCc/VdB7gQSlCOMjLraZaBfFoGOCI/PthXm+a1KkxoXdza1fQN9nVAbwoIascUe9Dm6r/ZpvDPT9J6mKz0GLYq7pi8nbbd6oOyTX/Mvme2pVe5ml/ZmmVolBJ8MtsC+ziGazTaCb6abQI7ZqSWyR1+aTKP6/U459WuKs44+5Xpt9oxbTfX1uqP11bbyuSIvGa5Zh8Bn5a0i/ZBkwN88GoTL7/1eKx9OVq9YBM8m7uHnb6DBxL6DfqdMtX+4NVe5nHlovXilgRIgARIgARIgARIgARIgASynYA/1cEnBQzAzAE+BmYYYKs4AjPmgNA0q2IYtmbSQRvsaNIBn3lMz2n5buc0j9vWHGTqwN8tn59j6rP66dyaNnQAC7+VjZMB8qsN5DGTWZaKP+Z5DJLNhLopa7Vl1j3awDhaPvUdfmoyfdPBOc7BJ2d9TOEMooeZTHHIPO6177SNfHoMnM1klmu2u1t9cJ2yc9rBOdOW1kHLxdbZFmYZmh92vLi58XfaxHe3fE67Zl3d8kN0U9/NtoMds/3Qf522zfxmXu1v9gVR/tFynflNXqYoCFPxtouzHc0yvNrEZOdWDbd+oPnc+rJZprNeuM7Zxihf66uMzDZEGWZCPZSpnvPqY7hO86pt0xb3SYAESIAESIAESIAESIAESCCbCTQqGgmspVMsMwei5oDQLFIHZtG2ml/zuA3ivOzrtV5bc5DZ3CDYy4YeNwegzdnCABh8tE7Ydw6KYVfPO+vcXFloCx1Qqw3dqq3mbGi9TEa4xkxu3KPZdfrgdr3aN+3osWhbp23kdTuG46Zts628/PGy42UrWn6vMrx8cuOPvoL8Zh/SMrHFOU2x2PXKq7a0DNQBKVp+Z1614bX1yu/FC3a8rvHyzSu/VxnR6uesh5cNpy96XbT8yOPnHnbrG2ofW2d9o9XHmde0w30SIAESIAESIAESIAESIAESyGYCSRHJAMwp/mhUhteAUAdm0bbaEJoHtpzJy74zn/O7Ocg0xRJnPj/fow1A3a43RSxEwCkrM69XnaOVZU5Bg4gCNohyUUFF+UWzYfpgMsI1ZnLjHs2usz5u16t9044ei7Z12kZet2M4bto2293LHy87Xrai5fcqw8snN/5mZBL6EWya12Nfk3ncrKubXa+8astZr2j5nXnVhtfWK78XL9jxugbn3Hzzyu9VhpsNL/+9bDh90euj5fd7D7u1odrH1lnfaPVx5jXtcJ8ESIAESIAESIAESIAESIAEsplAQkQyt8gnQDOnHemUS68BoVO4cUI3y9BBHK4xE/JAZMJ5CAaxJHOQaQoIsdjQvNEGoJpHtyYjFcvcfNc6g5+ZopWlrHWKlV6n5agtRKqofex7JZMRyjWTlgU7mqL5puWpDzrtFMedIqH6a9rWMty2TtvI43YMx718dKsP8qsvzr6Hc2YdtL96lYv8XmV4+eTGX+3rGlSwi7L1uNlOsdiNNt3SnL6H/ovkZRvn1Bdta/uCKP945ffiBVOJahevMqLVz1kVsx/46cteZcKunmvuHjb7hk6BVb/Mc8loLy2HWxIgARIgARIgARIgARIgARLIdAKNikYLaoIBHAaRKoTBFAbZKlhhq0kHfRgIIz8G9PiYg1AM+FVkwCAT9jHQ06SDaGwxIFQb5uDUFA30umhbcyBploVrYF8H4dFEJLVv1sVpS/NgawoRyk/rpoNZza/HIc7AHx18RytLWWOrjMzIFBxHwjmzrbSOOA77WgeTkQ7a1Q8tC35qiuab1kd9MIU69Rd2TH9N21qG29ZpG3ncjuG4l49u9XHmRxuBEZLpvylSeJWLa/yUoeyR3+QPv5HUvvYXtId5H2g+5DXrqvcH8rvZNfsE+pz6gfym39r+pm3Nazto+Ijr/CStkzO/Wa7Tjll+S9rFqwzTvrN+Tl/MvgB72ke8+rJXmbCr59QObJl2cBzJbEPwM9tXn104rs/oaPXx4u+sJ7+TAAmQAAmQAAmQAAmQAAmQQLYRaFQ0WlAzCCY6sHLbquiCIswBnubFAA+DP3Mwp+d0q4M72NBjKuzod93CTqzJHGQ6B8HmOR2URrNvDkDVJ3OL86YIYfqLAb7mNf1wYwwfzLLM/Dhn2lKbYKaczbqYgp3m1a1p18lcbWCr+ZVNNN80r16Pa9QvPadbN9tahtvWvE7Pux3DOS8fo5Xp5SfKwDkVRWDfq1yc8yrDyyezHyIPkpsvpl3Nh7y4h9Qf3eK8m13kj9YncL15X3v5DDtaFvzyk7zym/Vys+PGQm35bRevMqLVLxZf3Oy7HVObfu9hsw2d96gygC1N0eqj+eEXEwmQAAmQAAmQAAmQAAmQAAnkEoGEiGQQBTDoQsSJDrCwj4gWDN6cCYM1HchhqwIY7OCcaQfiEAbrZtIyMIjDOc0PW7jeFCnM66Ltm4NMp8+wpwNwUxjwsmcOQNVXc4vz5sBY6w97KMusj9YFW1MoQx4ksyw3v03WKBNladnYmgnnUIa2DcqAfTMhj7JAnTRqSm3imKZovikP0wfUEfa0fJSD9kUdNL/ajrbVvKZtt2Ow4eWjW33MMiH2mhyUlbaX5vUqF+e9yvDyyeyj2i6I5DL7BfjBBy1X86k/6L/av5AH393san60t9kmuAblOfual8+wo76Y7aH23bZe+b14mTZa2i5eZUSrn1m+7sfSl73KhC3Y8XMPO9sQ/up9hPbWyDL1L1p9vPjrtdySAAmQAAmQAAmQAAmQAAmQQLYSaFQ0MqiGHMRlUGPF4KpTYNJLVdSBKMVEAplAINV92SmSZQIj+kgCJEACJEACJEACJEACJEACQSNAkSxoLZLD/kAMQ2STCgwa2aaiqJ8ovhzGx6oHiECq+zJFsgA1Pl0hARIgARIgARIgARIgARLIWAIUyTK26bLPcZ0epqKYudVpndlXa9YoGwmkui9TJMvGXsQ6kQAJkAAJkAAJkAAJkAAJpJoARbJUE2d5ngSckWMQGrD+lXNNOk8DPEECASGQ6r5MkSwgDU83SIAESIAESIAESIAESIAEMppARopkGU2czpMACZAACZAACZAACZAACZAACZAACZAACQSOAEWywDUJHSIBEiABEiABEiABEiABEiABEiABEiABEkg1AYpkqSbO8kiABEiABEiABEiABEiABEiABEiABEiABAJHgCJZ4JqEDpEACZAACZAACZAACZAACZAACZAACZAACaSaAEWyVBNneSRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAoEjQJEscE1Ch0iABEiABEiABEiABEiABEiABEiABEiABFJNgCJZqomzPBIgARIgARIgARIgARIgARIgARIgARIggcARoEgWuCahQyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAqkmQJEs1cRZHgnkKIEddthBFi5cKPX19Ukj8PHHH8uf/vQneffdd5NWRqoNL1++XP73f/9XRowY4avoN954Qy666CL57rvvpLa2Vnr06CEffvihr2tTnamurk4uvvhiuffee+2iH3roIRk4cKD8+uuvCXMF/W3+/Pmy7777yq677ipvvfWWnHrqqfLvf/87YWXQEAmQAAmQAAmQAAmQAAmQQHYQoEiWHe3IWmQggXnz5snpp58uX331VdzeQwR57rnn5LDDDpPttttO9ttvP/nXv/7VrL0lS5bYZe+yyy6y8847yzXXXCPLli1ruG79+vXyf//3f9KpUyfZc889Zdy4cVJTU9NwHkJD7969pUOHDnL++efLihUrGs557cQrkkEw6dWrlyxevNjLdMPxeEWy++67z64n6tutWzdbkAqFQrZdCHvnnXeegBU+EOEKCgoayvSzA3avv/66WJZlt1PHjh3lgAMOkLlz5zZ7eTpEMghLd911lxxyyCF2Gw8bNqzBz6qqKpkwYYL0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"}}},{"cell_type":"code","source":"class GNNModel(torch.nn.Module):\n    def __init__(self, hidden_channels, graph_feats, hidden_dim):\n        super().__init__()\n        op_embedding_dim = 4 # 4-dimensional embedding\n        self.embedding = torch.nn.Embedding(120, #120 different op-codes\n                                            op_embedding_dim,\n                                           )\n        in_channels = op_embedding_dim+140 # = concat([x_feat,self.embedding(x_op)] 한 사이즈이다.\n        \n        self.convs = torch.nn.ModuleList()\n        last_dim = hidden_channels[0]\n        \n        # 몇개의 GCNConv layer를 사용할 것인지? 은닉층 깊이를 말함.\n        self.convs.append(GCNConv(in_channels, hidden_channels[0]))\n        \n        for i in range(len(hidden_channels)-1):\n            self.convs.append(GCNConv(hidden_channels[i], hidden_channels[i+1]))\n            last_dim = hidden_channels[i+1]\n        \n        self.convs.append(GCNConv(last_dim, graph_feats))\n        \n        self.dense = torch.nn.Sequential(nn.Linear(graph_feats+25+24+10, 64), # 25 : config ratio, 24 : config raw / 10 : stat f 수\n                                         nn.ReLU(),\n                                         nn.Linear(64, 64),\n                                         nn.ReLU(),\n                                         nn.Linear(64, 1),\n                                        )\n\n    def forward(self, x_cfg: Tensor,x_feat: Tensor, x_op: Tensor, edge_index: Tensor, x_stats : Tensor) -> Tensor:\n        \n        #get graph features\n        x = torch.concat([x_feat,self.embedding(x_op)],dim = 1) \n        # 피처 벡터(n,140) + opcode(n) 쓰이는 곳. \n        \n        for conv in self.convs:  # 각각 GCNConv layer(층)을 반복. 각각 conv() 한뒤 relu()\n            x = conv(x, edge_index).relu()  # edge 노드 간 선. (m,2)  \n        \n        # 1d graph embedding using average pooling ; 결과를 단순 평균\n        x_graph = torch.mean(x,0) \n        \n        x = torch.concat([x_cfg,\n                          x_stats.repeat((len(config_feat),1)), \n                          x_graph.repeat((len(x_cfg),1))],\n                         axis=1)  # 평균치 * c 만큼 복사\n        \n        # dense nn\n        x = torch.flatten(self.dense(x)) \n        \n        # activation ; PyTorch에서 제공하는 activation모듈을 init에서 선언하고 forward에서 연산역할을 하는 layer (dense(=fully-connected, linear),\n        \n        return x\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T11:06:21.961242Z","iopub.execute_input":"2023-09-11T11:06:21.961722Z","iopub.status.idle":"2023-09-11T11:06:21.978352Z","shell.execute_reply.started":"2023-09-11T11:06:21.961687Z","shell.execute_reply":"2023-09-11T11:06:21.977039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hidden_channels = [16,32,8]\n\nmodel = GNNModel(hidden_channels = hidden_channels,\n                 graph_feats = 32,\n                 hidden_dim = 32).to(device)\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T11:06:22.727691Z","iopub.execute_input":"2023-09-11T11:06:22.728155Z","iopub.status.idle":"2023-09-11T11:06:22.781238Z","shell.execute_reply.started":"2023-09-11T11:06:22.728119Z","shell.execute_reply":"2023-09-11T11:06:22.779422Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train","metadata":{}},{"cell_type":"markdown","source":"##### * Kaggle notebook 환경 제한상, epoch 2회만 시범적으로 학습","metadata":{}},{"cell_type":"code","source":"\ndf_train = df.loc[ df['split'] == 'train']\n\n# criterion = torch.nn.SmoothL1Loss()\ncriterion = torch.nn.HuberLoss()\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-4,weight_decay = 0.01)\n\nmodel.train()\nloss_sum = 0\nn = 0\nepoch_num = 1 # 50\nlr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.5)\n\nstart = time.time()\n\nfor now_epoch in range(epoch_num):\n    \n    pbar = tqdm(range(len(df_train)))\n    print('--------------epoch {}: ------------------'.format(now_epoch))\n    for i in pbar:\n        #\n        \n        #####################################################################################\n        # DATA SET\n        \n        d = df_train.iloc[i]\n        \n        graph_stats = torch.tensor( np.array( d[stat_collst].astype(np.float32) ) )\n        \n        config_f = np.concatenate( [ d['config_feat_ratio'],d['config_feat'] ], axis = 1)\n        \n        config_feat = torch.tensor(config_f.astype(np.float32))\n        node_feat = torch.tensor(d['node_feat'].astype(np.float32))\n        node_opcode = torch.tensor(d['node_opcode'].astype(np.int32))\n        edge_index = torch.tensor(np.swapaxes(d['edge_index'],0,1).astype(np.int32)) # edge ; u-->v\n        target = (d['config_runtime']/d['config_runtime_normalizers']).astype(np.float32)\n        \n        # minmax scale \n        target = (target-min(target))/(max(target) -min(target))\n        target = torch.tensor(target)\n        #####################################################################################\n        cfg_ft,nd_ft,nd_op,ind,stat_ft,target = config_feat.to(device),node_feat.to(device),node_opcode.to(device),edge_index.to(device),graph_stats.to(device),target.to(device)\n\n        out = model(cfg_ft,nd_ft,nd_op,ind,stat_ft)\n        loss = criterion(out, target)\n        loss.backward()\n        torch.nn.utils.clip_grad_norm_(model.parameters(), 0.01)\n        optimizer.step()\n\n        loss_sum+=loss.item()\n        n+=1\n        pbar.set_description(f'running loss: {(loss_sum/n):.3f},current loss: {(loss.item()):.3f}')\n\nend = time.time()\nprint(f\"{end - start:.5f} sec\")\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T11:06:25.741006Z","iopub.execute_input":"2023-09-11T11:06:25.741404Z","iopub.status.idle":"2023-09-11T11:08:57.586836Z","shell.execute_reply.started":"2023-09-11T11:06:25.741373Z","shell.execute_reply":"2023-09-11T11:08:57.585675Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Validation 예측 및 평가","metadata":{}},{"cell_type":"code","source":"\ndf_valid = df.loc[ df['split'] == 'valid']\n\ntile_xla_predictions = []\nmodel.eval()\n\npbar = tqdm(range(len(df_valid)))\nfor i in pbar:\n\n    #####################################################################################\n    # DATA SET\n    d = df_valid.iloc[i]\n    \n    graph_stats = torch.tensor( np.array( d[stat_collst].astype(np.float32) ) )\n\n    config_f = np.concatenate( [ d['config_feat_ratio'],d['config_feat'] ], axis = 1)\n\n    config_feat = torch.tensor(config_f.astype(np.float32))\n    node_feat = torch.tensor(d['node_feat'].astype(np.float32))\n    node_opcode = torch.tensor(d['node_opcode'].astype(np.int32))\n    edge_index = torch.tensor(np.swapaxes(d['edge_index'],0,1).astype(np.int32)) # edge ; u-->v\n    target = (d['config_runtime']/d['config_runtime_normalizers']).astype(np.float32)\n\n    # minmax scale \n    target = (target-min(target))/(max(target) -min(target))\n    target = torch.tensor(target)\n    #####################################################################################\n    \n    cfg_ft,nd_ft,nd_op,ind,stat_ft,target = config_feat.to(device),node_feat.to(device),node_opcode.to(device),edge_index.to(device),graph_stats.to(device),target.to(device)\n\n    out = model(cfg_ft,nd_ft,nd_op,ind, stat_ft)\n    tile_xla_predictions.append(np.argsort(out.detach().cpu().numpy())[:5])\n\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T11:10:24.140862Z","iopub.execute_input":"2023-09-11T11:10:24.141318Z","iopub.status.idle":"2023-09-11T11:10:39.475279Z","shell.execute_reply.started":"2023-09-11T11:10:24.141284Z","shell.execute_reply":"2023-09-11T11:10:39.474119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 평가척도","metadata":{}},{"cell_type":"markdown","source":"![image.png](attachment:c8d62c65-7da6-48fe-bdd1-278722642266.png)","metadata":{},"attachments":{"c8d62c65-7da6-48fe-bdd1-278722642266.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAm0AAABGCAYAAACe/6NiAAAgAElEQVR4Ae2dBbQcxRKG4eHuENyDu2tCgru7a4K7uwbXBCfB3d314A7B3d0laL/z1aP29Q4jPeszW3XO3rk7O9Pyt/1dVd09nDMxBAwBQ8AQMAQMAUPAEOh4BIbr+BRaAg0BQ8AQMAQMAUPAEDAEnJE2qwSGgCFgCBgChoAhYAgUAAEjbQUoJEuiIWAIGAKGgCFgCBgCRtqsDhgChoAhYAgYAoaAIVAABIy0FaCQLImGgCFgCBgChoAhYAgYabM6YAgYAoaAIWAIGAKGQAEQMNJWgEKyJBoChoAhYAgYAoaAIWCkzeqAIWAIGAKGgCFgCBgCBUDASFsBCsmSaAgYAoaAIWAIGAKGgJE2qwOGgCFgCBgChoAhYAgUAAEjbQUoJEuiIWAIGAKGgCFgCBgCRtqsDhgChoAhYAgYAoaAIVAABIy0FaCQLImGgCFgCBgChoAhYAgYabM6YAgYAoaAIWAIGAKGQAEQ6DrSduedd7p+/foVoGgsiYaAIWAIGAJpCLz00ktuxx13dF988UXaY/abIVAaBLqKtF166aVunnnmce+//35pCtAyYggYAoZAtyLw559/uosvvtgts8wy7quvvupWGCzfXYRA15C2Z5991s0333zu1VdfjS3eZ555xo0xxhhu1FFHddNMM42bfvrp3cQTT+yGG244N9poo7nppptOPhNNNJHcO+GEEyQcrhNOOKHcu+2222LDrufmK6+84u666y63xx57OGaVJuVE4Oeff3b33HOP22uvvdwWW2zhnnzyyVwZbXY9zJWYJj48ePBgN8UUU7jhhx/e3X///U2MqTlB04Zvv/12d8ABB7izzjqrOZF0Yaj777+/22GHHdyvv/7ahbm3LHcTAl1B2piBQbouuuiixLJ97LHH3Oijj+6uvfZa9+abb7p3333XnXrqqULGevfu7V5//XX3zjvvOMjd8ssvLySKwAj71ltvbRppu+KKKxzxQx5bOUhtu+22btiwYYl4tfuHuPT9/fffbtdddxWSTTkVSY488kghIgzolPUKK6yQmPy4vDe7Hmpi4uLW31px/eabb9w111zT8vbQqLyhFVp99dXdf/7zH3fggQdKsPXW27gyqTfMRuW3VeF8++23bsEFF3T77ruvI+8mhkBZESg9afvrr7/c5ptv7pZcckn3yy+/JJbjQw89JJ2p/8Dll18ug8OKK65YRWDuuOMOt/3221ce/fzzz+W5ZmjaiAQtYatJG3lOw6uS+Tb9k5S+OeaYQ7C64YYb2pSy/NF+//33bqSRRnJnn322vEzdgqwnSVLem10PSU9S3ElpbcZ9CHmr20Mj8/Hyyy87NPZK2gi7nnqbVCb1hNnI/LYqLCbeaGG5mjQOgW6bADQOueaEVHrS9umnn4rmBc1Zmlx99dUV7Zk+l0Tann/++ZaStueee66lg9R3330npuFOJW1p6UM7eN9992kRFuKKZhcSgn9OlqTlvdmkLS3urHQ38vdWt4dGpp2wcHmYZJJJqkhbrfU2rUxqDbPR+W1leLvssotbfPHFWxllV8TVbROATi7UUpO233//XcgH5oMswSx14403Vj2WRNo+/vhjd9RRR1We9QdLfJMwVfGJmheZsbz44ovSWe+0007ivwQBzBqs/UHqp59+EhPtU0895TAJRCUrDjC58sorRatI5zb//PO7ZZdd1kFakaFDh8piDUjEYYcd5o4++mj3+OOPR6OpfCesrbbaSjpKiPFKK63kevbs6R588EF55vrrr3dbb721aGg0Du7xDmaivffeuxJWyD9p6SPvf/zxh/vtt98yMQ2Ji2ey8MwKhwF6n332cf3793eU+cMPP/yvtL3xxhtC2rLCSss77zazHmbFTfwhec3KY8jvfnvgedrcDz/8UPlktaeQOLLqNWGE1g20/W+//bb4KeJiESVtSfWWuoz2frHFFnOzzz67m3POOcXhnrJA0sokKUzNe6PKKqs/0fhadVUt5vnnn9+qKLsinm6cAHRqwZaatA0cONCNMMII0vHVUgBJpC0alg6Wxx13nBCyAQMGyEKGdddd19Fhq1xyySVCaE477TTHwIPTOTPuRx55RB+JveogxaA/9dRTu91339317dvXjTnmmBWypS9mxUFHv8QSS7hPPvlEXmGp/JprrikrsLhx5plnis8epG299dZzG264ofj5afjRK6Tz4IMPFtIBWTvjjDPkf5yCEQYHnIQJj98QOlYwYuEHcSOnnHJKZeEHDvm77bab69OnjyzygNgxCCFp6bv55pvlHQY4Bl2Ee5tttpmbbbbZ3L333it+iuSL7/i/QTTxJ1trrbXE75F4GSxVsvDU5+KuTAKYoZIWcMJku8AC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"}}},{"cell_type":"code","source":"def score_tile(predictions, df):\n    score = 0\n    for i in range(len(df)):\n        predbest = min(df.iloc[i]['config_runtime'][predictions[i]])\n        best = min(df.iloc[i]['config_runtime'])\n        score +=2 - predbest/best\n    score /= len(df)\n    return score\n\n\nprint( '- 최종점수',score_tile(tile_xla_predictions, df_valid)  )\nprint('** Kaggle notebook은 시범적으로 running 한 결과 입니다. 최적화는 Local 환경에서 진행했습니다.')\n","metadata":{"execution":{"iopub.status.busy":"2023-09-11T11:16:29.960625Z","iopub.execute_input":"2023-09-11T11:16:29.961135Z","iopub.status.idle":"2023-09-11T11:16:30.296143Z","shell.execute_reply.started":"2023-09-11T11:16:29.961100Z","shell.execute_reply":"2023-09-11T11:16:30.294912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### 모델링 관련하여 아래 Code를 참조하여 기초 컨셉을 잡았습니다.\nhttps://www.kaggle.com/code/zulqarnainali/submit-this-after-improving","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}