Skip to content

Instantly share code, notes, and snippets.

@manisnesan
Created October 30, 2021 23:20
Show Gist options
  • Save manisnesan/404ec6f61376b5a1f3b6798816ffe311 to your computer and use it in GitHub Desktop.
Save manisnesan/404ec6f61376b5a1f3b6798816ffe311 to your computer and use it in GitHub Desktop.
04_modeling-question-answering.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"colab": {
"name": "04_modeling-question-answering.ipynb",
"provenance": [],
"toc_visible": true,
"include_colab_link": true
},
"accelerator": "GPU",
"widgets": {
"application/vnd.jupyter.widget-state+json": {
"c08d84f274b94ec9ad9510edacfa9c4c": {
"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_7869c1b391c24a5ab631bee8803b8fcd",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_b01b12fa8fe44206bded46144f1ebfe9",
"IPY_MODEL_730360df01a44642ba42c420797ed4d0",
"IPY_MODEL_344d0b927c9741bbaeb284918490352f"
]
}
},
"7869c1b391c24a5ab631bee8803b8fcd": {
"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
}
},
"b01b12fa8fe44206bded46144f1ebfe9": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_dfc4d83151e34222b6cfd99cd18f6631",
"_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_bae40a51df184386ab0992849a1c4d2a"
}
},
"730360df01a44642ba42c420797ed4d0": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_cf902c61da9a4ae1abc81397862cda3d",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 443,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 443,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_de76897c873247ca91e5c76d0fa1c99c"
}
},
"344d0b927c9741bbaeb284918490352f": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_f29ed6fc01f34892a23478c04694291c",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "​",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 443/443 [00:00<00:00, 6.75kB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_50edce2966df4a83a508937f86c69a9f"
}
},
"dfc4d83151e34222b6cfd99cd18f6631": {
"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"
}
},
"bae40a51df184386ab0992849a1c4d2a": {
"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
}
},
"cf902c61da9a4ae1abc81397862cda3d": {
"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"
}
},
"de76897c873247ca91e5c76d0fa1c99c": {
"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
}
},
"f29ed6fc01f34892a23478c04694291c": {
"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"
}
},
"50edce2966df4a83a508937f86c69a9f": {
"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
}
},
"0885d1d23c8d4c5f983f1e28ce0ea06d": {
"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_469d0e9deb994bc394bb258b2e35e90c",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_e41aac826c2547589577f1e1b041780a",
"IPY_MODEL_ea1a71d26db64bc6ab8818d20f9d9194",
"IPY_MODEL_b9cdadac1d964031b1c00247f724adf6"
]
}
},
"469d0e9deb994bc394bb258b2e35e90c": {
"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
}
},
"e41aac826c2547589577f1e1b041780a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_b8bd5a08eff14bfbb7b845553615676b",
"_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_a3304a4fb65b47e69e5c67b131fe522e"
}
},
"ea1a71d26db64bc6ab8818d20f9d9194": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_a8053bcb7f8f4a7b8ac580922c297bb7",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 28,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 28,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_a1e6401ee0164915a1973772e914fe75"
}
},
"b9cdadac1d964031b1c00247f724adf6": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_c515f9bb4d2b4e21be13cc533bb66ff8",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "​",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 28.0/28.0 [00:00<00:00, 532B/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_c740233e00fc4e51b87f463408ca3b26"
}
},
"b8bd5a08eff14bfbb7b845553615676b": {
"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"
}
},
"a3304a4fb65b47e69e5c67b131fe522e": {
"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
}
},
"a8053bcb7f8f4a7b8ac580922c297bb7": {
"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"
}
},
"a1e6401ee0164915a1973772e914fe75": {
"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
}
},
"c515f9bb4d2b4e21be13cc533bb66ff8": {
"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"
}
},
"c740233e00fc4e51b87f463408ca3b26": {
"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
}
},
"019bafae01244276a930515267e191ea": {
"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_63765de959c942849a43e1a7f1fa9aea",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_74f5f6a4baeb4b2c96c55377f62960d8",
"IPY_MODEL_020dc99a21514968b2e54652dc49b4ff",
"IPY_MODEL_09d56dc69a394dbb98b741aec5075209"
]
}
},
"63765de959c942849a43e1a7f1fa9aea": {
"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
}
},
"74f5f6a4baeb4b2c96c55377f62960d8": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_2efd453ded5b481ea12833bc41f06a39",
"_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_aa585eb2fc184f5e972829a852b3c0a0"
}
},
"020dc99a21514968b2e54652dc49b4ff": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_101fde751876428a901b70c6ef3a5e91",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 231508,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 231508,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_078dcffa3fea40beb3d38f6b54db630f"
}
},
"09d56dc69a394dbb98b741aec5075209": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_64af53679ce749ec85c7ac0dc852e561",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "​",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 226k/226k [00:00<00:00, 619kB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_2a3bfe5c7b3e4d3290be14142e7f4c69"
}
},
"2efd453ded5b481ea12833bc41f06a39": {
"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"
}
},
"aa585eb2fc184f5e972829a852b3c0a0": {
"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
}
},
"101fde751876428a901b70c6ef3a5e91": {
"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"
}
},
"078dcffa3fea40beb3d38f6b54db630f": {
"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
}
},
"64af53679ce749ec85c7ac0dc852e561": {
"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"
}
},
"2a3bfe5c7b3e4d3290be14142e7f4c69": {
"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
}
},
"47c2942844e64023b3b2ed86fec4a265": {
"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_e6854974367d483c95c96f94cd6718c4",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_182fe1165a0c4ae0a22c8b15e9e57193",
"IPY_MODEL_cf365272b084408e81c93eb9b43fcc63",
"IPY_MODEL_80fdd131238e41c0ac8ee3eec5eb7b5a"
]
}
},
"e6854974367d483c95c96f94cd6718c4": {
"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
}
},
"182fe1165a0c4ae0a22c8b15e9e57193": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_bd04152927aa4c369f6d47730f4f8d4a",
"_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_99f85f26fa9540f985ee270dcde0fdec"
}
},
"cf365272b084408e81c93eb9b43fcc63": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_24f0532a427c4506a2fb580a8a9c8343",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 466062,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 466062,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_f85befe20f1b49cbaf859a2295e98a09"
}
},
"80fdd131238e41c0ac8ee3eec5eb7b5a": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_dbc5483bb5084a4a9a46f50966f2f489",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "​",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 455k/455k [00:00<00:00, 654kB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_f851735f974d4de3bc012b9827863e10"
}
},
"bd04152927aa4c369f6d47730f4f8d4a": {
"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"
}
},
"99f85f26fa9540f985ee270dcde0fdec": {
"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
}
},
"24f0532a427c4506a2fb580a8a9c8343": {
"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"
}
},
"f85befe20f1b49cbaf859a2295e98a09": {
"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
}
},
"dbc5483bb5084a4a9a46f50966f2f489": {
"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"
}
},
"f851735f974d4de3bc012b9827863e10": {
"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
}
},
"e2d94a3e334944e0a1fb906a648f957c": {
"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_068338dad5ed4c5084086137f46e33bc",
"_model_module": "@jupyter-widgets/controls",
"children": [
"IPY_MODEL_001600de55e647e9bfd0fc0086ddece3",
"IPY_MODEL_65d43f0160fe4990b29a6571ecb34a48",
"IPY_MODEL_7c82a4b80b8e45d4993d8f17bb9d42b8"
]
}
},
"068338dad5ed4c5084086137f46e33bc": {
"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
}
},
"001600de55e647e9bfd0fc0086ddece3": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_18133ede387345ca9dd16a9f28902eaf",
"_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_21ab512903014ce4ab90c3491e4ea0f2"
}
},
"65d43f0160fe4990b29a6571ecb34a48": {
"model_module": "@jupyter-widgets/controls",
"model_name": "FloatProgressModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "ProgressView",
"style": "IPY_MODEL_45dd8d2f31814fc4957f3195ae316c54",
"_dom_classes": [],
"description": "",
"_model_name": "FloatProgressModel",
"bar_style": "success",
"max": 1340675298,
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": 1340675298,
"_view_count": null,
"_view_module_version": "1.5.0",
"orientation": "horizontal",
"min": 0,
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_406355b5090641ccb2c7cb6ad04a852b"
}
},
"7c82a4b80b8e45d4993d8f17bb9d42b8": {
"model_module": "@jupyter-widgets/controls",
"model_name": "HTMLModel",
"model_module_version": "1.5.0",
"state": {
"_view_name": "HTMLView",
"style": "IPY_MODEL_2f664fe953e548a29c00962487997c8a",
"_dom_classes": [],
"description": "",
"_model_name": "HTMLModel",
"placeholder": "​",
"_view_module": "@jupyter-widgets/controls",
"_model_module_version": "1.5.0",
"value": " 1.25G/1.25G [00:41<00:00, 31.4MB/s]",
"_view_count": null,
"_view_module_version": "1.5.0",
"description_tooltip": null,
"_model_module": "@jupyter-widgets/controls",
"layout": "IPY_MODEL_ff22853468d243bebc072beb9591b707"
}
},
"18133ede387345ca9dd16a9f28902eaf": {
"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"
}
},
"21ab512903014ce4ab90c3491e4ea0f2": {
"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
}
},
"45dd8d2f31814fc4957f3195ae316c54": {
"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"
}
},
"406355b5090641ccb2c7cb6ad04a852b": {
"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
}
},
"2f664fe953e548a29c00962487997c8a": {
"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"
}
},
"ff22853468d243bebc072beb9591b707": {
"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
}
}
}
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/manisnesan/404ec6f61376b5a1f3b6798816ffe311/04_modeling-question-answering.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "WyV8kufvex9Y"
},
"source": [
"%%capture\n",
"%pip install ohmeow-blurr\n",
"%pip install fastcore\n",
"%pip install transformers\n",
"%pip install fastai\n",
"%pip install nbdev\n",
"%pip install wwf"
],
"execution_count": 1,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "7ZAGc9bCe7O9"
},
"source": [
"from wwf.utils import *"
],
"execution_count": 3,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 148
},
"id": "ZyByEQoMe963",
"outputId": "f468805e-9395-49d0-b260-c3cf53c453f4"
},
"source": [
"state_versions('fastai', 'transformers', 'ohmeow-blurr')"
],
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/markdown": "\n---\nThis article is also a Jupyter Notebook available to be run from the top down. There\nwill be code snippets that you can then run in any environment.\n\nBelow are the versions of `fastai`, `transformers`, and `ohmeow-blurr` currently running at the time of writing this:\n* `fastai` : 2.5.3 \n* `transformers` : 4.12.2 \n* `ohmeow-blurr` : 0.1.0 \n---",
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"metadata": {},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "sjsL_4vZeoZ6"
},
"source": [
"# default_exp modeling.question_answering"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "VM15rO2VeoZ9"
},
"source": [
"#all_slow"
],
"execution_count": 7,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "exrOPJigeoZ9"
},
"source": [
"#hide\n",
"%reload_ext autoreload\n",
"%autoreload 2\n",
"%matplotlib inline"
],
"execution_count": 8,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "peI3qAy6eoZ-"
},
"source": [
"# modeling.question_answering\n",
"\n",
"> This module contains custom models, loss functions, custom splitters, etc... for question answering tasks"
]
},
{
"cell_type": "code",
"metadata": {
"id": "z2BEVafUeoZ_"
},
"source": [
"#export\n",
"import os, ast, inspect\n",
"from typing import Any, Callable, Dict, List, Optional, Union, Type\n",
"\n",
"from fastcore.all import *\n",
"from fastai.callback.all import *\n",
"from fastai.data.block import DataBlock, CategoryBlock, ColReader, ItemGetter, ColSplitter, RandomSplitter\n",
"from fastai.data.core import DataLoader, DataLoaders, TfmdDL\n",
"from fastai.imports import *\n",
"from fastai.learner import *\n",
"from fastai.losses import CrossEntropyLossFlat\n",
"from fastai.optimizer import Adam, OptimWrapper, params\n",
"from fastai.torch_core import *\n",
"from fastai.torch_imports import *\n",
"from fastprogress.fastprogress import progress_bar,master_bar\n",
"from seqeval import metrics as seq_metrics\n",
"from transformers import (\n",
" AutoModelForQuestionAnswering, logging,\n",
" PretrainedConfig, PreTrainedTokenizerBase, PreTrainedModel\n",
")\n",
"\n",
"from blurr.utils import BLURR\n",
"from blurr.data.core import HF_TextBlock, BlurrDataLoader, first_blurr_tfm\n",
"from blurr.modeling.core import HF_BaseModelCallback, HF_PreCalculatedLoss, Blearner\n",
"from blurr.data.question_answering import HF_QuestionAnswerInput, HF_QABeforeBatchTransform\n",
"\n",
"logging.set_verbosity_error()"
],
"execution_count": 9,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "J2Wd3ij8eoaA",
"outputId": "a5dfb03c-0d7c-484d-f824-7298ae26f9ab"
},
"source": [
"#hide_input\n",
"import pdb\n",
"\n",
"from fastai.data.external import untar_data, URLs\n",
"from fastcore.test import *\n",
"from nbverbose.showdoc import show_doc\n",
"from transformers import AutoConfig\n",
"\n",
"from blurr.utils import print_versions\n",
"from blurr.modeling.core import HF_BaseModelWrapper, HF_PreCalculatedLoss, hf_splitter\n",
"from blurr.data.question_answering import pre_process_squad\n",
"\n",
"os.environ[\"TOKENIZERS_PARALLELISM\"] = \"false\"\n",
"print(\"What we're running with at the time this documentation was generated:\")\n",
"print_versions('torch fastai transformers')"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"What we're running with at the time this documentation was generated:\n",
"torch: 1.9.0+cu111\n",
"fastai: 2.5.3\n",
"transformers: 4.12.2\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "q6DzU5QveoaB",
"outputId": "c2d92d14-841a-4c06-dc33-24fc3d297847"
},
"source": [
"#hide\n",
"#cuda\n",
"#torch.cuda.set_device(1)\n",
"print(f'Using GPU #{torch.cuda.current_device()}: {torch.cuda.get_device_name()}')"
],
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Using GPU #0: Tesla K80\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zpc-4O6FeoaC"
},
"source": [
"## Question Answer\n",
"\n",
"Given a document (context) and a question, the objective of these models is to predict the start and end token of the correct answer as it exists in the context."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rxaGNJJPeoaC"
},
"source": [
"Again, we'll use a subset of pre-processed SQUAD v2 for our purposes below."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "abeMiD_2eoaD",
"outputId": "0aa45b0b-32db-406d-f957-35d53e216a9b"
},
"source": [
"# full\n",
"# squad_df = pd.read_csv('./data/task-question-answering/squad_cleaned.csv'); len(squad_df)\n",
"!wget https://raw.githubusercontent.com/ohmeow/blurr/master/nbs/squad_sample.csv\n",
"# sample\n",
"squad_df = pd.read_csv('./squad_sample.csv'); len(squad_df)"
],
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1000"
]
},
"metadata": {},
"execution_count": 14
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 243
},
"id": "qtfPxS4leoaD",
"outputId": "e5ce4524-186e-4ede-a832-b55619e0dad1"
},
"source": [
"squad_df.head(2)"
],
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>title</th>\n",
" <th>context</th>\n",
" <th>question</th>\n",
" <th>answers</th>\n",
" <th>ds_type</th>\n",
" <th>answer_text</th>\n",
" <th>is_impossible</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>56be85543aeaaa14008c9063</td>\n",
" <td>Beyoncé</td>\n",
" <td>Beyoncé Giselle Knowles-Carter (/biːˈjɒnseɪ/ bee-YON-say) (born September 4, 1981) is an American singer, songwriter, record producer and actress. Born and raised in Houston, Texas, she performed in various singing and dancing competitions as a child, and rose to fame in the late 1990s as lead singer of R&amp;B girl-group Destiny's Child. Managed by her father, Mathew Knowles, the group became one of the world's best-selling girl groups of all time. Their hiatus saw the release of Beyoncé's debut album, Dangerously in Love (2003), which established her as a solo artist worldwide, earned five G...</td>\n",
" <td>When did Beyonce start becoming popular?</td>\n",
" <td>{'text': ['in the late 1990s'], 'answer_start': [269]}</td>\n",
" <td>train</td>\n",
" <td>in the late 1990s</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>56be85543aeaaa14008c9065</td>\n",
" <td>Beyoncé</td>\n",
" <td>Beyoncé Giselle Knowles-Carter (/biːˈjɒnseɪ/ bee-YON-say) (born September 4, 1981) is an American singer, songwriter, record producer and actress. Born and raised in Houston, Texas, she performed in various singing and dancing competitions as a child, and rose to fame in the late 1990s as lead singer of R&amp;B girl-group Destiny's Child. Managed by her father, Mathew Knowles, the group became one of the world's best-selling girl groups of all time. Their hiatus saw the release of Beyoncé's debut album, Dangerously in Love (2003), which established her as a solo artist worldwide, earned five G...</td>\n",
" <td>What areas did Beyonce compete in when she was growing up?</td>\n",
" <td>{'text': ['singing and dancing'], 'answer_start': [207]}</td>\n",
" <td>train</td>\n",
" <td>singing and dancing</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id title ... answer_text is_impossible\n",
"0 56be85543aeaaa14008c9063 Beyoncé ... in the late 1990s False\n",
"1 56be85543aeaaa14008c9065 Beyoncé ... singing and dancing False\n",
"\n",
"[2 rows x 8 columns]"
]
},
"metadata": {},
"execution_count": 16
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 176,
"referenced_widgets": [
"c08d84f274b94ec9ad9510edacfa9c4c",
"7869c1b391c24a5ab631bee8803b8fcd",
"b01b12fa8fe44206bded46144f1ebfe9",
"730360df01a44642ba42c420797ed4d0",
"344d0b927c9741bbaeb284918490352f",
"dfc4d83151e34222b6cfd99cd18f6631",
"bae40a51df184386ab0992849a1c4d2a",
"cf902c61da9a4ae1abc81397862cda3d",
"de76897c873247ca91e5c76d0fa1c99c",
"f29ed6fc01f34892a23478c04694291c",
"50edce2966df4a83a508937f86c69a9f",
"0885d1d23c8d4c5f983f1e28ce0ea06d",
"469d0e9deb994bc394bb258b2e35e90c",
"e41aac826c2547589577f1e1b041780a",
"ea1a71d26db64bc6ab8818d20f9d9194",
"b9cdadac1d964031b1c00247f724adf6",
"b8bd5a08eff14bfbb7b845553615676b",
"a3304a4fb65b47e69e5c67b131fe522e",
"a8053bcb7f8f4a7b8ac580922c297bb7",
"a1e6401ee0164915a1973772e914fe75",
"c515f9bb4d2b4e21be13cc533bb66ff8",
"c740233e00fc4e51b87f463408ca3b26",
"019bafae01244276a930515267e191ea",
"63765de959c942849a43e1a7f1fa9aea",
"74f5f6a4baeb4b2c96c55377f62960d8",
"020dc99a21514968b2e54652dc49b4ff",
"09d56dc69a394dbb98b741aec5075209",
"2efd453ded5b481ea12833bc41f06a39",
"aa585eb2fc184f5e972829a852b3c0a0",
"101fde751876428a901b70c6ef3a5e91",
"078dcffa3fea40beb3d38f6b54db630f",
"64af53679ce749ec85c7ac0dc852e561",
"2a3bfe5c7b3e4d3290be14142e7f4c69",
"47c2942844e64023b3b2ed86fec4a265",
"e6854974367d483c95c96f94cd6718c4",
"182fe1165a0c4ae0a22c8b15e9e57193",
"cf365272b084408e81c93eb9b43fcc63",
"80fdd131238e41c0ac8ee3eec5eb7b5a",
"bd04152927aa4c369f6d47730f4f8d4a",
"99f85f26fa9540f985ee270dcde0fdec",
"24f0532a427c4506a2fb580a8a9c8343",
"f85befe20f1b49cbaf859a2295e98a09",
"dbc5483bb5084a4a9a46f50966f2f489",
"f851735f974d4de3bc012b9827863e10",
"e2d94a3e334944e0a1fb906a648f957c",
"068338dad5ed4c5084086137f46e33bc",
"001600de55e647e9bfd0fc0086ddece3",
"65d43f0160fe4990b29a6571ecb34a48",
"7c82a4b80b8e45d4993d8f17bb9d42b8",
"18133ede387345ca9dd16a9f28902eaf",
"21ab512903014ce4ab90c3491e4ea0f2",
"45dd8d2f31814fc4957f3195ae316c54",
"406355b5090641ccb2c7cb6ad04a852b",
"2f664fe953e548a29c00962487997c8a",
"ff22853468d243bebc072beb9591b707"
]
},
"id": "AZ6IcdGleoaE",
"outputId": "eccb3e6b-ab2f-49a7-9e8a-098cbaa9aa6e"
},
"source": [
"pretrained_model_name = 'bert-large-uncased-whole-word-masking-finetuned-squad'\n",
"hf_model_cls = AutoModelForQuestionAnswering\n",
"\n",
"hf_arch, hf_config, hf_tokenizer, hf_model = BLURR.get_hf_objects(pretrained_model_name, model_cls=hf_model_cls)\n",
"\n",
"# # here's a pre-trained roberta model for squad you can try too\n",
"# pretrained_model_name = \"ahotrod/roberta_large_squad2\"\n",
"# hf_arch, hf_config, hf_tokenizer, hf_model = BLURR.get_hf_objects(pretrained_model_name, \n",
"# model_cls=AutoModelForQuestionAnswering)\n",
"\n",
"# # here's a pre-trained xlm model for squad you can try too\n",
"# pretrained_model_name = 'xlm-mlm-ende-1024'\n",
"# hf_arch, hf_config, hf_tokenizer, hf_model = BLURR.get_hf_objects(pretrained_model_name,\n",
"# model_cls=AutoModelForQuestionAnswering)"
],
"execution_count": 17,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "c08d84f274b94ec9ad9510edacfa9c4c",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/443 [00:00<?, ?B/s]"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0885d1d23c8d4c5f983f1e28ce0ea06d",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/28.0 [00:00<?, ?B/s]"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "019bafae01244276a930515267e191ea",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/226k [00:00<?, ?B/s]"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "47c2942844e64023b3b2ed86fec4a265",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/455k [00:00<?, ?B/s]"
]
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "e2d94a3e334944e0a1fb906a648f957c",
"version_minor": 0,
"version_major": 2
},
"text/plain": [
"Downloading: 0%| | 0.00/1.25G [00:00<?, ?B/s]"
]
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "P8koyGpNeoaE"
},
"source": [
"squad_df = squad_df.apply(partial(pre_process_squad, hf_arch=hf_arch, hf_tokenizer=hf_tokenizer), axis=1)"
],
"execution_count": 18,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "8GZ2avqQeoaF"
},
"source": [
"max_seq_len= 128"
],
"execution_count": 19,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "8rHfO6nAeoaF"
},
"source": [
"squad_df = squad_df[(squad_df.tokenized_input_len < max_seq_len) & (squad_df.is_impossible == False)]"
],
"execution_count": 20,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 643
},
"id": "u6cQJ1B5eoaF",
"outputId": "6b6a8227-e5c7-4bd2-dd22-69b742e0b110"
},
"source": [
"#hide\n",
"squad_df.head(2)"
],
"execution_count": 21,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>title</th>\n",
" <th>context</th>\n",
" <th>question</th>\n",
" <th>answers</th>\n",
" <th>ds_type</th>\n",
" <th>answer_text</th>\n",
" <th>is_impossible</th>\n",
" <th>tokenized_input</th>\n",
" <th>tokenized_input_len</th>\n",
" <th>tok_answer_start</th>\n",
" <th>tok_answer_end</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>214</th>\n",
" <td>56be97c73aeaaa14008c912a</td>\n",
" <td>Beyoncé</td>\n",
" <td>Beyoncé announced a hiatus from her music career in January 2010, heeding her mother's advice, \"to live life, to be inspired by things again\". During the break she and her father parted ways as business partners. Beyoncé's musical break lasted nine months and saw her visit multiple European cities, the Great Wall of China, the Egyptian pyramids, Australia, English music festivals and various museums and ballet performances.</td>\n",
" <td>Beyonce would take a break from music in which year?</td>\n",
" <td>{'text': ['2010'], 'answer_start': [60]}</td>\n",
" <td>train</td>\n",
" <td>2010</td>\n",
" <td>False</td>\n",
" <td>[[CLS], beyonce, would, take, a, break, from, music, in, which, year, ?, [SEP], beyonce, announced, a, hiatus, from, her, music, career, in, january, 2010, ,, hee, ##ding, her, mother, ', s, advice, ,, \", to, live, life, ,, to, be, inspired, by, things, again, \", ., during, the, break, she, and, her, father, parted, ways, as, business, partners, ., beyonce, ', s, musical, break, lasted, nine, months, and, saw, her, visit, multiple, european, cities, ,, the, great, wall, of, china, ,, the, egyptian, pyramid, ##s, ,, australia, ,, english, music, festivals, and, various, museums, and, ballet...</td>\n",
" <td>99</td>\n",
" <td>23</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>215</th>\n",
" <td>56be97c73aeaaa14008c912b</td>\n",
" <td>Beyoncé</td>\n",
" <td>Beyoncé announced a hiatus from her music career in January 2010, heeding her mother's advice, \"to live life, to be inspired by things again\". During the break she and her father parted ways as business partners. Beyoncé's musical break lasted nine months and saw her visit multiple European cities, the Great Wall of China, the Egyptian pyramids, Australia, English music festivals and various museums and ballet performances.</td>\n",
" <td>Which year did Beyonce and her father part business ways?</td>\n",
" <td>{'text': ['2010'], 'answer_start': [60]}</td>\n",
" <td>train</td>\n",
" <td>2010</td>\n",
" <td>False</td>\n",
" <td>[[CLS], which, year, did, beyonce, and, her, father, part, business, ways, ?, [SEP], beyonce, announced, a, hiatus, from, her, music, career, in, january, 2010, ,, hee, ##ding, her, mother, ', s, advice, ,, \", to, live, life, ,, to, be, inspired, by, things, again, \", ., during, the, break, she, and, her, father, parted, ways, as, business, partners, ., beyonce, ', s, musical, break, lasted, nine, months, and, saw, her, visit, multiple, european, cities, ,, the, great, wall, of, china, ,, the, egyptian, pyramid, ##s, ,, australia, ,, english, music, festivals, and, various, museums, and, b...</td>\n",
" <td>99</td>\n",
" <td>23</td>\n",
" <td>24</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id title ... tok_answer_start tok_answer_end\n",
"214 56be97c73aeaaa14008c912a Beyoncé ... 23 24\n",
"215 56be97c73aeaaa14008c912b Beyoncé ... 23 24\n",
"\n",
"[2 rows x 12 columns]"
]
},
"metadata": {},
"execution_count": 21
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "gce3KJs4eoaF"
},
"source": [
"vocab = list(range(max_seq_len))\n",
"# vocab = dict(enumerate(range(max_seq_len)));"
],
"execution_count": 22,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "r9sA6cUAeoaG"
},
"source": [
"# account for tokenizers that pad on right or left side\n",
"trunc_strat = 'only_second' if (hf_tokenizer.padding_side == 'right') else 'only_first'\n",
"\n",
"before_batch_tfm = HF_QABeforeBatchTransform(hf_arch, hf_config, hf_tokenizer, hf_model,\n",
" max_length=max_seq_len, \n",
" truncation=trunc_strat, \n",
" tok_kwargs={ 'return_special_tokens_mask': True })\n",
"\n",
"blocks = (\n",
" HF_TextBlock(before_batch_tfm=before_batch_tfm, input_return_type=HF_QuestionAnswerInput), \n",
" CategoryBlock(vocab=vocab),\n",
" CategoryBlock(vocab=vocab)\n",
")\n",
"\n",
"def get_x(x):\n",
" return (x.question, x.context) if (hf_tokenizer.padding_side == 'right') else (x.context, x.question)\n",
"\n",
"dblock = DataBlock(blocks=blocks, \n",
" get_x=get_x,\n",
" get_y=[ColReader('tok_answer_start'), ColReader('tok_answer_end')],\n",
" splitter=RandomSplitter(),\n",
" n_inp=1)"
],
"execution_count": 23,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "qiRG9Vx7eoaG"
},
"source": [
"dls = dblock.dataloaders(squad_df, bs=4)"
],
"execution_count": 24,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "_jYP1fLkeoaG",
"outputId": "a6ae5ccc-268f-460c-9930-194ce63d9c0b"
},
"source": [
"len(dls.vocab), dls.vocab[0], dls.vocab[1]"
],
"execution_count": 25,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(2,\n",
" [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127],\n",
" [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127])"
]
},
"metadata": {},
"execution_count": 25
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 176
},
"id": "QtKR9oMweoaG",
"outputId": "bccdab02-8044-4c1e-b1c1-43cb3b5e4304"
},
"source": [
"dls.show_batch(dataloaders=dls, max_n=2)"
],
"execution_count": 26,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>text</th>\n",
" <th>start/end</th>\n",
" <th>answer</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>what language does she mainly sing? beyonce's music is generally r &amp; b, but she also incorporates pop, soul and funk into her songs. 4 demonstrated beyonce's exploration of 90s - style r &amp; b, as well as further use of soul and hip hop than compared to previous releases. while she almost exclusively releases english songs, beyonce recorded several spanish songs for irreemplazable ( re - recordings of songs from b'day for a spanish - language audience ), and the re - release of b'day. to record these, beyonce was coached phonetically by american record producer rudy perez.</td>\n",
" <td>(67, 68)</td>\n",
" <td>english</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>what other language has she sung? beyonce's music is generally r &amp; b, but she also incorporates pop, soul and funk into her songs. 4 demonstrated beyonce's exploration of 90s - style r &amp; b, as well as further use of soul and hip hop than compared to previous releases. while she almost exclusively releases english songs, beyonce recorded several spanish songs for irreemplazable ( re - recordings of songs from b'day for a spanish - language audience ), and the re - release of b'day. to record these, beyonce was coached phonetically by american record producer rudy perez.</td>\n",
" <td>(73, 74)</td>\n",
" <td>spanish</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "f-X6U3WOeoaH"
},
"source": [
"### Training\n",
"\n",
"Here we create a question/answer specific subclass of `HF_BaseModelCallback` in order to get all the start and end prediction. We also add here a new loss function that can handle multiple targets"
]
},
{
"cell_type": "code",
"metadata": {
"id": "LqjqUIJJeoaH"
},
"source": [
"#export\n",
"class HF_QstAndAnsModelCallback(HF_BaseModelCallback): \n",
" \"\"\"The prediction is a combination start/end logits\"\"\"\n",
" def after_pred(self):\n",
" super().after_pred()\n",
" self.learn.pred = (self.pred.start_logits, self.pred.end_logits)"
],
"execution_count": 27,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "6wgZUtpzeoaH"
},
"source": [
"And here we provide a custom loss function our question answer task, expanding on some techniques learned from here and here.\n",
"\n",
"In fact, this new loss function can be used in many other multi-modal architectures, with any mix of loss functions. For example, this can be ammended to include the `is_impossible` task, as well as the start/end token tasks in the SQUAD v2 dataset."
]
},
{
"cell_type": "code",
"metadata": {
"id": "4nuwWYIbeoaH"
},
"source": [
"#export\n",
"class MultiTargetLoss(Module):\n",
" \"\"\"Provides the ability to apply different loss functions to multi-modal targets/predictions\"\"\"\n",
" def __init__(\n",
" self, \n",
" # The loss function for each target\n",
" loss_classes:List[Callable]=[CrossEntropyLossFlat, CrossEntropyLossFlat], \n",
" # Any kwargs you want to pass to the loss functions above\n",
" loss_classes_kwargs:List[dict]=[{}, {}], \n",
" # The weights you want to apply to each loss (default: [1,1])\n",
" weights:Union[List[float], List[int]]=[1, 1], \n",
" # The `reduction` parameter of the lass function (default: 'mean')\n",
" reduction:str='mean'\n",
" ):\n",
" loss_funcs = [ cls(reduction=reduction, **kwargs) for cls, kwargs in zip(loss_classes, loss_classes_kwargs) ]\n",
" store_attr(self=self, names='loss_funcs, weights')\n",
" self._reduction = reduction\n",
" \n",
" # custom loss function must have either a reduction attribute or a reduction argument (like all fastai and\n",
" # PyTorch loss functions) so that the framework can change this as needed (e.g., when doing lear.get_preds \n",
" # it will set = 'none'). see this forum topic for more info: https://bit.ly/3br2Syz\n",
" @property\n",
" def reduction(self): return self._reduction\n",
" \n",
" @reduction.setter\n",
" def reduction(self, v): \n",
" self._reduction = v\n",
" for lf in self.loss_funcs: lf.reduction = v\n",
"\n",
" def forward(self, outputs, *targets):\n",
" loss = 0.\n",
" for i, loss_func, weights, output, target in zip(range(len(outputs)), \n",
" self.loss_funcs, self.weights,\n",
" outputs, targets):\n",
" loss += weights * loss_func(output, target) \n",
" \n",
" return loss\n",
" \n",
" def activation(self, outs): \n",
" acts = [ self.loss_funcs[i].activation(o) for i, o in enumerate(outs) ]\n",
" return acts\n",
"\n",
" def decodes(self, outs): \n",
" decodes = [ self.loss_funcs[i].decodes(o) for i, o in enumerate(outs) ]\n",
" return decodes\n"
],
"execution_count": 28,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ETwtCUKueoaI"
},
"source": [
"model = HF_BaseModelWrapper(hf_model)\n",
"\n",
"learn = Learner(dls, \n",
" model,\n",
" opt_func=partial(Adam, decouple_wd=True),\n",
" cbs=[HF_QstAndAnsModelCallback],\n",
" splitter=hf_splitter)\n",
"\n",
"learn.loss_func=MultiTargetLoss()\n",
"learn.create_opt() # -> will create your layer groups based on your \"splitter\" function\n",
"learn.freeze()"
],
"execution_count": 31,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "5rYtg3steoaI"
},
"source": [
"Notice above how I had to define the loss function *after* creating the `Learner` object. I'm not sure why, but the `MultiTargetLoss` above prohibits the learner from being exported if I do."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 334
},
"id": "rBHeNwDXeoaI",
"outputId": "6ac031d6-93d7-47ac-fdf4-c056bc6c3eb1"
},
"source": [
"#hide_output\n",
"learn.summary()"
],
"execution_count": 32,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
""
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {}
},
{
"output_type": "error",
"ename": "TypeError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-32-f3eae8d3a65c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m#hide_output\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mlearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msummary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/callback/hook.py\u001b[0m in \u001b[0;36msummary\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 205\u001b[0m \u001b[0;34m\"Print a summary of the model, optimizer and loss function.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0mxb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mone_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"n_inp\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 207\u001b[0;31m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodule_summary\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mxb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 208\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34mf\"Optimizer used: {self.opt_func}\\nLoss function: {self.loss_func}\\n\\n\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopt\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/callback/hook.py\u001b[0m in \u001b[0;36mmodule_summary\u001b[0;34m(learn, *xb)\u001b[0m\n\u001b[1;32m 175\u001b[0m \u001b[0minfos\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlayer_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlearn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mxb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mbs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m76\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mfind_bs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 177\u001b[0;31m \u001b[0minp_sz\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_print_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 178\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf\"{type(learn.model).__name__} (Input shape: {inp_sz})\\n\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;34m\"=\"\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\"\\n\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/callback/hook.py\u001b[0m in \u001b[0;36m_print_shapes\u001b[0;34m(o, bs)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_print_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_get_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 166\u001b[0;31m \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_get_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 167\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0m_print_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 168\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/fastai/callback/hook.py\u001b[0m in \u001b[0;36m_get_shapes\u001b[0;34m(o, bs)\u001b[0m\n\u001b[1;32m 161\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[0;31m# Cell\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 163\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0m_get_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m' x '\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 164\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_print_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0m_get_shapes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: unhashable type: 'slice'"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "OhMKlbaFeoaI",
"outputId": "9217df1c-49ea-4008-fb7b-587d754b9a55"
},
"source": [
"print(len(learn.opt.param_groups))"
],
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "f1Uobp2PeoaI",
"outputId": "4e51947c-041d-458c-fbe0-29d6267f26f1"
},
"source": [
"x, y_start, y_end = dls.one_batch()\n",
"preds = learn.model(x)\n",
"len(preds),preds[0].shape"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"(2, torch.Size([4, 127]))"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "q-3PWw1IeoaJ",
"outputId": "96b05545-2534-4579-cbf9-f22b383bd0bb"
},
"source": [
"learn.lr_find(suggest_funcs=[minimum, steep, valley, slide])"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/wgilliam/miniconda3/envs/blurr/lib/python3.9/site-packages/fastai/callback/schedule.py:270: UserWarning: color is redundantly defined by the 'color' keyword argument and the fmt string \"ro\" (-> color='r'). The keyword argument will take precedence.\n",
" ax.plot(val, idx, 'ro', label=nm, c=color)\n"
]
},
{
"data": {
"text/plain": [
"SuggestedLRs(minimum=0.003981071710586548, steep=0.0010000000474974513, valley=0.0008317637839354575, slide=0.0020892962347716093)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "mcuW52ZveoaJ",
"outputId": "85654380-7081-4693-b5bb-143351757e18"
},
"source": [
"learn.fit_one_cycle(3, lr_max=1e-3)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: left;\">\n",
" <th>epoch</th>\n",
" <th>train_loss</th>\n",
" <th>valid_loss</th>\n",
" <th>time</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>4.139011</td>\n",
" <td>1.324671</td>\n",
" <td>00:04</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>2.428752</td>\n",
" <td>0.630240</td>\n",
" <td>00:04</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1.736481</td>\n",
" <td>0.554712</td>\n",
" <td>00:04</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lS7xPxaoeoaJ"
},
"source": [
"### Showing results\n",
"\n",
"Below we'll add in additional functionality to more intuitively show the results of our model."
]
},
{
"cell_type": "code",
"metadata": {
"id": "KYjjtD0JeoaJ"
},
"source": [
"#export\n",
"@typedispatch\n",
"def show_results(\n",
" # This typedispatched `show_results` will be called for `HF_QuestionAnswerInput` typed inputs\n",
" x:HF_QuestionAnswerInput, \n",
" # The targets\n",
" y, \n",
" # Your raw inputs/targets\n",
" samples, \n",
" # The model's predictions\n",
" outs, \n",
" # Your `Learner`. This is required so as to get at the Hugging Face objects for decoding them into \n",
" # something understandable\n",
" learner, \n",
" # Whether you want to remove special tokens during decoding/showing the outputs\n",
" skip_special_tokens=True, \n",
" # Your `show_results` context\n",
" ctxs=None, \n",
" # The maximum number of items to show\n",
" max_n=6, \n",
" # Any truncation your want applied to your decoded inputs\n",
" trunc_at=None, \n",
" # Any other keyword arguments you want applied to `show_results`\n",
" **kwargs\n",
"): \n",
" tfm = first_blurr_tfm(learner.dls)\n",
" hf_tokenizer = tfm.hf_tokenizer\n",
" \n",
" res = L()\n",
" for sample, input_ids, start, end, pred in zip(samples, x, *y, outs):\n",
" txt = hf_tokenizer.decode(sample[0], skip_special_tokens=True)[:trunc_at]\n",
" ans_toks = hf_tokenizer.convert_ids_to_tokens(input_ids, skip_special_tokens=False)[start:end]\n",
" pred_ans_toks = hf_tokenizer.convert_ids_to_tokens(input_ids, skip_special_tokens=False)[int(pred[0]):int(pred[1])]\n",
" \n",
" res.append((txt,\n",
" (start.item(),end.item()), hf_tokenizer.convert_tokens_to_string(ans_toks),\n",
" (int(pred[0]),int(pred[1])), hf_tokenizer.convert_tokens_to_string(pred_ans_toks)))\n",
"\n",
" df = pd.DataFrame(res, columns=['text', 'start/end', 'answer', 'pred start/end', 'pred answer'])\n",
" display_df(df[:max_n])\n",
" return ctxs"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "1vJfgVsGeoaJ",
"outputId": "e31f9cd8-5e98-4c5c-cd31-f9cee901cbd0"
},
"source": [
"learn.show_results(learner=learn, skip_special_tokens=True, max_n=2, trunc_at=500)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>text</th>\n",
" <th>start/end</th>\n",
" <th>answer</th>\n",
" <th>pred start/end</th>\n",
" <th>pred answer</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>where did beyonce exclusively release her single, formation? on february 6, 2016, one day before her performance at the super bowl, beyonce released a new single exclusively on music streaming service tidal called \" formation \".</td>\n",
" <td>(38, 39)</td>\n",
" <td>tidal</td>\n",
" <td>(38, 39)</td>\n",
" <td>tidal</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>what word does \" bey hive \" derive from? the bey hive is the name given to beyonce's fan base. fans were previously titled \" the beyontourage \", ( a portmanteau of beyonce and entourage ). the name bey hive derives from the word beehive, purposely misspelled to resemble her first name, and was penned by fans after petitions on the online social networking service twitter and online news reports during competitions.</td>\n",
" <td>(58, 61)</td>\n",
" <td>beehive</td>\n",
" <td>(58, 61)</td>\n",
" <td>beehive</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TCDlngdyeoaK"
},
"source": [
"... and lets see how `Learner.blurr_predict` works with question/answering tasks"
]
},
{
"cell_type": "code",
"metadata": {
"id": "djQt6L4meoaK",
"outputId": "7fb1e7cd-afb4-4212-842d-c00ea99b7cc3"
},
"source": [
"inf_df = pd.DataFrame.from_dict([{\n",
" 'question': 'What did George Lucas make?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
"}], \n",
" orient='columns')\n",
"\n",
"learn.blurr_predict(inf_df.iloc[0])"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"[(('11', '13'),\n",
" (#2) [tensor(11),tensor(13)],\n",
" (#2) [tensor([3.0268e-07, 6.9921e-08, 5.9632e-09, 1.2420e-08, 8.5584e-09, 7.5558e-09,\n",
" 9.2788e-10, 3.0270e-07, 3.8582e-04, 2.7305e-05, 8.3689e-04, 9.9857e-01,\n",
" 1.5739e-04, 4.2566e-07, 7.8813e-06, 5.0365e-07, 4.5226e-06, 4.6080e-06,\n",
" 3.3246e-08, 2.2053e-06, 8.2759e-07, 1.2332e-07, 2.5745e-07]),tensor([1.6131e-03, 8.3521e-05, 5.9296e-06, 2.2950e-06, 9.9383e-06, 6.0271e-06,\n",
" 2.4133e-05, 1.6132e-03, 3.1182e-05, 1.2563e-04, 9.7756e-05, 1.4331e-05,\n",
" 5.6870e-02, 5.2701e-01, 2.6772e-02, 3.5492e-01, 2.6779e-04, 8.0594e-05,\n",
" 2.0279e-04, 1.8910e-04, 6.8663e-03, 2.1703e-02, 1.4861e-03])])]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "cLn3RutNeoaK",
"outputId": "e14a1c45-551e-4c0a-b89a-518f14a4e653"
},
"source": [
"inf_df = pd.DataFrame.from_dict([\n",
" {\n",
" 'question': 'What did George Lucas make?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }, {\n",
" 'question': 'What year did Star Wars come out?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }, {\n",
" 'question': 'What did George Lucas do?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }], \n",
" orient='columns')\n",
"\n",
"learn.blurr_predict(inf_df)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"[(('11', '13'),\n",
" (#2) [tensor(11),tensor(13)],\n",
" (#2) [tensor([3.0268e-07, 6.9921e-08, 5.9632e-09, 1.2420e-08, 8.5584e-09, 7.5558e-09,\n",
" 9.2787e-10, 3.0270e-07, 3.8582e-04, 2.7305e-05, 8.3689e-04, 9.9857e-01,\n",
" 1.5739e-04, 4.2566e-07, 7.8812e-06, 5.0365e-07, 4.5226e-06, 4.6080e-06,\n",
" 3.3246e-08, 2.2053e-06, 8.2759e-07, 1.2332e-07, 2.5745e-07, 5.4841e-10,\n",
" 7.3210e-10]),tensor([1.6131e-03, 8.3521e-05, 5.9296e-06, 2.2950e-06, 9.9383e-06, 6.0271e-06,\n",
" 2.4133e-05, 1.6132e-03, 3.1182e-05, 1.2563e-04, 9.7755e-05, 1.4331e-05,\n",
" 5.6870e-02, 5.2701e-01, 2.6772e-02, 3.5492e-01, 2.6779e-04, 8.0594e-05,\n",
" 2.0279e-04, 1.8910e-04, 6.8663e-03, 2.1703e-02, 1.4861e-03, 1.3298e-06,\n",
" 8.1794e-07])]),\n",
" (('16', '17'),\n",
" (#2) [tensor(16),tensor(17)],\n",
" (#2) [tensor([1.8138e-06, 3.6914e-06, 7.9606e-08, 5.7100e-08, 4.9475e-08, 3.7448e-08,\n",
" 5.3773e-08, 6.4744e-08, 2.9010e-08, 1.8139e-06, 1.5196e-06, 1.7933e-06,\n",
" 2.9139e-06, 5.4099e-06, 2.6638e-06, 6.3237e-05, 9.9991e-01, 2.0777e-06,\n",
" 3.3066e-07, 3.0617e-07, 6.3106e-08, 3.2725e-07, 6.9513e-07, 9.8958e-07,\n",
" 1.8122e-06]),tensor([3.1355e-03, 6.7197e-04, 5.7665e-04, 2.1287e-04, 8.4543e-05, 1.6099e-04,\n",
" 1.0164e-04, 1.8573e-04, 4.5048e-04, 3.1355e-03, 6.3488e-04, 1.0317e-03,\n",
" 7.2071e-04, 3.0524e-04, 1.0807e-03, 1.1295e-03, 7.2798e-03, 9.5853e-01,\n",
" 1.0582e-02, 8.9976e-04, 8.4763e-04, 7.5183e-04, 2.1189e-03, 2.2401e-03,\n",
" 3.1360e-03])]),\n",
" (('17', '21'),\n",
" (#2) [tensor(17),tensor(21)],\n",
" (#2) [tensor([8.9343e-06, 3.5278e-07, 8.2588e-08, 1.7797e-07, 7.2601e-08, 9.2827e-08,\n",
" 2.2630e-08, 8.9359e-06, 4.9041e-03, 5.3172e-04, 1.2702e-01, 4.9925e-04,\n",
" 3.2418e-05, 2.7297e-06, 4.7746e-05, 1.4660e-05, 1.0720e-01, 7.3418e-01,\n",
" 2.3097e-05, 2.5464e-02, 3.5826e-05, 1.3317e-05, 8.6433e-06, 1.0467e-08,\n",
" 1.6150e-08]),tensor([3.4201e-03, 2.1435e-05, 1.3353e-05, 5.0382e-06, 2.2327e-05, 1.2700e-05,\n",
" 3.4319e-05, 3.4203e-03, 3.7694e-05, 2.4082e-04, 3.4410e-04, 3.1209e-04,\n",
" 1.6885e-02, 2.4353e-02, 7.8388e-03, 7.9421e-02, 4.1039e-05, 8.2386e-05,\n",
" 1.3766e-03, 3.6992e-03, 3.0023e-01, 5.5487e-01, 3.3109e-03, 3.7449e-06,\n",
" 1.6923e-06])])]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "vuO4JCLpeoaL",
"outputId": "97d55a40-c88b-43a2-c19e-830356b2757b"
},
"source": [
"inp_ids = hf_tokenizer.encode('What did George Lucas make?',\n",
" 'George Lucas created Star Wars in 1977. He directed and produced it.')\n",
"\n",
"hf_tokenizer.convert_ids_to_tokens(inp_ids, skip_special_tokens=False)[11:13]"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"['star', 'wars']"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eSMKKuTFeoaL"
},
"source": [
"Note that there is a bug currently in fastai v2 (or with how I'm assembling everything) that currently prevents us from seeing the decoded predictions and probabilities for the \"end\" token."
]
},
{
"cell_type": "code",
"metadata": {
"id": "cauKqimneoaL",
"outputId": "475b554b-a457-4082-a54d-c4e195f68d53"
},
"source": [
"inf_df = pd.DataFrame.from_dict([{\n",
" 'question': 'When was Star Wars made?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.'\n",
"}], \n",
" orient='columns')\n",
"\n",
"test_dl = dls.test_dl(inf_df)\n",
"inp = test_dl.one_batch()[0]['input_ids']\n",
"probs, _, preds = learn.get_preds(dl=test_dl, with_input=False, with_decoded=True)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "9m5gyJpbeoaL",
"outputId": "218a61ae-b873-4cda-bc1e-8e3b5e684a17"
},
"source": [
"hf_tokenizer.convert_ids_to_tokens(inp.tolist()[0], \n",
" skip_special_tokens=False)[torch.argmax(probs[0]):torch.argmax(probs[1])]"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"['1977']"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "irH_58a6eoaL"
},
"source": [
"We can unfreeze and continue training like normal"
]
},
{
"cell_type": "code",
"metadata": {
"id": "xiSHPsOueoaL"
},
"source": [
"learn.unfreeze()"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "hVYPxVPTeoaM",
"outputId": "b392cbbb-128c-4cf4-e010-4bdcee493e24"
},
"source": [
"learn.fit_one_cycle(3, lr_max=slice(1e-7, 1e-4))"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: left;\">\n",
" <th>epoch</th>\n",
" <th>train_loss</th>\n",
" <th>valid_loss</th>\n",
" <th>time</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>0.998746</td>\n",
" <td>0.454062</td>\n",
" <td>00:07</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>0.788146</td>\n",
" <td>0.426064</td>\n",
" <td>00:07</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>0.641020</td>\n",
" <td>0.407723</td>\n",
" <td>00:08</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "WKTuTOzyeoaM",
"outputId": "62204780-b8c8-4f2b-aea1-496cd2349300"
},
"source": [
"learn.recorder.plot_loss()"
],
"execution_count": null,
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "wcNpjYNfeoaM",
"outputId": "7895529c-1e3e-43f5-8f7f-7330d656a3af"
},
"source": [
"learn.show_results(learner=learn, max_n=2, trunc_at=100)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>text</th>\n",
" <th>start/end</th>\n",
" <th>answer</th>\n",
" <th>pred start/end</th>\n",
" <th>pred answer</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>where did beyonce exclusively release her single, formation? on february 6, 2016, one day before her</td>\n",
" <td>(38, 39)</td>\n",
" <td>tidal</td>\n",
" <td>(38, 39)</td>\n",
" <td>tidal</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>her first appearance performing since giving birth was where? on january 7, 2012, beyonce gave birth</td>\n",
" <td>(52, 61)</td>\n",
" <td>revel atlantic city's ovation hall</td>\n",
" <td>(52, 61)</td>\n",
" <td>revel atlantic city's ovation hall</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "t38wXhG1eoaM",
"outputId": "1c698074-00cd-4c51-ab87-ce588d8a6b97"
},
"source": [
"learn.blurr_predict(inf_df.iloc[0])"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"[(('14', '15'),\n",
" (#2) [tensor(14),tensor(15)],\n",
" (#2) [tensor([2.0139e-07, 6.0186e-08, 1.3398e-08, 8.2077e-09, 7.6575e-09, 2.5011e-08,\n",
" 3.6197e-09, 2.0140e-07, 1.6501e-06, 7.0809e-07, 6.9617e-06, 4.8223e-06,\n",
" 1.0504e-06, 9.7600e-04, 9.9901e-01, 9.0924e-07, 8.0747e-08, 4.3993e-08,\n",
" 6.1624e-09, 3.3514e-08, 7.0549e-08, 6.1190e-08, 1.9218e-07]),tensor([4.5972e-04, 1.5797e-05, 6.4806e-06, 2.9688e-06, 4.6566e-06, 2.9982e-06,\n",
" 1.1183e-05, 4.5972e-04, 2.5425e-05, 3.4846e-05, 5.2598e-05, 9.6193e-06,\n",
" 3.9660e-05, 1.1938e-04, 1.1622e-03, 9.9376e-01, 3.1741e-03, 2.8255e-05,\n",
" 2.0109e-05, 1.9298e-05, 7.3358e-05, 6.7907e-05, 4.4704e-04])])]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "sTbMvuP-eoaM",
"outputId": "3d8b2cab-dde8-46f4-fc50-b7e366ae7120"
},
"source": [
"preds, pred_classes, probs = zip(*learn.blurr_predict(inf_df.iloc[0]))\n",
"preds"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"(('14', '15'),)"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "WAT5sH6yeoaM",
"outputId": "09bb7234-d4bd-475a-f5fa-777242b2bb16"
},
"source": [
"inp_ids = hf_tokenizer.encode('When was Star Wars made?',\n",
" 'George Lucas created Star Wars in 1977. He directed and produced it.')\n",
"\n",
"hf_tokenizer.convert_ids_to_tokens(inp_ids, skip_special_tokens=False)[int(preds[0][0]):int(preds[0][1])]"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"['1977']"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "spNglbaleoaN"
},
"source": [
"### Inference\n",
"\n",
"Note that I had to replace the loss function because of the above-mentioned issue to exporting the model with the `MultiTargetLoss` loss function. After getting our inference learner, we put it back and we're good to go!"
]
},
{
"cell_type": "code",
"metadata": {
"id": "xJZhPFfUeoaN"
},
"source": [
"export_name = 'q_and_a_learn_export'"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "cX1kzewseoaN"
},
"source": [
"learn.loss_func = CrossEntropyLossFlat()\n",
"learn.export(fname=f'{export_name}.pkl')"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "XfkLrgaeeoaN",
"outputId": "2a3cd6d6-ea1b-4035-ac19-3d71675ce97e"
},
"source": [
"inf_learn = load_learner(fname=f'{export_name}.pkl')\n",
"inf_learn.loss_func = MultiTargetLoss()\n",
"\n",
"inf_df = pd.DataFrame.from_dict([\n",
" {\n",
" 'question': 'What did George Lucas make?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }, {\n",
" 'question': 'What year did Star Wars come out?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }, {\n",
" 'question': 'What did George Lucas do?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }], \n",
" orient='columns')\n",
"\n",
"inf_learn.blurr_predict(inf_df)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"[(('11', '13'),\n",
" (#2) [tensor(11),tensor(13)],\n",
" (#2) [tensor([1.8343e-07, 5.0318e-08, 4.8847e-09, 8.4643e-09, 5.8875e-09, 7.1094e-09,\n",
" 7.2085e-10, 1.8345e-07, 1.3470e-04, 1.2801e-05, 5.9846e-04, 9.9913e-01,\n",
" 1.1949e-04, 1.4157e-07, 3.5095e-06, 1.6165e-07, 1.3399e-06, 1.5361e-06,\n",
" 1.6692e-08, 7.6845e-07, 2.2477e-07, 4.0865e-08, 1.0515e-07, 4.5671e-10,\n",
" 6.0244e-10]),tensor([6.7522e-04, 2.6496e-05, 1.9889e-06, 7.5134e-07, 2.1462e-06, 1.3290e-06,\n",
" 5.0080e-06, 6.7526e-04, 7.9513e-06, 2.0008e-05, 2.3254e-05, 4.8967e-06,\n",
" 2.2808e-02, 7.4460e-01, 1.1859e-02, 2.1369e-01, 7.4602e-05, 2.3168e-05,\n",
" 4.3674e-05, 4.5102e-05, 1.5111e-03, 3.3360e-03, 5.5911e-04, 4.4061e-07,\n",
" 3.0934e-07])]),\n",
" (('16', '17'),\n",
" (#2) [tensor(16),tensor(17)],\n",
" (#2) [tensor([1.1055e-06, 1.8704e-06, 4.5308e-08, 3.7884e-08, 3.0064e-08, 2.3709e-08,\n",
" 3.2830e-08, 3.9723e-08, 1.7936e-08, 1.1055e-06, 5.2583e-07, 6.4640e-07,\n",
" 9.6506e-07, 1.8904e-06, 1.1272e-06, 2.7888e-05, 9.9996e-01, 5.5272e-07,\n",
" 1.1390e-07, 1.1871e-07, 3.3400e-08, 1.2625e-07, 2.4034e-07, 2.9475e-07,\n",
" 1.1031e-06]),tensor([1.4690e-03, 3.0677e-04, 2.0203e-04, 8.3740e-05, 3.4471e-05, 5.6418e-05,\n",
" 3.7654e-05, 5.9635e-05, 1.2717e-04, 1.4690e-03, 1.7384e-04, 2.6960e-04,\n",
" 2.0993e-04, 1.0054e-04, 2.9895e-04, 3.2731e-04, 3.5134e-03, 9.8572e-01,\n",
" 2.8103e-03, 2.1733e-04, 1.6969e-04, 1.6633e-04, 3.8966e-04, 3.1913e-04,\n",
" 1.4693e-03])]),\n",
" (('17', '21'),\n",
" (#2) [tensor(17),tensor(21)],\n",
" (#2) [tensor([9.8801e-06, 4.2964e-07, 1.1790e-07, 2.2178e-07, 9.1010e-08, 1.3551e-07,\n",
" 2.9758e-08, 9.8821e-06, 3.2094e-03, 4.5714e-04, 1.5957e-01, 3.8280e-04,\n",
" 2.7563e-05, 1.3641e-06, 4.6444e-05, 1.0686e-05, 1.1351e-01, 6.9439e-01,\n",
" 2.3044e-05, 2.8310e-02, 2.4390e-05, 8.8607e-06, 9.0558e-06, 1.2868e-08,\n",
" 2.0218e-08]),tensor([1.9702e-03, 8.6120e-06, 5.9526e-06, 2.1202e-06, 6.5693e-06, 4.6015e-06,\n",
" 1.1350e-05, 1.9704e-03, 1.2754e-05, 6.1397e-05, 1.4907e-04, 1.4174e-04,\n",
" 8.3424e-03, 1.6695e-02, 2.8036e-03, 3.3022e-02, 1.5188e-05, 3.1796e-05,\n",
" 5.4052e-04, 1.2613e-03, 3.0156e-01, 6.2954e-01, 1.8494e-03, 1.7348e-06,\n",
" 8.5971e-07])])]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "c1NGB3bueoaN",
"outputId": "27821cbd-cdc3-4f31-e1c8-01cd790f0ecc"
},
"source": [
"inp_ids = hf_tokenizer.encode('What did George Lucas make?',\n",
" 'George Lucas created Star Wars in 1977. He directed and produced it.')\n",
"\n",
"hf_tokenizer.convert_ids_to_tokens(inp_ids, skip_special_tokens=False)[11:13]"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"['star', 'wars']"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Y-Jo6bGWeoaN"
},
"source": [
"## High-level API"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mtIRN6tweoaN"
},
"source": [
"### BLearnerForQuestionAnswering"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6mJZopB_eoaO"
},
"source": [
"#hide\n",
"try: del learn; del inf_learn; torch.cuda.empty_cache()\n",
"except: pass"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "nsgDQSgPeoaO"
},
"source": [
"#export\n",
"@delegates(Blearner.__init__)\n",
"class BlearnerForQuestionAnswering(Blearner):\n",
"\n",
" def __init__(\n",
" self, \n",
" dls:DataLoaders, \n",
" hf_model: PreTrainedModel, \n",
" **kwargs\n",
" ):\n",
" kwargs['loss_func'] = kwargs.get('loss_func', MultiTargetLoss())\n",
" super().__init__(dls, hf_model, base_model_cb=HF_QstAndAnsModelCallback, **kwargs)\n",
" \n",
" @classmethod\n",
" def get_model_cls(self): \n",
" return AutoModelForQuestionAnswering\n",
" \n",
" @classmethod\n",
" def _get_x(\n",
" cls, \n",
" x, \n",
" qst, \n",
" ctx, \n",
" padding_side='right'\n",
" ): \n",
" return (x[qst], x[ctx]) if (padding_side == 'right') else (x[ctx], x[qst])\n",
" \n",
" @classmethod\n",
" def _create_learner(\n",
" cls, \n",
" # Your raw dataset\n",
" data, \n",
" # The name or path of the pretrained model you want to fine-tune\n",
" pretrained_model_name_or_path:Optional[Union[str, os.PathLike]],\n",
" # A function to perform any preprocessing required for your Dataset \n",
" preprocess_func:Callable=None, \n",
" # The maximum sequence length to constrain our data\n",
" max_seq_len:int=None,\n",
" # The attribute in your dataset that contains the context (where the answer is included) (default: 'context')\n",
" context_attr:str='context', \n",
" # The attribute in your dataset that contains the question being asked (default: 'question')\n",
" question_attr:str='question', \n",
" # The attribute in your dataset that contains the actual answer (default: 'answer_text')\n",
" answer_text_attr:str='answer_text',\n",
" # The attribute in your dataset that contains the tokenized answer start (default: 'tok_answer_start')\n",
" tok_ans_start_attr:str='tok_answer_start', \n",
" # The attribute in your dataset that contains the tokenized answer end(default: 'tok_answer_end')\n",
" tok_ans_end_attr:str='tok_answer_end', \n",
" # A function that will split your Dataset into a training and validation set\n",
" # See [here](https://docs.fast.ai/data.transforms.html#Split) for a list of fast.ai splitters\n",
" dblock_splitter:Callable=RandomSplitter(), \n",
" # Any kwargs to pass to your `DataLoaders`\n",
" dl_kwargs={}, \n",
" # Any kwargs to pass to your task specific `Blearner`\n",
" learner_kwargs={}\n",
" ):\n",
" hf_arch, hf_config, hf_tokenizer, hf_model = BLURR.get_hf_objects(pretrained_model_name_or_path, \n",
" model_cls=cls.get_model_cls())\n",
" \n",
" # potentially used by our preprocess_func, it is the basis for our CategoryBlock vocab\n",
" if (max_seq_len is None):\n",
" max_seq_len = hf_config.get('max_position_embeddings', 128)\n",
" \n",
" # client can pass in a function that takes the raw data, hf objects, and max_seq_len ... and\n",
" # returns a DataFrame with the expected format\n",
" if (preprocess_func):\n",
" data = preprocess_func(data, hf_arch, hf_config, hf_tokenizer, hf_model, max_seq_len, \n",
" context_attr, question_attr, answer_text_attr, \n",
" tok_ans_start_attr, tok_ans_end_attr)\n",
" \n",
" # bits required by our \"before_batch_tfm\" and DataBlock\n",
" vocab = list(range(max_seq_len))\n",
" padding_side = hf_tokenizer.padding_side\n",
" trunc_strat = 'only_second' if (padding_side == 'right') else 'only_first'\n",
"\n",
" before_batch_tfm = HF_QABeforeBatchTransform(hf_arch, hf_config, hf_tokenizer, hf_model,\n",
" max_length=max_seq_len, \n",
" truncation=trunc_strat, \n",
" tok_kwargs={ 'return_special_tokens_mask': True })\n",
" \n",
" # define getters\n",
" if (isinstance(data, pd.DataFrame)):\n",
" get_x = partial(cls._get_x, qst=question_attr, ctx=context_attr, padding_side=padding_side)\n",
" get_y = [ColReader(tok_ans_start_attr), ColReader(tok_ans_end_attr)]\n",
" else:\n",
" get_x = partial(cls._get_x, qst=question_attr, ctx=context_attr, padding_side=padding_side)\n",
" get_y = [ItemGetter(tok_ans_start_attr), ItemGetter(tok_ans_end_attr)]\n",
" \n",
" # define DataBlock and DataLoaders\n",
" blocks = (\n",
" HF_TextBlock(before_batch_tfm=before_batch_tfm, input_return_type=HF_QuestionAnswerInput), \n",
" CategoryBlock(vocab=vocab),\n",
" CategoryBlock(vocab=vocab)\n",
" )\n",
" \n",
" dblock = DataBlock(blocks=blocks, \n",
" get_x=get_x,\n",
" get_y=get_y,\n",
" splitter=dblock_splitter,\n",
" n_inp=1)\n",
"\n",
" dls = dblock.dataloaders(data, **dl_kwargs.copy())\n",
" \n",
" # return BLearner instance\n",
" return cls(dls, hf_model, **learner_kwargs.copy())\n",
"\n",
" @classmethod\n",
" def from_dataframe(\n",
" cls, \n",
" # Your pandas DataFrame\n",
" df:pd.DataFrame, \n",
" # The name or path of the pretrained model you want to fine-tune\n",
" pretrained_model_name_or_path:Optional[Union[str, os.PathLike]],\n",
" # A function to perform any preprocessing required for your Dataset \n",
" preprocess_func:Callable=None, \n",
" # The maximum sequence length to constrain our data\n",
" max_seq_len:int=None,\n",
" # The attribute in your dataset that contains the context (where the answer is included) (default: 'context')\n",
" context_attr:str='context', \n",
" # The attribute in your dataset that contains the question being asked (default: 'question')\n",
" question_attr:str='question', \n",
" # The attribute in your dataset that contains the actual answer (default: 'answer_text')\n",
" answer_text_attr:str='answer_text',\n",
" # The attribute in your dataset that contains the tokenized answer start (default: 'tok_answer_start')\n",
" tok_ans_start_attr:str='tok_answer_start', \n",
" # The attribute in your dataset that contains the tokenized answer end(default: 'tok_answer_end')\n",
" tok_ans_end_attr:str='tok_answer_end', \n",
" # A function that will split your Dataset into a training and validation set\n",
" # See [here](https://docs.fast.ai/data.transforms.html#Split) for a list of fast.ai splitters\n",
" dblock_splitter:Callable=ColSplitter(), \n",
" # Any kwargs to pass to your `DataLoaders`\n",
" dl_kwargs={}, \n",
" # Any kwargs to pass to your task specific `Blearner`\n",
" learner_kwargs={}\n",
" ):\n",
" return cls._create_learner(df, pretrained_model_name_or_path, preprocess_func, max_seq_len,\n",
" context_attr, question_attr, answer_text_attr,\n",
" tok_ans_start_attr, tok_ans_end_attr, dblock_splitter,\n",
" dl_kwargs, learner_kwargs)\n",
" \n",
" @classmethod\n",
" def from_csv(\n",
" cls, \n",
" # The path to your csv file\n",
" csv_file:Union[Path, str],\n",
" # The name or path of the pretrained model you want to fine-tune\n",
" pretrained_model_name_or_path:Optional[Union[str, os.PathLike]],\n",
" # A function to perform any preprocessing required for your Dataset \n",
" preprocess_func:Callable=None, \n",
" # The maximum sequence length to constrain our data\n",
" max_seq_len:int=None,\n",
" # The attribute in your dataset that contains the context (where the answer is included) (default: 'context')\n",
" context_attr:str='context', \n",
" # The attribute in your dataset that contains the question being asked (default: 'question')\n",
" question_attr:str='question', \n",
" # The attribute in your dataset that contains the actual answer (default: 'answer_text')\n",
" answer_text_attr:str='answer_text',\n",
" # The attribute in your dataset that contains the tokenized answer start (default: 'tok_answer_start')\n",
" tok_ans_start_attr:str='tok_answer_start', \n",
" # The attribute in your dataset that contains the tokenized answer end(default: 'tok_answer_end')\n",
" tok_ans_end_attr:str='tok_answer_end', \n",
" # A function that will split your Dataset into a training and validation set\n",
" # See [here](https://docs.fast.ai/data.transforms.html#Split) for a list of fast.ai splitters\n",
" dblock_splitter:Callable=ColSplitter(), \n",
" # Any kwargs to pass to your `DataLoaders`\n",
" dl_kwargs={}, \n",
" # Any kwargs to pass to your task specific `Blearner`\n",
" learner_kwargs={}\n",
" ):\n",
" df = pd.read_csv(csv_file)\n",
" \n",
" return cls.from_dataframe(df, pretrained_model_name_or_path, preprocess_func, max_seq_len,\n",
" context_attr, question_attr, answer_text_attr,\n",
" tok_ans_start_attr, tok_ans_end_attr, dblock_splitter,\n",
" dl_kwargs, learner_kwargs)\n",
" \n",
" @classmethod\n",
" def from_dictionaries(\n",
" cls, \n",
" # A list of dictionaries\n",
" ds:List[Dict], \n",
" # The name or path of the pretrained model you want to fine-tune\n",
" pretrained_model_name_or_path:Optional[Union[str, os.PathLike]],\n",
" # A function to perform any preprocessing required for your Dataset \n",
" preprocess_func:Callable=None, \n",
" # The maximum sequence length to constrain our data\n",
" max_seq_len:int=None,\n",
" # The attribute in your dataset that contains the context (where the answer is included) (default: 'context')\n",
" context_attr:str='context', \n",
" # The attribute in your dataset that contains the question being asked (default: 'question')\n",
" question_attr:str='question', \n",
" # The attribute in your dataset that contains the actual answer (default: 'answer_text')\n",
" answer_text_attr:str='answer_text',\n",
" # The attribute in your dataset that contains the tokenized answer start (default: 'tok_answer_start')\n",
" tok_ans_start_attr:str='tok_answer_start', \n",
" # The attribute in your dataset that contains the tokenized answer end(default: 'tok_answer_end')\n",
" tok_ans_end_attr:str='tok_answer_end', \n",
" # A function that will split your Dataset into a training and validation set\n",
" # See [here](https://docs.fast.ai/data.transforms.html#Split) for a list of fast.ai splitters\n",
" dblock_splitter:Callable=RandomSplitter(), \n",
" # Any kwargs to pass to your `DataLoaders`\n",
" dl_kwargs={}, \n",
" # Any kwargs to pass to your task specific `Blearner`\n",
" learner_kwargs={}\n",
" ):\n",
" return cls._create_learner(ds, pretrained_model_name_or_path, preprocess_func, max_seq_len,\n",
" context_attr, question_attr, answer_text_attr, \n",
" tok_ans_start_attr, tok_ans_end_attr, dblock_splitter,\n",
" dl_kwargs, learner_kwargs)"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZbJl8PQ9eoaO"
},
"source": [
"`BLearnerForQuestionAnswering` requires a question, context (within which to find the answer to the question), and the start/end indices of where the answer lies in the *tokenized context*. Because those indices vary by tokenizer, we can pass a `preprocess_func` that will take our raw data, perform any preprocessing we want, and return it in a way that will work for extractive QA."
]
},
{
"cell_type": "code",
"metadata": {
"id": "MnJSKgbfeoaO"
},
"source": [
"def preprocess_df(df, hf_arch, hf_config, hf_tokenizer, hf_model, max_seq_len, \n",
" context_attr, question_attr, answer_text_attr, tok_ans_start_attr, tok_ans_end_attr):\n",
" \n",
" df = df.apply(partial(pre_process_squad, hf_arch=hf_arch, hf_tokenizer=hf_tokenizer, ctx_attr=context_attr, \n",
" qst_attr=question_attr, ans_attr=answer_text_attr), axis=1)\n",
" \n",
" df = df[(df.tokenized_input_len < max_seq_len) & (df.is_impossible == False)]\n",
" \n",
" return df"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "_1OF6B_geoaP"
},
"source": [
"Let's re-grab the raw data and use the high-level API to train"
]
},
{
"cell_type": "code",
"metadata": {
"id": "SxeaQ9eQeoaP"
},
"source": [
"squad_df = pd.read_csv('./squad_sample.csv')\n",
"\n",
"pretrained_model_name = 'bert-large-uncased-whole-word-masking-finetuned-squad'\n",
"\n",
"learn = BlearnerForQuestionAnswering.from_dataframe(squad_df, pretrained_model_name,\n",
" preprocess_func=preprocess_df, max_seq_len=128,\n",
" dblock_splitter=RandomSplitter(), \n",
" dl_kwargs={ 'bs': 4 }).to_fp16()"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "-DEYU82GeoaP",
"outputId": "a11ce1a9-18bc-496d-fd39-5654a8b35e0d"
},
"source": [
"learn.dls.show_batch(dataloaders=learn.dls, max_n=2, trunc_at=500)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>text</th>\n",
" <th>start/end</th>\n",
" <th>answer</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>where did beyonce perform in 2011? in 2011, documents obtained by wikileaks revealed that beyonce was one of many entertainers who performed for the family of libyan ruler muammar gaddafi. rolling stone reported that the music industry was urging them to return the money they earned for the concerts ; a spokesperson for beyonce later confirmed to the huffington post that she donated the money to the clinton bush haiti fund. later that year she became the first solo female artist to headline the</td>\n",
" <td>(102, 107)</td>\n",
" <td>glastonbury festival</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>what language does she mainly sing? beyonce's music is generally r &amp; b, but she also incorporates pop, soul and funk into her songs. 4 demonstrated beyonce's exploration of 90s - style r &amp; b, as well as further use of soul and hip hop than compared to previous releases. while she almost exclusively releases english songs, beyonce recorded several spanish songs for irreemplazable ( re - recordings of songs from b'day for a spanish - language audience ), and the re - release of b'day. to record th</td>\n",
" <td>(67, 68)</td>\n",
" <td>english</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "TT0jSci5eoaP",
"outputId": "06d92855-ef22-4be2-8d60-c77cc58e851a"
},
"source": [
"learn.fit_one_cycle(3, lr_max=1e-3)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: left;\">\n",
" <th>epoch</th>\n",
" <th>train_loss</th>\n",
" <th>valid_loss</th>\n",
" <th>time</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>0</td>\n",
" <td>4.252031</td>\n",
" <td>1.568532</td>\n",
" <td>00:05</td>\n",
" </tr>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>2.521215</td>\n",
" <td>0.815515</td>\n",
" <td>00:05</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>1.775412</td>\n",
" <td>0.717965</td>\n",
" <td>00:05</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "JBST4s-deoaP",
"outputId": "891e45a2-9495-42af-f3ee-f5214eed436f"
},
"source": [
"learn.show_results(learner=learn, skip_special_tokens=True, max_n=2, trunc_at=500)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/html": [],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>text</th>\n",
" <th>start/end</th>\n",
" <th>answer</th>\n",
" <th>pred start/end</th>\n",
" <th>pred answer</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>how much bail money did they spend? following the death of freddie gray, beyonce and jay - z, among other notable figures, met with his family. after the imprisonment of protesters of gray's death, beyonce and jay - z donated thousands of dollars to bail them out.</td>\n",
" <td>(50, 53)</td>\n",
" <td>thousands of dollars</td>\n",
" <td>(50, 53)</td>\n",
" <td>thousands of dollars</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>how was the suit settled? the release of a video - game starpower : beyonce was cancelled after beyonce pulled out of a $ 100 million with gatefive who alleged the cancellation meant the sacking of 70 staff and millions of pounds lost in development. it was settled out of court by her lawyers in june 2013 who said that they had cancelled because gatefive had lost its financial backers. beyonce also has had deals with american express, nintendo ds and l'oreal since the age of 18.</td>\n",
" <td>(56, 59)</td>\n",
" <td>out of court</td>\n",
" <td>(56, 59)</td>\n",
" <td>out of court</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Z3OHHY3KeoaP"
},
"source": [
"learn.loss_func = CrossEntropyLossFlat()\n",
"learn.export(fname=f'{export_name}.pkl')\n",
"inf_learn = load_learner(fname=f'{export_name}.pkl')"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "1uY1SWQ2eoaP",
"outputId": "3c8d0c46-e358-4876-cda5-768e72c17ac2"
},
"source": [
"inf_learn = load_learner(fname=f'{export_name}.pkl')\n",
"inf_learn.loss_func = MultiTargetLoss()\n",
"\n",
"inf_df = pd.DataFrame.from_dict([\n",
" {\n",
" 'question': 'What did George Lucas make?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }, {\n",
" 'question': 'What year did Star Wars come out?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }, {\n",
" 'question': 'What did George Lucas do?',\n",
" 'context': 'George Lucas created Star Wars in 1977. He directed and produced it.' \n",
" }], \n",
" orient='columns')\n",
"\n",
"inf_learn.blurr_predict(inf_df)"
],
"execution_count": null,
"outputs": [
{
"data": {
"text/plain": [
"[(('11', '13'),\n",
" (#2) [tensor(11),tensor(13)],\n",
" (#2) [tensor([2.7284e-07, 8.3190e-08, 3.7982e-09, 7.9587e-09, 6.0532e-09, 5.2288e-09,\n",
" 6.7031e-10, 2.7283e-07, 1.3389e-04, 1.2072e-05, 4.0296e-04, 9.9912e-01,\n",
" 2.9206e-04, 4.0871e-07, 1.7246e-05, 5.3299e-07, 7.4445e-06, 9.2675e-06,\n",
" 2.7095e-08, 4.0778e-06, 1.4063e-06, 2.7503e-07, 2.7421e-07, 3.4118e-10,\n",
" 4.1309e-10]),tensor([2.2255e-03, 1.9398e-04, 1.4811e-05, 6.0629e-06, 2.3273e-05, 1.2139e-05,\n",
" 4.9242e-05, 2.2257e-03, 6.3393e-05, 2.5946e-04, 2.7473e-04, 4.4387e-05,\n",
" 8.3237e-02, 4.8414e-01, 1.9951e-02, 3.9145e-01, 3.2640e-04, 1.6923e-04,\n",
" 4.2092e-04, 4.4922e-04, 1.0046e-02, 2.2117e-03, 2.1988e-03, 2.9638e-06,\n",
" 1.8428e-06])]),\n",
" (('16', '17'),\n",
" (#2) [tensor(16),tensor(17)],\n",
" (#2) [tensor([5.6653e-07, 2.0562e-06, 2.7093e-08, 1.3462e-08, 1.3675e-08, 9.8854e-09,\n",
" 1.6482e-08, 1.7449e-08, 8.9821e-09, 5.6657e-07, 6.3263e-07, 7.9726e-07,\n",
" 9.9635e-07, 2.6835e-06, 7.8746e-07, 2.4374e-05, 9.9996e-01, 1.0222e-06,\n",
" 1.4942e-07, 1.1580e-07, 2.3458e-08, 1.3362e-07, 3.7979e-07, 5.6670e-07,\n",
" 5.6669e-07]),tensor([2.9526e-03, 7.3836e-04, 6.0738e-04, 2.0252e-04, 7.6138e-05, 1.5352e-04,\n",
" 8.7644e-05, 1.7705e-04, 5.1405e-04, 2.9525e-03, 7.0142e-04, 1.1698e-03,\n",
" 7.6684e-04, 3.1254e-04, 1.2962e-03, 1.3482e-03, 1.0334e-02, 9.5583e-01,\n",
" 9.3413e-03, 8.3610e-04, 8.9849e-04, 7.6981e-04, 2.0273e-03, 2.9528e-03,\n",
" 2.9529e-03])]),\n",
" (('17', '21'),\n",
" (#2) [tensor(17),tensor(21)],\n",
" (#2) [tensor([7.6245e-06, 2.5309e-07, 4.6802e-08, 1.1821e-07, 5.4243e-08, 5.6511e-08,\n",
" 1.4816e-08, 7.6252e-06, 3.1773e-03, 3.0238e-04, 1.2024e-01, 4.0060e-04,\n",
" 3.5399e-05, 2.5930e-06, 7.0493e-05, 7.6382e-06, 9.2087e-02, 7.4348e-01,\n",
" 1.6772e-05, 4.0094e-02, 5.2537e-05, 1.6554e-05, 7.6619e-06, 6.5125e-09,\n",
" 9.3592e-09]),tensor([3.2386e-03, 3.2943e-05, 2.0672e-05, 7.7881e-06, 3.0920e-05, 1.7127e-05,\n",
" 5.0501e-05, 3.2389e-03, 6.1905e-05, 3.5101e-04, 6.3880e-04, 3.3710e-04,\n",
" 1.3215e-02, 1.3914e-02, 6.1565e-03, 3.2390e-03, 7.0665e-05, 1.4825e-04,\n",
" 1.5560e-03, 6.0942e-03, 3.0879e-01, 6.3557e-01, 3.2132e-03, 5.1384e-06,\n",
" 2.4964e-06])])]"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_UoJcLXZeoaQ"
},
"source": [
"## Summary"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "O9KJkRTFeoaQ"
},
"source": [
"This module includes all the low, mid, and high-level API bits for extractive Q&A tasks training and inference."
]
},
{
"cell_type": "code",
"metadata": {
"id": "0MI30ReceoaQ",
"outputId": "95d4aeda-bea4-4b8f-ad1d-b5e4b0efef64"
},
"source": [
"#hide\n",
"from nbdev.export import notebook2script\n",
"notebook2script()"
],
"execution_count": null,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Converted 00_utils.ipynb.\n",
"Converted 01_data-core.ipynb.\n",
"Converted 01_modeling-core.ipynb.\n",
"Converted 02_data-language-modeling.ipynb.\n",
"Converted 02_modeling-language-modeling.ipynb.\n",
"Converted 03_data-token-classification.ipynb.\n",
"Converted 03_modeling-token-classification.ipynb.\n",
"Converted 04_data-question-answering.ipynb.\n",
"Converted 04_modeling-question-answering.ipynb.\n",
"Converted 10_data-seq2seq-core.ipynb.\n",
"Converted 10_modeling-seq2seq-core.ipynb.\n",
"Converted 11_data-seq2seq-summarization.ipynb.\n",
"Converted 11_modeling-seq2seq-summarization.ipynb.\n",
"Converted 12_data-seq2seq-translation.ipynb.\n",
"Converted 12_modeling-seq2seq-translation.ipynb.\n",
"Converted 99a_examples-high-level-api.ipynb.\n",
"Converted 99b_examples-glue.ipynb.\n",
"Converted 99c_examples-glue-plain-pytorch.ipynb.\n",
"Converted 99d_examples-multilabel.ipynb.\n",
"Converted 99e_examples-causal-lm-gpt2.ipynb.\n",
"Converted index.ipynb.\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "mk3ZNNjLeoaQ"
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment