{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "fast_inference_transformers_on_GPU.ipynb",
"provenance": [],
"collapsed_sections": [
"xOuBqEynERFG",
"U2VWWKpbR5mL",
"QeiLPvAteK0q"
]
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"8277f2ac369a4222878b0734d8620e99": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HBoxView",
"_dom_classes": [],
"_model_name": "HBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_47090989378e4b3790b44ba52e2da41c",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_b909783e4ca3484bb3f0b1790625ecec",
"IPY_MODEL_5231daf2afaa44ceb818aaf5e29c01a7",
"IPY_MODEL_c0c4d89eac574403b5996daac2ecde52"
]
}
},
"47090989378e4b3790b44ba52e2da41c": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"b909783e4ca3484bb3f0b1790625ecec": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_10e1b68ca4df4096b440fa26427ae54a",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": "Downloading: 100%",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_ec6a2c8ce547423097dc98a1cf937a80"
}
},
"5231daf2afaa44ceb818aaf5e29c01a7": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_68a4ae3194994a2ca3682b0109bbcf27",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 494,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 494,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_8a4b9e0b44694366b5fa81e37a140842"
}
},
"c0c4d89eac574403b5996daac2ecde52": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_d20ab2758f774596934f2b9cc574a1c2",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 494/494 [00:00<00:00, 10.5kB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_eac2e4141dcb44749c4da076ae2314ff"
}
},
"10e1b68ca4df4096b440fa26427ae54a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"ec6a2c8ce547423097dc98a1cf937a80": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"68a4ae3194994a2ca3682b0109bbcf27": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "ProgressStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"bar_color": null,
"_model_module": "@jupyter-widgets/controls"
}
},
"8a4b9e0b44694366b5fa81e37a140842": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"d20ab2758f774596934f2b9cc574a1c2": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"eac2e4141dcb44749c4da076ae2314ff": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"8c259af90c2b46a6a47a16b52c0637eb": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HBoxView",
"_dom_classes": [],
"_model_name": "HBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_ec5b7c00cb09480c95af382d093e7123",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_1add92e1d59e442287f560fb718c527a",
"IPY_MODEL_640577e69737412d9abe6b60f1743e58",
"IPY_MODEL_6f06f50fc21b461994a75a1b0ef7d4a6"
]
}
},
"ec5b7c00cb09480c95af382d093e7123": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"1add92e1d59e442287f560fb718c527a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_0a489921e8b34bb1a4a0703571511b3f",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": "Downloading: 100%",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_f9835635dd5e457bb45473678865eeeb"
}
},
"640577e69737412d9abe6b60f1743e58": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_0cd61fee7456450e813e4179db06b815",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 862,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 862,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_f965054aa0af472fbaa4056e1edd8994"
}
},
"6f06f50fc21b461994a75a1b0ef7d4a6": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_5c3669b1e6a942d5b8d5381850bdb6e0",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 862/862 [00:00<00:00, 22.4kB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_9b3759459d3c4ec9bcc3f6b696ce93b5"
}
},
"0a489921e8b34bb1a4a0703571511b3f": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"f9835635dd5e457bb45473678865eeeb": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"0cd61fee7456450e813e4179db06b815": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "ProgressStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"bar_color": null,
"_model_module": "@jupyter-widgets/controls"
}
},
"f965054aa0af472fbaa4056e1edd8994": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"5c3669b1e6a942d5b8d5381850bdb6e0": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"9b3759459d3c4ec9bcc3f6b696ce93b5": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"cc37d7d444f2457f97747af57451b6e9": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HBoxView",
"_dom_classes": [],
"_model_name": "HBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_873562a4a33b42d9b9ef22409cb22a89",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_8acc7ec22a4f4ffb97e960aa10389451",
"IPY_MODEL_e3612a3fcaad4505b6a04b657db6c947",
"IPY_MODEL_57799db8df7c4aaeb843fe1a0a405f26"
]
}
},
"873562a4a33b42d9b9ef22409cb22a89": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"8acc7ec22a4f4ffb97e960aa10389451": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_1fee6fb3d29b4bae82ea34ad42c4183c",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": "Downloading: 100%",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_634e1097c09e4683b57d3f9db8c928e8"
}
},
"e3612a3fcaad4505b6a04b657db6c947": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_8c2bbfcc4339456b96c18010ff85cb23",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 209528,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 209528,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_3cef6cc24e4b439a9707ac8779b2753a"
}
},
"57799db8df7c4aaeb843fe1a0a405f26": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_a42aa32326334e4c9f3042623e8b215b",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 205k/205k [00:00<00:00, 951kB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_2d3875c8cdf340e6817e7ff339c6073d"
}
},
"1fee6fb3d29b4bae82ea34ad42c4183c": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"634e1097c09e4683b57d3f9db8c928e8": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"8c2bbfcc4339456b96c18010ff85cb23": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "ProgressStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"bar_color": null,
"_model_module": "@jupyter-widgets/controls"
}
},
"3cef6cc24e4b439a9707ac8779b2753a": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"a42aa32326334e4c9f3042623e8b215b": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"2d3875c8cdf340e6817e7ff339c6073d": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"326e7918480645fca7821f26903e877b": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HBoxView",
"_dom_classes": [],
"_model_name": "HBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_0fef3b830dda4bfc9f90fef79696c7cf",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_73629e5e6727425e9858453297b8fc45",
"IPY_MODEL_c0dd73ddfb6548ccb8872b505f524cb3",
"IPY_MODEL_7f1a6f9ca1564b049f97991bfe21cc89"
]
}
},
"0fef3b830dda4bfc9f90fef79696c7cf": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"73629e5e6727425e9858453297b8fc45": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_871edad667354b81a04c8ac9850ec3dd",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": "Downloading: 100%",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_ce38b5d8ac984644ae075b1195d150c0"
}
},
"c0dd73ddfb6548ccb8872b505f524cb3": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_0808a57049e44525b56b741fe90d9801",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 112,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 112,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_6fd30b9154b04bfcb60d3340dd26d33a"
}
},
"7f1a6f9ca1564b049f97991bfe21cc89": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_68ff2fc76f6e4977ba6d9e8767a6e271",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 112/112 [00:00<00:00, 2.66kB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_d29fd4613044451886a749f0faa6aeb1"
}
},
"871edad667354b81a04c8ac9850ec3dd": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"ce38b5d8ac984644ae075b1195d150c0": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"0808a57049e44525b56b741fe90d9801": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "ProgressStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"bar_color": null,
"_model_module": "@jupyter-widgets/controls"
}
},
"6fd30b9154b04bfcb60d3340dd26d33a": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"68ff2fc76f6e4977ba6d9e8767a6e271": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"d29fd4613044451886a749f0faa6aeb1": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"f2ff6e53b64c4a1f9f4d25206bf8441c": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HBoxModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HBoxView",
"_dom_classes": [],
"_model_name": "HBoxModel",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.5.0",
"box_style": "",
"layout": "IPY_MODEL_9f4d0a818d55402daa979c087ec34d98",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_f80f42a8865c4195b1f3864ed971f768",
"IPY_MODEL_e657cb48beca48fb9759d280cb4db15a",
"IPY_MODEL_058bb6219e624ec1aee3c1e7cf030480"
]
}
},
"9f4d0a818d55402daa979c087ec34d98": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"f80f42a8865c4195b1f3864ed971f768": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_98db58d2b4624b19ae82715a7145e39d",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": "Downloading: 100%",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_fc59c522db7e4f4fb4ff2e745b907356"
}
},
"e657cb48beca48fb9759d280cb4db15a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_a33224ea8d844fedab9537c1b04f9864",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 433422856,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 433422856,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_4e066e6aefe342eb828b08201dafb2e6"
}
},
"058bb6219e624ec1aee3c1e7cf030480": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_40a60ec138ab4fd3b49614447e62c2ca",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 413M/413M [00:13<00:00, 22.2MB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_0f136bf0e1944a54813ff7b90e7da328"
}
},
"98db58d2b4624b19ae82715a7145e39d": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"fc59c522db7e4f4fb4ff2e745b907356": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"a33224ea8d844fedab9537c1b04f9864": {
"model_module": "@jupyter-widgets/controls",
"model_name": "ProgressStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "ProgressStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"bar_color": null,
"_model_module": "@jupyter-widgets/controls"
}
},
"4e066e6aefe342eb828b08201dafb2e6": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
},
"40a60ec138ab4fd3b49614447e62c2ca": {
"model_module": "@jupyter-widgets/controls",
"model_name": "DescriptionStyleModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "StyleView",
"_model_name": "DescriptionStyleModel",
"description_width": "",
"_view_module": "@jupyter-widgets/base",
"_model_module_version": "1.5.0",
"_view_count": null,
"_view_module_version": "1.2.0",
"_model_module": "@jupyter-widgets/controls"
}
},
"0f136bf0e1944a54813ff7b90e7da328": {
"model_module": "@jupyter-widgets/base",
"model_name": "LayoutModel",
"model_module_version": "1.2.0",
"state": {
"_view_name": "LayoutView",
"grid_template_rows": null,
"right": null,
"justify_content": null,
"_view_module": "@jupyter-widgets/base",
"overflow": null,
"_model_module_version": "1.2.0",
"_view_count": null,
"flex_flow": null,
"width": null,
"min_width": null,
"border": null,
"align_items": null,
"bottom": null,
"_model_module": "@jupyter-widgets/base",
"top": null,
"grid_column": null,
"overflow_y": null,
"overflow_x": null,
"grid_auto_flow": null,
"grid_area": null,
"grid_template_columns": null,
"flex": null,
"_model_name": "LayoutModel",
"justify_items": null,
"grid_row": null,
"max_height": null,
"align_content": null,
"visibility": null,
"align_self": null,
"height": null,
"min_height": null,
"padding": null,
"grid_auto_rows": null,
"grid_gap": null,
"max_width": null,
"order": null,
"_view_module_version": "1.2.0",
"grid_template_areas": null,
"object_position": null,
"object_fit": null,
"grid_auto_columns": null,
"margin": null,
"display": null,
"left": null
}
}
}
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "_hkUF5jx2Xxs"
},
"source": [
"# Fast inference for Hugging Face tasks models on GPU (for example: QA model)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mDmIlOqh3Cyh"
},
"source": [
"- **Author**: [Pierre Guillou](https://www.linkedin.com/in/pierreguillou/)\n",
"- **Version & Date** : v1 (10/22/2021)\n",
"- **Blog post**: [NLP nas empresas | Técnicas para acelerar modelos de Deep Learning para inferência em produção](https://medium.com/@pierre_guillou/nlp-nas-empresas-t%C3%A9cnicas-para-acelerar-modelos-de-deep-learning-para-infer%C3%AAncia-em-produ%C3%A7%C3%A3o-884acbf49f20)\n",
"- **Other notebook** : [fast_inference_transformers_on_CPU.ipynb](https://github.com/piegu/language-models/blob/master/fast_inference_transformers_on_CPU.ipynb)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FREHU6cIboN8"
},
"source": [
"## Notebook overview"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vre_6Zjfbq_s"
},
"source": [
"### Objective\n",
"The objective of this notebook is to help those who want to **accelerate inference time on GPU for tasks models of Hugging Face** (NER, QA, Classification...).\n",
"\n",
"### Method for inference\n",
"\n",
"source: https://discuss.pytorch.org/t/model-eval-vs-with-torch-no-grad/19615/2\n",
"\n",
"- `model.eval()` will notify all your layers that you are in eval mode, that way, batchnorm or dropout layers will work in eval mode instead of training mode.\n",
"- `torch.no_grad()` impacts the autograd engine and deactivate it. It will reduce memory usage and speed up computations but you won’t be able to backprop (which you don’t want in an eval script).\n",
"\n",
"### References\n",
"- post blog from HF and Microsoft: [Accelerate your NLP pipelines using Hugging Face Transformers and ONNX Runtime](https://medium.com/microsoftazure/accelerate-your-nlp-pipelines-using-hugging-face-transformers-and-onnx-runtime-2443578f4333) (19/05/2020)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-Tmx-niCvKdO"
},
"source": [
"**Note**: data from the notebook fast_inference_transformers_on_CPU.ipynb"
]
},
{
"cell_type": "code",
"metadata": {
"id": "c0IRz6lCvITk"
},
"source": [
"mean_time_cpu, pipeline_mean_time_cpu = 889.07, 872.47\n",
"onnx_mean_time_cpu, torchscript_mean_time_cpu = 711.5, 849"
],
"execution_count": 1,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "DNmi0bXikgM3"
},
"source": [
"## System overview"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"id": "ov7T5Sk_pL_B",
"outputId": "4a4f323c-1204-4d88-b6e9-7b32f75e775b"
},
"source": [
"import platform\n",
"platform.platform()"
],
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"data": {
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "string"
},
"text/plain": [
"'Linux-5.4.104+-x86_64-with-Ubuntu-18.04-bionic'"
]
},
"metadata": {},
"execution_count": 2
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VvdQxXRHiXHL"
},
"source": [
"### CPU"
]
},
{
"cell_type": "code",
"metadata": {
"id": "3ViMgMkxklj7"
},
"source": [
"from psutil import *"
],
"execution_count": 3,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "dBjiK-_tkntn",
"outputId": "ede5913f-debb-46fb-b2d6-397885f02a2d"
},
"source": [
"cpu_count(),cpu_stats()"
],
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(2,\n",
" scpustats(ctx_switches=655478, interrupts=338520, soft_interrupts=322078, syscalls=0))"
]
},
"metadata": {},
"execution_count": 4
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "SnzYmVM4kuwl",
"outputId": "a1edfae3-b302-4ceb-900a-1be5a4367ddb"
},
"source": [
"!cat /proc/cpuinfo"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"processor\t: 0\n",
"vendor_id\t: GenuineIntel\n",
"cpu family\t: 6\n",
"model\t\t: 63\n",
"model name\t: Intel(R) Xeon(R) CPU @ 2.30GHz\n",
"stepping\t: 0\n",
"microcode\t: 0x1\n",
"cpu MHz\t\t: 2299.998\n",
"cache size\t: 46080 KB\n",
"physical id\t: 0\n",
"siblings\t: 2\n",
"core id\t\t: 0\n",
"cpu cores\t: 1\n",
"apicid\t\t: 0\n",
"initial apicid\t: 0\n",
"fpu\t\t: yes\n",
"fpu_exception\t: yes\n",
"cpuid level\t: 13\n",
"wp\t\t: yes\n",
"flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat md_clear arch_capabilities\n",
"bugs\t\t: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs\n",
"bogomips\t: 4599.99\n",
"clflush size\t: 64\n",
"cache_alignment\t: 64\n",
"address sizes\t: 46 bits physical, 48 bits virtual\n",
"power management:\n",
"\n",
"processor\t: 1\n",
"vendor_id\t: GenuineIntel\n",
"cpu family\t: 6\n",
"model\t\t: 63\n",
"model name\t: Intel(R) Xeon(R) CPU @ 2.30GHz\n",
"stepping\t: 0\n",
"microcode\t: 0x1\n",
"cpu MHz\t\t: 2299.998\n",
"cache size\t: 46080 KB\n",
"physical id\t: 0\n",
"siblings\t: 2\n",
"core id\t\t: 0\n",
"cpu cores\t: 1\n",
"apicid\t\t: 1\n",
"initial apicid\t: 1\n",
"fpu\t\t: yes\n",
"fpu_exception\t: yes\n",
"cpuid level\t: 13\n",
"wp\t\t: yes\n",
"flags\t\t: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat md_clear arch_capabilities\n",
"bugs\t\t: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs\n",
"bogomips\t: 4599.99\n",
"clflush size\t: 64\n",
"cache_alignment\t: 64\n",
"address sizes\t: 46 bits physical, 48 bits virtual\n",
"power management:\n",
"\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "iU5N7WYs2Y9b",
"outputId": "3f7754a0-e00d-48e5-81bd-63b39c63d15e"
},
"source": [
"!df -h"
],
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Filesystem Size Used Avail Use% Mounted on\n",
"overlay 79G 47G 32G 60% /\n",
"tmpfs 64M 0 64M 0% /dev\n",
"tmpfs 6.4G 0 6.4G 0% /sys/fs/cgroup\n",
"shm 5.8G 0 5.8G 0% /dev/shm\n",
"/dev/root 2.0G 1.2G 821M 59% /sbin/docker-init\n",
"/dev/sda1 86G 51G 35G 60% /opt/bin/.nvidia\n",
"tmpfs 6.4G 28K 6.4G 1% /var/colab\n",
"tmpfs 6.4G 0 6.4G 0% /proc/acpi\n",
"tmpfs 6.4G 0 6.4G 0% /proc/scsi\n",
"tmpfs 6.4G 0 6.4G 0% /sys/firmware\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "r7DSRg45kzqp",
"outputId": "1210c0ae-a080-4273-8ce0-4da1b54b4e65"
},
"source": [
"virtual_memory()"
],
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"svmem(total=13622194176, available=12734242816, percent=6.5, used=603373568, free=10599632896, active=1086910464, inactive=1633361920, buffers=135700480, cached=2283487232, shared=1212416, slab=199516160)"
]
},
"metadata": {},
"execution_count": 7
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lfwBXKFViakD"
},
"source": [
"### GPU"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "U6k_Lb0c4Cxj"
},
"source": [
"Let's check the CUDA configuration of our Colab notebook (firstly, you need to associate a GPU to your notebook as Google Colab comes with both options GPU or without GPU. You can enable or disable GPU in runtime settings: go to `Menu > Runtime > Change runtime`, select GPU and save your notebook settings."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rORNotQz5tOC"
},
"source": [
""
]
},
{
"cell_type": "code",
"metadata": {
"id": "Pqeje9iI4Jr-",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "f2aaaa7c-6227-4ddb-aa5c-dfa68b20d85a"
},
"source": [
"!nvidia-smi"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Sat Oct 23 17:02:08 2021 \n",
"+-----------------------------------------------------------------------------+\n",
"| NVIDIA-SMI 470.74 Driver Version: 460.32.03 CUDA Version: 11.2 |\n",
"|-------------------------------+----------------------+----------------------+\n",
"| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n",
"| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n",
"| | | MIG M. |\n",
"|===============================+======================+======================|\n",
"| 0 Tesla K80 Off | 00000000:00:04.0 Off | 0 |\n",
"| N/A 34C P8 25W / 149W | 0MiB / 11441MiB | 0% Default |\n",
"| | | N/A |\n",
"+-------------------------------+----------------------+----------------------+\n",
" \n",
"+-----------------------------------------------------------------------------+\n",
"| Processes: |\n",
"| GPU GI CI PID Type Process name GPU Memory |\n",
"| ID ID Usage |\n",
"|=============================================================================|\n",
"| No running processes found |\n",
"+-----------------------------------------------------------------------------+\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "wwqGARRb4MH8",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "30492bc3-9d33-4246-c312-eff8e3904a42"
},
"source": [
"!nvcc --version"
],
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"nvcc: NVIDIA (R) Cuda compiler driver\n",
"Copyright (c) 2005-2020 NVIDIA Corporation\n",
"Built on Mon_Oct_12_20:09:46_PDT_2020\n",
"Cuda compilation tools, release 11.1, V11.1.105\n",
"Build cuda_11.1.TC455_06.29190527_0\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wBVI6b9C2QqD"
},
"source": [
"**On 22/10/2021, ONNX Runtime GPU 1.9 needs CUDA 11.4 and cuDNN 8.2.4 (Linux) in Ubuntu 18.4** (check [Requirements](https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements)).\n",
"\n",
"If this is not the current situation of this Colab notebook (see results from previous cells), you need to install another CUDA version that fits with ONNX Runtime GPU 1.9\n",
"\n",
"To do that, you will find the links to CUDA 11.4 [here](https://developer.nvidia.com/cuda-toolkit-archive). Click on [CUDA Toolkit 11.4.2 (September 2021)](https://developer.nvidia.com/cuda-11-4-2-download-archive), select the options as following:"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dT5zT_PS39ke"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8r1mWxxc4-DT"
},
"source": [
"Then, copy/paste in the following cell the code proposed by NVIDIA and run it with an exclamation point (!) at the beginning of each line. Just wait few minutes, check the CUDA version and that's it!"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GZMVL4ckwI-v",
"outputId": "9587741b-4ccb-4766-e592-a532b758ba94"
},
"source": [
"%%time\n",
"%%capture\n",
"!wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin\n",
"!sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600\n",
"!wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu1804-11-4-local_11.4.2-470.57.02-1_amd64.deb\n",
"!sudo dpkg -i cuda-repo-ubuntu1804-11-4-local_11.4.2-470.57.02-1_amd64.deb\n",
"!sudo apt-key add /var/cuda-repo-ubuntu1804-11-4-local/7fa2af80.pub\n",
"!sudo apt-get update\n",
"!sudo apt-get -y install cuda"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CPU times: user 3.41 s, sys: 605 ms, total: 4.02 s\n",
"Wall time: 8min 14s\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "83tqnjQ-igsS",
"outputId": "f72627ce-58c1-43a9-80ed-90ab7a0593cf"
},
"source": [
"!nvidia-smi"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Sat Oct 23 17:10:23 2021 \n",
"+-----------------------------------------------------------------------------+\n",
"| NVIDIA-SMI 495.29.05 Driver Version: 460.32.03 CUDA Version: 11.2 |\n",
"|-------------------------------+----------------------+----------------------+\n",
"| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n",
"| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n",
"| | | MIG M. |\n",
"|===============================+======================+======================|\n",
"| 0 Tesla K80 Off | 00000000:00:04.0 Off | 0 |\n",
"| N/A 34C P8 25W / 149W | 0MiB / 11441MiB | 0% Default |\n",
"| | | N/A |\n",
"+-------------------------------+----------------------+----------------------+\n",
" \n",
"+-----------------------------------------------------------------------------+\n",
"| Processes: |\n",
"| GPU GI CI PID Type Process name GPU Memory |\n",
"| ID ID Usage |\n",
"|=============================================================================|\n",
"| No running processes found |\n",
"+-----------------------------------------------------------------------------+\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "WMu8nsTyiitP",
"outputId": "87b36039-a0e1-4962-cbfb-5e0c771dc6ac"
},
"source": [
"!nvcc --version"
],
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"nvcc: NVIDIA (R) Cuda compiler driver\n",
"Copyright (c) 2005-2021 NVIDIA Corporation\n",
"Built on Mon_Sep_13_19:13:29_PDT_2021\n",
"Cuda compilation tools, release 11.5, V11.5.50\n",
"Build cuda_11.5.r11.5/compiler.30411180_0\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CFr_c2Rv5ejC"
},
"source": [
"Great! We have the right CUDA version for ONNX Runtime 1.9!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xOuBqEynERFG"
},
"source": [
"## Installation"
]
},
{
"cell_type": "code",
"metadata": {
"id": "P_sWC1bkETZw"
},
"source": [
"%%capture\n",
"!pip install transformers"
],
"execution_count": 13,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "OQxJyew3GOEg",
"outputId": "6c175004-17c5-465e-90ed-c667daa411ee"
},
"source": [
"import transformers, torch, numpy as np\n",
"\n",
"print(\"transformers:\",transformers.__version__)\n",
"print(\"torch:\",torch.__version__)\n",
"print(\"numpy:\",np.__version__)"
],
"execution_count": 14,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"transformers: 4.11.3\n",
"torch: 1.9.0+cu111\n",
"numpy: 1.19.5\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "OFZpEH_scifg"
},
"source": [
"from time import perf_counter\n",
"def timer(f,*args): \n",
" start = perf_counter()\n",
" f(*args)\n",
" return (1000 * (perf_counter() - start))"
],
"execution_count": 15,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "U2VWWKpbR5mL"
},
"source": [
"## QA model"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vDfR4S0DcNoi"
},
"source": [
"Model at https://huggingface.co/pierreguillou/bert-base-cased-squad-v1.1-portuguese"
]
},
{
"cell_type": "code",
"metadata": {
"id": "cBlOI89tR8Oq"
},
"source": [
"model_checkpoint = \"pierreguillou/bert-base-cased-squad-v1.1-portuguese\"\n",
"# model_checkpoint = \"pierreguillou/bert-large-cased-squad-v1.1-portuguese\""
],
"execution_count": 16,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "bclIDEVOSm-M"
},
"source": [
"context = r\"\"\"\n",
"A pandemia de COVID-19, também conhecida como pandemia de coronavírus, é uma pandemia em curso de COVID-19, \n",
"uma doença respiratória aguda causada pelo coronavírus da síndrome respiratória aguda grave 2 (SARS-CoV-2). \n",
"A doença foi identificada pela primeira vez em Wuhan, na província de Hubei, República Popular da China, \n",
"em 1 de dezembro de 2019, mas o primeiro caso foi reportado em 31 de dezembro do mesmo ano. \n",
"Acredita-se que o vírus tenha uma origem zoonótica, porque os primeiros casos confirmados \n",
"tinham principalmente ligações ao Mercado Atacadista de Frutos do Mar de Huanan, que também vendia animais vivos. \n",
"Em 11 de março de 2020, a Organização Mundial da Saúde declarou o surto uma pandemia. Até 8 de fevereiro de 2021, \n",
"pelo menos 105 743 102 casos da doença foram confirmados em pelo menos 191 países e territórios, \n",
"com cerca de 2 308 943 mortes e 58 851 440 pessoas curadas.\n",
"\"\"\"\n",
"\n",
"question = \"Quando começou a pandemia de Covid-19 no mundo?\""
],
"execution_count": 17,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QeiLPvAteK0q"
},
"source": [
"## 1. Check the model"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "itx8-vxHgrgI"
},
"source": [
"Before evaluating its inference time, let's check that our QA model is working well."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dUixO7_ueq38"
},
"source": [
"#### 1.1 Without pipeline"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0,
"referenced_widgets": [
"8277f2ac369a4222878b0734d8620e99",
"47090989378e4b3790b44ba52e2da41c",
"b909783e4ca3484bb3f0b1790625ecec",
"5231daf2afaa44ceb818aaf5e29c01a7",
"c0c4d89eac574403b5996daac2ecde52",
"10e1b68ca4df4096b440fa26427ae54a",
"ec6a2c8ce547423097dc98a1cf937a80",
"68a4ae3194994a2ca3682b0109bbcf27",
"8a4b9e0b44694366b5fa81e37a140842",
"d20ab2758f774596934f2b9cc574a1c2",
"eac2e4141dcb44749c4da076ae2314ff",
"8c259af90c2b46a6a47a16b52c0637eb",
"ec5b7c00cb09480c95af382d093e7123",
"1add92e1d59e442287f560fb718c527a",
"640577e69737412d9abe6b60f1743e58",
"6f06f50fc21b461994a75a1b0ef7d4a6",
"0a489921e8b34bb1a4a0703571511b3f",
"f9835635dd5e457bb45473678865eeeb",
"0cd61fee7456450e813e4179db06b815",
"f965054aa0af472fbaa4056e1edd8994",
"5c3669b1e6a942d5b8d5381850bdb6e0",
"9b3759459d3c4ec9bcc3f6b696ce93b5",
"cc37d7d444f2457f97747af57451b6e9",
"873562a4a33b42d9b9ef22409cb22a89",
"8acc7ec22a4f4ffb97e960aa10389451",
"e3612a3fcaad4505b6a04b657db6c947",
"57799db8df7c4aaeb843fe1a0a405f26",
"1fee6fb3d29b4bae82ea34ad42c4183c",
"634e1097c09e4683b57d3f9db8c928e8",
"8c2bbfcc4339456b96c18010ff85cb23",
"3cef6cc24e4b439a9707ac8779b2753a",
"a42aa32326334e4c9f3042623e8b215b",
"2d3875c8cdf340e6817e7ff339c6073d",
"326e7918480645fca7821f26903e877b",
"0fef3b830dda4bfc9f90fef79696c7cf",
"73629e5e6727425e9858453297b8fc45",
"c0dd73ddfb6548ccb8872b505f524cb3",
"7f1a6f9ca1564b049f97991bfe21cc89",
"871edad667354b81a04c8ac9850ec3dd",
"ce38b5d8ac984644ae075b1195d150c0",
"0808a57049e44525b56b741fe90d9801",
"6fd30b9154b04bfcb60d3340dd26d33a",
"68ff2fc76f6e4977ba6d9e8767a6e271",
"d29fd4613044451886a749f0faa6aeb1",
"f2ff6e53b64c4a1f9f4d25206bf8441c",
"9f4d0a818d55402daa979c087ec34d98",
"f80f42a8865c4195b1f3864ed971f768",
"e657cb48beca48fb9759d280cb4db15a",
"058bb6219e624ec1aee3c1e7cf030480",
"98db58d2b4624b19ae82715a7145e39d",
"fc59c522db7e4f4fb4ff2e745b907356",
"a33224ea8d844fedab9537c1b04f9864",
"4e066e6aefe342eb828b08201dafb2e6",
"40a60ec138ab4fd3b49614447e62c2ca",
"0f136bf0e1944a54813ff7b90e7da328"
]
},
"id": "v0Ewv1TleWqi",
"outputId": "8e025acd-b8ce-41c3-ae02-0cb0d073b9ba"
},
"source": [
"from transformers import AutoTokenizer, AutoModelForQuestionAnswering\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, use_fast=True)\n",
"model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint)\n",
"model.eval();"
],
"execution_count": 18,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8277f2ac369a4222878b0734d8620e99",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/494 [00:00, ?B/s]"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "8c259af90c2b46a6a47a16b52c0637eb",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/862 [00:00, ?B/s]"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "cc37d7d444f2457f97747af57451b6e9",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/205k [00:00, ?B/s]"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "326e7918480645fca7821f26903e877b",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/112 [00:00, ?B/s]"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "f2ff6e53b64c4a1f9f4d25206bf8441c",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/413M [00:00, ?B/s]"
]
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "V3jrcdqmeWqj",
"outputId": "5fb9c725-c430-4b77-d3b6-ff257a55fac6"
},
"source": [
"# code source: https://huggingface.co/transformers/master/task_summary.html#extractive-question-answering\n",
"\n",
"# tokenize inputs\n",
"inputs = tokenizer(question, context, add_special_tokens=True, return_tensors=\"pt\")\n",
"\n",
"# get outputs\n",
"outputs = model(**inputs)\n",
"answer_start_scores = outputs.start_logits\n",
"answer_end_scores = outputs.end_logits\n",
"\n",
"# Get the most likely beginning of answer with the argmax of the score\n",
"answer_start = torch.argmax(answer_start_scores)\n",
"# Get the most likely end of answer with the argmax of the score\n",
"answer_end = torch.argmax(answer_end_scores) + 1\n",
"\n",
"input_ids = inputs[\"input_ids\"].tolist()[0]\n",
"answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end]))\n",
"\n",
"# print answer\n",
"print(f\"Question: {question}\")\n",
"print(f\"Answer: {answer}\")"
],
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Question: Quando começou a pandemia de Covid-19 no mundo?\n",
"Answer: 1 de dezembro de 2019\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Wf-o7fLRewoY"
},
"source": [
"That's the right answer!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XOINhKq2T3Bw"
},
"source": [
"#### 1.2 With pipeline"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DFxfoEGXcoYj"
},
"source": [
"We can use Pipeline, too."
]
},
{
"cell_type": "code",
"metadata": {
"id": "5srv6sCpSeNt"
},
"source": [
"from transformers import pipeline\n",
"\n",
"nlp = pipeline(\"question-answering\", model=model_checkpoint)"
],
"execution_count": 20,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "z0jMdQ92Tt_1",
"outputId": "920e7955-2f00-45a2-83e3-72359b704cc2"
},
"source": [
"# get result\n",
"result = nlp(question, context)\n",
"\n",
"# print answer\n",
"print(f\"Question: {question}\")\n",
"print(f\"Answer: {result['answer']} (score: {round(result['score'], 4)})\")"
],
"execution_count": 21,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Question: Quando começou a pandemia de Covid-19 no mundo?\n",
"Answer: 1 de dezembro de 2019 (score: 0.713)\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nMjpms2RfQ_9"
},
"source": [
"That's the right answer!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PRV40jI3PkcM"
},
"source": [
"## 2. Inference time | PyTorch model"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6KLKVAmpfe6v"
},
"source": [
"### 2.1 PyTorch model (without pipeline)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "sBTdifUAPuZf"
},
"source": [
"from transformers import AutoTokenizer, AutoModelForQuestionAnswering\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, use_fast=True)\n",
"model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint)\n",
"model.eval();"
],
"execution_count": 22,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HOdhaPFwl1Oe"
},
"source": [
"#### 1. Tokenize the inputs"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "K1_5839CDbiD",
"outputId": "a99d4aef-a6d3-4aad-ca6e-073751d0ba26"
},
"source": [
"num=100\n",
"\n",
"total = 0\n",
"for i in range(num):\n",
" start = perf_counter()\n",
" inputs = tokenizer(question, context, add_special_tokens=True, return_tensors=\"pt\")\n",
" diff = perf_counter() - start\n",
" total += diff\n",
"\n",
"mean_tokenizer = round((total/num)*1000,2)\n",
"print(f'average time: {mean_tokenizer} ms')"
],
"execution_count": 23,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"average time: 0.76 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "K_2Djf9uQq9I"
},
"source": [
"#### 2. Model on GPU"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ZUJKEBTnQgsz",
"outputId": "58cf87c9-2561-497a-b6a4-7d6141f93b80"
},
"source": [
"# put model and inputs to gpu\n",
"model = model.to('cuda')\n",
"inputs = inputs.to('cuda')\n",
"\n",
"# get mean time\n",
"with torch.no_grad():\n",
" mean_time_gpu = round(np.mean([timer(model,inputs.input_ids,inputs.token_type_ids,inputs.attention_mask) for _ in range(100)]),2)\n",
"\n",
"print(f'average time: {mean_time_gpu} ms')"
],
"execution_count": 24,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"average time: 44.42 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dFKgglV91tnk"
},
"source": [
"Now, we can evaluate the time to get the answer."
]
},
{
"cell_type": "code",
"metadata": {
"id": "icBpNtrqnOoH"
},
"source": [
"# get outputs\n",
"with torch.no_grad(): \n",
" outputs = model(**inputs)"
],
"execution_count": 25,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "6e4Z8B0QnOoH",
"outputId": "a2aca418-14c4-4f2b-891d-340470135831"
},
"source": [
"num = 100\n",
"\n",
"total = 0\n",
"for i in range(num):\n",
" start = perf_counter()\n",
" answer_start_scores = outputs.start_logits\n",
" answer_end_scores = outputs.end_logits\n",
"\n",
" # Get the most likely beginning of answer with the argmax of the score\n",
" answer_start = torch.argmax(answer_start_scores)\n",
" # Get the most likely end of answer with the argmax of the score\n",
" answer_end = torch.argmax(answer_end_scores) + 1\n",
"\n",
" input_ids = inputs[\"input_ids\"].tolist()[0]\n",
" answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end]))\n",
" diff = perf_counter() - start\n",
" total += diff\n",
"\n",
"mean_time_gpu_answer = round((total/num)*1000,2)\n",
"print(f'average time: {mean_time_gpu_answer} ms')"
],
"execution_count": 26,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"average time: 1.52 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0ekcFHtJWWa_"
},
"source": [
"Then, we have the total time when the model is on the GPU:"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "wsiIrP_OWWbA",
"outputId": "2c733937-2099-44da-8d13-215faa99ad07"
},
"source": [
"total_gpu = round(mean_tokenizer + mean_time_gpu + mean_time_gpu_answer,2)\n",
"print(f'time: {total_gpu} ms')"
],
"execution_count": 27,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"time: 46.7 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "huZuti5kdqmb"
},
"source": [
"### 2.2 PyTorch model (with pipeline)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PGi0rLL3XGLu"
},
"source": [
"We can use Pipeline, too."
]
},
{
"cell_type": "code",
"metadata": {
"id": "JUaBkiE7XGME"
},
"source": [
"from transformers import pipeline"
],
"execution_count": 28,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "LQ8IYY1wW-2U"
},
"source": [
"#### Model on GPU"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jMOPgbPpZNK6"
},
"source": [
"We have the total time when the model is on the GPU:"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "qL78khUFZNLI",
"outputId": "8de1f1fe-93f2-482e-d373-8de939e15e5f"
},
"source": [
"# put model and inputs to gpu\n",
"nlp = pipeline(\"question-answering\", model=model_checkpoint, use_fast=True, device=0)\n",
"\n",
"# get mean time\n",
"with torch.no_grad():\n",
" pipeline_mean_time_gpu = round(np.mean([timer(nlp,question,context) for _ in range(100)]),2)\n",
"\n",
"print(f'average time: {pipeline_mean_time_gpu} ms')"
],
"execution_count": 29,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.7/dist-packages/transformers/pipelines/base.py:901: UserWarning: You seem to be using the pipelines sequentially on GPU. In order to maximize efficiency please use a dataset\n",
" UserWarning,\n"
]
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"average time: 48.31 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PIozp6wuZxWC"
},
"source": [
"### 2.3 Results with PyTorch"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nOg4-rckNtSb"
},
"source": [
"Let's compage the GPU results with the ones with CPU (check link to the CPU notebook at the beginning of this notebook."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 112
},
"id": "P1Y-xV--ZxWD",
"outputId": "9fe23ddd-3ca3-4e22-fcb1-a5f6ac73826a"
},
"source": [
"import pandas as pd\n",
"\n",
"raw_data = {\n",
" 'Latency on CPU (ms)': [mean_time_cpu, pipeline_mean_time_cpu],\n",
" 'Latency on GPU (ms)': [mean_time_gpu, pipeline_mean_time_gpu],\n",
" }\n",
"\n",
"df = pd.DataFrame(raw_data,\n",
" index=pd.Index(['Without pipeline', 'With pipeline']),\n",
" columns=pd.Index(['Latency on CPU (ms)','Latency on GPU (ms)']))\n",
"\n",
"df"
],
"execution_count": 30,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Latency on CPU (ms) \n",
" Latency on GPU (ms) \n",
" \n",
" \n",
" \n",
" \n",
" Without pipeline \n",
" 889.07 \n",
" 44.42 \n",
" \n",
" \n",
" With pipeline \n",
" 872.47 \n",
" 48.31 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Latency on CPU (ms) Latency on GPU (ms)\n",
"Without pipeline 889.07 44.42\n",
"With pipeline 872.47 48.31"
]
},
"metadata": {},
"execution_count": 30
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 352
},
"id": "Xeaj_0HlcPJV",
"outputId": "37582d68-e726-47a1-892b-2ae7bc84a548"
},
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"labels = ['CPU','GPU']\n",
"data = [\n",
" [mean_time_cpu, mean_time_gpu],\n",
" [pipeline_mean_time_cpu, pipeline_mean_time_gpu]\n",
" ]\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"\n",
"X = np.arange(2)\n",
"ax.bar(X - 0.1, data[0], color = 'r', width = 0.2, label='Without pipeline')\n",
"ax.bar(X + 0.1, data[1], color = 'g', width = 0.2, label='With pipeline')\n",
"\n",
"# axes and title\n",
"x = np.arange(len(labels)) # the label locations\n",
"ax.set_xticks(x)\n",
"ax.set_xticklabels(labels)\n",
"ax.set_ylabel('Latency (ms)')\n",
"ax.set_title('Inference latency of PyTorch model (CPU vs GPU) in Google Colab')\n",
"\n",
"leg = ax.legend();"
],
"execution_count": 31,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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to8HHXQQS5cuXadxK29gccIJJ9Ttrlf15lXZklRS7f1Nira+uTBu3DjuuOMOTj/99KbbPr788stNwxsaGrj88ssZM2YMBx98MFAE88SJExk2bFi71DhlypR2mc4NN9zQLtPpCO4xS5KA+t72sdLUqVPZb7/9+PCHP8yQIUM48cQTm34ve9CgQSxatIjnnnuOXXfdlaOOOoqhQ4dy6KGH8tprrwEwY8YM9t9/f971rncxYcIEXnjhhTXmUbnn3qtXL7785S+zxx57MGbMGF588UWgtts/dgSDWZIE1Pe2j9WmTZvG1VdfzRNPPMEzzzzDT37ykzXaPPnkk5x88snMnj2brbbaim9/+9ssX76cU089lcmTJzNjxgw++9nP8uUvf7nV1/Xqq68yZswYHnnkEfbbbz+uv/56YN1u/7gheChbktSkXrd9rLb33nvzjne8AyhuyXjfffdx6KGHrtZm4MCBTfM8+uijueqqqzjwwAN5/PHH+cAHPgDAm2++yXbbbddqPT169GDixIlNNd19991Ay7d/7NWrV02vs14MZklSkw1128fq2zQ2d9vG5tqklNhtt92aDrnXonv37k3TqqxpXW7/uCF4KFuS1KRet32sNm3aNJ599llWrlzJ7bff3uxtG+fOndsUwI23dhwyZAgLFy5s6r98+XJmzZq11vOH9rv9Y3szmCVJTep128dqe+21F6eccgpDhw5l8ODBfOxjH1ujzZAhQ7jmmmsYOnQoS5Ys4aSTTqJHjx5MnjyZc845hz322IORI0fS0NCwTq+1vW7/2N687WOlTfy2j3FBR1dQX97EQhu7znLbx6lTp3LJJZdw1113tdjmueeeY+LEiTz++OMbsLL68LaPkiRtxLz4S5K0QY0fP57x48e32mbQoEGbxN7yunCPWZKkEjGYJalENubrfrSmdfl/1jWYI+KMiJgVEY9HxA8jomdEDI6IhyJiTkTcHhE9ctvNcvecPHxQPWuTpLLp2bMnixcvNpw3ESklFi9evNbfk67bOeaI2AH4AjAspfR6RNwBHAEcBFyeUrotIq4Fjge+k/8uSSntHBFHAN8EDq9XfZJUNgMGDGD+/PksXLiwo0tRO+nZsycDBgxYq3HqffFXN2DziFgObAG8ALwP+FQefjNwAUUwH5KfA0wGvhURkdx0lNRJdO/encGDB3d0GepgdTuUnVJa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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 352
},
"id": "2864pyNWyw8H",
"outputId": "09425ba7-4524-4c79-9b26-5d77835845bd"
},
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"labels = ['GPU']\n",
"data = [mean_time_gpu, pipeline_mean_time_gpu]\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
" \n",
"X = np.arange(1)\n",
"ax.bar(X - 0.1, data[0], color = 'r', width = 0.2, label='PyTorch (without pipeline)')\n",
"ax.bar(X + 0.1, data[1], color = 'g', width = 0.2, label='PyTorch (with pipeline)')\n",
"\n",
"# axes and title\n",
"x = np.arange(len(labels)) # the label locations\n",
"ax.set_xticks(x)\n",
"ax.set_xticklabels(labels)\n",
"ax.set_ylabel('Latency (ms)')\n",
"ax.set_title('Inference latency of PyTorch model (GPU) in Google Colab')\n",
"\n",
"leg = ax.legend();"
],
"execution_count": 32,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v3r9x8ixbGAk"
},
"source": [
"- Pipeline does not help improve latency neither on CPU and GPU.\n",
"- Using the **GPU** allows inferring up to **19 times faster** than with the CPU (**45 ms** for the PyTorch model without a pipeline)."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "s6ZTYbyBB9F8"
},
"source": [
"## 3. Inference time | ONNX Runtime"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6WuzVpniCACF"
},
"source": [
"[ONNX Runtime](https://onnxruntime.ai/) helps **accelerate PyTorch and TensorFlow models in production, on CPU or GPU**. As an open source library built for performance and broad platform support, ONNX Runtime is used in products and services handling over 20 billion inferences each day. "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "n9AcUibxJGXt"
},
"source": [
"### 3.1 Old method | convert_graph_to_onnx.py"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "G6AD86PrI99o"
},
"source": [
"You can use ONNX Runtime and Hugging Face Transformers together to improve the experience of training and deploying NLP models. Hugging Face has made it easy to inference Transformer models with ONNX Runtime with the [transformers/convert_graph_to_onnx.py](https://github.com/huggingface/transformers/blob/master/src/transformers/convert_graph_to_onnx.py) which generates a model that can be loaded by ONNX Runtime."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "691vn7sAGypy",
"outputId": "cc0ed233-7cf3-4f43-e74f-200e2fdeb275"
},
"source": [
"!python -m transformers.onnx --help"
],
"execution_count": 33,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"usage: Hugging Face ONNX Exporter tool [-h] -m MODEL\n",
" [--feature {causal-lm,causal-lm-with-past,default,default-with-past,masked-lm,seq2seq-lm,seq2seq-lm-with-past,sequence-classification,sequence-classification-with-past,token-classification}]\n",
" [--opset OPSET] [--atol ATOL]\n",
" output\n",
"\n",
"positional arguments:\n",
" output Path indicating where to store generated ONNX model.\n",
"\n",
"optional arguments:\n",
" -h, --help show this help message and exit\n",
" -m MODEL, --model MODEL\n",
" Model's name of path on disk to load.\n",
" --feature {causal-lm,causal-lm-with-past,default,default-with-past,masked-lm,seq2seq-lm,seq2seq-lm-with-past,sequence-classification,sequence-classification-with-past,token-classification}\n",
" Export the model with some additional feature.\n",
" --opset OPSET ONNX opset version to export the model with (default\n",
" 12).\n",
" --atol ATOL Absolute difference tolerence when validating the\n",
" model.\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jpByQiFAeOoY"
},
"source": [
"````\n",
"SUPPORTED_PIPELINES = [\n",
" \"feature-extraction\",\n",
" \"ner\",\n",
" \"sentiment-analysis\",\n",
" \"fill-mask\",\n",
" \"question-answering\",\n",
" \"text-generation\",\n",
" \"translation_en_to_fr\",\n",
" \"translation_en_to_de\",\n",
" \"translation_en_to_ro\",\n",
"]\n",
"````"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MIq7eMLLdBWf"
},
"source": [
"Get the file convert_graph_to_onnx.py"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "GrSHTpBILZPd",
"outputId": "76dab283-6fd6-42ae-f619-a2f4b2f240d8"
},
"source": [
"!wget https://raw.githubusercontent.com/huggingface/transformers/master/src/transformers/convert_graph_to_onnx.py"
],
"execution_count": 34,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"--2021-10-23 17:12:06-- https://raw.githubusercontent.com/huggingface/transformers/master/src/transformers/convert_graph_to_onnx.py\n",
"Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.110.133, ...\n",
"Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 18640 (18K) [text/plain]\n",
"Saving to: ‘convert_graph_to_onnx.py’\n",
"\n",
"\rconvert_graph_to_on 0%[ ] 0 --.-KB/s \rconvert_graph_to_on 100%[===================>] 18.20K --.-KB/s in 0s \n",
"\n",
"2021-10-23 17:12:06 (60.0 MB/s) - ‘convert_graph_to_onnx.py’ saved [18640/18640]\n",
"\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rtxn_TnPUqYZ"
},
"source": [
"### 3.1.1 Tokenize the inputs"
]
},
{
"cell_type": "code",
"metadata": {
"id": "371tF1SsYhwM"
},
"source": [
"from transformers import AutoTokenizer\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, use_fast=True)"
],
"execution_count": 35,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "oDusFXaeUqYa",
"outputId": "5d6bfcca-9444-4548-8ed8-17a5d7568ed8"
},
"source": [
"num=100\n",
"\n",
"total = 0\n",
"for i in range(num):\n",
" start = perf_counter()\n",
" # WARNING!!!!!!! return_tensors=\"np\" and not return_tensors=\"pt\"\n",
" inputs = tokenizer(question, context, add_special_tokens=True, return_tensors=\"np\")\n",
" diff = perf_counter() - start\n",
" total += diff\n",
"\n",
"onnx_mean_tokenizer = round((total/num)*1000,2)\n",
"print(f'average time: {onnx_mean_tokenizer} ms')"
],
"execution_count": 36,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"average time: 0.83 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XAas8R1RZbj-"
},
"source": [
"### 3.1.2 Model on GPU"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "W5Z9-kF4Zbj-"
},
"source": [
"#### Installation"
]
},
{
"cell_type": "code",
"metadata": {
"id": "MVKmLdKXeFlP"
},
"source": [
"# uninstall onnxruntime cpu\n",
"# !pip uninstall onnxruntime"
],
"execution_count": 37,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "cCCxt0ZKPaRm"
},
"source": [
"%%capture\n",
"# onnxruntime gpu\n",
"!pip install onnx\n",
"!pip install onnxruntime-gpu"
],
"execution_count": 38,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"id": "NyrnTj0OPwju",
"outputId": "f8e0835a-04e7-4cbe-c3bb-2d0c79840f35"
},
"source": [
"import onnxruntime as ort\n",
"ort.get_device()"
],
"execution_count": 39,
"outputs": [
{
"output_type": "execute_result",
"data": {
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "string"
},
"text/plain": [
"'GPU'"
]
},
"metadata": {},
"execution_count": 39
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "8maDa3NVPaRm",
"outputId": "01da4462-2f47-4cc8-f04c-1783366b5929"
},
"source": [
"import onnxruntime\n",
"print(\"onnxruntime:\",onnxruntime.__version__)"
],
"execution_count": 40,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"onnxruntime: 1.9.0\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bsfHhNzrZbj_"
},
"source": [
"#### Convert the transformer model to its quantized onnx version"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "gk-hgwjsZbj_",
"outputId": "4ab8e480-53a9-46e3-be33-7434394310c7"
},
"source": [
"model_checkpoint_onnx = 'onnx_gpu/' + model_checkpoint.replace('/','-') + '.onnx'\n",
"\n",
"!python convert_graph_to_onnx.py \\\n",
"--pipeline question-answering \\\n",
"--model {model_checkpoint} \\\n",
"--tokenizer {model_checkpoint} \\\n",
"--framework pt \\\n",
"--opset 11 \\\n",
"--check-loading \\\n",
"--use-external-format \\\n",
"--quantize \\\n",
"{model_checkpoint_onnx}"
],
"execution_count": 41,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"====== Converting model to ONNX ======\n",
"ONNX opset version set to: 11\n",
"Loading pipeline (model: pierreguillou/bert-base-cased-squad-v1.1-portuguese, tokenizer: pierreguillou/bert-base-cased-squad-v1.1-portuguese)\n",
"Creating folder /content/onnx_gpu\n",
"Using framework PyTorch: 1.9.0+cu111\n",
"Found input input_ids with shape: {0: 'batch', 1: 'sequence'}\n",
"Found input token_type_ids with shape: {0: 'batch', 1: 'sequence'}\n",
"Found input attention_mask with shape: {0: 'batch', 1: 'sequence'}\n",
"Found output output_0 with shape: {0: 'batch', 1: 'sequence'}\n",
"Found output output_1 with shape: {0: 'batch', 1: 'sequence'}\n",
"Ensuring inputs are in correct order\n",
"position_ids is not present in the generated input list.\n",
"Generated inputs order: ['input_ids', 'attention_mask', 'token_type_ids']\n",
"\n",
"====== Optimizing ONNX model ======\n",
"/usr/local/lib/python3.7/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py:353: UserWarning: Deprecation warning. This ORT build has ['CUDAExecutionProvider', 'CPUExecutionProvider'] enabled. The next release (ORT 1.10) will require explicitly setting the providers parameter (as opposed to the current behavior of providers getting set/registered by default based on the build flags) when instantiating InferenceSession.For example, onnxruntime.InferenceSession(..., providers=[\"CUDAExecutionProvider\"], ...)\n",
" \"based on the build flags) when instantiating InferenceSession.\"\n",
"2021-10-23 17:12:53.079006789 [W:onnxruntime:, inference_session.cc:1419 Initialize] Serializing optimized model with Graph Optimization level greater than ORT_ENABLE_EXTENDED and the NchwcTransformer enabled. The generated model may contain hardware specific optimizations, and should only be used in the same environment the model was optimized in.\n",
"Optimized model has been written at /content/onnx_gpu/pierreguillou-bert-base-cased-squad-v1.onnx: ✔\n",
"/!\\ Optimized model contains hardware specific operators which might not be portable. /!\\\n",
"As of onnxruntime 1.4.0, models larger than 2GB will fail to quantize due to protobuf constraint.\n",
"This limitation will be removed in the next release of onnxruntime.\n",
"WARNING:root:onnxruntime.quantization.quantize is deprecated.\n",
" Please use quantize_static for static quantization, quantize_dynamic for dynamic quantization.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator FusedMatMul. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Warning: Unsupported operator Gelu. No schema registered for this operator.\n",
"Warning: Unsupported operator LayerNormalization. No schema registered for this operator.\n",
"Quantized model has been written at /content/onnx_gpu/pierreguillou-bert-base-cased-squad-v1-quantized.onnx: ✔\n",
"\n",
"====== Check exported ONNX model(s) ======\n",
"Checking ONNX model loading from: /content/onnx_gpu/pierreguillou-bert-base-cased-squad-v1.1-portuguese.onnx ...\n",
"Model /content/onnx_gpu/pierreguillou-bert-base-cased-squad-v1.1-portuguese.onnx correctly loaded: ✔\n",
"Checking ONNX model loading from: /content/onnx_gpu/pierreguillou-bert-base-cased-squad-v1.onnx ...\n",
"Model /content/onnx_gpu/pierreguillou-bert-base-cased-squad-v1.onnx correctly loaded: ✔\n",
"Checking ONNX model loading from: /content/onnx_gpu/pierreguillou-bert-base-cased-squad-v1-quantized.onnx ...\n",
"Model /content/onnx_gpu/pierreguillou-bert-base-cased-squad-v1-quantized.onnx correctly loaded: ✔\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uq08GtbNZbj_"
},
"source": [
"#### Import the onnx quantized version of the model"
]
},
{
"cell_type": "code",
"metadata": {
"id": "kqBAT9f_ZbkA",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "fbae2bf8-270f-412a-caeb-71d511ce515a"
},
"source": [
"import onnxruntime as ort\n",
"\n",
"# copy/paste the path to the file xxx.quantized.onnx\n",
"ort_session = ort.InferenceSession(\"/content/\" + model_checkpoint_onnx)"
],
"execution_count": 42,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/usr/local/lib/python3.7/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py:353: UserWarning: Deprecation warning. This ORT build has ['CUDAExecutionProvider', 'CPUExecutionProvider'] enabled. The next release (ORT 1.10) will require explicitly setting the providers parameter (as opposed to the current behavior of providers getting set/registered by default based on the build flags) when instantiating InferenceSession.For example, onnxruntime.InferenceSession(..., providers=[\"CUDAExecutionProvider\"], ...)\n",
" \"based on the build flags) when instantiating InferenceSession.\"\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "B99jvy5ZZbkB"
},
"source": [
"#### Run the onnx model"
]
},
{
"cell_type": "code",
"metadata": {
"id": "_xIRQ_TiZbkB",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "3fb39692-4eb0-4e1b-9535-40d58b232dd6"
},
"source": [
"num = 100\n",
"\n",
"total = 0\n",
"for i in range(num):\n",
" start = perf_counter()\n",
" outputs = ort_session.run(None, dict(inputs))\n",
" diff = perf_counter() - start\n",
" total += diff\n",
"\n",
"onnx_mean_time_gpu = round((total/num)*1000,2)\n",
"print(f'average time: {onnx_mean_time_gpu} ms')"
],
"execution_count": 43,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"average time: 37.54 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZppkcuFfZbkB"
},
"source": [
"Now, we can evaluate the time to get the answer."
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ac30L0VQZbkB",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "b103d417-e2e3-4579-ad39-1f4d8a57334f"
},
"source": [
"num = 100\n",
"\n",
"total = 0\n",
"for i in range(num):\n",
" start = perf_counter()\n",
" # code source: https://huggingface.co/transformers/master/task_summary.html#extractive-question-answering\n",
"\n",
" answer_start_scores = outputs[0]\n",
" answer_end_scores = outputs[1]\n",
"\n",
" # Get the most likely beginning of answer with the argmax of the score\n",
" answer_start = np.argmax(answer_start_scores)\n",
" # Get the most likely end of answer with the argmax of the score\n",
" answer_end = np.argmax(answer_end_scores) + 1\n",
"\n",
" input_ids = inputs[\"input_ids\"].tolist()[0]\n",
" answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end]))\n",
"\n",
" diff = perf_counter() - start\n",
" total += diff\n",
" \n",
" # print(f\"Question: {question}\")\n",
" # print(f\"Answer: {answer}\")\n",
"\n",
"onnx_mean_time_gpu_answer = round((total/num)*1000,2)\n",
"print(f'average time: {onnx_mean_time_gpu_answer} ms')"
],
"execution_count": 44,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"average time: 0.12 ms\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "wSmGj3TXZbkB",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "0d7ee3ba-c502-4998-d9c9-aba9edb85c40"
},
"source": [
"print(f\"Question: {question}\")\n",
"print(f\"Answer: {answer}\")"
],
"execution_count": 45,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Question: Quando começou a pandemia de Covid-19 no mundo?\n",
"Answer: 1 de dezembro de 2019\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xVX45tENZbkC"
},
"source": [
"Then, we have the total time when the model is on the GPU:"
]
},
{
"cell_type": "code",
"metadata": {
"id": "mCRxdHgLZbkC",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "e39277b7-ae9b-44c8-c94e-737d8bf17810"
},
"source": [
"onnx_total_gpu = round(onnx_mean_tokenizer + onnx_mean_time_gpu + onnx_mean_time_gpu_answer,2)\n",
"print(f'time: {onnx_total_gpu} ms')"
],
"execution_count": 46,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"time: 38.49 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rDV-A-S_cxwR"
},
"source": [
"### 3.1.4 Results with ONNX Runtime"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O23VQLBXQPZp"
},
"source": [
"Let's compage the GPU results with the ones with CPU (check link to the CPU notebook at the beginning of this notebook."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 112
},
"id": "pUrYN-jcQPZq",
"outputId": "afcaade1-c780-4bdd-99ae-6455ec77a7e8"
},
"source": [
"import pandas as pd\n",
"\n",
"raw_data = {\n",
" 'Latency on CPU (ms)': [mean_time_cpu, onnx_mean_time_cpu],\n",
" 'Latency on GPU (ms)': [mean_time_gpu, onnx_mean_time_gpu],\n",
" }\n",
"\n",
"df = pd.DataFrame(raw_data,\n",
" index=pd.Index(['PyTorch (without pipeline)','ONNX Runtime']),\n",
" columns=pd.Index(['Latency on CPU (ms)','Latency on GPU (ms)']))\n",
"\n",
"df"
],
"execution_count": 47,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Latency on CPU (ms) \n",
" Latency on GPU (ms) \n",
" \n",
" \n",
" \n",
" \n",
" PyTorch (without pipeline) \n",
" 889.07 \n",
" 44.42 \n",
" \n",
" \n",
" ONNX Runtime \n",
" 711.50 \n",
" 37.54 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Latency on CPU (ms) Latency on GPU (ms)\n",
"PyTorch (without pipeline) 889.07 44.42\n",
"ONNX Runtime 711.50 37.54"
]
},
"metadata": {},
"execution_count": 47
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 352
},
"id": "ivKh9ctrQPZr",
"outputId": "2b409d93-74ca-4c29-de56-b47d06b1de27"
},
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"labels = ['CPU','GPU']\n",
"data = [\n",
" [mean_time_cpu, mean_time_gpu],\n",
" [onnx_mean_time_cpu, onnx_mean_time_gpu]\n",
" ]\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"\n",
"X = np.arange(2)\n",
"ax.bar(X - 0.1, data[0], color = 'r', width = 0.2, label='PyTorch (without pipeline)')\n",
"ax.bar(X + 0.1, data[1], color = 'g', width = 0.2, label='ONNX Runtime')\n",
"\n",
"# axes and title\n",
"x = np.arange(len(labels)) # the label locations\n",
"ax.set_xticks(x)\n",
"ax.set_xticklabels(labels)\n",
"ax.set_ylabel('Latency (ms)')\n",
"ax.set_title('Inference latency (CPU vs GPU) in Google Colab')\n",
"\n",
"leg = ax.legend();"
],
"execution_count": 48,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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+tWvGDZsWEX/wYMHc8MNN+Sd5v7776dTp07stttuXHbZZRX9GzduzMUXX0yXLl146aWXuOeee+jcuTNdunTh1FNPrRjv+eefZ5999mGHHXaoMmzuvfde+vfvD8C5557LqFGjADjqqKM47bTTgCS8Bw8eXLFsgEGDBvHCCy9QWlrK0KFDgWRr85BDDqFDhw5ceumlBa1HuZEjRzJw4EBefPFFRo0axSWXXEJpaSnvvvvuCvUOHDiQs88+m+7du7PTTjvx2GOPATB27Fj69esHwJAhQzj11FPp0aMHHTp04LbbbquY/vrrr2ePPfagc+fOXHHFFSu9Hh988AG77bYbkLQCHH300XnXafTo0fTo0YNu3bpx7LHHsmjRIiB5n5955hm++eabvK/3KomI9fax++67h5lZrilTpqzYA9buowCbbrppREQsW7YsjjjiiLj55pvj/fffj65du0ZERFlZWeywww4xd+7cimkGDBgQI0aMiJkzZ8a2224bs2fPjmXLlkXv3r3j4YcfTleF+Nvf/hYREZMmTYoOHTrEnDlzIiJi3rx5FfM55phjoqysLCZPnhw77rjjSvV99dVXsdVWW1V033///fGzn/0sIiL22GOP2GuvvSIiYuDAgfHkk0+usE7PPvtsHH744RXT3nXXXdGuXbtYsGBBLFmyJLbbbrv46KOPql2P8nlFRIwYMSIGDBiwwmuQz4ABA6Jv375RVlYWb7/9drRu3TqWLFmyQj1XXHFFdO7cORYvXhxz5syJNm3axMyZM+Opp56KM844I5YvXx5lZWVx+OGHx3PPPbdCLe+//37suuuu1a7TnDlzomfPnrFo0aKIiLjmmmviyiuvrKjxwAMPjPHjx69U+0qfyYgAxkcV2ebTpczM1rIlS5ZQWloKJFtSp59+Og0bNqRFixa8/vrrfPrpp3Tt2pUWLVqsNO2rr77K/vvvT8uWyf0NTj75ZJ5//nmOPPJI6tevz/e//30AxowZw7HHHssWW2wBQPPmzSvmceSRR1KvXj06duzIp59+utIy5s6dS7NmzSq6e/bsybBhw5gyZQodO3Zk/vz5zJo1i5deeqmgZuI+ffrQtGlTADp27MiHH37IvHnzqlyP1XXcccdRr149OnTowA477MBbb7210jj9+/enUaNGNGrUiN69e/Of//yHcePGMXr0aLp27QrAokWLeOedd9hvv/1WaZ0WLFjAlClT2HfffQH4+uuv6dGjR8U0W265JR9//DG77777aq8j+DzmFW3oR3JG1HYFZnVC+T7myn70ox8xfPhwPvnkk4rm4lVRUlJS0D7hjTfeuOJ55Pm/b9So0Qqn8LRu3ZoFCxbw5JNPst9++/HZZ5/x4IMP0rhxY5o0abJKy6tfv36Nzbm5RyqvyqlElY9wznfEc75xIoKf//znnHXWWQUvK986RQQHHXQQ999/f95pli5dSqNGjQpeRlW8j9nMbB056qijePLJJ3n11Vfp27dv3nH23HNPnnvuOebOnUtZWRn3338/vXr1Wmm8Aw44gBEjRjBv3jwAPvvss4Lr2HzzzSkrK1shFPfee2+GDRvGfvvtR8+ePfntb39Lz549V5q2SZMmLFy4sMZlVLceW221FVOnTmX58uU8/PDDBc97xIgRLF++nHfffZf33nuPnXfeeaVxHnnkEZYuXcq8efMYO3Yse+yxB3379uXOO++s2B88c+ZMZs+eXeM6VLb33nvz73//m2nTpgHw5Zdf8vbbb1cMf/vttyv2U68JbzGbma0jDRs2pHfv3jRr1qzKLd9tttmGa665ht69exMRHH744RUHaeXaddddGTx4ML169aJ+/fp07dqV4cOHF1zLwQcfzLhx4ypOzerZsyejR4+mffv2bL/99nz22Wd5g7lz587Ur1+fLl26MHDgQDbffPNVXo9rrrmGfv360bJlS7p3714RmCeccAJnnHEGN954IyNHjmTHHXdcYZ7bbbcde+65J1988QW33HILJSUleevr3bs3c+fO5Ze//CWtWrWiVatWTJ06taLZuXHjxvz1r39lyy23LPj1AmjZsiXDhw/nxBNP5KuvvgLgqquuYqedduLTTz+lUaNGbL311qs0z3yUr5ljfdG9e/dYq/djdlO22Xpv6tSp7LLLLrVdRl7Lly+nW7dujBgxgg4dOtRqLa+99hpDhw7lL3/5S63WUaiBAwfSr1+/as81HjJkCI0bN+ZnP/vZOqwsMXToUDbbbDNOP/30lYbl+0xKmhAR3fPNy03ZZmbrwJQpU2jfvj19+vSp9VAG6NatG717917j86Et0axZMwYMGLBW5uUt5lzeYjZb72V5i9nqJm8xm5mZrccczGZmZhniYDYzM8sQB7OZmVmGOJjNzNayGTNm0L9/fzp06MCOO+7IhRdeyNdffw0kN12QxKOPPloxfr9+/Rg7diwA+++/P927f3tM0Pjx49l///0BeOihh+jTp0/FsHHjxlFaWrrSlbbGjh1L06ZNKS0t5Tvf+c4anT5U+W5Sa3qbRauZLzBiZhs0Xbl2z7aIK6o/uyEiOProoznnnHN45JFHKCsr48wzz2Tw4MFcf/31ALRp04arr76a733ve3nnMXv2bJ544gkOPfTQFfofffTR3H777dx3330ce+yx/PjHP+aWW25ho41W/irv2bMnjz32GEuWLKFr164cddRRFdd4XhXlwXzSSScByW0Wc3842NrnLWYzs7VozJgxlJSU8MMf/hBIrrM8dOhQ7rzzThYvXgxAly5daNq0KU8//XTeeVxyySVcffXVeYfddNNNXH755QwZMoQ99tiDffbZp9p6GjVqRGlpKTNnzgTy33IRkgt4XHDBBSvdLrLybR4r32ZxwIAB9OzZk+23356HHnqISy+9lE6dOnHIIYewbNkyACZMmECvXr3Yfffd6du3L7NmzSrkpayzHMxmZmvR5MmTV7q70GabbcZ2221XcY1lSO7HfNVVV+WdR48ePWjYsCHPPvvsSsN22GEHjj/+eG666SauvfbaGuuZP39+jXdSKjdr1izGjRvHY489xqBBg4Dk8pk9e/Zk4sSJ/PSnP11pmnfffZcxY8YwatQoTjnlFHr37s2bb75Jo0aN+Oc//8myZcs4//zzGTlyJBMmTOC0006ruMez5edgNjOrBeVBOW7cuLzDL7/88rzBXVZWxtNPP03jxo358MMPq5z/Cy+8QJcuXWjdujV9+/Yt6BrONd0uMp9DDz2UBg0a0KlTJ8rKyjjkkEMA6NSpEx988AH/+9//mDRpEgcddBClpaVcddVVzJgxo6B511UOZjOztahjx45MmDBhhX5ffPEFH330Ee3bt1+hf3VbzQcccABLlizh5ZdfXqH/zTffTKdOnbjjjjs499xz897WEZJ9zG+88QaTJ0/mjjvuqLgNZXW3XKzpdpH5lE9Tr149GjRoUDH/evXqVdwqcdddd2XixIlMnDiRN998k9GjRxc077rKwWxmthb16dOHxYsXc8899wDJFu7FF1/MwIED2WSTTVYY9+CDD2b+/Pn897//zTuvyy+/nOuuu66i+5NPPuH3v/891113HYcccgitW7fm9ttvr7aedu3aMWjQ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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 352
},
"id": "AVvwdz-7t0Cq",
"outputId": "19e025b6-9d13-4d0b-e4aa-1dc9cccfe4d1"
},
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"labels = ['GPU']\n",
"data = [mean_time_gpu, onnx_mean_time_gpu]\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"\n",
"X = np.arange(1)\n",
"ax.bar(X - 0.1, data[0], color = 'r', width = 0.2, label='PyTorch (without pipeline)')\n",
"ax.bar(X + 0.1, data[1], color = 'g', width = 0.2, label='ONNX Runtime')\n",
"\n",
"# axes and title\n",
"x = np.arange(len(labels)) # the label locations\n",
"ax.set_xticks(x)\n",
"ax.set_xticklabels(labels)\n",
"ax.set_ylabel('Latency (ms)')\n",
"ax.set_title('Inference latency (GPU) in Google Colab')\n",
"\n",
"leg = ax.legend();"
],
"execution_count": 49,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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KfZq/AfFd+yTwCcz891WFvcN4LMU3+0f03q43kixW3oaxUlnV7SxDVoNROYKX64pqSIRcQdwdWZevpx2A4GrKE7Uapf/5BFxP8UJdI+2x/rqKSJ+QXFyXMs9HtIqYwBLa4hyl/ltwIfL3rJWkfKzfY1iD8n+FHtPhmXmil6GJdXMs6ClNUBEXEVxPfUphm9dbAZcT3HS1kzgJMNX9WYPWJKkCngSliRJFTCAJUmqwBpxDHjjjTfOrbfeuuoyJElaIVOnTn01M/u0Nm2NCOCtt96aKVOmVF2GJEkrJCLavGbfXdCSJFXAAJYkqQIGsCRJFVgjjgFLUkuLFi1i5syZvP3221WXItG9e3f69evH2mu3fGpn2wxgSWukmTNn0qtXL7beemuaPZtXaneZybx585g5cyb9+/eveT53QUtaI7399tv07t3b8FXlIoLevXuv8N4YA1jSGsvw1epiZb6LBrAkraSuXbvS0NDATjvtxFFHHcWCBQtabffII4/Q0NBAQ0MDG220Ef3796ehoYF99913pdc9duxYJk6cuNx2CxcuZK+99qKxsbGm5Q4fPhyA5557jquvvrpp/IQJE/jKV76ycsW28Otf/5oZM2as0DxTpkzha1/72kqvs2fPngC89NJLHHnkkSu9nKOPPponn3xypedvzgCW1DFErNpXDXr06MG0adN49NFH6datG5dddlmr7QYNGsS0adOYNm0ahxxyCBdffDHTpk3j9ttvX+46ag3Otlx55ZUcccQRdO3atab29957L7B0AK9KKxPAQ4cO5ZJLLvnA695iiy1q+sOlLSeddBIXXXTRB64DDGBJWiVGjBjBU089xb/8y78wfvz4pvFnnXUW3//+91ud55prrmHQoEHstNNOnHHGGU3je/bsyWmnncbgwYO57777+OlPf8rOO+/M4MGDOe6445ra3X333QwfPpxtttmmzVD5+c9/zqGHHgrAySefzE033QTA4Ycfzuc//3mgCOmzzjqrad0AZ555Jvfccw8NDQ2MGzcOKHqPBxxwAAMGDOD000+vaTsWmzhxImPHjuXee+/lpptu4pvf/CYNDQ08/fTTS9Q7duxYTjzxRIYOHcr222/PzTffDMCkSZM4+OCDATj33HM57rjjGDZsGAMGDODHP/5x0/wXX3wxu+22GzvvvDPnnHPOUp/Hc889x0477QQUvfojjjii1W269dZbGTZsGLvssgtHHXUUb731FlD8nG+//Xbee++9Vj/vFZKZq/1r1113TUlqbsaMGUuOgFX7qsGHPvShzMxctGhRHnLIIfnDH/4wn3322RwyZEhmZjY2NuY222yTr776atM8Y8aMyeuuuy5nzZqVH/7wh3POnDm5aNGiHDlyZN5www3lppC/+MUvMjPz0UcfzQEDBuTcuXMzM3PevHlNyznyyCOzsbExp0+fnttuu+1S9b3zzju56aabNg1fc801+Y1vfCMzM3fbbbf82Mc+lpmZY8eOzVtuuWWJbbrzzjvzoIMOapr3Jz/5Sfbv3z/nz5+fCxcuzC233DJfeOGFZW7H4mVlZl533XU5ZsyYJT6D1owZMyZHjx6djY2N+cQTT2Tfvn1z4cKFS9Rzzjnn5M4775wLFizIuXPnZr9+/XLWrFn5u9/9Lr/4xS/m+++/n42NjXnQQQflXXfdtUQtzz77bO64447L3Ka5c+fmiBEj8q233srMzAsvvDDPO++8phr33XffnDJlylK1L/WdzExgSraRbV6GJEkraeHChTQ0NABFz+j444+nW7du9O7dm4cffphXXnmFIUOG0Lt376XmffDBB9l7773p06e4T/+xxx7L3XffzWGHHUbXrl351Kc+BcAdd9zBUUcdxcYbbwzARhtt1LSMww47jC5dujBw4EBeeeWVpdbx6quvssEGGzQNjxgxgvHjxzNjxgwGDhzI66+/zuzZs7nvvvtq2r07atQo1l9/fQAGDhzI888/z7x589rcjpX16U9/mi5dujBgwAC22WYb/vKXvyzV5tBDD6VHjx706NGDkSNH8sADDzB58mRuvfVWhgwZAsBbb73Fk08+yZ577rlC2zR//nxmzJjBxz/+cQDeffddhg0b1jTPJptswksvvcSuu+660tsInfE6YM+alJaUWXUFa6zFx4Bb+sIXvsCECRN4+eWXm3bzroju3bvXdMx2nXXWaXqfrfwce/ToscSlMX379mX+/Pnccsst7Lnnnrz22mv88pe/pGfPnvTq1WuF1te1a9fl7oZtfmbwilyi0/KM4tbOMG6tTWbyrW99iy996Us1r6u1bcpM9ttvP6655ppW53n77bfp0aNHzetoi8eAJWkVO/zww7nlllt48MEHGT16dKttdt99d+666y5effVVGhsbueaaa9hrr72WarfPPvtw3XXXMW/ePABee+21muvYcMMNaWxsXCL89thjD8aPH8+ee+7JiBEj+O53v8uIESOWmrdXr168+eaby13HsrZj00035bHHHuP999/nhhtuqHnZ1113He+//z5PP/00zzzzDDvssMNSbW688Ubefvtt5s2bx6RJk9htt90YPXo0V155ZdPx2lmzZjFnzpzlbkNLe+yxB3/4wx946qmnAPjb3/7GE0880TT9iSeeaDqO/EF0vh6wJNVZt27dGDlyJBtssEGbPdnNN9+cCy+8kJEjR5KZHHTQQU0nSzW34447ctZZZ7HXXnvRtWtXhgwZwoQJE2quZf/992fy5MlNlzyNGDGCW2+9le22246tttqK1157rdUA3nnnnenatSuDBw9m7NixbLjhhiu8HRdeeCEHH3wwffr0YejQoU3BePTRR/PFL36RSy65hIkTJ7Ltttsuscwtt9yS3XffnTfeeIPLLruM7t27t1rfyJEjefXVV/n2t7/NFltswRZbbMFjjz3WtLu4Z8+e/OxnP2OTTTap+fMC6NOnDxMmTOCYY47hnXfeAeD8889n++2355VXXqFHjx5sttlmK7TM1kRruy1WN0OHDs1V9jxgd0FLS1oDfge05rHHHuOjH/1o1WW06v3332eXXXbhuuuuY8CAAZXW8tBDDzFu3Dj++7//u9I6ajV27FgOPvjgZV6re+6559KzZ0++8Y1vtGNlhXHjxrHeeutx/PHHLzWtte9kREzNzKGtLctd0JK0Cs2YMYPtttuOUaNGVR6+ALvssgsjR478wNcTq7DBBhswZsyYVbIse8BSZ7cG/A5ozercA1bnZA9YkqQ1gAEsSVIFDGBJkipgAEuSVAEDWJJW0syZMzn00EMZMGAA2267LaeccgrvvvsuUDw8ICL4zW9+09T+4IMPZtKkSQDsvffeDB3693NzpkyZwt577w3A9ddfz6hRo5qmTZ48mYaGhqXuPDVp0iTWX399Ghoa+MhHPvKBLstp+fSjD/r4Py2fN+KQ1CHEeav2Coc8Z9lnh2cmRxxxBCeddBI33ngjjY2NnHDCCZx11llcfPHFAPTr148LLriAT37yk60uY86cOfzv//4vBx544BLjjzjiCC6//HKuvvpqjjrqKL785S9z2WWXsdZaS//KHjFiBDfffDMLFy5kyJAhHH744U33MF4RiwP4s5/9LFA8/q/5Hwha9ewBS9JKuOOOO+jevTv/+I//CBT3ER43bhxXXnklCxYsAGDw4MGsv/763Hbbba0u45vf/CYXXHBBq9MuvfRSzj77bM4991x22203hg8fvsx6evToQUNDA7NmzQJafxQgFDe6+NrXvrbUYwxbPn6w5eP/xowZw4gRI9hqq624/vrrOf300xk0aBAHHHAAixYtAmDq1Knstdde7LrrrowePZrZs2fX8lF2WgawJK2E6dOnL/U0nPXWW48tt9yy6R7CUDwP+Pzzz291GcOGDaNbt27ceeedS03bZptt+MxnPsOll17Kd77zneXW8/rrry/3yT+LzZ49m8mTJ3PzzTdz5plnAsVtI0eMGMG0adP4p3/6p6Xmefrpp7njjju46aab+NznPsfIkSN55JFH6NGjB7/97W9ZtGgRX/3qV5k4cSJTp07l85//fNMzhtU6A1iS6mhxIE6ePLnV6WeffXarAd3Y2Mhtt91Gz549ef7559tc/j333MPgwYPp27cvo0ePrukexct7jGFrDjzwQNZee20GDRpEY2MjBxxwAACDBg3iueee4/HHH+fRRx9lv/32o6GhgfPPP5+ZM2fWtOzOygCWpJUwcOBApk6dusS4N954gxdeeIHttttuifHL6gXvs88+LFy4kD/+8Y9LjP/hD3/IoEGDuOKKKzj55JNbfdwgFMeA//SnPzF9+nSuuOKKpscjLutRgMt7jGFrFs/TpUsX1l577abld+nSpekRfjvuuCPTpk1j2rRpPPLII9x66601LbuzMoAlaSWMGjWKBQsW8NOf/hQoeqynnXYaY8eOZd11112i7f7778/rr7/On//851aXdfbZZ3PRRRc1Db/88st873vf46KLLuKAAw6gb9++XH755cusp3///px55plNu6vbehRgW2p9/GBbdthhB+bOnct9990HwKJFi5g+ffpKL68zMIAlaSVEBDfccEPTE4+23357unfvzr/+67+22v6ss87ixRdfbHXaJz7xCfr06dM0fOqpp3L66ac3jRs/fjwXXHDBcp8FfOKJJ3L33Xfz3HPPNT0KcPjw4Wy++ebL3Z7mjx8cN27cctu31K1bNyZOnMgZZ5zB4MGDaWho4N57713h5XQmPoxB6uzWgN8BrfFhDFrd+DAGSZLWAAawJEkVMIAlSaqAASxpjbUmnMOizmFlvot1D+CI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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1WI18RL5cxwR"
},
"source": [
"- ONNX Runtime does help improve latency both on CPU and GPU, and improves results in comparison to PyTorch.\n",
"- On GPU, using **ONNX Runtime** allows inferring up to **1.2 times faster** than with PyTorch (**38 ms** with ONNX Runtime)."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qPQdX75lWG1C"
},
"source": [
"### 3.2 New method | transformers.onnx"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_lBK1y0UFjSO"
},
"source": [
"(source: [Configuration-based approach](https://huggingface.co/transformers/master/serialization.html#configuration-based-approach)) Transformers v4.9.0 introduces a new package: `transformers.onnx`. **This package allows converting checkpoints to an ONNX graph by leveraging configuration objects.** These configuration objects come ready made for a number of model architectures, and are made to be easily extendable to other architectures.\n",
"\n",
"Ready-made configurations include the following models:\n",
"\n",
"````\n",
"ALBERT\n",
"BART\n",
"BERT\n",
"DistilBERT\n",
"GPT Neo\n",
"LayoutLM\n",
"Longformer\n",
"mBART\n",
"OpenAI GPT-2\n",
"RoBERTa\n",
"T5\n",
"XLM-RoBERTa\n",
"````"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "LdKK7nYXWib8"
},
"source": [
"Run `transformers.onnx` (or the conversion script located at [transformers/convert_graph_to_onnx.py](https://github.com/huggingface/transformers/blob/master/src/transformers/convert_graph_to_onnx.py)). This script takes a few arguments such as the model to be exported and the framework you want to export from (PyTorch or TensorFlow)."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8taFL-OHddE_"
},
"source": [
"**WARNING**: which arguments to use?"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mKf91Ju0Wib8"
},
"source": [
"It will be exported under `onnx/pierreguillou-bert-base-cased-squad-v1.1-portuguese`."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "X-sH97kXWib8",
"outputId": "81879e7d-4389-47ac-c1dd-f3421aa37485"
},
"source": [
"%%time\n",
"model_checkpoint_onnx = 'onnx/' + model_checkpoint.replace('/','-')\n",
"\n",
"!python -m transformers.onnx --model {model_checkpoint} {model_checkpoint_onnx}"
],
"execution_count": 50,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Some weights of the model checkpoint at pierreguillou/bert-base-cased-squad-v1.1-portuguese were not used when initializing BertModel: ['qa_outputs.weight', 'qa_outputs.bias']\n",
"- This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
"- This IS NOT expected if you are initializing BertModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n",
"Some weights of BertModel were not initialized from the model checkpoint at pierreguillou/bert-base-cased-squad-v1.1-portuguese and are newly initialized: ['bert.pooler.dense.weight', 'bert.pooler.dense.bias']\n",
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n",
"Using framework PyTorch: 1.9.0+cu111\n",
"Overriding 1 configuration item(s)\n",
"\t- use_cache -> False\n",
"Validating ONNX model...\n",
"/usr/local/lib/python3.7/dist-packages/onnxruntime/capi/onnxruntime_inference_collection.py:353: UserWarning: Deprecation warning. This ORT build has ['CUDAExecutionProvider', 'CPUExecutionProvider'] enabled. The next release (ORT 1.10) will require explicitly setting the providers parameter (as opposed to the current behavior of providers getting set/registered by default based on the build flags) when instantiating InferenceSession.For example, onnxruntime.InferenceSession(..., providers=[\"CUDAExecutionProvider\"], ...)\n",
" \"based on the build flags) when instantiating InferenceSession.\"\n",
"\t-[✓] ONNX model outputs' name match reference model ({'pooler_output', 'last_hidden_state'}\n",
"\t- Validating ONNX Model output \"last_hidden_state\":\n",
"\t\t-[✓] (2, 8, 768) matches (2, 8, 768)\n",
"\t\t-[✓] all values close (atol: 0.0001)\n",
"\t- Validating ONNX Model output \"pooler_output\":\n",
"\t\t-[✓] (2, 768) matches (2, 768)\n",
"\t\t-[✓] all values close (atol: 0.0001)\n",
"All good, model saved at: onnx/pierreguillou-bert-base-cased-squad-v1.1-portuguese/model.onnx\n",
"CPU times: user 182 ms, sys: 86.6 ms, total: 268 ms\n",
"Wall time: 23.4 s\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cKopthXBSXAP"
},
"source": [
"The outputs can be obtained by taking a look at the ONNX configuration of each model. For example, for BERT:"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "M-KOpz6RSIH1",
"outputId": "2702cb9e-601e-43b1-e28e-3071a5b2eb04"
},
"source": [
"from transformers.models.bert import BertOnnxConfig, BertConfig\n",
"\n",
"config = BertConfig()\n",
"onnx_config = BertOnnxConfig(config)\n",
"output_keys = list(onnx_config.outputs.keys())\n",
"output_keys"
],
"execution_count": 51,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['last_hidden_state', 'pooler_output']"
]
},
"metadata": {},
"execution_count": 51
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rQvqPtLaY3tG"
},
"source": [
"**WARNING**: these outputs do not allow to get an answer!!!!!"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SC7iQP-sdjpR"
},
"source": [
"We can not continue. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "0yk6QyZyKv4k"
},
"source": [
"# import onnxruntime as ort\n",
"# ort_session = ort.InferenceSession('onnx/pierreguillou-bert-base-cased-squad-v1.1-portuguese/model.onnx')"
],
"execution_count": 52,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "dVoNg7jts2bA"
},
"source": [
"## 4. Inference time | TorchScript"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TSA0tteRsiz1"
},
"source": [
"source: https://huggingface.co/transformers/serialization.html#torchscript"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0cmuvCVLsovC"
},
"source": [
"According to Pytorch’s documentation: “TorchScript is a way to create serializable and optimizable models from PyTorch code”. Pytorch’s two modules JIT and TRACE allow the developer to export their model to be re-used in other programs, such as efficiency-oriented C++ programs."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rhJM05N8svj1"
},
"source": [
"Hugging Face provided an interface that allows the export of 🤗 Transformers models to TorchScript so that they can be reused in a different environment than a Pytorch-based python program. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "EMWyHf05s2bB"
},
"source": [
"from transformers import AutoTokenizer, AutoModelForQuestionAnswering\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(model_checkpoint, use_fast=True, torchscript=True)\n",
"model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint, torchscript=True)\n",
"model.eval();"
],
"execution_count": 53,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "hOG6K7tZqK2C"
},
"source": [
"### 4.1 Tokenize the inputs"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "OijtuOCLqK2D",
"outputId": "04fa1cd0-4f97-404f-d399-4568cb5d6aae"
},
"source": [
"num=100\n",
"\n",
"total = 0\n",
"for i in range(num):\n",
" start = perf_counter()\n",
" inputs = tokenizer(question, context, add_special_tokens=True, return_tensors=\"pt\")\n",
" diff = perf_counter() - start\n",
" total += diff\n",
"\n",
"torchscript_mean_tokenizer = round((total/num)*1000,2)\n",
"print(f'average time: {torchscript_mean_tokenizer} ms')"
],
"execution_count": 54,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"average time: 0.83 ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eCu7ae2ps2bC"
},
"source": [
"### 4.2 Model on GPU"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "TUVbHHi-s2bC",
"outputId": "55272f11-1435-430c-f2b1-2617006e67bb"
},
"source": [
"# put model and inputs to cpu\n",
"model = model.to('cuda')\n",
"inputs = inputs.to('cuda')\n",
"\n",
"# get mean time\n",
"with torch.no_grad():\n",
" traced_model = torch.jit.trace(model, [inputs.input_ids,inputs.token_type_ids,inputs.attention_mask])\n",
" torchscript_mean_time_gpu = round(np.mean([timer(traced_model,inputs.input_ids,inputs.token_type_ids,inputs.attention_mask) for _ in range(100)]))\n",
"print(f'{torchscript_mean_time_gpu}ms')"
],
"execution_count": 55,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"74ms\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WABOBcVIqyBx"
},
"source": [
"### 4.3 Results with TorchScript"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0jMq1eKSv_xM"
},
"source": [
"Let's compage the GPU results with the ones with CPU (check link to the CPU notebook at the beginning of this notebook."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 143
},
"id": "7hkvzq12v_xN",
"outputId": "0b4cefef-eff8-4982-ddba-9b42044b6759"
},
"source": [
"import pandas as pd\n",
"\n",
"raw_data = {\n",
" 'Latency on CPU (ms)': [mean_time_cpu, onnx_mean_time_cpu, torchscript_mean_time_cpu],\n",
" 'Latency on GPU (ms)': [mean_time_gpu, onnx_mean_time_gpu, torchscript_mean_time_gpu],\n",
" }\n",
"\n",
"df = pd.DataFrame(raw_data,\n",
" index=pd.Index(['PyTorch (without pipeline)','ONNX Runtime', 'TorchScript']),\n",
" columns=pd.Index(['Latency on CPU (ms)','Latency on GPU (ms)']))\n",
"\n",
"df"
],
"execution_count": 56,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Latency on CPU (ms) \n",
" Latency on GPU (ms) \n",
" \n",
" \n",
" \n",
" \n",
" PyTorch (without pipeline) \n",
" 889.07 \n",
" 44.42 \n",
" \n",
" \n",
" ONNX Runtime \n",
" 711.50 \n",
" 37.54 \n",
" \n",
" \n",
" TorchScript \n",
" 849.00 \n",
" 74.00 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Latency on CPU (ms) Latency on GPU (ms)\n",
"PyTorch (without pipeline) 889.07 44.42\n",
"ONNX Runtime 711.50 37.54\n",
"TorchScript 849.00 74.00"
]
},
"metadata": {},
"execution_count": 56
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 352
},
"id": "4z7trW6yqyBz",
"outputId": "9efee2a2-f638-4e19-9348-d59b70700e44"
},
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"labels = ['CPU','GPU']\n",
"data = [\n",
" [mean_time_cpu, mean_time_gpu],\n",
" [onnx_mean_time_cpu, onnx_mean_time_gpu],\n",
" [torchscript_mean_time_cpu, torchscript_mean_time_gpu]\n",
" ]\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"\n",
"X = np.arange(2)\n",
"ax.bar(X - 0.2, data[0], color = 'r', width = 0.2, label='PyTorch (without pipeline)')\n",
"ax.bar(X, data[1], color = 'g', width = 0.2, label='ONNX Runtime')\n",
"ax.bar(X + 0.2, data[2], color = 'b', width = 0.2, label='TorchScript')\n",
"\n",
"# axes and title\n",
"x = np.arange(len(labels)) # the label locations\n",
"ax.set_xticks(x)\n",
"ax.set_xticklabels(labels)\n",
"ax.set_ylabel('Latency (ms)')\n",
"ax.set_title('Inference latency (CPU vs GPU) in Google Colab')\n",
"\n",
"leg = ax.legend();"
],
"execution_count": 57,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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lvvvv3+/6wAFs4hIUnXt2pUlS5bwxz/+kVGjRuWOv/POO3nooYfizvP888/TqlUrWrZsyR133JE7vnLlytx66620adOGjz76iKeffprWrVvTpk0bLr300tx2M2bMoEuXLjRu3LjAsHn22WcZMGAAANdddx0TJ04E4JxzzuHyyy8HgvC+8847c9cNMHToUD744APS09MZOXIkEGxtnnnmmTRt2pTbb789oceRY8KECWRkZPDhhx8yceJEbrvtNtLT01m6dGmeejMyMrjmmmto3749zZo1Y9KkSQBMnz6dfv36ATBs2DAuvfRSOnfuTNOmTXn88cdz53/ggQfo0KEDrVu35u67797r+Vi+fDktW7YEgl6AgQMHxn1MU6ZMoXPnzrRr145BgwaxZcsWIHid33nnHXbv3h33+S4Wdz9obyeddJKLiMRauHBh3hFQsrcEHH744e7uvmvXLu/fv78/+uijvmzZMm/btq27u2dnZ3vjxo19/fr1ufMMGTLEx48f7ytXrvRjjz3W165d67t27fIePXr4K6+8Ej4U/MUXX3R39/nz53vTpk193bp17u6elZWVu5zzzjvPs7OzfcGCBX7cccftVd+OHTv8qKOOyh1+/vnn/Xe/+527u3fo0MFPPvlkd3fPyMjwyZMn53lM7733nvft2zd33qeeesobNWrkmzZt8m3btnn9+vX9u+++K/Rx5CzL3X38+PE+ZMiQPM9BPEOGDPHevXt7dna2f/311163bl3ftm1bnnruvvtub926tW/dutXXrVvn9erV85UrV/rbb7/tV155pe/Zs8ezs7O9b9++/v777+epZdmyZX7iiScW+pjWrVvnXbt29S1btri7+4gRI/yee+7JrbFXr14+e/bsvWrf6z3p7sBsLyDb9HMpEZEStm3bNtLT04FgS+qKK66gYsWK1KhRg88++4w1a9bQtm1batSosde8s2bNonv37tSqFVzf4OKLL2bGjBmcffbZpKSkcO655wIwbdo0Bg0aRM2aNQGoXr167jLOPvtsypUrR4sWLVizZs1e61i/fj3VqlXLHe7atSujRo1i4cKFtGjRgo0bN7J69Wo++uijhLqJe/bsSdWqVQFo0aIF3377LVlZWQU+jn11/vnnU65cOZo2bUrjxo358ssv92ozYMAA0tLSSEtLo0ePHnz66afMnDmTKVOm0LZtWwC2bNnC4sWLOfXUU4v1mDZt2sTChQs55ZRTANi5cyedO3fOnad27dqsWrWKk046aZ8fI+h3zHkdCkdyupd2BSJlXs4+5vx+/etfM3bsWL7//vvc7uLiSE1NTWifcKVKlXLve5z/CWlpaXl+wlO3bl02bdrE5MmTOfXUU9mwYQMvvfQSlStXpkqVKsVaX0pKSpHdubFHKhfnp0T5j3COd8RzvDbuzu9//3uuvvrqhNcV7zG5O6effjrPP/983Hm2b99OWlpawusoiPYxi4gcIOeccw6TJ09m1qxZ9O7dO26bjh078v7777N+/Xqys7N5/vnn6dat217tTjvtNMaPH09WVhYAGzZsSLiOI488kuzs7Dyh2KlTJ0aNGsWpp55K165defDBB+natete81apUoXNmzcXuY7CHsdRRx3FokWL2LNnD6+88krCyx4/fjx79uxh6dKlfPPNNzRv3nyvNq+99hrbt28nKyuL6dOn06FDB3r37s2TTz6Zuz945cqVrF27tsjHkF+nTp3473//y5IlSwD46aef+Prrr3Onf/3117n7qfeHtphFRA6QihUr0qNHD6pVq1bglu8xxxzDiBEj6NGjB+5O3759cw/SinXiiSdy55130q1bN1JSUmjbti1jx45NuJYzzjiDmTNn5v40q2vXrkyZMoUmTZrQoEEDNmzYEDeYW7duTUpKCm3atCEjI4Mjjzyy2I9jxIgR9OvXj1q1atG+ffvcwLzgggu48sorefjhh5kwYQLHHXdcnmXWr1+fjh078uOPP/LYY4+Rmpoat74ePXqwfv16/vCHP1CnTh3q1KnDokWLcrudK1euzL///W9q166d8PMFUKtWLcaOHcuFF17Ijh07ALj33ntp1qwZa9asIS0tjaOPPrpYy4zH4nVzHCzat2/vJXo9ZnVlixz0Fi1axAknnFDaZcS1Z88e2rVrx/jx42natGmp1jJ37lxGjhzJM888U6p1JCojI4N+/foV+lvjYcOGUblyZX73u98dwMoCI0eO5IgjjuCKK67Ya1q896SZzXH39vGWpa5sEZEDYOHChTRp0oSePXuWeigDtGvXjh49euz376ElUK1aNYYMGVIiy9IWcyxtMYsc9KK8xSxlk7aYRUREDmIKZhERkQhRMIuIiESIgllERCRCFMwiIiUsMzOTAQMG0LRpU4477jhuuukmdu7cCQQXXTAzXn/99dz2/fr1Y/r06QB0796d9u1/PiZo9uzZdO/eHYCXX36Znj175k6bOXMm6enpe51pa/r06VStWpX09HSOP/74/fr5UP6rSe3vZRalaDrBiIgc0uyekv21hd9d+C8f3J2BAwdy7bXX8tprr5Gdnc1VV13FnXfeyQMPPABAvXr1GD58OL/85S/jLmPt2rW89dZb9OnTJ8/4gQMH8sQTT/Dcc88xaNAgfvOb3/DYY49Rvvze/8q7du3KpEmT2LZtG23btuWcc87JPcdzceQE80UXXQQEl1mM/eIgJU9bzBI5JX353NK4Sdk1bdo0UlNT+dWvfgUE51keOXIkTz75JFu3bgWgTZs2VK1alalTp8Zdxm233cbw4cPjTnvkkUe46667GDZsGB06dKBLly6F1pOWlkZ6ejorV64E4l9yEYITeNx44417XS4y/2Ue819mcciQIXTt2pUGDRrw8ssvc/vtt9OqVSvOPPNMdu3aBcCcOXPo1q0bJ510Er1792b16tWJPJVlloJZRKQELViwYK+rCx1xxBHUr18/9xzLEFyP+d577427jM6dO1OxYkXee++9vaY1btyYwYMH88gjj3DfffcVWc/GjRuLvJJSjtWrVzNz5kwmTZrE0KFDgeD0mV27dmXevHn89re/3WuepUuXMm3aNCZOnMgll1xCjx49+OKLL0hLS+ONN95g165d3HDDDUyYMIE5c+Zw+eWX517jWeJTMIuIlIKcoJw5c2bc6XfddVfc4M7Ozmbq1KlUrlyZb7/9tsDlf/DBB7Rp04a6devSu3fvhM7hXNTlIuPp06cPFSpUoFWrVmRnZ3PmmWcC0KpVK5YvX85XX33F/PnzOf3000lPT+fee+8lMzMzoWWXVQpmEZES1KJFC+bMmZNn3I8//sh3331HkyZN8owvbKv5tNNOY9u2bXz88cd5xj/66KO0atWKMWPGcN1118W9rCME+5j/97//sWDBAsaMGZN7GcrCLrlY1OUi48mZp1y5clSoUCF3+eXKlcu9VOKJJ57IvHnzmDdvHl988QVTpkxJaNlllYJZRKQE9ezZk61bt/L0008DwRburbfeSkZGBocddlietmeccQYbN27k888/j7usu+66i/vvvz93+Pvvv+dvf/sb999/P2eeeSZ169bliSeeKLSeRo0aMXTo0Nxu74IuuViQRC/zWJDm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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 352
},
"id": "rrrUr_WHxOvG",
"outputId": "260c8a84-b5a9-4309-ea34-3d62e319b07c"
},
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"labels = ['GPU']\n",
"data = [mean_time_gpu, onnx_mean_time_gpu, torchscript_mean_time_gpu]\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_axes([0,0,1,1])\n",
"\n",
"X = np.arange(1)\n",
"ax.bar(X - 0.2, data[0], color = 'r', width = 0.2, label='PyTorch (without pipeline)')\n",
"ax.bar(X, data[1], color = 'g', width = 0.2, label='ONNX Runtime')\n",
"ax.bar(X + 0.2, data[2], color = 'b', width = 0.2, label='TorchScript')\n",
"\n",
"# axes and title\n",
"x = np.arange(len(labels)) # the label locations\n",
"ax.set_xticks(x)\n",
"ax.set_xticklabels(labels)\n",
"ax.set_ylabel('Latency (ms)')\n",
"ax.set_title('Inference latency (GPU) in Google Colab')\n",
"\n",
"leg = ax.legend();"
],
"execution_count": 58,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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7r5nzx4/++yz/aGHHvLPPvvMu3bt6u7ueXl53qpVK9+8eXPBMiNHjvSpU6f6unXr/LjjjvNNmzb5nj17vF+/fj59+vRwV/Bnn33W3d2XLl3qbdu29ZycHHd3z83NLVjP+eef73l5eb5s2TJv3br1fvV988033qhRo4Lhp59+2m+55RZ3d+/evbufdNJJ7u6elZXlL7/8cqF9eu2113zw4MEFyz7++OPesmVL37Ztm+/atcubN2/un3/+eYn7kb8ud/epU6f6yJEjC70H8YwcOdIHDhzoeXl5/vHHH3vTpk19165dheq56667vHPnzr5z507PycnxZs2a+bp16/w///mPX3HFFb5v3z7Py8vzwYMH++uvv16ols8++8xPOOGEEvcpJyfHe/fu7Tt27HB393Hjxvndd99dUOOAAQM8Ozt7v9r3+0yKSLUHZHsx2VZpb0OqCHbt2kVGRgYQtIwuv/xyateuTYMGDXj33XfZuHEjXbt2pUGDBvstu3DhQvr27Ut6evCM7osvvph58+ZxzjnnkJKSwnnnnQfAq6++yvDhw2nYsCEA9evXL1jHOeecQ40aNejQoQMbN27cbxubN2+mXr16BcO9e/dm4sSJLF++nA4dOrB161bWr1/PggULEjq8279/f4466igAOnTowJo1a8jNzS12P0rrggsuoEaNGrRt25ZWrVrx4Ycf7jfP0KFDSUtLIy0tjX79+vHOO+8wf/58Zs2aRdeuXQHYsWMHK1eu5NRTTz2ofdq2bRvLly/nlFNOAeDbb7+lZ8+eBcscc8wxfPnll5x44oml3kcREQXwIcg/B1zUT3/6UyZPnsyGDRsKDvMejNTU1ITO2R522GEFr4MvWvvXF3trTNOmTdm2bRsvv/wyp556Klu2bOG5556jTp061K1b96C2l5KScsDDsLFXBh/MLTpFryiOd4VxvHncnV/+8pf87Gc/S3hb8fbJ3Tn99NN5+umn4y6ze/du0tLSEt6GVHy6iF3yxflTmjQ6B5wE5557Li+//DILFy5k4MCBcefp0aMHr7/+Ops3byYvL4+nn36aPn367DffaaedxtSpU8nNzQVgy5YtCddx9NFHk5eXVyj8Tj75ZCZOnMipp55K7969uffee+ndu/d+y9atW5ft27cfcBsl7UejRo1YsWIF+/btY/r06Qmve+rUqezbt49Vq1bx6aef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efPmh1qKiIhIhVLaQ9AHxd23Aa8BPYF6ZpYf/M2AdcUsM8ndM909Mz09vTzKFBERKTdJC2AzSw9bvphZGnA6sIIgiPN7UxoJvJisGkRERCqqRB7EUVqNgSnheeAawHPuPtPMlgPPmNkY4F3g0STWICIiUiElLYDd/X2ga5zxnwI9krVdERGRyqBczgGLiIhIYQpgERGRCCiARUREIqAAFhERiYACWEREJAIKYBERkQgogEVERCKgABYREYmAAlhERCQCCmAREZEIKIBFREQioAAWERGJgAJYREQkAgpgERGRCCiARUREIqAAFhERiYACWEREJAIKYBERkQgogEVERCKgABYREYmAAlhERCQCCmAREZEIKIBFREQioAAWERGJgAJYREQkAgpgERGRCCiARUREIqAAFhERiUDSAtjMjjOz18xsuZktM7MbwvH1zWy2ma0M/z06WTWIiIhUVMlsAe8Fbnb3DsDJwLVm1gEYBcxx97bAnHBYRESkWklaALv7endfHL7eDqwAmgJDgSnhbFOAc5JVg4iISEVVLueAzawF0BV4G2jk7uvDSRuARuVRg4iISEWS9AA2szrAP4Ab3f2r2Gnu7oAXs9yVZpZtZtk5OTnJLlNERKRcJTWAzawWQfg+6e7Ph6M3mlnjcHpjYFO8Zd19krtnuntmenp6MssUEREpd8m8CtqAR4EV7n5fzKQZwMjw9UjgxWTVICIiUlHVTOK6TwEuBT4wsyXhuF8B44DnzOxyYA1wQRJrEBERqZCSFsDuPh+wYib3T9Z2RUREKgM9CUtERCQCCmAREZEIKIBFREQioAAWERGJgAJYREQkAgpgERGRCCiARUREIqAAFhERiYACWEREJAIKYBERkQgogEVERCKgABYREYmAAlhERCQCCmAREZEIKIBFREQioAAWERGJgAJYREQkAgpgERGRCCiARUREIqAAFhERiYACWEREJAIKYBERkQgogEVERCKgABYREYmAAlhERCQCCmAREZEIKIBFREQioAAWERGJQNIC2MweM7NNZrY0Zlx9M5ttZivDf49O1vZFREQqsmS2gCcDg4qMGwXMcfe2wJxwWEREpNpJWgC7+zxgS5HRQ4Ep4espwDnJ2r6IiEhFVt7ngBu5+/rw9QagUTlvX0REpEKI7CIsd3fAi5tuZleaWbaZZefk5JRjZSIiIslX3gG80cwaA4T/bipuRnef5O6Z7p6Znp5ebgWKiIiUh/IO4BnAyPD1SODFct6+iIhIhZDM25CeBhYA7c1srZldDowDTjezlcCAcFhERKTaqZmsFbv7RcVM6p+sbYqIiFQWehKWiIhIBBTAIiIiEVAAi4iIREABLCIiEgEFsIiISAQUwCIiIhFQAIuIiERAASwiIhIBBbCIiEgEFMAiIiIRUACLiIhEQAEsIiISAQWwiIhIBBTAIiIiEVAAi4iIREABLCIiEgEFsIiISAQUwCIiIhFQAIuIiERAASwiIhIBBbCIiEgEFMAiIiIRUACLiIhEQAEsIiISAQWwiIhIBBTAIiIiEVAAi4iIREABLCIiEoFIAtjMBpnZR2b2iZmNiqIGERGRKJV7AJtZCvBn4EygA3CRmXUo7zpERESiFEULuAfwibt/6u7fAs8AQyOoQ0REJDJRBHBT4IuY4bXhOBERkWqjZtQFFMfMrgSuDAd3mNlHUdYjVdDoqAuoMBoCm6MuIloWdQFSQVjZfxSOL25CFAG8DjguZrhZOK4Qd58ETCqvokSqKzPLdvfMqOsQqW6iOAS9EGhrZi3NrDZwITAjgjpEREQiU+4tYHffa2Y/B/4DpACPufuy8q5DREQkSubuUdcgIhEysyvDUz4iUo4UwCIiIhHQoyhFREQioAAWqcLMrJGZPWVmn5rZIjNbYGbnmllfM/ufmS0xsxVmdlc4f5aZPVhkHXPNTFdJi5QxBbBIFWVmBrwAzHP3Vu5+IsFdB83CWd5w9wwgE7jEzLpFVKpItaQAFqm6TgO+dfeH80e4+xp3/1PsTO7+NbAIaFPO9YlUawpgkarrBGDxgWYyswbAyYBuBxQpRwpgkWrCzP5sZu+Z2cJwVG8zexeYBYwL78cv7rYI3S4hUsYq7LOgReSQLQPOyx9w92vNrCGQHY56w92HFFkmFzi6yLj6VPtnRYuUPbWARaquV4FUM7s6ZtzhB1hmIXCKmR0LEF79fBiFezATkTKgFrBIFeXubmbnABPM7DYgB/gauL2EZTaa2Q3Av8ysBrADuMjd95VL0SLViJ6EJSIiEgEdghYREYmAAlhERCQCCmAREZEIKIBFREQioAAWERGJgAJYREQkAgpgERGRCCiARUREIvD/AU+vdjNtK1jeAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8Emg1-pErnr2"
},
"source": [
"- TorchScript does not help improve latency on GPU.\n",
"- On GPU, it's better to use **ONNX Runtime**."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jPbv62O7s2bE"
},
"source": [
"# END"
]
}
]
}