{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# <p style=\"font-family:JetBrains Mono; font-weight:bold; letter-spacing: 2px; color:#FFC0CB; font-size:140%; text-align:left;padding: 0px; border-bottom: 3px solid #FFC0CB\">Google Slow VS Fast AI Runtime</p>\n\n<div style=\"border-radius:10px; border:#FFC0CB solid; padding: 15px; background-color: #F3f9ed; font-size:100%; text-align:left\">\n\nThe `Google AI Fast or Slow? Predict AI Model Runtime` competition is a `machine learning challenge` targets to `develop a model to predict the runtime of AI models` on a `variety of hardware configurations`. The competition data consists of a `training set`/`test set`, with each set containing information about `AI models`, including their `characteristics`/`runtimes`. The `goal` is to `develop a model` that can `accurately predict` the `runtime of an AI model` based on its characteristics, such as the number of parameters, the number of layers, and the hardware configuration.\n\nThe total prize pool for the competition is $50,000$, with the top 3 teams winning prizes of $15,000$, $10,000$, and $5,000$, respectively.","metadata":{}},{"cell_type":"code","source":"import os ","metadata":{"execution":{"iopub.status.busy":"2023-08-30T08:22:17.965193Z","iopub.execute_input":"2023-08-30T08:22:17.965630Z","iopub.status.idle":"2023-08-30T08:22:17.970931Z","shell.execute_reply.started":"2023-08-30T08:22:17.965595Z","shell.execute_reply":"2023-08-30T08:22:17.969616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"border-radius:10px; border:#FFC0CB solid; padding: 15px; background-color: #F3f9ed; font-size:100%; text-align:left\">\n\nOur model data is situtated acrros various domains ranging from $Computer-Vision$ to $Natural-Langauage-Processing$. A look at the models can be seen below","metadata":{}},{"cell_type":"code","source":"os.listdir('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/xla/default/train')","metadata":{"execution":{"iopub.status.busy":"2023-08-30T08:19:59.646097Z","iopub.execute_input":"2023-08-30T08:19:59.646794Z","iopub.status.idle":"2023-08-30T08:19:59.680278Z","shell.execute_reply.started":"2023-08-30T08:19:59.646748Z","shell.execute_reply":"2023-08-30T08:19:59.679386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <p style=\"font-family:JetBrains Mono; font-weight:bold; letter-spacing: 2px; color:#FF0000; font-size:140%; text-align:left;padding: 0px; border-bottom: 3px solid #FF0000\">1 | Data 📈</p>","metadata":{}},{"cell_type":"code","source":"import tqdm\nimport numpy as np \nimport pandas as pd ","metadata":{"execution":{"iopub.status.busy":"2023-08-30T08:22:21.330388Z","iopub.execute_input":"2023-08-30T08:22:21.330878Z","iopub.status.idle":"2023-08-30T08:22:21.336934Z","shell.execute_reply.started":"2023-08-30T08:22:21.330838Z","shell.execute_reply":"2023-08-30T08:22:21.335654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"border-radius:10px; border:#FF0000 solid; padding: 15px; background-color: #F3f9ed; font-size:100%; text-align:left\">\n\nOur files are divided in $4$ Dirs","metadata":{}},{"cell_type":"code","source":"ndt = os.listdir('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/nlp/default/train')\nnrt = os.listdir('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/nlp/random/train')\n\nxdt = os.listdir('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/xla/default/train')\nxrt = os.listdir('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/xla/random/train')","metadata":{"execution":{"iopub.status.busy":"2023-08-30T08:22:21.536864Z","iopub.execute_input":"2023-08-30T08:22:21.537302Z","iopub.status.idle":"2023-08-30T08:22:21.588853Z","shell.execute_reply.started":"2023-08-30T08:22:21.537264Z","shell.execute_reply":"2023-08-30T08:22:21.587401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ndt = [\n    np.load('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/nlp/default/train/' + value)\n    for value \n    in tqdm.tqdm(ndt , total = len(ndt) , desc = 'Loading NDT --->')\n]\nnrt = [\n    np.load('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/nlp/random/train/' + value)\n    for value \n    in tqdm.tqdm(nrt , total = len(nrt) , desc = 'Loading NRT --->')\n]\nxdt = [\n    np.load('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/xla/default/train/' + value)\n    for value\n    in tqdm.tqdm(xdt , total = len(xdt) , desc = 'Loading XDT --->')\n]\nxrt = [\n    np.load('/kaggle/input/predict-ai-model-runtime/npz_all/npz/layout/xla/random/train/' + value)\n    for value\n    in tqdm.tqdm(xrt , total = len(xrt) , desc = 'Loading NRT --->')\n]\n\nfiles = ndt + nrt + xdt + xrt \nlen(files)","metadata":{"execution":{"iopub.status.busy":"2023-08-30T08:22:22.201733Z","iopub.execute_input":"2023-08-30T08:22:22.202198Z","iopub.status.idle":"2023-08-30T08:22:30.123815Z","shell.execute_reply.started":"2023-08-30T08:22:22.202160Z","shell.execute_reply":"2023-08-30T08:22:30.122487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<div style=\"border-radius:10px; border:#FF0000 solid; padding: 15px; background-color: #F3f9ed; font-size:100%; text-align:left\">\n\nEach file contains \n\n|||\n|---|---|\n|Node Feature\n|Node OpCode|Specific operation or instruction that is performed by a node\n|Edge Index |Connections between nodes in a graph or a neural network\n|Node Config Features\n|Node Config IDS\n|Config Runtime\n|Node Splits\n\nWe will make these files to a DataFrame in export it in the output DIRs","metadata":{}},{"cell_type":"code","source":"data = pd.DataFrame({\n    'node_feat' : [\n        val['node_feat']\n        for val \n        in tqdm.tqdm(files , total = len(files) , desc = 'Reading Node Feats --->')\n    ] , \n    'node_opcode' : [\n        val['node_opcode']\n        for val \n        in tqdm.tqdm(files , total = len(files) , desc = 'Reading Node Opcodes --->')\n    ] , \n    'edge_index' : [\n        val['edge_index']\n        for val \n        in tqdm.tqdm(files , total = len(files) , desc = 'Reading Edge Index --->')\n    ] , \n#     'node_config_feat' : [\n#         val['node_config_feat']\n#         for val \n#         in tqdm.tqdm(files , total = len(files) , desc = 'Reading Node Config Feats --->')\n#     ] , \n    'node_config_ids' : [\n        val['node_config_ids']\n        for val \n        in tqdm.tqdm(files , total = len(files) , desc = 'Reading Node Config Ids --->')\n    ] , \n    'config_runtime' : [\n        val['config_runtime']\n        for val \n        in tqdm.tqdm(files , total = len(files) , desc = 'Reading Node Config Runtime --->')\n    ] , \n    'node_splits' : [\n        val['node_splits']\n        for val \n        in tqdm.tqdm(files , total = len(files) , desc = 'Reading Node Splits --->')\n    ]\n})","metadata":{"execution":{"iopub.status.busy":"2023-08-30T08:22:57.716420Z","iopub.execute_input":"2023-08-30T08:22:57.716935Z","iopub.status.idle":"2023-08-30T08:23:06.370157Z","shell.execute_reply.started":"2023-08-30T08:22:57.716893Z","shell.execute_reply":"2023-08-30T08:23:06.368954Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.head()","metadata":{"execution":{"iopub.status.busy":"2023-08-30T08:30:19.136903Z","iopub.execute_input":"2023-08-30T08:30:19.137375Z","iopub.status.idle":"2023-08-30T08:30:19.766156Z","shell.execute_reply.started":"2023-08-30T08:30:19.137337Z","shell.execute_reply":"2023-08-30T08:30:19.764793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data.to_csv('/kaggle/working/Input Files.csv')","metadata":{"execution":{"iopub.status.busy":"2023-08-30T08:24:05.052300Z","iopub.execute_input":"2023-08-30T08:24:05.052756Z","iopub.status.idle":"2023-08-30T08:24:05.763734Z","shell.execute_reply.started":"2023-08-30T08:24:05.052721Z","shell.execute_reply":"2023-08-30T08:24:05.762089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# <p style=\"font-family:JetBrains Mono; font-weight:bold; letter-spacing: 2px; color:#FFA500; font-size:140%; text-align:left;padding: 0px; border-bottom: 3px solid #FFA500\">2 | Ending 🏁</p>\n\n<div style=\"border-radius:10px; border:#FFA500 solid; padding: 15px; background-color: #F3f9ed; font-size:100%; text-align:left\">\n\n**WE WILL GO DEEPER INTO THE DATA IN THE UPCOMING VERSIONS**\n\n**PLEASE COMMENT DOWN IF I DID ANY MISTAKES, OR IF CAN MAKE THIS MORE CONNECTED TO THE GROUND, OR SUGGESTIONS. YOUR ASSISTS ARE HIGHLY APPRECIABLE**\n\n**THATS IT FOR TODAY GUYS**\n\n**HOPE YOU UNDERSTOOD AND LIKED MY WORK**\n\n**DONT FORGET TO MAKE AN UPVOTE $:)$**\n    \n<img src = \"data:image/jpeg;base64,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\">\n   \n**PEACE OUT**","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"}}