diff --git a/demo/tutorials/benchmarks/Benchmarking_with_Harness.ipynb b/demo/tutorials/benchmarks/Benchmarking_with_Harness.ipynb new file mode 100644 index 000000000..4a0509dd6 --- /dev/null +++ b/demo/tutorials/benchmarks/Benchmarking_with_Harness.ipynb @@ -0,0 +1,2426 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUgAAABcCAYAAAAMJCwKAAAgAElEQVR4nOy9f5gcZ3Xn+znnra5pjcfKZCyNfqDIQgghZMdxZMfGxpbbwhjM2g4h2Ak/Nol3Aw5xEsLu5eHh8vCofNl9uFluLhiwhUi4zib3ZomcZBMgARsjt4RxbGIritcSsiyE0GpleSQLMYxHPd1V59w/qnq6Z6ZnNJJG/Ej6+zw9PW911fueeqvq1Pn9CucASZJokkzZaudirC666KKLcwWZ+y4TveyWJeW4/lKZYYD5mI2m8+YdH61Wk3Tux+uiiy66ODeYYwaZaKUysNSI7xSVtfj4MCPi9t8WLhzY+sADt9fndswuuuiii3ODaO66ShQSM7lvvYj8B6A8/pMIiM4/evToTuDI3I3ZRRdddHHuMIcMMocgC9ysFwx3DBzVyFzCQBpF8VyP10UXXXRxrjDnDBJygdFyl4wiTS3egJPnYrguuuiii3MCPRedem57NHBk3A6pwLxzMVwXXXTRxTnBnEmQSZJ/xP2gaDjhrv00vTSigB12tVqSJNrcf/p+uiFBXXTRxY8ec+7Fvuqq+f1RT/ktgl40PogwbKn/XQgv7KhUsJwBJjNIr10G2UUXXfzocU7iICsV9AfnL4k5nG85//zYKpXv1pMksStv+uT8eKy0RtyWqU9U8U1cU5e9Mb17qtU7anNPWxdddNHF7HEOGOTUTJpKBa1UsC271kYLjh79zyL6bnefP3F4b5JzxLEPvrhw4Z/v7sZMdtFFFz9CnBMGORW5On1V5YLVsUT/CNJrlnXcUzXg+JfU7c5K5ehQ1x7ZRRdd/KhwTsJ8JqMpTW7dzlJc+swykBZ3HpcdAfcMkVAGLVerKHl8UBdddNHFDx3nJMxn2sHMFYrEmrbtPyQxtosuuujitPBDlSDXbwgqDo4grUTtCRJkF1100cWPC+aIQc4uZMdMLAhtzDH/lo7KdhdddNHFjxZzwCATXbuWCNZO8/sWBgdfUvhuCh75hN8mM8P2djfKp4suuvjR4iwYZKLXvq7/YrGeD7jbIBxF3NskyZZ/JTc9LkyBBdP5XNxBwETV8OwwcKJSwarVM6ewiy666OJscEb6bJIkWq0uXOkS/ptqaZ1ZSqsoxQxwU/f28J7Jxzil6LwnG/aDD2zf+rtbz4S2Lrrooou5whlLkCa+LmjP8ix9KXUkEloWxBm+TaTwnDsmok+L6iHcIxcxaBzP0h98bnvlxe1szetLnu0JdtFFF12cKc6YQbprjLgiolKECzXlwVN9Fz2kmdumyPyhNLhGmRhEI9XqnceongFzLIpg0A0s76KLLuYILQaZJAobIZFZMphsgnQ4W7g7ICaAqp2oXHfs4K5dREePthsnZ2BySdPOWS2+K5bTvLG5rcsgu+iiizlBziCTRyIWDpY5ursO5PnPic8QunM3ofgvZ46T2eSp2tB04iRJYkmSpDOmFCau44x77e6II3GZ0s+U0bEyvq+PTc/2Ic8tw5fGJL5l9ky+iy666GJ65AxyydJVuN7OYh/lM88OIQwjz42QygjKMJ6OYlajhzqhd5Q7qFPJO/Ai7Lv5fx7VOHO7CfdZZPJsPtwLe9fxmb2D4H286IuJWYTqAvS8BbgsRmwAGCTL9gFb5mhuuuiii3/lyBlkqsuZN+8OsvogIaqhOgqhRikbJUtHca2TpaM0pE5afzBJNn5m/bb7VGkP8p74/3TtcSapBhODIjvDvj9I+fy7kbCGtF7GrBfPYtwUc8vXd3AIEdC5AEYXXXTRxZkgZ5Alt9yg6BH1sX5gfsHbNOdnriBQ7jVOvpRWqH72rHVYY3bGSytFNBqLkXSQrFFInN70hBffbmiYZYdddNFFF7NDIUECJcgZjytNxtiEA7iRpYqQTu2mubPMsi2AIGKz5LMCmOKmHeMtu3yxiy66OAeI2v6eIthbirVlRGGyq3imlMHJ7bbM60ICzMuatSrsTlmXRrFZqeNddNFFF3OIXEXtIBNOz5CauvfZQ0TqANXqRH47qyK5XYbZRRddnGNMlCDbMUWY7MyR2r3Ys4XjiKC4r61UPnMQsrJpi0lm+olDpfTE4Wo16cS6p6Gviy666GJuMZE1+mTD4/RcyFWsGcRzOpCWAKogHzGyjwATdPbg8QF06d2Vyv2fn75WRbc0WhdddHFuMclJAy3GM7lG4xSHSwp5QLa7W3uwT4t1easHkem1cqHVrWMi0XIXeY9Qa/LHtmOno+cnH801wydt6wa9d9HFjwgdVOxTOVya8N2W1YdE4wXi2YxH5BFERidm5u75/sVPDmAZIEsta/QC9YnHdex9GhrPHJ2YVbH9HDCsRG+6aaCvWg29k3+pVDanlcrzx//lMMr2eW2d08SVMP+lnOuPEdoz485Vptnk7LvTHSdxhbvJ04anw91nXm+hSV87XaeYl4kqdrsXe4oGOy7iWZWKVbJtu2HwfZlnG8VZPC1RCuLgbgMg/ePVfMaHLAZpfakI5gBxTOvHSUzwHGrY0zHHczXWU08tKZ8YyX4f918uwt5VwAwipfF0tbrkvUmS/EQzyZwBJkYClSo6NFRELly0FtjNll1Q1P+05vz/JJ9vF2eARGxqrYV2VIqaC8nE9ONT9lvUmWj2u2VXG9/bDbuHLO+bKf1Ob4OcUqpxIiOrVLAk+e2HIdl62WVLykuXTkfd8wCcGB78UAjRfzCrRyAzVBGapTR4jpjjbbdtiavVY+sybIUIRhaADIJHiB4DHprrMYeGxqK4HF6uIbrYLVMpXgiRBixr1EulenzKTn5skWilglarS/qvrty7LFTlNSby6gWLfJkg/Rw7rrB4FOG4kR1av97/6aGq7CXWw5VKcnxGR10Xs8Omb61A9l0OGXhQPv2tnfzOq/fOWf/JIxFLll2CPbsq3yCK6yj3f2c7d7z8xCmP37Ir5lhpGZEuxp5dCroAedl8JJQR78ElxTmJ7x0G389nnjuI7B0i8eP5+DMwysSVnzown/i5FaitI7rwSk74UpA+xFPcj7P0woPw3C42P/c0YfcBEj/R7HN6RuU+KS6yybgKKRVyzpwk9tRTjD711LQUKsC111nqba6Yyd7vZnvWPvEp9J09KpUkOjR8qC/WeXeKh7fnGToOLghR5GZPcg4Y5Lx5wTL31C2z3BSRM0jLR09H53rAHwKaUmC1urA3w25Q4ZYS4Ro3WyUiKqJ4YcMW0DyyIeBqtZLqARq+AwY/BTz+Iz2Rn2Q0JSd/7mpCuAejTKlkYB8C5oZBJolywZJBotIHSeVW8BSIEB2hkd4BfKHJJzof78rRby9nXvmjZI31CPNxi0GLpBAthCEDF0PCMCE6hNsOFu39Mg39exIfmZZJLn52HRq/DS29kbSxGhFFFEQUHBzDHUxSotJBTP+SZbs/1mSSE+MgRVpSZJP5TG5PqEp2ahWoZVcquivY38QCFq32KVleJ/rm0ATZM3aeQkCQCCd2J3aIEVVkJsn37CCtOyEPgZrgiPrJxBe/uKScuX44aM/HwX8NfBU47hlmDSyr5x+r45ZinoEQ46zGeKuJLYcfrsnjXxaaaqUoqhEiMVEMOoPD9ExQ0lVIuJjcfFYGIkLUj+hNwKn5hKS9qCwDGaD5rIWIfBGWDDzL81OiHiWEftzW4PZOeno/TmQbedm+pR2rj21+9hqi8iZEfhv31WgUIZr32RiDtFgJQRVEIpxVGOsIvdOo2DBVahxvnzkXShL42rai+0nGw9MNE+pM31w7aQzM8WbON27F2+aHgJ9873zTrnre+endIfT8dpaNxTiKoHnWapvtuWi3NRRxQ+WAethd9Ne1RZ4NJrAOn7uKqYkra3dHHLN1pPXlxeJTxRgZmN/A//vcfN75yuHpO7kb5J2FFJfm6cRwgKzxNwj/E6eGiaLWh6SvxFmPllbgBo2xBcQ9v0Wj3s/CAx8i8aFxO+aSfZcS9XycrL4OMyOUFLLDGF/CfRduI0BMlr4c90twW8d5fQsYPvY1vvuq4dxZNNmL3ZTOxnmYTGqfBQwIs+lqMmMYyw+cvEs7fXMNV/WiMlBLqJbTZ+b/SrFlF9HCkfR3Qii/O01PxiIStU+d5Kq1tiWdGoKKY/nLCEXYWS8xVKkkUdcOORdwxl/ycyk/vhAW0Ft+HZmVUVXS9CuUoktxHyREqxitryfxvwdmthU26z3kmtROTD7KC684NuWY+7/TT73+a2j0XsxXkDViSvHtZNn/4MIDnyHxlEXfHsDlA5hdipmhoY5nW8jC3bzn5QemjJ24sujAcn7w4luw7AtTnTQT4iCZJtJnbpjDqXtpqdo5q+yZ0OrYyU+usNUBk+M8f7JQLOi2lhDdlqVjfcJEdU5EUxE9CLbHPT3miKlIHxIGUF2M23KgTJb+c2znDXdXtpwrTHSyzgkSMe57bjlZdmmxxRC/n6h0F5ktQAOkfhNUv0Jy/Wm85DwizSKuQ0naH+674bsrhlny/B+TvZQSlT5CI+1HrZcQ3sBIbQtUh5CfWUccX06jDhqBsJVG9hGGXnFw2kLgL6w4SCL/9+TNp1Gs4sxQVAxXhe+rBMuQIrB8qoMGwAUTFBEZcer5pJ6qNNo5oHvSALPeczycZdK24vuslZvJ/Z+q79kEn7diECfHJZ4+vdUqmrpfEcxX57p06zeRAOJfERu7B0r76uXGcM+YGMRlPOuzLBuUwKVo6UqX8Pj1679bb94/pzqHs6F5ch/5N0yOx5yu/5lspDPRM/m4TmOeaozZn2+bdjgXKnYzHCYK1yC6ODdLZUOkPEpmr8eya8hSRaPXMPiy5SR+4LTjIrdhU45JNirPL6mx8MBfo+k7CKXX5GdkawjxAi5ccZyxxsWk9aW4QVwe4eTI3zH0qoP58dPQMA3j7BzmM9lDfJYe4yRJ7NprP/Gwp/V3hKh86cyKtqu51zJPv9DosSPAYO5JnkRnRw/73KEps+aUztx/O5NKinbTNzXl+5QPcbOo8ERUq2iSJIz3P8n5Nf3DO3176kOXKLPstxOSJNEvPzHQW66Fi9ysb9zmSG6gcLNhj/QDgeN7Ad5wVf6oVquMAMe2b0/23XbbliePHv3eFqE80hw3/y5oSzoO3U7EeJhFqyrU7BaBa55ra15a85Mk01/D6embpRNz/LgZmanl3uDmhsljnQpzrJWMMxq/CRUgMpxvsqh+jO/V/wcS1fAsJu5dRnbychLZf0rypqDDGlOJ5PNwdOMQS57bQ6nnNaR1cPqwrJ8fSMw8/Rncy+ApwgjoPujAbDuez0RMVLHbvdhNJjQeG3l2TOjrX//9pyuVe/+NWe0t7lZkjDTvvxZt4sFcbU9w2f7El39vhJvfNJinNLbR1ZG+uUXrwW6Xb6dWLE+SRLfsWhsNHj0yuH7Dp1bLtvCaRwivuA4WQBY/4jricOhasn/m2vt2fPnL6QFg+HSlnaEh9KuP9i+9Juu5YSty5XUbfCnmPLJN9nuWfSPL0scrleRwXhkp77dS2bQiwy/11FJVVVOxrdsye+3rP7Xz9a998UheZm7higy9/LrruQp0BdssAj3yCPbPlcq926vV3j1JktRnS2vISmURHURzb7XguIuJBpzs4Ne/dmRPMXPtqvN43xddtDtNkuRYs33ZZZt7zz+/foUZ860qputVATz69KEXLxh8ZvDobhsbmz9fe3rWbt2u16x3+XnB5rNBRrZW/cA1lU8+GNGzE5ITM9kyK5UkeuihRQPr19+76pFtevl118urcJaSe2VrW6scuZb0Wat86tFqNT5QqeT9VSr3l2H0cjMbaNJnKqbmCvcc2779vY91GqvOwou3bpPl11TMqIKuV0313oOPVe/aOXX/+8uZ1i6Rbb6Y9cWEVc2iikZZ+OTer3/t93af+so0X/fMnQ3yvj2X4H4NaUMRMdz/jtsvqrP52R2E6ABuq0nTAcRfxyef+wrHV00fjnMmj7Fbffx/kTpRGOWkKm5Riy+IgkzJUJstpqYaTpYUJ4f7nAWq1buOAPedar9WDF2HHzvSdy6NkNImQU50FiVJol/9av+yhfHRm116flHcLgcGkOZNEEAEcVdcUonCgbLKX1+74dN/Ua0e250kSZ0OaB9RALFQvmBwwVvUone523rRkN/iWkjiwm9GpWg7LL4HfusrkEuYW7dlG5Tojzx4DUHVzUTiUW003l+tLvxLM26UEL1PsHUQehGseY754pPRPhi9p1rt2wIc60DqjBhfkUhcPU9HXXbttYMXv+51Q8/kNHZUVydsmzcvW+we/YEIl6q4oYCLikd/0//9F38XLlhe6gn/HuRmcVla1CzNRxZXNfl3HvE3kl2wqVJJdnZikle94Y8HsrGxDaUe/SWMG9xYIKoTGEkeiqcaiR5w2Oos+KvLLttchXqvubwHid6q5PSpuEnQ2C3aWakkV7WPmSSJfvUbFwyW0ujDbtnNiqSIqASNStjDwE3ttFUqj0Rp2LU8ePRRd7+6SZO6mmsoq/EeYBYMsg1z5cVWuYFSOSIdM5BDYE8CUPf9SGMvImuwFOLyJdjoCrj7mbkZeCMs291PI1pNVoTqiB7ETx6j96U6dv4xJKQgkGXzwS7jwgMPkST1001TnL4e5GScczvfRJyWLekcO2m8k/yfJFqtXrA6RPGnIPrP4De4eb+54Vkzxq+BZ3XcU8AjsJUov68S3Zux4M1ffGpJOZfiOp9MMeWxpPZOJXwUZL27q2f1vN+sgWcNwMuOvxENH69U7nvNuBqdaU01KEgZJ0aIVUOs7ksz+A2Nev4Q/Grce90LWpv9muFuKyF8xCj/1k03fXL+bOIR43qtbm7H3a3wSkPLbCD9ov7Rr1YHr9iya+2kJYc7I4rE0JCiGmHEOLEEjZQwX+q22qV0r4j+O5ylbpm25iWPrQTvF5O3u0QfzbKB1ZP7r1TuXRzX7UMq0cfBf9VhgWOYNcav43if7ubmy8F/TSW+5/zz7feGFv70sKg+JSKG5/RhRSygyKpG44LBibdNYpr5MlFdKSqtawORO5dWKpsXTKRvm6mzGMIyEYnHx4AyeE1cpkioM6KIvT4rJIly/3f6gdcXy6AoIjtI64dJXHnx+SHcniCKR4EU95WIrJ05x7oN0wljSaLjtsK0VKHUs5YsNZAU9ypmx3j+sjruu4ii44hAWu8lKr2Z2tjVrL0tym2ns4+rzXecHObzI8aPX9zb1HmpVC9YnRE2icrNbul890wR0yYrLbJFtJ25upu6W+yZXy4e/vC8kcbNUyWacS++uhuOrBb0P7r7cstSLVxammcESB5bKK7uZu7Zmgzf+NBDixbkc+i1PI7eQUxx1KwRu8htKuH95o1lZinuZjjmbX2Cq3umjs8XLb3rByd1PcwmaPv7I0L2zyI6MjHeFXAzRG6MNHzugqGhjZXKp9aQd2rkJocpfTcaYybjBUscxNUtU7N0tbr/IcgVbhYVvNha8yKKgONq1oiRaL2WSu+f2HuirtHHReTd7tni/HwzBVcBXFAR1bbzUMSa46+QEH9w4dDQ73iWPSOqRxAMseJ6ZIjo/FJJV7aGK87RwnJ3W+qeX5e2/QfNGmsLm2lrPlJdhtsCt2J/DNEA5nvghT0zX49JmCsnTb1+MaXyGiw1oEaWfoOFHM+LSVyfYjwOHMctIksHiEpXMbCvb+blpAtMJ4s1+cLi564h6vkAWTqAqqL6NHbyAY4+MAoYFu3A/BmcCDMQ1hJKH+NY/MbChpnHSs6Clok7zCgl/ngwz444x8JtK+snI0kSrVQ2rXDCx1R0vecXILeL5a/nVELphIjsNfc9IcRDImEiE/RMRWWxEG2+9nX3XXLyZKaTw2HGz0noBe/L/1VUo1SQnKG17SqCmmdpFHpeE+L0LUmSqKnXJ3QoqHtWBrnULFuGmZL3aaKKeMs+JCKIiLplkWe2LEjpjmp14eBkp087kiSxSgUT9+2CPi46yd6UF0lWz7I1IcT/u0v0j9dtuO/Prq3c9+bXfnXJsi1b1kaTmWSppOZNHWe80ImD+EoRvcIsNQRVVUSDFT/bhIQrcfWsHrn7r61ff+/VkOhll23uXV8Z/AOV8KtZNtYLFo2fN2IaolGVsB9nt4TosGioC0W/goJFWVbrDaXeD6Csc2cvIupe3C3uphppBs0QGBLy1Etcf8GzbAGeL4ZXVLMy1aAeqOQ25MSqVbRaXdiL+s+6Zf15VpxAca+4yN9Xq0n6Q800ShKF65RM14MMgqRE8X5UHmf32nSciVn9ScZGnyaKQQKIVuixaSs2FCgW4ZMyJZayaPEyNn1rBfftXcnmZ9fw2b03sOQ7mwjRf8fSy9EIgj6O1d/LnWt35IxPjLtW7SPLPkb5vL2okku5cimBv+Wz+/8rn917Awt3D0JVT8UoO8dBdsT0XChx1yLwfE6QnKtyTKeBiT5yz62CrrlDRl+8WQjXFA/nuKoooiaqO71R36QavknGaCb1derhXaJhvVsWk8cwqVlmqqV+Se0DIZTeZ3gqjk728I8nZmrY75buMOe4qi4vJKeBPPOkuZdHZo35SrjuoccW/XUkmRVse1IuRe52EpW6oI+aNQ4gUtYQXeKWXTJZzc+7tyvAlkFy5NRe4Rf3Zb7gc0HjNe4sds90vB6ooI5hWcMQ6ROJ3i6kb45i/+bCRcf/qlod+AJwqOmpbzTESrGk3kZ38yxwN5HIVGSve7bTzU5I0NWIrMOy/lawQ26nVonVqN8CyWPnnffpimjp7WluP8sZjjuCGnAo8+xz5tnfSxSOq9sKcf6tiLzV3fpaHmGP0sbYAkF/CU+HNET1jCxu7w+4qDlfCfDahs0v9ZTWuhvuaZt06nlMs8vP33LL5t4vfvH5WrWKXX2j9pbSsAo3xX2cRvdsGPWvz3wXT4OzYqcb4WX7FuPhKtJ6nKuxjd00xiZ6qe+6aIRNzz6I6M1kYyC6CgmXksie6SvxCGCgcjla2gyhmTgQgffhtpigfWQpwGG88RUyPs6RVROl6MSVIzzEon0fpjzvD2iMrSgkXSPSd5Lpmyj1PsqSpV9G9lQ5fGR/EfIwTbmzM1GxN26EJOETu04ul2dH3+S/IhHuhoQzn37PDAKf+NWxR39/Tc/TZ9zPHKAV4tPGpAQbPHpk0CX+JfD5tN9qriYiJ9wb/3HDhmOPNjfv2rX20JEXXzyo5veAXOHuxUPratYwDfE1sTQuMbfc09tWetidIutEdpqnH80auj2ObbQRxgaiLHqnavR+t6y/RbXg5mgUrQhZulhdzCfFIgKIYwh1N/usRX5P5DIE9ahhsiYS+SOQi/OiGQV7dVPQxYJeDDyZJFPDh5oowmSoVuVLnjUGRMNHRaI+LyQ9mhlJuRqf21CFPjeviMrlaPn69Rs+/alq9dhjlQo0GuDixaJtE9ITTTQC829CfaNQ3yk6r4bbYkPuFA3vxrK+1jUS3DMQW1epbF7gkv0i7oMTcyDERMOwe/qpejn77BNfPj5S/HCgUhnYax56VUu3uzVyVb4ZDKa6yiwbVbeaIHFz3twzcF9dqfzU/GolGSZJrFTZNGDua5quxXH2KCi5mr36e99rLAP2QWKa3dcHvpKiDB5Cs97CHjLfe0axn2cjfiRibPrWKuKe1aR1I4pr1Eef4OjQMZKLWiXDAHTvw2SNEZBeNJSx7A3A508dD6n9aLSu+D9/EIpsXxr1lHweTiD+jwhD42M2+22mG76w6i9Z8u06qncRxVcDZRpjIKEfsVuReAORfpNFS/8W+/W/hOTI5MIas3fStIjPaSharqzE5f0CH0T0g4h/UNo+p9NG9QOi9gF3W3c6FJ17FGxSvJYSLnbzy3MnRpukpaqI/7Xasceq1evG4yIvumh3uviCC3YiPCAhGqG4PXMV1k1hIHO7HogmhDMB4KYhOu6SbQr0fimOXzherRwd/cbDJw6JN+7DssdEI9zb46QwdwZClg20r/Mz3qNDblPXrZbJPVE2dLBaPToK3x95fWXom5h/yt1TL9TUNptqZMgrZjNbuap9dHRkJPoTJ/tdYK+GWIubfeI5NhklmbpZn3t2q0rPPSkL3ghAb/uuzZNonoupB7sbjldh5ESlcnQUjh5Q5L+CPENbFXvH86ElLDUdW6caX+JmOm4eaaq41tiRxvqnN13ZZI5JEat5/DCBexxLc2bbJMrVzfpBBtzTWq5mA1DYFcNSiBZX8pU71Sxbi2XL3QxcwN3cyRMn3Ey1NKAlXdOkO8p8qbstd2tZs91NPfUdUDsx1ck3C5ypCJO4cv93yki4nLS+vAinOU4WHodKEaeZaDOPmedX78PZQVTKGZzZhsK5MzM8HSUdO0ha309aP0BaP0jWOIGIUe6NCAFCWM28+R/B5HMsfnbdxFqStOIan/+fX6KR3oll7ydLdxL1KFFJMQNPe0nTDcTzPkKJTWzad3F+bMtkMdFJMytPdfHMFXMgSorIqED+cUZo+0xoU7RpfSb9PuowKh3X3v7hYrKKXbzv64peJyrz80IWkjNJF3PLhh17II+N22btQc4PPLA7bbhvxX1IhOYDhLtoljV6Bb8cvJ/2cnCOiahmWX3Ig26tVr9br1aTwsaTWLX6vhMmfFk1dApk70uRPjWxKdIjmCg1cftiFA0drFQo+kvSJEksy6wqovtVWyFN7m6ImogOMkskSWK33PJ8bfsjd/1pGuQNZul/EtHdGnpG8WAgaev9InnxCnE1y2K37OJI40/Bomva+2wG0DuF9CiyY/vWux6qVpO0SX+lgp1/vu53T3eIaJ2mKNw80r2XNLrW8pTGCVCNMOVvH3voPUNF8HdxbP7/9q13PYbzpIQSTAjeFVWVsjsHRQPgzegzk1CanyKrxvcN4ToJIXYc1Qjwb6roweZS9OY+X+DSSmWccV+C+4LcOQOCpqLhmEn29Wrl+8OTVwSdHs2XPGcnQY6MDRDF16MaUeqBsZM7iE7sbDk/ig9AIinIA2SZkaVQ6lnOWHrD9J27FXRuh3Ataf3nSMd+lpPRzxHkZ2nUr4lUAr8AACAASURBVOXkS/8HIjuAlNEf9FMq3Uyp9//js/tvnVJkNxEjuT5l6JUHOLzyM8ThtaT1X6Y+9nlK8UE0GGZG/eR8gt5KpA+y6G2Xw8ZxJjnNu8QnqduT2y2IuYGnhtfBUnJ5tPPH2769rQ0pWNGWVPxUl3ASPefAf9SxSyNCfDWiJmBN+5yoIqqHTfwAdPbC+1jPQbf0cBFnaOMrO4orooOO9I+rn+MQBEZcs1pnlVYONetHTiyI45GgEaRtFq6m1wIDHcnwY3n17ok9RlGoC+SFSGWCGwiE0yrc25yHbzx858Ht1aGN4v4rno19VFQeEo0Oi2hK4RgaL3snglmmDstd+DCjcVSYGZjw2hJBjCPFSBPu48sue76myAtISPPzLc5B8nMQZRVu88enq/g2S8F9GtNOPoaITPrdEcFAyiqyF3dEirAmwRR6BVlRrWJr1xLltlyMgkE6uh2V/VLEznrWKLv5RbCkH8Al/KxoZDhWOHNURA+QsTe/dKeTauhn96wkYvREK/BsXe5gQlGG8f71fGbPGyd8Fu99I5959k14I8ZtBFFDxBC/iS27TnEfSUqqdY6uHeWui0Z438tP8K5XHuLoXzzO0OGP4GPvIEv/BNE6acOwdDUiG1my7JKOITxNafKOl9c48ud/g/a9i3r9DtLGnxLFJ9AI6jXQsJhS+WMs3bOqGZI0UcX2JuMZt8xPbY+jzSvj1BCpC1ITpCZyZh+EGlBDfHoJshN959SLPSFPPHZncOJdVgwucjzKQsfAb0isp+fQMHBMVWkvC+wO4tILEkNhMyzGbf2djjKvNfdoUz+104RMYbyGTX64kiTRRqTmkp9H03c/V2+gavWF3SLH/ou4v8fTsd8F+WNURmj6porxRFDPUhC9JoR0DWitKfw0YwUACFNfpM30wsyzurTJSs1XiLur4QvcPPY2ppFL9lkaEXUMiG97kRwZZw5FzwV6Ef8ndxsZZ+aOmmW94K+47JYl5YGBwWU4a1pFkQ1RnkD0ADC+sJ1GpeVZyJYmSaK4r83PurjOKlia7g2hdPA0pr5F55nGQTbVV/cKyCCWKY0xQ/RWouiPCD2fm/iJ/yj/lN6PWx9uSqMGGl/B96KVM4fYOJTHtPOyC9uMw2v2kcUfAdtCFEd5LCSXIvqOZsjYVPrb7J53Lh3lhVXbKcfvx+obCeEQGnImKXI5pu/gwgMxietEFRumMsJTqN2ipDmDo+ZCzdXqLlZ3L75ltm3qAjXwus2kBHSi7xxGII0/jrnEGkkeqNuyXTVvXJd6o6EdCysAVKuYIB0YqBgaVCZyiVlh5uq92Sn3mA06BsmfEZqmgSStVF44uGHDi19qjI1+yN3vEuFA4T0eH89xVKLY1K91UqWI5/TCwTPZMz89/cW3FDpsXso8br2AJrhL0jRk07zkmpCxcRW6SamBO+UU9uCyVzQycTcH3LNYkRXn/yCdLxGXiJb6MENENEsbdXWextLv5jZJDMHcWCoNX/zEE6v6EFbiha3U3VTDCGL/dGYLuZ3FszLOYPQNSGFL1qBEpQFgGSJLO390MSGKgNzuV4oW4375zI4agU5l9NvV96MrhsjsHiwbHY+Qc7uVe3f1zZgt01L/jRUHRvDz/gRr3IOEEUQhrZcpla9mNFsGc/AEpSmIWj2gGJh625uh+aKcZdudVHBcT9MGOUfPcLWKVSpphER9orlHeFzykkLddclVhZz28ZqGDr2lkk3jUUy0Urkwdk72NVlqy/nh6m41F6nLhBqJZ4hxlTLMvN8s0KJzbkX05hxVKsnw0MJlWwaODcVBo4+5Wb9IW9FVHHHWgMduTRUcaIsBPRXG59llvOakC3VEwFrsMZckJY4yZszbdbfzRbStXsr4CGnJ5TBBtnor9lFxjBAPYukCsNeqKJm4iUQK2d5K5ej+rdsu2Ccan3DL+t1dRWxQRFaMjIwckuCL3VtXwtyPoZxe9kzz/Jrc8UxtkPfuvRT8NWSN3K5kthfP9mAetdJrOw3tA2i4FKxMo94P0ev4+D99ie+fGMkXy/r26dHRYq5P80f7dhNK64qCFSuQsJIkyVMaT/UCuf76lOQRWPgzX6As/waXDQgpqsvRxjIS2TdRxT6ddMKNG4tDPBWRmkNNoO5IzZGaS/E5jTbqNReti4fTu4RzJEHmapSWaa7SKC0lU3Nj4xFROdQ+Ty0Hji2uYx09dEkCjdLIgIsvNjOgXfoUHDuheYXjlq3wNJhS59PPOM3whNPs/9Q4VQBztZqkg0d3W+S6WzU6RFtgeZ6P7gAxPiGb5bTombCvkJfTcx8SpD6+zEfBdTVEajbVeVOcSxF9wEpErKm+53lNggjHwWrm2T+4pXVENF9SRUxF+qGxGPe1ZllhRwSQJ5MkMXU9KKJDCCaCOl520VeGYKtVS3mWkGOiQS2r71Orn17udfPkzxYRNxKXI/KMpRouG3n+lb+Enn8bPaXpP0HuIpSeyV9KppTii+ntWwnbjLMNoHbJFwVzz71sQeaf4ohJqBiMHaFeP4Bqmj/O3otob37Krb9nhsjNTWuKmEEuR07Rfjrxu6nPjpF7XSU79xLkxLp/UKmgSZKk69dvWolk42EW446/nA8edOGo5OEhxc+Cu6mIDqpwCbBzciB1ksD6DaxRiRabp4wvN5BXuUnF0n2GRHqGrOicmmDPoP9OZdSa8zxRwk40l9qzMnh5siMwd1n5CYR+0dzHebr0tDQANHegaOruB1TCCcda0qKTB4wrVyVJ8qVOmkClcm+fua+T9vvZx42jB8BHXMMeNfYDa8wzlTy4e74RLhVhZV60Q3C31Mi+AZAGORwsPYSzGjBRAdFV7vYDFaWotI5IhEj69Wr1fSfOrIiwnNnNkiTKsn/fT+Pk68kaoAFE9yAndwDw/JJa5wML5jfwjv301J9Gw7p8jRlbidvFcN0cxDrnWWb5v2ago62c71nWg4t+2vAf1HKeZNY+SR1Y48RMjqntAm2MXyH1fGU6y4qU2BwtBaa1TSe1WxARyzNWbAYJshN9p4/JD0ClklCpJLr1Eb9LVPvNsjw+zwsmaKkiPEua7XMNI7j0uuQ5u7ntSGNxfxvwp8UImveLwoVRaiOvV2WBu1vTGC+CqZaGU8+eELefZ8JbY/bnNc0V4mwtKGf2LCVarS5a7mK3O/5MpXL/1mr1jmm88HDllQN9mcstkqYrEJ9EsIDotwS5zJuhQPlmbb+zZsbE2VEJqWm6C5FDIEvHexHUrAGU3vjwwwvur1SS/fnSxq2eTLhRJVpheXC7FhRansrOznovwyHzuro+jdvaptfZ3frEea2jA4ghqoAcDsiTAFHmQ+bZXtFSxTyFzFXUVpl5LJKNu/TMGmTIGdZXPxsv9kZo7LuEnvJqxk6ChgjsSYLlDq0Z6ywmyvFVIyx69h+Ie9/C2EvzcesnlK/ip1Z8gUsPjHB62eQth9GSvQO4ryJLc6btNkw9O3L65/eDXlwGsbQo2yajICMwOdVwfIXA5k0jrfY0T4umpRTSmqOWhzugrcfcaQmUxcbJAmZ72y0X1CSawYvdib7ZY+3aJB4cXHS1iS/1NN3nrieiKMRbt/pKUb9DVG81y3TcvuS5ucXhYObp0yX1Iy6lRxG/Ec8lcgTFUtMQ3bi+cu//1hjr+X96eg4VMWoLyyYnbw3S83bL0phchcpVJtHIspMHAjxs8PNeLHrkM7C8TpjgZsgdSLTbICevHHk6aB07OyRJYus33Ls60vPuzGxsmVntmfWVz2zH7B9V2Z8GhqJMLAvSGzJfaeLvwv1N7lY4UYq5QcnS2qiKPezwC+30nO55tJ+/4+oi+ywd+6ZoWGd56FbO7NxNlLUhkg/Coru3bHnhcJKQVqsXxnnNR/+ISRp5U5b1XMbVEO03sr+76crjI7t2ra0NHRv6Bwi34pTzQPJ0PrABsd7WlZKdwJE8E+aukfXXf/op1WjY0rQ/L4jhqwVZbtbIox60hFu2uyRHnzytk++E5vM203KsTSSee5Nl6XqcBagaGp2g0djG80PD8MDMYyWJkWxULNpO/eRhRPoRNczWMy9dyrZte1j0zkkHzeKhXvJ8GdffptSzgEbNiGIwHuPFVUdy73el5c2eaclZqkr2skvp6bmYRj1Pa/TsAMYhEtepSy6cUT1IrUsza2Py8ZM16RnahhgK0YTg3kk4i3qQuXTzU72m4VfE7TcJ0Ql1GTUhQhlAQtkss0lDGGAisr3k8QGIR8xH/0IlrMN1QdOp4DmTBJcPx3Hj1akt3HbttYxmLlep6O2epUvBtWlbaxaeyCz9XP1kOtRT1gjBcLS9HuRsMZVlZMW8hDNijNB8lGdPS5IkumULkWSsymx00N0jCdGlAusMUhOGg8mwo6mYlc19UDXEmRW1KNqcHqKKW/b5RoPDUezllg9b8NNw0sCkF4N7/gIJ/ldCuFHUV7lleYiNoG5ZJITbHR+8YHDwi1+r+rGgtVWWydtEdY2bjWsADiaqdcuyh+aVSzvzEKPd6QvbFz0j6BHwFYVwoUBuG3Mxx8zddo6OlIab8/a17faMWXZCkCKHXGKYGHcqKtXqI8k06uypZ2EqNkIyUzTARqCqLBlcisZXktbLedSF7CewO2dC15/aX5CIkTxygMVLHyOetzZP99OVqFxBkuxm0+3ka08V8OKZvo4iYHsjucpaqM6Lvr0Az94KelcRagRuJzC7H6rK4LLL0W/3k922k7suOjI1pKjoKxHj3r2XEOR3SRurwYxo3ijpS9tYYIcY6iRBTodpHDgaxtLM4xqSV0M5mzx4AcMhUzk9G+RpPC31uBzHKQs89zAOoDIghSrtZHnwdrPb3GZlInoos/pfBV48AZDFi/5eG/yChNJveFYvN1W+/CR8vov8RkDfCpK6WX9epqrlnRUXE1V1S78QGPt8Z4/zGbpG5Ix9lB26On0MDv5Ur6Gvxr0XUMtSy/3FROLaj0o/4uNOmMzSybdWKqqK2ZMe/F5ixnn9mUnAHc6jAcdeHHx84cKhTaLh4+QRNCYi6oJC1gv6JhWtAKPu3gfEZqZ5EXsHxDSUEOdxs9q9Dz74nuMA1eojkbL7oIscQFg5ZXwRUwnHzPyfb7nl+RrkNuqr3pDuK9X0gGi0sjBUNZlwbj7FasC2fP8zWXvHARRLI5yL2LT3ZngO/Fe1df81K+Y3289C9DLDWIPIxUVoD2SN3YTy1NUBZ0Jyfcpn9j6IZe/GHUKIsfQm4E8mO+EQYsT72D04zIW/njK6OyJ6Wxn2LiCTdZTC67HoTbgtAIworuPp54nqW7lwRR+mb0PCrdT9m2za8yD+rd2kpUMMMMxL56WE28qk+xZz395LifRdIFdjmVEqK86TpKUt7H5FSlIwtdmZqjo/sHWLLcJriMbkthhMMHVTkyh32bppvq1gPqKFimJKsX+zPwXIZggU74RZPjdJkthrX7u5TMziwnsMnqdw5fbrdkkjV/5D6BnNvPG5gD7ctpzB0A03fOIPGo3yAo3i2y2tNyWaXDV3U3fpQ9wQz+v3FZKPoIiqmttXAvLhavX7w5XKwl6bUUL/yUA+v5+YX4rDxS5mZm0vnPwFpLl0MEntzf/Ns0tCrJ6lzxD8w4svGHzm8IkXFnQebXbocGtYCKndfvvu9IknBv7kpZPyStHwW+T1N1NBiqfBcJMyeWFammuku+dZPSGU1PG9Da+//xtfP76nybSq1W122WVLDp/Xlz4jGq5xyyLaXroI6iIHVdnfnDOAN1yVnPhadeGOoGFDXui3FWCV2yzZL954uv2Y00I+x0paLxNKt1OK3zTrl3CWlUkb/eBQikcYe+kJDi87cdqLcIlvJ02PoNFg7qxhPZv2DY4vP49ofhvI5YSwGWSYWqNOiCKM+USlBZRKg2SNATzLmWpcTmmMfYGGf5yja0+waM9yovJrEF+KyFuJz9uAZ8fRxnFG/BiM1ElLfYQwSFxaSv1kwWR7FPchxkY/xNE1+5vnNlHgG1dX2yeu2e7MhcolTOCkZz7q4qPuPiomNXcZFfOamNda2/Lf3bzmxfb8t3w/cR91l9FsxjjITvTNHqVSvdexQciZFS4mxSdPe5O0CKlINcRDDat/eNEFA/8lL4TQujGvuebEIZEjv25p/ZOi4VirTmOzVqNT2NVM0BTHVCOTEB9yz/6vQPquavU9z7Q7AYq0RcPF2p+pjkGzraMoDMtN+ovtgbT15kvHf5dgrRTCTjjJeICqF7RIUQl4Fo9DVupRkFS1NKIarIitMRFJBTWcPG3O1fJ2HjKjoZRq6DnmWf2PLbLbtq8/+vBFF+1uuw/yfvL9i3Oc1eOpNK9JM60xyyIFuPLK4yPnzcs+hGXvFaI9QeNiPClSIL2Nkef0qqppKJ2wrLElqzdu+Ub1xR2txcEAEnvqqedruD2hWjohzb5a18c8G9sD9XEJrOn1D/A1MwMN7fsX9gd/cmysMTQ5rXLWEPL7BAHL+qifXEy9NrtPkzlqgLQxhPmjpx2ek7hy56uOoeEhQpQ7Yks9g3h6I9Rb9ImmqPQTQoWo52ZKpbcQ4lsJ0QbMLqZRGwSUuHcUZD+1l95Pze7k6CtypqZaJkQpUZybIhq1ftJ0JSJXEKI3EUpvRsONWHYJjbEBRCGeN4LZwzTGfpGjax5vJ7tDPcjJjHBm8axu5BWfFdP8T4H266gdtnVoN3OwZ7JBdqLvtKSvKBL0sKiWTaQPtzJ54QkDqSMyjPsQlu0Usb94tPrbDwM8MMkWXTwQtUrl/g+kfvKL6nabhJ5LgWW49UlegFVB6yI6jNgRS9OnTep/dnxo0WO33747bYZqnH9+ZN//QXZYNX7aMFQL35UEGo2TB0qlUsfsjgaMlDXeIRN0VDFERyRNR4AR1Z4draI2CrghOuI6Ntxxek6GNJSj/aj0mQYTXB1MpaSucqjt3Dvi8eoLB6+5ZvBOVasgvFajaK0QBtyZD152L7SWfC2WuiDH3bMhz+o7UR5UOfbQhmuxR5PEEhK9+sYoVQ0HBN1pmk2gJ5NakW43MaQqSUA0OhZC/DRCLG03mkjpsPjJ0eYSq0mSjFSrfLbuCx8LJreFKGxwD0vzXG0rjpVUJIwAx9zGnvEs+++qjYe2P/q+E52X+YVqlR0i4fEQlZY1tzuYalxv1EYeqX69FarTCpy/d6e7PR6intjVinPNXyBpdvJrPT3DwzOVmpsWlg0T9T4DVj4jI5ijBUNTRr/3GPN69p7u2i7jCPwVIaxFepSe82Cs9mpMHqdU3oPQh3kZiPHm85NnF0GooTJKo3GcNN2PNZ5ArMp7Xr13Qmrh86v3snTPHWR6IyLXEc9bBT6AWR9mEZiimiLRKBKOU39pH7XRv0PCF3jPq4YmO67yJ+uze2+g1LuZdGw5WTadwp3r6I3aX/Kq//W2ZFvFkkTs4986uQLxN6vPQV5b4eixzKvvW3teHmN1775V9ER/i9uaYvW0Dge6EfVAlj3N83922UwXr1K5v5yFk6s9s+UqMmDIAnWPwVLxMOyeHVHVg8C+SuXo6GzVmZtu+uT8kZFohUS+SmCxYX3iquJ+3NWPqLf6hElMJkn0tV/tX1YqlQbaOWFQVxdGouzY/k6LTV150yfnxyO6KgstVScGsiAWsrGDJ08Gi+Ppf69W33dicp+33bYlfv740Apx+jJrHRfU1cZKx77xjTtPmQPcZBqVyr19WQjLQ9YYNNEBy7yfQF4d3RkVYVjdh0APQe+havWOGsWSuW3ZNhEsXJGpz59MTzAZrlbv2teJhqtv3DQY123p1DeLpmPn6/6nvnjnuFzelOB27VobHTl+fJVYusKdpYL3g0YOI2I+BHJo3ryePQ8++JvHTzUHt922JT569IWVmUpvO90A3jN28B8e/A8d+kj06spPrw1ZiJvX7FTXa1b4410D1MMymqnFTWGoUXzP1G7/PxJljCF+75WHzogOgHt39SHzVhIKPpPKML3hEA1bTqO+gCjqwzxGPcI9ArW8iogWoTc+hDeGOLo2v36d1PymY2fZoX7Sl1biuhjxAdA+3CPUR3E5TqZH0Jf28Z6fG5qO3JzbbNqzgZ6+zaS1FTmX7Yj8DdKo/w090duS766oJ4nYJ58bXeaZ3+yEGMfOyktjBqpIJtX3ru3J04U2P7sGjf8WfNW0DNLdKPWAZzt41yt+YeoOE9G+/nG+ZOtLOjT0Xbv9dtL2dZFP19bTYgxJBBcW8/jdZimufK3safucSXWa/phKBW0vedUsk9XcNt3veYzf6fU78zEdeimqgrevTz15/NYa3zP1e/r05BELE49p+3WasI8Wc06SRHftIjp69EJtv4ZF37Ocg6nX9NTzOPGY2V2vU5Exi3VgZoWqwjY7Y+lxCj3NcJxpajlOe9wM+0zYv2CUrf4Vqkwc8+4ZUxJzbrP52Wso9W6mMbYan4FBaqRY+ijiv8Tzq4+TiG1+1hec9Nobxa0X1bP0oBpmmhJk+/f//P88kCSJsenZKwjRF4EFZOn0EmRpHmTpdt698vrZj9fK8ICm6jIXC4ZN7vfHbRGyHxXaM2pgbub63GFittWPN61dzAKniovsACFxZelzl1Cat5n62OXj3qGOfhkB1b1kY7/MC6/eTSJ27y7vS8NL17iEQU5Zx/HUUPfR1OZVhx/gRJKIsXnv2xG9H/N4gkNmAn1uxL2QNv6ad6+8bVYBsF100UUXp0CzWMUwaTact8fTuXJMKExrRqmnHymtgbtJ3PXoEDVTjoh7TfC647Uz/Yh4aipDw0O0ORDCL6AhHndZji9X10afA5aBUtjHZrn+bhdddNHFDMgZZNw4QTZ2pChZNFHymqzSZul84Cou/PU4AZLrJY0bHBHXE47XBK1LpnWh7XPKttcFr5tRH3Pbz7a7cxru/04ZYUPhYe6cqSPFtiyFzJ6d+ynqoosu/rUiZ5CH1p7A2UUUj+YS2jRhMyJKlsbEPeupp2uboVBHh847JioH1b2mntZUqam3fU7ZDjXB63h04OSreo/AxrwOx8n6G9FwMWld8WncP05RXUSOIeSOnblcg7aLLrr4V4vWUonC0+CdY+Pa4Q5ZuhbRm1m4u5ck0eR6SV+M4wOWlo5khLq518y9ZqH4tP/f3m7bniHHYi/tTUQsgTzfslS6sxhzyuJTEyGgYTcuh7r2xy666GKu0JLKgj5NOnaIEGkH70wbXHEvA/8WDVfkbnTX5OVSmzcW71NPjyleV3wio/S2Txtz1NTrkqbH5WR939G1jJK4suSpMpK9EwmvIa3TvnznFIgYuGHZDsbsBFw3RyENXXTRxb92FG5vMf7XoSNktpWoB5gpk4XcIQIr///27ifEruoO4Pj3d869972ZvsQYnTCRYEIYUpmFRBoGXdVAd13ZVpe1QWiKWVYLUkrvUIrYLooUq6YuFARtCy5aKaWbDLRKrS66KLY0dkwlZpKZMB3j+ObNfef+jov73sub/2/GSSPl94FhOMx973Bn8eOce3/n98P5H7L/vapgZR7d6RPS/O++xrRGuaROm1LGIJIUErQQ6fsJWlR/06IUuVxvNqY/Or7vWt7dGWvjXlz2CGW7AVvkcImAS66i5RvMjy2Sn7zpLWONMf8fVi4Vf/HPu3H+LYQM7ZSFiquu7tWHFCWtKaF4lVA8ztzs1W4CZh6jOzhDPSx/spdm0mg5XHSFYxnqaaaFoknQlk+GFubGaeYiSn4ugfuVQ++fILpniXo3ZTtZVeVj1ePRCN4r4v9AaJ3hyl0fbPsAvTHGbGDtXvr5f7+C9w91muC4zXfbUcnqBWX7t8TiKW6Nf+fd8dAfpPJzMeEIyUhzLoER5marPtj5SQnXM+MnYeTBYZyfIKs/g8a7KNsbTLpq/trwAq3mE8wee2GrrHhjjNmO6+Gv+3Lj7L++giQvEXWUUjcPkFW2tuLTgJbvoPpL2vIa82OLOZOdjhAb5CT2H/85cP5OvDyE84+AHKVsb/0cMaIkCSBTEB7mw7FLtno0xuymleEvzx2HH95LO/wY5Nuods4vbkkRgbQ2S2vpjzh+Ra35JqfuWVj3HGg3kD3z/ii++Bo++zqRE8Sy0TvJM8iczjtUH+Ty2GsrvtcYY3bB2kiUR8fBfxwn3fNzQjGBbljdp09nJQmQZAqySFieBvkLTt6mHS+RyiKxdJRxP94fBb5EZILa0CHay/XqxU/cOjjG7vPPuqLlr/mweQpWbuuNMWY3rB8gc1GeO/8NstrPCMVoFSQHLNsdY7Wa9KnDewgBNFR9dKvVaB2fgnMQ2lAG3TSNZ+0EikuA+FdieYqZV3Zem84YYzax/vY3jw75wu9pffIsiEOcDlyUVsQRoyMUyvKSom065wHrIBkxQnsZlpd08ODYPd0TOw165AKqP2UmTG/jXo0xZls2Xhbm0XHLhb0Mhadx8k1Uldh5ntjrM9qp5r3huG+K6+lBdBqUDPD5vjFU5eLTbJ6y/AHt1svMjTdta22MuVE2Xr3lonx05Bqe76O8iEsCzmkv6PWauMsm41U5jL1CE4N+vvsVUq0c01qL0H6C1L3I3G8sOBpjbqitHyzm0THy7gF88jhJ7Vto2IeuetPcW+XJjRgr3iuRi8T4JKfHzu74bo0xZhu2fv6XizI3PovwJGUxSZJdxGdVWbQYtfNWmV7zrN0aRxSRquct7k20/C4Mv3xD/xvGGNNnsLfHuSgzx+bJ0rOE9hkiUyRZwCeuU0OyIn1b452Pq+CbZHRSh14gLJ1hf/t1Zg62dnSXxhizA37gK6cmI/fcqnz8wHka8+dQvQJ6lNrQHlQFYlldGGVNy4beKrFroz7bUqXwJGmLMryDxu8RWs8xO36JuRG1Z47GmP+lwQMkwNRU5H4RFh+4xmO3vcFXH/0dZXsJn9ZIa/Wqx7QH5yIinf1ylPWDo4A4xbkqenrfojZ0haL1JzT8BIk/4jvH3mbiQCA/qUxNbqf5tTHGfGYDZn+vo9eshxRnXwAAALtJREFU+8uOO0aPojIBch/p8HGkPEQobyfGYbzXNdNEdagqIk18chHVC4Tib0TewvNnTn/xam8OSwI3xtwkOw+QcD2Adc9b73+vQcYhXLyDUu9E/GHSZBTxDaJmAGhs4uICoZyB+AGlTEOcxV+7zMzrrV4fW2OMuck+W4Bcrb8Rd34u4fCRhI9Dxp7EsdC5xgfFF8rwcOA/RwK5hF4tSAuMxpjPkd0NkP16W3BYWfJssjPu/LagaIz5nPoUBSp4D1AF9yMAAAAASUVORK5CYII=)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Benchmarking_with_Harness.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**LangTest**is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy**\n", + "models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification, fill-mask, Translation model using the library. We also support testing LLMS for Question-Answering, Summarization and text-generation tasks on benchmark datasets. The library supports 60+ out of the box tests. For a complete list of supported test categories, please refer to the [documentation](http://langtest.org/docs/pages/docs/test_categories)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook provides a comprehensive overview of benchmarking Language Models (LLMs) in Question-Answering tasks. Explore step-by-step instructions on conducting robustness and accuracy tests to evaluate LLM performance." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Getting started with LangTest" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install langtest==2.2.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "0ZVlGWBJyGO8" + }, + "outputs": [], + "source": [ + "yaml_content = \"\"\"\n", + "model_parameters:\n", + " max_tokens: 64\n", + " device: 0\n", + " task: text2text-generation\n", + "tests:\n", + " defaults:\n", + " min_pass_rate: 0.65\n", + " robustness:\n", + " add_typo:\n", + " min_pass_rate: 0.7\n", + " lowercase:\n", + " min_pass_rate: 0.7\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The content stored in the variable `yaml_content` (which should be formatted in valid YAML syntax) is written to the opened file using the `f.write` method." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "zPbGsd-Iydxv" + }, + "outputs": [], + "source": [ + "import yaml\n", + "\n", + "# write a yaml file\n", + "with open('config.yml', 'w') as f:\n", + " f.write(yaml_content)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Harness and Its Parameters\n", + "\n", + "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the LangTest library in the following way." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from langtest import Harness" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It imports the Harness class from within the module, that is designed to provide a blueprint or framework for conducting NLP testing, and that instances of the Harness class can be customized or configured for different testing scenarios or environments.\n", + "\n", + "Here is a list of the different parameters that can be passed to the Harness function:\n", + "\n", + "
\n", + "\n", + "\n", + "| Parameter | Description | \n", + "| - | - |\n", + "|**task** |Task for which the model is to be evaluated (question-answering or summarization)|\n", + "| **model** | Specifies the model(s) to be evaluated. This parameter can be provided as either a dictionary or a list of dictionaries. Each dictionary should contain the following keys: |\n", + "| **data** | The data to be used for evaluation. A dictionary providing flexibility and options for data sources. It should include the following keys: |\n", + "| **config** | Configuration for the tests to be performed, specified in the form of a YAML file. |\n", + "\n", + "
\n", + "
." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "P3O9AFRlz2y5", + "outputId": "7ce24c8e-d92f-4f52-98ef-a132bf9989c1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Token has not been saved to git credential helper. Pass `add_to_git_credential=True` if you want to set the git credential as well.\n", + "Token is valid (permission: write).\n", + "Your token has been saved to C:\\Users\\KALYAN\\.cache\\huggingface\\token\n", + "Login successful\n", + "Test Configuration : \n", + " {\n", + " \"model_parameters\": {\n", + " \"max_tokens\": 64,\n", + " \"device\": 0,\n", + " \"task\": \"text2text-generation\"\n", + " },\n", + " \"tests\": {\n", + " \"defaults\": {\n", + " \"min_pass_rate\": 0.65\n", + " },\n", + " \"robustness\": {\n", + " \"add_typo\": {\n", + " \"min_pass_rate\": 0.7\n", + " },\n", + " \"lowercase\": {\n", + " \"min_pass_rate\": 0.7\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "harness = Harness(\n", + " task=\"question-answering\",\n", + " model={\n", + " \"model\": \"google/flan-t5-base\",\n", + " \"hub\": \"huggingface\"\n", + " },\n", + " data=[\n", + " {\n", + " \"data_source\": \"MedMCQA\"\n", + " },\n", + " {\n", + " \"data_source\": \"PubMedQA\"\n", + " },\n", + " {\n", + " \"data_source\": \"MMLU\"\n", + " },\n", + " {\n", + " \"data_source\": \"MedQA\"\n", + " }\n", + " ],\n", + " config=\"config.yml\",\n", + " benchmarking={\n", + " \"save_dir\":\"~/.langtest/leaderboard/\"\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MVm3XwHr-qNa", + "outputId": "7ef92ed4-11d0-45e8-e1a2-0c8be708cb9f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + " MedMCQA \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 1/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorydataset_nametest_typeoriginal_contextoriginal_questionperturbed_contextperturbed_questionoptions
0robustnessMedMCQAadd_typo-Highest concentration of oxygen is delivered t...-Highest cpncentration of oxygen is delivered t...A. Nasal cannula\\nB. Venturi mask\\nC. Bag and ...
1robustnessMedMCQAadd_typo-Steps of intubation - arrange in sequence:- a....-Steps of intubation - arrange in sequence:- a....A. ABCDE\\nB. DBCEA\\nC. ACBED\\nD. CBAED
2robustnessMedMCQAadd_typo-Tracheal secretions should be suctioned for:-Ttacheal secretions should be suctioned for:A. 10-15 seconds\\nB. 60 seconds\\nC. 30 seconds...
3robustnessMedMCQAadd_typo-Which of the following nerve fibre types is le...-Which of the following nerve fibre types is le...A. A beta\\nB. A alpha\\nC. B fibers\\nD. C fibers
4robustnessMedMCQAadd_typo-All are true about rapid sequence induction do...-All are true about rapid sequence induction do...A. Inducing agent and neuromuscular relaxant a...
...........................
14904robustnessMedQAlowercase-A 39-year-old woman presents to the clinic for...-a 39-year-old woman presents to the clinic for...A. Erythropoietin\\nB. Glucose\\nC. Triiodothyro...
14905robustnessMedQAlowercase-A 38-year-old woman comes to the physician bec...-a 38-year-old woman comes to the physician bec...A. Celiac disease\\nB. Carcinoid tumor\\nC. VIPo...
14906robustnessMedQAlowercase-A 21-year-old college student comes to the phy...-a 21-year-old college student comes to the phy...A. Trial of diphenhydramine\\nB. Complete caffe...
14907robustnessMedQAlowercase-A 19-year-old man is brought to the physician ...-a 19-year-old man is brought to the physician ...A. Social anxiety disorder\\nB. Avoidant person...
14908robustnessMedQAlowercase-A 79-year-old man presents to the office due t...-a 79-year-old man presents to the office due t...A. Asthma\\nB. Lymphangioleiomyomatosis\\nC. Chr...
\n", + "

14909 rows × 8 columns

\n", + "" + ], + "text/plain": [ + " category dataset_name test_type original_context \\\n", + "0 robustness MedMCQA add_typo - \n", + "1 robustness MedMCQA add_typo - \n", + "2 robustness MedMCQA add_typo - \n", + "3 robustness MedMCQA add_typo - \n", + "4 robustness MedMCQA add_typo - \n", + "... ... ... ... ... \n", + "14904 robustness MedQA lowercase - \n", + "14905 robustness MedQA lowercase - \n", + "14906 robustness MedQA lowercase - \n", + "14907 robustness MedQA lowercase - \n", + "14908 robustness MedQA lowercase - \n", + "\n", + " original_question perturbed_context \\\n", + "0 Highest concentration of oxygen is delivered t... - \n", + "1 Steps of intubation - arrange in sequence:- a.... - \n", + "2 Tracheal secretions should be suctioned for: - \n", + "3 Which of the following nerve fibre types is le... - \n", + "4 All are true about rapid sequence induction do... - \n", + "... ... ... \n", + "14904 A 39-year-old woman presents to the clinic for... - \n", + "14905 A 38-year-old woman comes to the physician bec... - \n", + "14906 A 21-year-old college student comes to the phy... - \n", + "14907 A 19-year-old man is brought to the physician ... - \n", + "14908 A 79-year-old man presents to the office due t... - \n", + "\n", + " perturbed_question \\\n", + "0 Highest cpncentration of oxygen is delivered t... \n", + "1 Steps of intubation - arrange in sequence:- a.... \n", + "2 Ttacheal secretions should be suctioned for: \n", + "3 Which of the following nerve fibre types is le... \n", + "4 All are true about rapid sequence induction do... \n", + "... ... \n", + "14904 a 39-year-old woman presents to the clinic for... \n", + "14905 a 38-year-old woman comes to the physician bec... \n", + "14906 a 21-year-old college student comes to the phy... \n", + "14907 a 19-year-old man is brought to the physician ... \n", + "14908 a 79-year-old man presents to the office due t... \n", + "\n", + " options \n", + "0 A. Nasal cannula\\nB. Venturi mask\\nC. Bag and ... \n", + "1 A. ABCDE\\nB. DBCEA\\nC. ACBED\\nD. CBAED \n", + "2 A. 10-15 seconds\\nB. 60 seconds\\nC. 30 seconds... \n", + "3 A. A beta\\nB. A alpha\\nC. B fibers\\nD. C fibers \n", + "4 A. Inducing agent and neuromuscular relaxant a... \n", + "... ... \n", + "14904 A. Erythropoietin\\nB. Glucose\\nC. Triiodothyro... \n", + "14905 A. Celiac disease\\nB. Carcinoid tumor\\nC. VIPo... \n", + "14906 A. Trial of diphenhydramine\\nB. Complete caffe... \n", + "14907 A. Social anxiety disorder\\nB. Avoidant person... \n", + "14908 A. Asthma\\nB. Lymphangioleiomyomatosis\\nC. Chr... \n", + "\n", + "[14909 rows x 8 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "lat4hO76ATVr", + "outputId": "c056cc6a-0584-4ddb-ae68-0086faa0a6eb" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + " MedMCQA \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 8178/8178 [05:54<00:00, 23.04it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n", + "================================================================================\n", + " PubMedQA \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 2000/2000 [01:34<00:00, 21.24it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n", + "================================================================================\n", + " MMLU \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 2135/2135 [01:29<00:00, 23.83it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n", + "================================================================================\n", + " MedQA \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 2596/2596 [01:49<00:00, 23.67it/s] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "o8tlvlj7IIm3", + "outputId": "5a667aca-3ef9-418d-abf9-4e877874214f" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorydataset_nametest_typeoriginal_contextoriginal_questionperturbed_contextperturbed_questionoptionsexpected_resultactual_resultpass
0robustnessMedMCQAadd_typo-Highest concentration of oxygen is delivered t...-Highest cpncentration of oxygen is delivered t...A. Nasal cannula\\nB. Venturi mask\\nC. Bag and ...AATrue
1robustnessMedMCQAadd_typo-Steps of intubation - arrange in sequence:- a....-Steps of intubation - arrange in sequence:- a....A. ABCDE\\nB. DBCEA\\nC. ACBED\\nD. CBAEDAATrue
2robustnessMedMCQAadd_typo-Tracheal secretions should be suctioned for:-Ttacheal secretions should be suctioned for:A. 10-15 seconds\\nB. 60 seconds\\nC. 30 seconds...BBTrue
3robustnessMedMCQAadd_typo-Which of the following nerve fibre types is le...-Which of the following nerve fibre types is le...A. A beta\\nB. A alpha\\nC. B fibers\\nD. C fibersDATrue
4robustnessMedMCQAadd_typo-All are true about rapid sequence induction do...-All are true about rapid sequence induction do...A. Inducing agent and neuromuscular relaxant a...CCTrue
....................................
14904robustnessMedQAlowercase-A 39-year-old woman presents to the clinic for...-a 39-year-old woman presents to the clinic for...A. Erythropoietin\\nB. Glucose\\nC. Triiodothyro...DDTrue
14905robustnessMedQAlowercase-A 38-year-old woman comes to the physician bec...-a 38-year-old woman comes to the physician bec...A. Celiac disease\\nB. Carcinoid tumor\\nC. VIPo...DDTrue
14906robustnessMedQAlowercase-A 21-year-old college student comes to the phy...-a 21-year-old college student comes to the phy...A. Trial of diphenhydramine\\nB. Complete caffe...BBTrue
14907robustnessMedQAlowercase-A 19-year-old man is brought to the physician ...-a 19-year-old man is brought to the physician ...A. Social anxiety disorder\\nB. Avoidant person...DDTrue
14908robustnessMedQAlowercase-A 79-year-old man presents to the office due t...-a 79-year-old man presents to the office due t...A. Asthma\\nB. Lymphangioleiomyomatosis\\nC. Chr...CCTrue
\n", + "

14909 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " category dataset_name test_type original_context \\\n", + "0 robustness MedMCQA add_typo - \n", + "1 robustness MedMCQA add_typo - \n", + "2 robustness MedMCQA add_typo - \n", + "3 robustness MedMCQA add_typo - \n", + "4 robustness MedMCQA add_typo - \n", + "... ... ... ... ... \n", + "14904 robustness MedQA lowercase - \n", + "14905 robustness MedQA lowercase - \n", + "14906 robustness MedQA lowercase - \n", + "14907 robustness MedQA lowercase - \n", + "14908 robustness MedQA lowercase - \n", + "\n", + " original_question perturbed_context \\\n", + "0 Highest concentration of oxygen is delivered t... - \n", + "1 Steps of intubation - arrange in sequence:- a.... - \n", + "2 Tracheal secretions should be suctioned for: - \n", + "3 Which of the following nerve fibre types is le... - \n", + "4 All are true about rapid sequence induction do... - \n", + "... ... ... \n", + "14904 A 39-year-old woman presents to the clinic for... - \n", + "14905 A 38-year-old woman comes to the physician bec... - \n", + "14906 A 21-year-old college student comes to the phy... - \n", + "14907 A 19-year-old man is brought to the physician ... - \n", + "14908 A 79-year-old man presents to the office due t... - \n", + "\n", + " perturbed_question \\\n", + "0 Highest cpncentration of oxygen is delivered t... \n", + "1 Steps of intubation - arrange in sequence:- a.... \n", + "2 Ttacheal secretions should be suctioned for: \n", + "3 Which of the following nerve fibre types is le... \n", + "4 All are true about rapid sequence induction do... \n", + "... ... \n", + "14904 a 39-year-old woman presents to the clinic for... \n", + "14905 a 38-year-old woman comes to the physician bec... \n", + "14906 a 21-year-old college student comes to the phy... \n", + "14907 a 19-year-old man is brought to the physician ... \n", + "14908 a 79-year-old man presents to the office due t... \n", + "\n", + " options expected_result \\\n", + "0 A. Nasal cannula\\nB. Venturi mask\\nC. Bag and ... A \n", + "1 A. ABCDE\\nB. DBCEA\\nC. ACBED\\nD. CBAED A \n", + "2 A. 10-15 seconds\\nB. 60 seconds\\nC. 30 seconds... B \n", + "3 A. A beta\\nB. A alpha\\nC. B fibers\\nD. C fibers D \n", + "4 A. Inducing agent and neuromuscular relaxant a... C \n", + "... ... ... \n", + "14904 A. Erythropoietin\\nB. Glucose\\nC. Triiodothyro... D \n", + "14905 A. Celiac disease\\nB. Carcinoid tumor\\nC. VIPo... D \n", + "14906 A. Trial of diphenhydramine\\nB. Complete caffe... B \n", + "14907 A. Social anxiety disorder\\nB. Avoidant person... D \n", + "14908 A. Asthma\\nB. Lymphangioleiomyomatosis\\nC. Chr... C \n", + "\n", + " actual_result pass \n", + "0 A True \n", + "1 A True \n", + "2 B True \n", + "3 A True \n", + "4 C True \n", + "... ... ... \n", + "14904 D True \n", + "14905 D True \n", + "14906 B True \n", + "14907 D True \n", + "14908 C True \n", + "\n", + "[14909 rows x 11 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Benchmarking Results: google/flan-t5-base
fail_countpass_countpass_rateminimum_pass_ratepass
dataset_namecategorytest_type
MedMCQArobustnessadd_typo151387396%70%True
lowercase103405198%70%True
PubMedQArobustnessadd_typo01000100%70%True
lowercase699499%70%True
MMLUrobustnessadd_typo19102898%70%True
lowercase17107198%70%True
MedQArobustnessadd_typo31270100%70%True
lowercase8131599%70%True
\n", + "
" + ], + "text/plain": [ + " Benchmarking Results: google/flan-t5-base \\\n", + " fail_count \n", + "dataset_name category test_type \n", + "MedMCQA robustness add_typo 151 \n", + " lowercase 103 \n", + "PubMedQA robustness add_typo 0 \n", + " lowercase 6 \n", + "MMLU robustness add_typo 19 \n", + " lowercase 17 \n", + "MedQA robustness add_typo 3 \n", + " lowercase 8 \n", + "\n", + " \n", + " pass_count pass_rate minimum_pass_rate pass \n", + "dataset_name category test_type \n", + "MedMCQA robustness add_typo 3873 96% 70% True \n", + " lowercase 4051 98% 70% True \n", + "PubMedQA robustness add_typo 1000 100% 70% True \n", + " lowercase 994 99% 70% True \n", + "MMLU robustness add_typo 1028 98% 70% True \n", + " lowercase 1071 98% 70% True \n", + "MedQA robustness add_typo 1270 100% 70% True \n", + " lowercase 1315 99% 70% True " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
modelAvgMMLUMedMCQAMedQAPubMedQA
0google/flan-t5-base0.9861880.9831140.968840.9957980.997
\n", + "
" + ], + "text/plain": [ + " model Avg MMLU MedMCQA MedQA PubMedQA\n", + "0 google/flan-t5-base 0.986188 0.983114 0.96884 0.995798 0.997" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.get_leaderboard()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Benchmarking `google/flan-t5-large` model" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Token has not been saved to git credential helper. Pass `add_to_git_credential=True` if you want to set the git credential as well.\n", + "Token is valid (permission: write).\n", + "Your token has been saved to C:\\Users\\KALYAN\\.cache\\huggingface\\token\n", + "Login successful\n", + "Test Configuration : \n", + " {\n", + " \"model_parameters\": {\n", + " \"max_tokens\": 64,\n", + " \"device\": 0,\n", + " \"task\": \"text2text-generation\"\n", + " },\n", + " \"tests\": {\n", + " \"defaults\": {\n", + " \"min_pass_rate\": 0.65\n", + " },\n", + " \"robustness\": {\n", + " \"add_typo\": {\n", + " \"min_pass_rate\": 0.7\n", + " },\n", + " \"lowercase\": {\n", + " \"min_pass_rate\": 0.7\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "harness1 = Harness(\n", + " task=\"question-answering\",\n", + " model={\n", + " \"model\": \"google/flan-t5-large\",\n", + " \"hub\": \"huggingface\"\n", + " },\n", + " data=[\n", + " {\n", + " \"data_source\": \"MedMCQA\"\n", + " },\n", + " {\n", + " \"data_source\": \"PubMedQA\"\n", + " },\n", + " {\n", + " \"data_source\": \"MMLU\"\n", + " },\n", + " {\n", + " \"data_source\": \"MedQA\"\n", + " }\n", + " ],\n", + " config=\"config.yml\",\n", + " benchmarking={\n", + " \"save_dir\":\"~/.langtest/leaderboard/\"\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + " MedMCQA \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 1/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorydataset_nametest_typeoriginal_contextoriginal_questionperturbed_contextperturbed_questionoptions
0robustnessMedMCQAadd_typo-A patient who was on ventilator and being vent...-A patient who was on ventilayor and being vent...A. Assess the patient, give bag and mask venti...
1robustnessMedMCQAadd_typo-Highest concentration of oxygen is delivered t...-Highest concentration of oxygen is deliveted t...A. Nasal cannula\\nB. Venturi mask\\nC. Bag and ...
2robustnessMedMCQAadd_typo-Steps of intubation - arrange in sequence:- a....-Steps of intubation - arrange in sequence:- a....A. ABCDE\\nB. DBCEA\\nC. ACBED\\nD. CBAED
3robustnessMedMCQAadd_typo-Which of the following nerve fibre types is le...-Which of the following nerve fibre types is le...A. A beta\\nB. A alpha\\nC. B fibers\\nD. C fibers
4robustnessMedMCQAadd_typo-All are true about rapid sequence induction do...-All are yrue about rapid sequence induction do...A. Inducing agent and neuromuscular relaxant a...
...........................
14930robustnessMedQAlowercase-A 39-year-old woman presents to the clinic for...-a 39-year-old woman presents to the clinic for...A. Erythropoietin\\nB. Glucose\\nC. Triiodothyro...
14931robustnessMedQAlowercase-A 38-year-old woman comes to the physician bec...-a 38-year-old woman comes to the physician bec...A. Celiac disease\\nB. Carcinoid tumor\\nC. VIPo...
14932robustnessMedQAlowercase-A 21-year-old college student comes to the phy...-a 21-year-old college student comes to the phy...A. Trial of diphenhydramine\\nB. Complete caffe...
14933robustnessMedQAlowercase-A 19-year-old man is brought to the physician ...-a 19-year-old man is brought to the physician ...A. Social anxiety disorder\\nB. Avoidant person...
14934robustnessMedQAlowercase-A 79-year-old man presents to the office due t...-a 79-year-old man presents to the office due t...A. Asthma\\nB. Lymphangioleiomyomatosis\\nC. Chr...
\n", + "

14935 rows × 8 columns

\n", + "" + ], + "text/plain": [ + " category dataset_name test_type original_context \\\n", + "0 robustness MedMCQA add_typo - \n", + "1 robustness MedMCQA add_typo - \n", + "2 robustness MedMCQA add_typo - \n", + "3 robustness MedMCQA add_typo - \n", + "4 robustness MedMCQA add_typo - \n", + "... ... ... ... ... \n", + "14930 robustness MedQA lowercase - \n", + "14931 robustness MedQA lowercase - \n", + "14932 robustness MedQA lowercase - \n", + "14933 robustness MedQA lowercase - \n", + "14934 robustness MedQA lowercase - \n", + "\n", + " original_question perturbed_context \\\n", + "0 A patient who was on ventilator and being vent... - \n", + "1 Highest concentration of oxygen is delivered t... - \n", + "2 Steps of intubation - arrange in sequence:- a.... - \n", + "3 Which of the following nerve fibre types is le... - \n", + "4 All are true about rapid sequence induction do... - \n", + "... ... ... \n", + "14930 A 39-year-old woman presents to the clinic for... - \n", + "14931 A 38-year-old woman comes to the physician bec... - \n", + "14932 A 21-year-old college student comes to the phy... - \n", + "14933 A 19-year-old man is brought to the physician ... - \n", + "14934 A 79-year-old man presents to the office due t... - \n", + "\n", + " perturbed_question \\\n", + "0 A patient who was on ventilayor and being vent... \n", + "1 Highest concentration of oxygen is deliveted t... \n", + "2 Steps of intubation - arrange in sequence:- a.... \n", + "3 Which of the following nerve fibre types is le... \n", + "4 All are yrue about rapid sequence induction do... \n", + "... ... \n", + "14930 a 39-year-old woman presents to the clinic for... \n", + "14931 a 38-year-old woman comes to the physician bec... \n", + "14932 a 21-year-old college student comes to the phy... \n", + "14933 a 19-year-old man is brought to the physician ... \n", + "14934 a 79-year-old man presents to the office due t... \n", + "\n", + " options \n", + "0 A. Assess the patient, give bag and mask venti... \n", + "1 A. Nasal cannula\\nB. Venturi mask\\nC. Bag and ... \n", + "2 A. ABCDE\\nB. DBCEA\\nC. ACBED\\nD. CBAED \n", + "3 A. A beta\\nB. A alpha\\nC. B fibers\\nD. C fibers \n", + "4 A. Inducing agent and neuromuscular relaxant a... \n", + "... ... \n", + "14930 A. Erythropoietin\\nB. Glucose\\nC. Triiodothyro... \n", + "14931 A. Celiac disease\\nB. Carcinoid tumor\\nC. VIPo... \n", + "14932 A. Trial of diphenhydramine\\nB. Complete caffe... \n", + "14933 A. Social anxiety disorder\\nB. Avoidant person... \n", + "14934 A. Asthma\\nB. Lymphangioleiomyomatosis\\nC. Chr... \n", + "\n", + "[14935 rows x 8 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness1.testcases()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + " MedMCQA \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 8209/8209 [10:31<00:00, 13.01it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n", + "================================================================================\n", + " PubMedQA \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 1997/1997 [05:41<00:00, 5.84it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n", + "================================================================================\n", + " MMLU \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 2136/2136 [02:43<00:00, 13.04it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n", + "================================================================================\n", + " MedQA \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 2593/2593 [03:29<00:00, 12.38it/s] " + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness1.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorydataset_nametest_typeoriginal_contextoriginal_questionperturbed_contextperturbed_questionoptionsexpected_resultactual_resultpass
0robustnessMedMCQAadd_typo-A patient who was on ventilator and being vent...-A patient who was on ventilayor and being vent...A. Assess the patient, give bag and mask venti...AATrue
1robustnessMedMCQAadd_typo-Highest concentration of oxygen is delivered t...-Highest concentration of oxygen is deliveted t...A. Nasal cannula\\nB. Venturi mask\\nC. Bag and ...BBTrue
2robustnessMedMCQAadd_typo-Steps of intubation - arrange in sequence:- a....-Steps of intubation - arrange in sequence:- a....A. ABCDE\\nB. DBCEA\\nC. ACBED\\nD. CBAEDDDTrue
3robustnessMedMCQAadd_typo-Which of the following nerve fibre types is le...-Which of the following nerve fibre types is le...A. A beta\\nB. A alpha\\nC. B fibers\\nD. C fibersDDTrue
4robustnessMedMCQAadd_typo-All are true about rapid sequence induction do...-All are yrue about rapid sequence induction do...A. Inducing agent and neuromuscular relaxant a...CCTrue
....................................
14930robustnessMedQAlowercase-A 39-year-old woman presents to the clinic for...-a 39-year-old woman presents to the clinic for...A. Erythropoietin\\nB. Glucose\\nC. Triiodothyro...EETrue
14931robustnessMedQAlowercase-A 38-year-old woman comes to the physician bec...-a 38-year-old woman comes to the physician bec...A. Celiac disease\\nB. Carcinoid tumor\\nC. VIPo...DDTrue
14932robustnessMedQAlowercase-A 21-year-old college student comes to the phy...-a 21-year-old college student comes to the phy...A. Trial of diphenhydramine\\nB. Complete caffe...BBTrue
14933robustnessMedQAlowercase-A 19-year-old man is brought to the physician ...-a 19-year-old man is brought to the physician ...A. Social anxiety disorder\\nB. Avoidant person...DDTrue
14934robustnessMedQAlowercase-A 79-year-old man presents to the office due t...-a 79-year-old man presents to the office due t...A. Asthma\\nB. Lymphangioleiomyomatosis\\nC. Chr...CCTrue
\n", + "

14935 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " category dataset_name test_type original_context \\\n", + "0 robustness MedMCQA add_typo - \n", + "1 robustness MedMCQA add_typo - \n", + "2 robustness MedMCQA add_typo - \n", + "3 robustness MedMCQA add_typo - \n", + "4 robustness MedMCQA add_typo - \n", + "... ... ... ... ... \n", + "14930 robustness MedQA lowercase - \n", + "14931 robustness MedQA lowercase - \n", + "14932 robustness MedQA lowercase - \n", + "14933 robustness MedQA lowercase - \n", + "14934 robustness MedQA lowercase - \n", + "\n", + " original_question perturbed_context \\\n", + "0 A patient who was on ventilator and being vent... - \n", + "1 Highest concentration of oxygen is delivered t... - \n", + "2 Steps of intubation - arrange in sequence:- a.... - \n", + "3 Which of the following nerve fibre types is le... - \n", + "4 All are true about rapid sequence induction do... - \n", + "... ... ... \n", + "14930 A 39-year-old woman presents to the clinic for... - \n", + "14931 A 38-year-old woman comes to the physician bec... - \n", + "14932 A 21-year-old college student comes to the phy... - \n", + "14933 A 19-year-old man is brought to the physician ... - \n", + "14934 A 79-year-old man presents to the office due t... - \n", + "\n", + " perturbed_question \\\n", + "0 A patient who was on ventilayor and being vent... \n", + "1 Highest concentration of oxygen is deliveted t... \n", + "2 Steps of intubation - arrange in sequence:- a.... \n", + "3 Which of the following nerve fibre types is le... \n", + "4 All are yrue about rapid sequence induction do... \n", + "... ... \n", + "14930 a 39-year-old woman presents to the clinic for... \n", + "14931 a 38-year-old woman comes to the physician bec... \n", + "14932 a 21-year-old college student comes to the phy... \n", + "14933 a 19-year-old man is brought to the physician ... \n", + "14934 a 79-year-old man presents to the office due t... \n", + "\n", + " options expected_result \\\n", + "0 A. Assess the patient, give bag and mask venti... A \n", + "1 A. Nasal cannula\\nB. Venturi mask\\nC. Bag and ... B \n", + "2 A. ABCDE\\nB. DBCEA\\nC. ACBED\\nD. CBAED D \n", + "3 A. A beta\\nB. A alpha\\nC. B fibers\\nD. C fibers D \n", + "4 A. Inducing agent and neuromuscular relaxant a... C \n", + "... ... ... \n", + "14930 A. Erythropoietin\\nB. Glucose\\nC. Triiodothyro... E \n", + "14931 A. Celiac disease\\nB. Carcinoid tumor\\nC. VIPo... D \n", + "14932 A. Trial of diphenhydramine\\nB. Complete caffe... B \n", + "14933 A. Social anxiety disorder\\nB. Avoidant person... D \n", + "14934 A. Asthma\\nB. Lymphangioleiomyomatosis\\nC. Chr... C \n", + "\n", + " actual_result pass \n", + "0 A True \n", + "1 B True \n", + "2 D True \n", + "3 D True \n", + "4 C True \n", + "... ... ... \n", + "14930 E True \n", + "14931 D True \n", + "14932 B True \n", + "14933 D True \n", + "14934 C True \n", + "\n", + "[14935 rows x 11 columns]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness1.generated_results()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Benchmarking Results: google/flan-t5-large
fail_countpass_countpass_rateminimum_pass_ratepass
dataset_namecategorytest_type
MedMCQArobustnessadd_typo531352487%70%True
lowercase335381992%70%True
PubMedQArobustnessadd_typo7092793%70%True
lowercase30070070%70%True
MMLUrobustnessadd_typo8995992%70%True
lowercase9199792%70%True
MedQArobustnessadd_typo43122797%70%True
lowercase94122993%70%True
\n", + "
" + ], + "text/plain": [ + " Benchmarking Results: google/flan-t5-large \\\n", + " fail_count \n", + "dataset_name category test_type \n", + "MedMCQA robustness add_typo 531 \n", + " lowercase 335 \n", + "PubMedQA robustness add_typo 70 \n", + " lowercase 300 \n", + "MMLU robustness add_typo 89 \n", + " lowercase 91 \n", + "MedQA robustness add_typo 43 \n", + " lowercase 94 \n", + "\n", + " \n", + " pass_count pass_rate minimum_pass_rate pass \n", + "dataset_name category test_type \n", + "MedMCQA robustness add_typo 3524 87% 70% True \n", + " lowercase 3819 92% 70% True \n", + "PubMedQA robustness add_typo 927 93% 70% True \n", + " lowercase 700 70% 70% True \n", + "MMLU robustness add_typo 959 92% 70% True \n", + " lowercase 997 92% 70% True \n", + "MedQA robustness add_typo 1227 97% 70% True \n", + " lowercase 1229 93% 70% True " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness1.report()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
modelAvgMMLUMedMCQAMedQAPubMedQA
0google/flan-t5-base0.9861880.9831140.9688400.9957980.997000
1google/flan-t5-large0.8930900.9157180.8942030.9475460.814895
\n", + "
" + ], + "text/plain": [ + " model Avg MMLU MedMCQA MedQA PubMedQA\n", + "0 google/flan-t5-base 0.986188 0.983114 0.968840 0.995798 0.997000\n", + "1 google/flan-t5-large 0.893090 0.915718 0.894203 0.947546 0.814895" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness1.get_leaderboard()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dataset_nameAvgMMLUMedMCQAMedQAPubMedQA
categorymodel
robustnessgoogle/flan-t5-base0.9861880.9831140.9688400.9957980.997000
google/flan-t5-large0.8930900.9157180.8942030.9475460.814895
\n", + "
" + ], + "text/plain": [ + "dataset_name Avg MMLU MedMCQA MedQA \\\n", + "category model \n", + "robustness google/flan-t5-base 0.986188 0.983114 0.968840 0.995798 \n", + " google/flan-t5-large 0.893090 0.915718 0.894203 0.947546 \n", + "\n", + "dataset_name PubMedQA \n", + "category model \n", + "robustness google/flan-t5-base 0.997000 \n", + " google/flan-t5-large 0.814895 " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness1.get_leaderboard(category=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dataset_nameAvgMMLUMedMCQAMedQAPubMedQA
categorytest_typemodel
robustnessadd_typogoogle/flan-t5-base0.9854930.9818530.9624750.9976431.000000
google/flan-t5-large0.9200140.9150760.8690510.9661420.929789
lowercasegoogle/flan-t5-base0.9868830.9843750.9752050.9939530.994000
google/flan-t5-large0.8661660.9163600.9193550.9289490.700000
\n", + "
" + ], + "text/plain": [ + "dataset_name Avg MMLU MedMCQA \\\n", + "category test_type model \n", + "robustness add_typo google/flan-t5-base 0.985493 0.981853 0.962475 \n", + " google/flan-t5-large 0.920014 0.915076 0.869051 \n", + " lowercase google/flan-t5-base 0.986883 0.984375 0.975205 \n", + " google/flan-t5-large 0.866166 0.916360 0.919355 \n", + "\n", + "dataset_name MedQA PubMedQA \n", + "category test_type model \n", + "robustness add_typo google/flan-t5-base 0.997643 1.000000 \n", + " google/flan-t5-large 0.966142 0.929789 \n", + " lowercase google/flan-t5-base 0.993953 0.994000 \n", + " google/flan-t5-large 0.928949 0.700000 " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness1.get_leaderboard(test_wise=True, rank_by=\"MMLU\")" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "A100", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/tutorials/benchmarks/Langtest_Cli_Eval_Command.ipynb b/demo/tutorials/benchmarks/Langtest_Cli_Eval_Command.ipynb index 9b926f95c..50f9a9e7f 100644 --- a/demo/tutorials/benchmarks/Langtest_Cli_Eval_Command.ipynb +++ b/demo/tutorials/benchmarks/Langtest_Cli_Eval_Command.ipynb @@ -46,24 +46,9 @@ "id": "OPPUwGvzyAoV", "outputId": "670c68e7-83fe-418c-8e3e-094590f5b7f2" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m19.7/19.7 MB\u001b[0m \u001b[31m73.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h\u001b[33mWARNING: langtest 2.1.0rc2 does not provide the extra 'all'\u001b[0m\u001b[33m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.0/13.0 MB\u001b[0m \u001b[31m99.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.1/3.1 MB\u001b[0m \u001b[31m105.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m345.4/345.4 kB\u001b[0m \u001b[31m41.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "google-colab 1.0.0 requires pandas==1.5.3, but you have pandas 2.2.1 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0m" - ] - } - ], + "outputs": [], "source": [ - "!pip install -q langtest[all]==2.1.0rc2" + "!pip install -q langtest[all]" ] }, { diff --git a/demo/tutorials/llm_notebooks/Fewshot_QA_Notebook.ipynb b/demo/tutorials/llm_notebooks/Fewshot_QA_Notebook.ipynb new file mode 100644 index 000000000..268fbad62 --- /dev/null +++ b/demo/tutorials/llm_notebooks/Fewshot_QA_Notebook.ipynb @@ -0,0 +1,1392 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "e7PsSmy9sCoR" + }, + "source": [ + "![image.png](data:image/png;base64,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)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "3o5sAOfwL5qd" + }, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Fewshot_QA_Notebook.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "WJJzt3RWhEc6" + }, + "source": [ + "**LangTest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification, fill-mask, Translation model using the library. We also support testing LLMS for Question-Answering, Summarization and text-generation tasks on benchmark datasets. The library supports 60+ out of the box tests. For a complete list of supported test categories, please refer to the [documentation](http://langtest.org/docs/pages/docs/test_categories).\n", + "\n", + "Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "26qXWhCYhHAt" + }, + "source": [ + "# Getting started with LangTest " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install \"langtest[evaluate,openai,transformers]==2.2.0\" " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "yR6kjOaiheKN" + }, + "source": [ + "# Harness and Its Parameters\n", + "\n", + "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the LangTest library in the following way." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "lTzSJpMlhgq5" + }, + "outputs": [], + "source": [ + "#Import Harness from the LangTest library\n", + "from langtest import Harness" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "sBcZjwJBhkOw" + }, + "source": [ + "It imports the Harness class from within the module, that is designed to provide a blueprint or framework for conducting NLP testing, and that instances of the Harness class can be customized or configured for different testing scenarios or environments.\n", + "\n", + "Here is a list of the different parameters that can be passed to the Harness function:\n", + "\n", + "
\n", + "\n", + "\n", + "| Parameter | Description | \n", + "| - | - | \n", + "|**task** |Task for which the model is to be evaluated (question-answering or summarization)|\n", + "| **model** | Specifies the model(s) to be evaluated. This parameter can be provided as either a dictionary or a list of dictionaries. Each dictionary should contain the following keys: |\n", + "| **data** | The data to be used for evaluation. A dictionary providing flexibility and options for data sources. It should include the following keys: |\n", + "| **config** | Configuration for the tests to be performed, specified in the form of a YAML file. |\n", + "\n", + "
\n", + "
" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "JFhJ9CcbsKqN" + }, + "source": [ + "# OpenAI Model Testing For Question Answering\n", + "\n", + "In this section, we dive into testing of OpenAI models in Question Answering task.\n", + "\n", + "LangTest supports robustness tests for LLM testing for now." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "kKgXC7cvuyar" + }, + "source": [ + "### Set environment for OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "MHqlSjFLuy7o" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ[\"OPENAI_API_KEY\"] = \"\" #Replace with your OpenAI API Key" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BoolQ-test-tiny dataset testing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The YAML content defines a task named \"BoolQ\" that specifies how an intelligent bot should respond to queries. The task instructions dictate that the bot must provide a concise answer of either \"true\" or \"false.\" The `prompt_type` is set to \"instruct,\" indicating that the bot should execute the task based on direct commands rather than engaging in conversational interaction.\n", + "\n", + "The YAML also includes examples to illustrate how the bot should handle specific questions. Each example contains a \"context\" that provides background information and a \"question\" that the bot needs to answer with either \"true\" or \"false.\" In the provided examples:\n", + "1. The context discusses the renewal of the series \"The Good Fight\" for a third season, and the question asks whether there is a third series of \"The Good Fight,\" to which the bot correctly responds \"True.\"\n", + "2. The context mentions the cancellation of \"Lost in Space\" at the end of season 3 without resolving the story, and the question asks whether the Robinsons ever returned to Earth, to which the bot incorrectly responds \"True,\" presumably due to the bot misunderstanding or misinterpreting the context." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "yaml_content = \"\"\"\n", + "prompt_config:\n", + " \"BoolQ\":\n", + " instructions: \"You are an intelligent bot and it is your responsibility to make sure to give a concise answer. Answer should be `true` or `false`.\"\n", + " prompt_type: \"instruct\" # instruct for completion and chat for conversation(chat models)\n", + " examples:\n", + " - user:\n", + " context: \"The Good Fight -- A second 13-episode season premiered on March 4, 2018. On May 2, 2018, the series was renewed for a third season.\"\n", + " question: \"is there a third series of the good fight?\"\n", + " ai:\n", + " answer: \"True\"\n", + " - user:\n", + " context: \"Lost in Space -- The fate of the castaways is never resolved, as the series was unexpectedly canceled at the end of season 3.\"\n", + " question: \"did the robinsons ever get back to earth\"\n", + " ai:\n", + " answer: \"True\"\n", + " \"NQ-open\":\n", + " instructions: \"You are an intelligent bot and it is your responsibility to make sure to give a short concise answer.\"\n", + " prompt_type: \"instruct\" # completion\n", + " examples:\n", + " - user:\n", + " question: \"where does the electron come from in beta decay?\"\n", + " ai:\n", + " answer: \"an atomic nucleus\"\n", + " - user:\n", + " question: \"who wrote you're a grand ol flag?\"\n", + " ai:\n", + " answer: \"George M. Cohan\"\n", + "\n", + "tests:\n", + " defaults:\n", + " min_pass_rate: 0.8\n", + " robustness:\n", + " uppercase:\n", + " min_pass_rate: 0.8\n", + " add_typo:\n", + " min_pass_rate: 0.8\n", + "\"\"\"\n", + "\n", + "with open(\"config.yaml\", \"w\") as f:\n", + " f.write(yaml_content)\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "swaYPW-wPlku" + }, + "source": [ + "### Setup and Configure Harness" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "p_5nO14bvTzt", + "outputId": "cee6c5f4-6f32-4f72-e9db-440a410b59c7" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test Configuration : \n", + " {\n", + " \"prompt_config\": {\n", + " \"BoolQ\": {\n", + " \"instructions\": \"You are an intelligent bot and it is your responsibility to make sure to give a concise answer. Answer should be `true` or `false`.\",\n", + " \"prompt_type\": \"instruct\",\n", + " \"examples\": [\n", + " {\n", + " \"user\": {\n", + " \"context\": \"The Good Fight -- A second 13-episode season premiered on March 4, 2018. On May 2, 2018, the series was renewed for a third season.\",\n", + " \"question\": \"is there a third series of the good fight?\"\n", + " },\n", + " \"ai\": {\n", + " \"answer\": \"True\"\n", + " }\n", + " },\n", + " {\n", + " \"user\": {\n", + " \"context\": \"Lost in Space -- The fate of the castaways is never resolved, as the series was unexpectedly canceled at the end of season 3.\",\n", + " \"question\": \"did the robinsons ever get back to earth\"\n", + " },\n", + " \"ai\": {\n", + " \"answer\": \"True\"\n", + " }\n", + " }\n", + " ]\n", + " },\n", + " \"NQ-open\": {\n", + " \"instructions\": \"You are an intelligent bot and it is your responsibility to make sure to give a short concise answer.\",\n", + " \"prompt_type\": \"instruct\",\n", + " \"examples\": [\n", + " {\n", + " \"user\": {\n", + " \"question\": \"where does the electron come from in beta decay?\"\n", + " },\n", + " \"ai\": {\n", + " \"answer\": \"an atomic nucleus\"\n", + " }\n", + " },\n", + " {\n", + " \"user\": {\n", + " \"question\": \"who wrote you're a grand ol flag?\"\n", + " },\n", + " \"ai\": {\n", + " \"answer\": \"George M. Cohan\"\n", + " }\n", + " }\n", + " ]\n", + " }\n", + " },\n", + " \"tests\": {\n", + " \"defaults\": {\n", + " \"min_pass_rate\": 0.8\n", + " },\n", + " \"robustness\": {\n", + " \"uppercase\": {\n", + " \"min_pass_rate\": 0.8\n", + " },\n", + " \"add_typo\": {\n", + " \"min_pass_rate\": 0.8\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "harness = Harness(\n", + " task=\"question-answering\", \n", + " model={\"model\": \"gpt-3.5-turbo-instruct\",\"hub\":\"openai\"}, \n", + " data=[{\"data_source\" :\"BoolQ\",\n", + " \"split\":\"test-tiny\"},\n", + " {\"data_source\" :\"NQ-open\",\n", + " \"split\":\"test-tiny\"}],\n", + " config=\"config.yaml\"\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "jWPAw9q0PwD1" + }, + "source": [ + "We have specified task as QA, hub as OpenAI and model as GPT-3.5.\n", + "\n", + "For dataset we used `BoolQ` dataset and `test-tiny` split which includes 50 samples. Other available datasets are: [Benchmark Datasets](https://langtest.org/docs/pages/docs/data#question-answering)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For tests we used lowercase and uppercase. Other available robustness tests for QA task are:\n", + "* `add_context`\n", + "* `add_contraction`\n", + "* `add_punctuation`\n", + "* `add_typo`\n", + "* `add_ocr_typo`\n", + "* `american_to_british`\n", + "* `british_to_american`\n", + "* `lowercase`\n", + "* `strip_punctuation`\n", + "* `titlecase`\n", + "* `uppercase`\n", + "* `number_to_word`\n", + "* `add_abbreviation`\n", + "* `add_speech_to_text_typo`\n", + "* `add_slangs`\n", + "* `dyslexia_word_swap`\n", + "* `multiple_perturbations`\n", + "* `adjective_synonym_swap`\n", + "* `adjective_antonym_swap`\n", + "* `strip_all_punctuation`" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Available Bias tests for QA task are:\n", + "\n", + "* `replace_to_male_pronouns`\n", + "* `replace_to_female_pronouns`\n", + "* `replace_to_neutral_pronouns`\n", + "* `replace_to_high_income_country`\n", + "* `replace_to_low_income_country`\n", + "* `replace_to_upper_middle_income_country`\n", + "* `replace_to_lower_middle_income_country`\n", + "* `replace_to_white_firstnames`\n", + "* `replace_to_black_firstnames`\n", + "* `replace_to_hispanic_firstnames`\n", + "* `replace_to_asian_firstnames`\n", + "* `replace_to_white_lastnames`\n", + "* `replace_to_sikh_names`\n", + "* `replace_to_christian_names`\n", + "* `replace_to_hindu_names`\n", + "* `replace_to_muslim_names`\n", + "* `replace_to_inter_racial_lastnames`\n", + "* `replace_to_native_american_lastnames`\n", + "* `replace_to_asian_lastnames`\n", + "* `replace_to_hispanic_lastnames`\n", + "* `replace_to_black_lastnames`\n", + "* `replace_to_parsi_names`\n", + "* `replace_to_jain_names`\n", + "* `replace_to_buddhist_names`\n", + "\n", + "Available Representation tests for QA task are:\n", + "\n", + "* `min_gender_representation_count`\n", + "* `min_ethnicity_name_representation_count`\n", + "* `min_religion_name_representation_count`\n", + "* `min_country_economic_representation_count`\n", + "* `min_gender_representation_proportion`\n", + "* `min_ethnicity_name_representation_proportion`\n", + "* `min_religion_name_representation_proportion`\n", + "* `min_country_economic_representation_proportion`\n", + "\n", + "\n", + "Available Accuracy tests for QA task are:\n", + "\n", + "* `min_exact_match_score`\n", + "* `min_bleu_score`\n", + "* `min_rouge1_score`\n", + "* `min_rouge2_score`\n", + "* `min_rougeL_score`\n", + "* `min_rougeLsum_score`\n", + "\n", + "\n", + "Available Fairness tests for QA task are:\n", + "\n", + "* `max_gender_rouge1_score`\n", + "* `max_gender_rouge2_score`\n", + "* `max_gender_rougeL_score`\n", + "* `max_gender_rougeLsum_score`\n", + "* `min_gender_rouge1_score`\n", + "* `min_gender_rouge2_score`\n", + "* `min_gender_rougeL_score`\n", + "* `min_gender_rougeLsum_score`" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also set prompts and other model parameters in config. Possible parameters are:\n", + "* `user_promt:` Promt to be given to the model.\n", + "* `temperature:` Temperature of the model.\n", + "* `max_tokens:` Maximum number of output tokens allowed for model." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "ZPU46A7WigFr" + }, + "source": [ + "Here we have configured the harness to perform two robustness tests (uppercase and lowercase) and defined the minimum pass rate for each test." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "➤ You can adjust the level of transformation in the sentence by using the \"`prob`\" parameter, which controls the proportion of words to be changed during robustness tests.\n", + "\n", + "➤ **NOTE** : \"`prob`\" defaults to 1.0, which means all words will be transformed.\n", + "```\n", + "harness.configure(\n", + "{\n", + " 'tests': {\n", + " 'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {\n", + " 'lowercase': {'min_pass_rate': 0.66, 'prob': 0.50}, \n", + " 'uppercase':{'min_pass_rate': 0.60, 'prob': 0.70},\n", + " }\n", + " }\n", + "})\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "harness.data = {k: v[:10] for k, v in harness.data.items()}" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "i6kPvA13F7cr" + }, + "source": [ + "\n", + "### Generating the test cases." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mdNH3wCKF9fn", + "outputId": "cd348490-7ade-40fa-d870-dc059f5aa647" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + " BoolQ \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 1/1 [00:00<00:00, 995.80it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n", + "================================================================================\n", + " NQ-open \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 1/1 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorydataset_nametest_typeoriginal_contextoriginal_questionperturbed_contextperturbed_question
0robustnessBoolQuppercase20 euro note -- Until now there has been only ...is the first series 20 euro note still legal t...20 EURO NOTE -- UNTIL NOW THERE HAS BEEN ONLY ...IS THE FIRST SERIES 20 EURO NOTE STILL LEGAL T...
1robustnessBoolQuppercase2018–19 UEFA Champions League -- The final wil...do the champions league winners get automatic ...2018–19 UEFA CHAMPIONS LEAGUE -- THE FINAL WIL...DO THE CHAMPIONS LEAGUE WINNERS GET AUTOMATIC ...
2robustnessBoolQuppercaseBullsnake -- Bullsnakes are very powerful cons...can a bull snake kill a small dogBULLSNAKE -- BULLSNAKES ARE VERY POWERFUL CONS...CAN A BULL SNAKE KILL A SMALL DOG
3robustnessBoolQuppercaseNBA playoffs -- All rounds are best-of-seven s...are all nba playoff games best of 7NBA PLAYOFFS -- ALL ROUNDS ARE BEST-OF-SEVEN S...ARE ALL NBA PLAYOFF GAMES BEST OF 7
4robustnessBoolQuppercaseManchester station group -- The Manchester sta...can i use my train ticket on the tram in manch...MANCHESTER STATION GROUP -- THE MANCHESTER STA...CAN I USE MY TRAIN TICKET ON THE TRAM IN MANCH...
........................
190robustnessNQ-openadd_typo-who has the most followers on the twitter-who has the most followers on tme twitter
191robustnessNQ-openadd_typo-who said it's not what your country can do for...-who said it's not what your country can do for...
192robustnessNQ-openadd_typo-when does lil wayne new album drop 2018-jhen does lil wayne new album drop 2018
193robustnessNQ-openadd_typo-the khajuraho temples are especially well know...-the khajuraho temples are rspecially well know...
194robustnessNQ-openadd_typo-when does the regular nba basketball season start-when does the regular nba basuetball season start
\n", + "

195 rows × 7 columns

\n", + "" + ], + "text/plain": [ + " category dataset_name test_type \\\n", + "0 robustness BoolQ uppercase \n", + "1 robustness BoolQ uppercase \n", + "2 robustness BoolQ uppercase \n", + "3 robustness BoolQ uppercase \n", + "4 robustness BoolQ uppercase \n", + ".. ... ... ... \n", + "190 robustness NQ-open add_typo \n", + "191 robustness NQ-open add_typo \n", + "192 robustness NQ-open add_typo \n", + "193 robustness NQ-open add_typo \n", + "194 robustness NQ-open add_typo \n", + "\n", + " original_context \\\n", + "0 20 euro note -- Until now there has been only ... \n", + "1 2018–19 UEFA Champions League -- The final wil... \n", + "2 Bullsnake -- Bullsnakes are very powerful cons... \n", + "3 NBA playoffs -- All rounds are best-of-seven s... \n", + "4 Manchester station group -- The Manchester sta... \n", + ".. ... \n", + "190 - \n", + "191 - \n", + "192 - \n", + "193 - \n", + "194 - \n", + "\n", + " original_question \\\n", + "0 is the first series 20 euro note still legal t... \n", + "1 do the champions league winners get automatic ... \n", + "2 can a bull snake kill a small dog \n", + "3 are all nba playoff games best of 7 \n", + "4 can i use my train ticket on the tram in manch... \n", + ".. ... \n", + "190 who has the most followers on the twitter \n", + "191 who said it's not what your country can do for... \n", + "192 when does lil wayne new album drop 2018 \n", + "193 the khajuraho temples are especially well know... \n", + "194 when does the regular nba basketball season start \n", + "\n", + " perturbed_context \\\n", + "0 20 EURO NOTE -- UNTIL NOW THERE HAS BEEN ONLY ... \n", + "1 2018–19 UEFA CHAMPIONS LEAGUE -- THE FINAL WIL... \n", + "2 BULLSNAKE -- BULLSNAKES ARE VERY POWERFUL CONS... \n", + "3 NBA PLAYOFFS -- ALL ROUNDS ARE BEST-OF-SEVEN S... \n", + "4 MANCHESTER STATION GROUP -- THE MANCHESTER STA... \n", + ".. ... \n", + "190 - \n", + "191 - \n", + "192 - \n", + "193 - \n", + "194 - \n", + "\n", + " perturbed_question \n", + "0 IS THE FIRST SERIES 20 EURO NOTE STILL LEGAL T... \n", + "1 DO THE CHAMPIONS LEAGUE WINNERS GET AUTOMATIC ... \n", + "2 CAN A BULL SNAKE KILL A SMALL DOG \n", + "3 ARE ALL NBA PLAYOFF GAMES BEST OF 7 \n", + "4 CAN I USE MY TRAIN TICKET ON THE TRAM IN MANCH... \n", + ".. ... \n", + "190 who has the most followers on tme twitter \n", + "191 who said it's not what your country can do for... \n", + "192 jhen does lil wayne new album drop 2018 \n", + "193 the khajuraho temples are rspecially well know... \n", + "194 when does the regular nba basuetball season start \n", + "\n", + "[195 rows x 7 columns]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "NOJ8BAU2GGzd" + }, + "source": [ + "harness.testcases() method displays the produced test cases in form of a pandas data frame." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "3CwhQw6hGR9S" + }, + "source": [ + "### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aguX6-aFGOnP", + "outputId": "bb014811-522b-4f07-fa8a-bf3d1c906d7f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "================================================================================\n", + " BoolQ \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 100/100 [01:19<00:00, 1.26it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n", + "================================================================================\n", + " NQ-open \n", + "================================================================================\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 95/95 [01:47<00:00, 1.13s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--------------------------------------------------------------------------------\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "191O2oaUGWrH" + }, + "source": [ + "Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 797 + }, + "id": "-cXkdnihGYke", + "outputId": "2aa88caa-5e83-44fe-b3aa-b81b9ae9115a" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorydataset_nametest_typeoriginal_contextoriginal_questionperturbed_contextperturbed_questionexpected_resultactual_resultpass
0robustnessBoolQuppercase20 euro note -- Until now there has been only ...is the first series 20 euro note still legal t...20 EURO NOTE -- UNTIL NOW THERE HAS BEEN ONLY ...IS THE FIRST SERIES 20 EURO NOTE STILL LEGAL T...\\nFalse\\nFalseTrue
1robustnessBoolQuppercase2018–19 UEFA Champions League -- The final wil...do the champions league winners get automatic ...2018–19 UEFA CHAMPIONS LEAGUE -- THE FINAL WIL...DO THE CHAMPIONS LEAGUE WINNERS GET AUTOMATIC ...\\nTrue\\nTrueTrue
2robustnessBoolQuppercaseBullsnake -- Bullsnakes are very powerful cons...can a bull snake kill a small dogBULLSNAKE -- BULLSNAKES ARE VERY POWERFUL CONS...CAN A BULL SNAKE KILL A SMALL DOG\\nFalse\\nFalseTrue
3robustnessBoolQuppercaseNBA playoffs -- All rounds are best-of-seven s...are all nba playoff games best of 7NBA PLAYOFFS -- ALL ROUNDS ARE BEST-OF-SEVEN S...ARE ALL NBA PLAYOFF GAMES BEST OF 7\\nTrueTrueTrue
4robustnessBoolQuppercaseManchester station group -- The Manchester sta...can i use my train ticket on the tram in manch...MANCHESTER STATION GROUP -- THE MANCHESTER STA...CAN I USE MY TRAIN TICKET ON THE TRAM IN MANCH...\\nTrue\\nFalseFalse
.................................
190robustnessNQ-openadd_typo-who has the most followers on the twitter-who has the most followers on tme twitter?\\n\\nAs of 2021, the person with the most foll...?\\n\\nAs of June 2021, the account with the mos...True
191robustnessNQ-openadd_typo-who said it's not what your country can do for...-who said it's not what your country can do for...?\\n\\nJohn F. Kennedy?\\n\\n\\nJohn F. KennedyTrue
192robustnessNQ-openadd_typo-when does lil wayne new album drop 2018-jhen does lil wayne new album drop 2018\\nLil Wayne's album, \"Tha Carter V,\" was relea...?\\n\\nThere is no official release date for Lil...False
193robustnessNQ-openadd_typo-the khajuraho temples are especially well know...-the khajuraho temples are rspecially well know...\\nerotic sculptures?\\n\\nerotic sculptures.True
194robustnessNQ-openadd_typo-when does the regular nba basketball season start-when does the regular nba basuetball season start?\\nThe regular NBA basketball season typically...?\\n\\nThe regular NBA basketball season typical...True
\n", + "

195 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " category dataset_name test_type \\\n", + "0 robustness BoolQ uppercase \n", + "1 robustness BoolQ uppercase \n", + "2 robustness BoolQ uppercase \n", + "3 robustness BoolQ uppercase \n", + "4 robustness BoolQ uppercase \n", + ".. ... ... ... \n", + "190 robustness NQ-open add_typo \n", + "191 robustness NQ-open add_typo \n", + "192 robustness NQ-open add_typo \n", + "193 robustness NQ-open add_typo \n", + "194 robustness NQ-open add_typo \n", + "\n", + " original_context \\\n", + "0 20 euro note -- Until now there has been only ... \n", + "1 2018–19 UEFA Champions League -- The final wil... \n", + "2 Bullsnake -- Bullsnakes are very powerful cons... \n", + "3 NBA playoffs -- All rounds are best-of-seven s... \n", + "4 Manchester station group -- The Manchester sta... \n", + ".. ... \n", + "190 - \n", + "191 - \n", + "192 - \n", + "193 - \n", + "194 - \n", + "\n", + " original_question \\\n", + "0 is the first series 20 euro note still legal t... \n", + "1 do the champions league winners get automatic ... \n", + "2 can a bull snake kill a small dog \n", + "3 are all nba playoff games best of 7 \n", + "4 can i use my train ticket on the tram in manch... \n", + ".. ... \n", + "190 who has the most followers on the twitter \n", + "191 who said it's not what your country can do for... \n", + "192 when does lil wayne new album drop 2018 \n", + "193 the khajuraho temples are especially well know... \n", + "194 when does the regular nba basketball season start \n", + "\n", + " perturbed_context \\\n", + "0 20 EURO NOTE -- UNTIL NOW THERE HAS BEEN ONLY ... \n", + "1 2018–19 UEFA CHAMPIONS LEAGUE -- THE FINAL WIL... \n", + "2 BULLSNAKE -- BULLSNAKES ARE VERY POWERFUL CONS... \n", + "3 NBA PLAYOFFS -- ALL ROUNDS ARE BEST-OF-SEVEN S... \n", + "4 MANCHESTER STATION GROUP -- THE MANCHESTER STA... \n", + ".. ... \n", + "190 - \n", + "191 - \n", + "192 - \n", + "193 - \n", + "194 - \n", + "\n", + " perturbed_question \\\n", + "0 IS THE FIRST SERIES 20 EURO NOTE STILL LEGAL T... \n", + "1 DO THE CHAMPIONS LEAGUE WINNERS GET AUTOMATIC ... \n", + "2 CAN A BULL SNAKE KILL A SMALL DOG \n", + "3 ARE ALL NBA PLAYOFF GAMES BEST OF 7 \n", + "4 CAN I USE MY TRAIN TICKET ON THE TRAM IN MANCH... \n", + ".. ... \n", + "190 who has the most followers on tme twitter \n", + "191 who said it's not what your country can do for... \n", + "192 jhen does lil wayne new album drop 2018 \n", + "193 the khajuraho temples are rspecially well know... \n", + "194 when does the regular nba basuetball season start \n", + "\n", + " expected_result \\\n", + "0 \\nFalse \n", + "1 \\nTrue \n", + "2 \\nFalse \n", + "3 \\nTrue \n", + "4 \\nTrue \n", + ".. ... \n", + "190 ?\\n\\nAs of 2021, the person with the most foll... \n", + "191 ?\\n\\nJohn F. Kennedy \n", + "192 \\nLil Wayne's album, \"Tha Carter V,\" was relea... \n", + "193 \\nerotic sculptures \n", + "194 ?\\nThe regular NBA basketball season typically... \n", + "\n", + " actual_result pass \n", + "0 \\nFalse True \n", + "1 \\nTrue True \n", + "2 \\nFalse True \n", + "3 True True \n", + "4 \\nFalse False \n", + ".. ... ... \n", + "190 ?\\n\\nAs of June 2021, the account with the mos... True \n", + "191 ?\\n\\n\\nJohn F. Kennedy True \n", + "192 ?\\n\\nThere is no official release date for Lil... False \n", + "193 ?\\n\\nerotic sculptures. True \n", + "194 ?\\n\\nThe regular NBA basketball season typical... True \n", + "\n", + "[195 rows x 10 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "TKB8Rsr2GZME" + }, + "source": [ + "This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "PBSlpWnUU55G" + }, + "source": [ + "### Final Results" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "gp57HcF9yxi7", + "outputId": "b893072f-102a-45a6-be03-d737996e659c" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Benchmarking Results: gpt-3.5-turbo-instruct
fail_countpass_countpass_rateminimum_pass_ratepass
dataset_namecategorytest_type
BoolQrobustnessuppercase143672%80%False
add_typo84284%80%True
NQ-openrobustnessuppercase94182%80%True
add_typo103578%80%False
\n", + "
" + ], + "text/plain": [ + " Benchmarking Results: gpt-3.5-turbo-instruct \\\n", + " fail_count \n", + "dataset_name category test_type \n", + "BoolQ robustness uppercase 14 \n", + " add_typo 8 \n", + "NQ-open robustness uppercase 9 \n", + " add_typo 10 \n", + "\n", + " \\\n", + " pass_count pass_rate minimum_pass_rate \n", + "dataset_name category test_type \n", + "BoolQ robustness uppercase 36 72% 80% \n", + " add_typo 42 84% 80% \n", + "NQ-open robustness uppercase 41 82% 80% \n", + " add_typo 35 78% 80% \n", + "\n", + " \n", + " pass \n", + "dataset_name category test_type \n", + "BoolQ robustness uppercase False \n", + " add_typo True \n", + "NQ-open robustness uppercase True \n", + " add_typo False " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + } + ], + "metadata": { + "accelerator": "TPU", + "colab": { + "machine_shape": "hm", + "provenance": [], + "toc_visible": true + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/tutorials/llm_notebooks/NER Casual LLM.ipynb b/demo/tutorials/llm_notebooks/NER Casual LLM.ipynb new file mode 100644 index 000000000..1e4517c6a --- /dev/null +++ b/demo/tutorials/llm_notebooks/NER Casual LLM.ipynb @@ -0,0 +1,1017 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/NER%20Casual%20LLM.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**LangTest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification, fill-mask, Translation model using the library. We also support testing LLMS for Question-Answering, Summarization and text-generation tasks on benchmark datasets. The library supports 60+ out of the box tests. For a complete list of supported test categories, please refer to the [documentation](http://langtest.org/docs/pages/docs/test_categories).\n", + "\n", + "Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Getting started with LangTest" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install \"langtest[evaluate,openai]==2.2.0\" requests" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Harness and Its Parameters\n", + "\n", + "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the LangTest library in the following way." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#Import Harness from the LangTest library\n", + "from langtest import Harness" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It imports the Harness class from within the module, that is designed to provide a blueprint or framework for conducting NLP testing, and that instances of the Harness class can be customized or configured for different testing scenarios or environments.\n", + "\n", + "Here is a list of the different parameters that can be passed to the Harness function:\n", + "\n", + "
\n", + "\n", + "\n", + "| Parameter | Description | \n", + "| - | - | \n", + "|**task** |Task for which the model is to be evaluated (ner)|\n", + "| **model** | Specifies the model(s) to be evaluated. This parameter can be provided as either a dictionary or a list of dictionaries. Each dictionary should contain the following keys: |\n", + "| **data** | The data to be used for evaluation. A dictionary providing flexibility and options for data sources. It should include the following keys: |\n", + "| **config** | Configuration for the tests to be performed, specified in the form of a YAML file. |\n", + "\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A system prompt, in the context of Language Model (LLM), is a predefined input that guides the model to generate a specific structured output. This is particularly useful in tasks where the output needs to follow a certain format or structure.\n", + "\n", + "For instance, in Named Entity Recognition (NER), a task in Natural Language Processing (NLP), we might want the model to identify and classify named entities in a text into predefined categories like person names, organizations, locations, medical codes, time expressions, quantities, monetary values, percentages, etc.\n", + "\n", + "In such a case, a system prompt could be a sentence with placeholders for the model to fill. The LLM model, upon receiving this prompt, generates an output that fills these placeholders with appropriate entities, thereby producing a structured output.\n", + "\n", + "This approach of using system prompts helps in controlling the output of the LLM models, making them more useful in practical applications where structured outputs are required." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# OpenAI Model Testing For NER\n", + "\n", + "In this section, we dive into testing of OpenAI models in NER task.\n", + "\n", + "LangTest supports robustness and accuracy tests for LLM testing for now." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set environment for OpenAI" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ[\"OPENAI_API_KEY\"] = \"\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load CoNLL\n", + "!wget https://github.com/JohnSnowLabs/langtest/raw/main/langtest/data/conll/sample.conll" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup and Configure Harness" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test Configuration : \n", + " {\n", + " \"model_parameters\": {\n", + " \"temperature\": 0\n", + " },\n", + " \"tests\": {\n", + " \"defaults\": {\n", + " \"min_pass_rate\": 1.0\n", + " },\n", + " \"robustness\": {\n", + " \"lowercase\": {\n", + " \"min_pass_rate\": 0.7\n", + " }\n", + " },\n", + " \"accuracy\": {\n", + " \"min_f1_score\": {\n", + " \"min_score\": 0.7\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# Create a Harness object\n", + "h = Harness(task=\"ner\",\n", + " model={\n", + " \"model\": \"gpt-3.5-turbo-instruct\",\n", + " \"hub\": \"openai\",},\n", + " data={\n", + " \"data_source\": '../../data/conll03.conll'\n", + " },\n", + " config={\n", + " \"model_parameters\": {\n", + " \"temperature\": 0,\n", + " },\n", + " \"tests\": {\n", + " \"defaults\": {\n", + " \"min_pass_rate\": 1.0\n", + " },\n", + " \"robustness\": {\n", + " \"lowercase\": {\n", + " \"min_pass_rate\": 0.7\n", + " }\n", + " },\n", + " \"accuracy\": {\n", + " \"min_f1_score\": {\n", + " \"min_score\": 0.7,\n", + " },\n", + " }\n", + " }\n", + " }\n", + " )\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have specified task as NER, hub as OpenAI and model as GPT-3.5.\n", + "\n", + "For dataset we used default `Conll` dataset " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For tests we used lowercase and uppercase. Other available robustness tests for QA task are:\n", + "* `add_context`\n", + "* `add_contraction`\n", + "* `add_punctuation`\n", + "* `add_typo`\n", + "* `add_ocr_typo`\n", + "* `american_to_british`\n", + "* `british_to_american`\n", + "* `lowercase`\n", + "* `strip_punctuation`\n", + "* `titlecase`\n", + "* `uppercase`\n", + "* `number_to_word`\n", + "* `add_abbreviation`\n", + "* `add_speech_to_text_typo`\n", + "* `add_slangs`\n", + "* `dyslexia_word_swap`\n", + "* `multiple_perturbations`\n", + "* `adjective_synonym_swap`\n", + "* `adjective_antonym_swap`\n", + "* `strip_all_punctuation`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Available Bias tests for QA task are:\n", + "\n", + "* `replace_to_male_pronouns`\n", + "* `replace_to_female_pronouns`\n", + "* `replace_to_neutral_pronouns`\n", + "* `replace_to_high_income_country`\n", + "* `replace_to_low_income_country`\n", + "* `replace_to_upper_middle_income_country`\n", + "* `replace_to_lower_middle_income_country`\n", + "* `replace_to_white_firstnames`\n", + "* `replace_to_black_firstnames`\n", + "* `replace_to_hispanic_firstnames`\n", + "* `replace_to_asian_firstnames`\n", + "* `replace_to_white_lastnames`\n", + "* `replace_to_sikh_names`\n", + "* `replace_to_christian_names`\n", + "* `replace_to_hindu_names`\n", + "* `replace_to_muslim_names`\n", + "* `replace_to_inter_racial_lastnames`\n", + "* `replace_to_native_american_lastnames`\n", + "* `replace_to_asian_lastnames`\n", + "* `replace_to_hispanic_lastnames`\n", + "* `replace_to_black_lastnames`\n", + "* `replace_to_parsi_names`\n", + "* `replace_to_jain_names`\n", + "* `replace_to_buddhist_names`\n", + "\n", + "Available Representation tests for QA task are:\n", + "\n", + "* `min_gender_representation_count`\n", + "* `min_ethnicity_name_representation_count`\n", + "* `min_religion_name_representation_count`\n", + "* `min_country_economic_representation_count`\n", + "* `min_gender_representation_proportion`\n", + "* `min_ethnicity_name_representation_proportion`\n", + "* `min_religion_name_representation_proportion`\n", + "* `min_country_economic_representation_proportion`\n", + "\n", + "\n", + "Available Accuracy tests for QA task are:\n", + "\n", + "* `min_exact_match_score`\n", + "* `min_bleu_score`\n", + "* `min_rouge1_score`\n", + "* `min_rouge2_score`\n", + "* `min_rougeL_score`\n", + "* `min_rougeLsum_score`\n", + "\n", + "\n", + "Available Fairness tests for QA task are:\n", + "\n", + "* `max_gender_rouge1_score`\n", + "* `max_gender_rouge2_score`\n", + "* `max_gender_rougeL_score`\n", + "* `max_gender_rougeLsum_score`\n", + "* `min_gender_rouge1_score`\n", + "* `min_gender_rouge2_score`\n", + "* `min_gender_rougeL_score`\n", + "* `min_gender_rougeLsum_score`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also set prompts and other model parameters in config. Possible parameters are:\n", + "* `user_prompt:` Promt to be given to the model.\n", + "* `temperature:` Temperature of the model.\n", + "* `max_tokens:` Maximum number of output tokens allowed for model." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'model_parameters': {'temperature': 0},\n", + " 'tests': {'defaults': {'min_pass_rate': 1.0},\n", + " 'robustness': {'lowercase': {'min_pass_rate': 0.7}},\n", + " 'accuracy': {'min_f1_score': {'min_score': 0.7}}}}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h.configure({\n", + " \"model_parameters\": {\n", + " \"temperature\": 0,\n", + " },\n", + " \"tests\": {\n", + " \"defaults\": {\n", + " \"min_pass_rate\": 1.0\n", + " },\n", + " \"robustness\": {\n", + " \"lowercase\": {\n", + " \"min_pass_rate\": 0.7\n", + " }\n", + " },\n", + " \"accuracy\": {\n", + " \"min_f1_score\": {\n", + " \"min_score\": 0.7,\n", + " },\n", + " }\n", + " }\n", + "})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we have configured the harness to perform two robustness tests (uppercase and lowercase) and defined the minimum pass rate for each test.\n", + "\n", + "➤ You can adjust the level of transformation in the sentence by using the \"`prob`\" parameter, which controls the proportion of words to be changed during robustness tests.\n", + "\n", + "➤ **NOTE** : \"`prob`\" defaults to 1.0, which means all words will be transformed.\n", + "```\n", + "harness.configure(\n", + "{\n", + " 'tests': {\n", + " 'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {\n", + " 'lowercase': {'min_pass_rate': 0.66, 'prob': 0.50}, \n", + " 'uppercase':{'min_pass_rate': 0.60, 'prob': 0.70},\n", + " }\n", + " }\n", + "})\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "import random as rnd \n", + "\n", + "rnd.seed(0)\n", + "\n", + "h.data = rnd.choices(h.data, k=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generating the test cases." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 2/2 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_case
0robustnesslowercaseHe won acclaim for the insights that he gave i...he won acclaim for the insights that he gave i...
1robustnesslowercaseFLORIDA AT CINCINNATIflorida at cincinnati
2robustnesslowercaseISSUER : Bay Co Building Authority ST : MIissuer : bay co building authority st : mi
3robustnesslowercaseChernomyrdin said on Thursday after a meeting ...chernomyrdin said on thursday after a meeting ...
4robustnesslowercaseWigan 42 Bradford Bulls 36wigan 42 bradford bulls 36
...............
100accuracymin_f1_score-ORG
101accuracymin_f1_score-MISC
102accuracymin_f1_score-PER
103accuracymin_f1_score-O
104accuracymin_f1_score-LOC
\n", + "

105 rows × 4 columns

\n", + "" + ], + "text/plain": [ + " category test_type \\\n", + "0 robustness lowercase \n", + "1 robustness lowercase \n", + "2 robustness lowercase \n", + "3 robustness lowercase \n", + "4 robustness lowercase \n", + ".. ... ... \n", + "100 accuracy min_f1_score \n", + "101 accuracy min_f1_score \n", + "102 accuracy min_f1_score \n", + "103 accuracy min_f1_score \n", + "104 accuracy min_f1_score \n", + "\n", + " original \\\n", + "0 He won acclaim for the insights that he gave i... \n", + "1 FLORIDA AT CINCINNATI \n", + "2 ISSUER : Bay Co Building Authority ST : MI \n", + "3 Chernomyrdin said on Thursday after a meeting ... \n", + "4 Wigan 42 Bradford Bulls 36 \n", + ".. ... \n", + "100 - \n", + "101 - \n", + "102 - \n", + "103 - \n", + "104 - \n", + "\n", + " test_case \n", + "0 he won acclaim for the insights that he gave i... \n", + "1 florida at cincinnati \n", + "2 issuer : bay co building authority st : mi \n", + "3 chernomyrdin said on thursday after a meeting ... \n", + "4 wigan 42 bradford bulls 36 \n", + ".. ... \n", + "100 ORG \n", + "101 MISC \n", + "102 PER \n", + "103 O \n", + "104 LOC \n", + "\n", + "[105 rows x 4 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h.testcases()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "harness.testcases() method displays the produced test cases in form of a pandas data frame." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 99%|█████████▉| 104/105 [06:20<00:03, 3.66s/it]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "df = h.generated_results()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0robustnesslowercaseHe won acclaim for the insights that he gave i...he won acclaim for the insights that he gave i...Europe: Location, Europe: Location, 20th: Date...he: PERSON, modern: DATE, europe: LOCATION, eu...False
1robustnesslowercaseFLORIDA AT CINCINNATIflorida at cincinnatiFLORIDA: LOCATION, CINCINNATI: LOCATIONflorida: LOCATION, cincinnati: LOCATIONTrue
2robustnesslowercaseISSUER : Bay Co Building Authority ST : MIissuer : bay co building authority st : miBay Co Building Authority: Organization, ST: L...bay: issuer, co: issuer, building: issuer, aut...False
3robustnesslowercaseChernomyrdin said on Thursday after a meeting ...chernomyrdin said on thursday after a meeting ...Chernomyrdin: Person, Thursday: Date, Lebed: P...chernomyrdin: PERSON, thursday: DATE, lebed: P...False
4robustnesslowercaseWigan 42 Bradford Bulls 36wigan 42 bradford bulls 36Wigan: Location, 42: Number, Bradford Bulls: O...wigan: ORG, 42: CARDINAL, bradford: ORG, bulls...False
........................
99robustnesslowercaseIndonesian President Suharto has asked busines...indonesian president suharto has asked busines...Indonesian: Location, President: Title, Suhart...indonesian: GPE, president: TITLE, suharto: PE...False
100accuracymin_f1_score-ORG0.70.0False
101accuracymin_f1_score-PER---
102accuracymin_f1_score-O0.70.4False
103accuracymin_f1_score-LOC0.70.0False
\n", + "

104 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " category test_type \\\n", + "0 robustness lowercase \n", + "1 robustness lowercase \n", + "2 robustness lowercase \n", + "3 robustness lowercase \n", + "4 robustness lowercase \n", + ".. ... ... \n", + "99 robustness lowercase \n", + "100 accuracy min_f1_score \n", + "101 accuracy min_f1_score \n", + "102 accuracy min_f1_score \n", + "103 accuracy min_f1_score \n", + "\n", + " original \\\n", + "0 He won acclaim for the insights that he gave i... \n", + "1 FLORIDA AT CINCINNATI \n", + "2 ISSUER : Bay Co Building Authority ST : MI \n", + "3 Chernomyrdin said on Thursday after a meeting ... \n", + "4 Wigan 42 Bradford Bulls 36 \n", + ".. ... \n", + "99 Indonesian President Suharto has asked busines... \n", + "100 - \n", + "101 - \n", + "102 - \n", + "103 - \n", + "\n", + " test_case \\\n", + "0 he won acclaim for the insights that he gave i... \n", + "1 florida at cincinnati \n", + "2 issuer : bay co building authority st : mi \n", + "3 chernomyrdin said on thursday after a meeting ... \n", + "4 wigan 42 bradford bulls 36 \n", + ".. ... \n", + "99 indonesian president suharto has asked busines... \n", + "100 ORG \n", + "101 PER \n", + "102 O \n", + "103 LOC \n", + "\n", + " expected_result \\\n", + "0 Europe: Location, Europe: Location, 20th: Date... \n", + "1 FLORIDA: LOCATION, CINCINNATI: LOCATION \n", + "2 Bay Co Building Authority: Organization, ST: L... \n", + "3 Chernomyrdin: Person, Thursday: Date, Lebed: P... \n", + "4 Wigan: Location, 42: Number, Bradford Bulls: O... \n", + ".. ... \n", + "99 Indonesian: Location, President: Title, Suhart... \n", + "100 0.7 \n", + "101 - \n", + "102 0.7 \n", + "103 0.7 \n", + "\n", + " actual_result pass \n", + "0 he: PERSON, modern: DATE, europe: LOCATION, eu... False \n", + "1 florida: LOCATION, cincinnati: LOCATION True \n", + "2 bay: issuer, co: issuer, building: issuer, aut... False \n", + "3 chernomyrdin: PERSON, thursday: DATE, lebed: P... False \n", + "4 wigan: ORG, 42: CARDINAL, bradford: ORG, bulls... False \n", + ".. ... ... \n", + "99 indonesian: GPE, president: TITLE, suharto: PE... False \n", + "100 0.0 False \n", + "101 - - \n", + "102 0.4 False \n", + "103 0.0 False \n", + "\n", + "[104 rows x 7 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Final Results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0robustnesslowercase693131%70%False
1accuracymin_f1_score400%100%False
\n", + "
" + ], + "text/plain": [ + " category test_type fail_count pass_count pass_rate \\\n", + "0 robustness lowercase 69 31 31% \n", + "1 accuracy min_f1_score 4 0 0% \n", + "\n", + " minimum_pass_rate pass \n", + "0 70% False \n", + "1 100% False " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "h.report()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/demo/tutorials/misc/Data_Augmenter_Notebook.ipynb b/demo/tutorials/misc/Data_Augmenter_Notebook.ipynb new file mode 100644 index 000000000..ba9c4ff3a --- /dev/null +++ b/demo/tutorials/misc/Data_Augmenter_Notebook.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{"id":"e7PsSmy9sCoR"},"source":["![image.png](data:image/png;base64,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)"]},{"cell_type":"markdown","metadata":{"id":"MhgkQYQiEvZt"},"source":["[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Data_Augmenter_Notebook.ipynb)"]},{"cell_type":"markdown","metadata":{"id":"WJJzt3RWhEc6"},"source":["**LangTest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification, fill-mask, Translation model using the library. We also support testing LLMS for Question-Answering, Summarization and text-generation tasks on benchmark datasets. The library supports 60+ out of the box tests. For a complete list of supported test categories, please refer to the [documentation](http://langtest.org/docs/pages/docs/test_categories).\n","\n","Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings."]},{"cell_type":"markdown","metadata":{"id":"26qXWhCYhHAt"},"source":["# Getting started with LangTest on John Snow Labs"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"oGIyE43uhTxH"},"outputs":[],"source":["!pip install langtest==2.2.0"]},{"cell_type":"markdown","metadata":{"id":"yR6kjOaiheKN"},"source":["# DataAugmenter and its Parameters\n","\n","The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the LangTest library in the following way."]},{"cell_type":"code","execution_count":9,"metadata":{},"outputs":[],"source":["yaml_content = \"\"\"\n","parameters:\n"," type: proportion\n"," style: new\n","tests:\n"," robustness:\n"," uppercase:\n"," max_proportion: 0.2\n"," lowercase:\n"," max_proportion: 0.2\n","\n","\"\"\"\n","\n","with open(\"config.yaml\", \"w\") as f:\n"," f.write(yaml_content)"]},{"cell_type":"code","execution_count":10,"metadata":{"executionInfo":{"elapsed":1405,"status":"ok","timestamp":1692343652196,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"lTzSJpMlhgq5"},"outputs":[],"source":["from langtest.augmentation import DataAugmenter\n","from langtest.tasks.task import TaskManager\n","\n","data_augmenter = DataAugmenter(\n"," task=TaskManager(\"ner\"),\n"," config=\"config.yaml\",\n",")"]},{"cell_type":"markdown","metadata":{"id":"sBcZjwJBhkOw"},"source":["The instance of the `DataAugmenter` class from the `langtest.augmentation` module is to perform the Data augmentation for different tasks from langtest. \n","In this specific instance, the `DataAugmenter` object is created with the following parameters:\n","\n","
\n","\n","| Parameter | Description |\n","| - | - |\n","| **task** | Task for which the model is to be evaluated (text-classification or ner) |\n","| **config** | Configuration for the tests to be performed, specified in the form of a YAML file. |\n","\n","By creating an instance of the `DataAugmenter` class, you can utilize its methods and functionalities to perform data augmentation on different tasks from langtest specific to the Named Entity Recognition task. The `config.yaml` file contains the specific configuration settings for the tests to be performed, such as the type of augmentation and the maximum proportion of augmentation for different test cases.\n","\n","Overall, the `data_augmenter` object represents an instance of the `DataAugmenter` class that can be used to conduct Data augmentation for the Named Entity Recognition task based on the provided configuration.\n","\n","
\n","
"]},{"cell_type":"markdown","metadata":{"id":"I21Jmq79jgC6"},"source":["#### Load Train and Test CoNLL"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["--2023-08-18 07:27:31-- https://raw.githubusercontent.com/JohnSnowLabs/langtest/main/langtest/data/conll/sample.conll\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.109.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 50519 (49K) [text/plain]\n","Saving to: ‘sample.conll’\n","\n","sample.conll 100%[===================>] 49.33K --.-KB/s in 0.006s \n","\n","2023-08-18 07:27:31 (7.50 MB/s) - ‘sample.conll’ saved [50519/50519]\n","\n","--2023-08-18 07:27:31-- https://raw.githubusercontent.com/JohnSnowLabs/langtest/main/demo/data/conll03.conll\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 827443 (808K) [text/plain]\n","Saving to: ‘conll03.conll’\n","\n","conll03.conll 100%[===================>] 808.05K --.-KB/s in 0.03s \n","\n","2023-08-18 07:27:31 (30.1 MB/s) - ‘conll03.conll’ saved [827443/827443]\n","\n"]}],"source":["# Load test CoNLL\n","!wget https://raw.githubusercontent.com/JohnSnowLabs/langtest/main/langtest/data/conll/sample.conll\n","\n","# Load train CoNLL\n","!wget https://raw.githubusercontent.com/JohnSnowLabs/langtest/main/demo/data/conll03.conll"]},{"cell_type":"markdown","metadata":{},"source":["### Augmenting with train data"]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["data_augmenter.augment(data={\n"," 'data_source': 'conll03.conll'\n","})"]},{"cell_type":"markdown","metadata":{},"source":["### Save the augmentated dataset "]},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":["data_augmenter.save(\"augmented.conll\")"]},{"cell_type":"markdown","metadata":{"id":"YPXIxv9D_fR7"},"source":["Essentially it applies perturbations to the input data based on the recommendations from the harness reports. Then this augmented_dataset is used to retrain the original model so as to make the model more robust and improve its performance."]}],"metadata":{"colab":{"machine_shape":"hm","provenance":[]},"gpuClass":"standard","kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8.10"},"widgets":{"application/vnd.jupyter.widget-state+json":{"083d033d6ae6468eba99f49ad4d70851":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"0c90c077bdb6413c8436753e04b0b310":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0d83e860bf5143c097f86589ec57c838":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6052db4c34ce40f091a76a6c560d7914","placeholder":"​","style":"IPY_MODEL_083d033d6ae6468eba99f49ad4d70851","value":"Downloading data: 100%"}},"0e954b1f50424ace89ded6ca266b2e47":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0efee88a1ec54982be57f1a4e3c13512":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"104eac103a524d27a5752ec152215f3e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_bdcebd9082fd4819806ec3c40b681a1f","max":27887,"min":0,"orientation":"horizontal","style":"IPY_MODEL_cbaaa99d2ed04dab9ae64bbb2b5575ff","value":27887}},"1144053479084dc3af5110a0d21f1695":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"12f88028ea3e481183077ae83c45178c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"137c73d474af45869edde1737ad6bdf8":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e78d8f1fdce14a58976034c3451bdb4d","placeholder":"​","style":"IPY_MODEL_a96a14b9e9e54c2eb6c2530830ccee78","value":"Downloading (…)solve/main/vocab.txt: 100%"}},"179c66b6176042b881c1791f2364e768":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_137c73d474af45869edde1737ad6bdf8","IPY_MODEL_a0a89fb0ba9d41d4a0764051e2ab1b18","IPY_MODEL_504427e2ab484763a69f2d107c629ff6"],"layout":"IPY_MODEL_c2f90037d09e4a1bb4186972d6124369"}},"1acb529a0b934c9dabe4695bbce2605f":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"1f3eb60a6494457fb8518771d08d538c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_c798214f4c1744648e6c12be6f0f3ed2","placeholder":"​","style":"IPY_MODEL_85a5b62c72e44a95a4dc3068935927ab","value":"Downloading (…)lve/main/config.json: 100%"}},"28ba25fefcdb4f3791c7b2aeba221099":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_83096e8a9a744c8ab7200130e3e680d9","max":872,"min":0,"orientation":"horizontal","style":"IPY_MODEL_b6c073c8ddaa4343a4d42585895fc88d","value":872}},"2be16a678e71496bb0295ec3ad4eb94d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_a760fee0c5ef48038aecb72efe79d818","placeholder":"​","style":"IPY_MODEL_48760cd2db3d41459b8d91097877e51b","value":" 67349/67349 [00:07<00:00, 15271.54 examples/s]"}},"2fe4ffbc33164d92a442966e7e62a277":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"32d41b06e3774d1da15821d27d312a36":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_f2edd2f3a05346a980084353a5a69588","placeholder":"​","style":"IPY_MODEL_1144053479084dc3af5110a0d21f1695","value":"Generating test split: 100%"}},"34fa21f16fa14360bda378d994b4e9e6":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_d7c606bba3cd4b27a636ec045f63e5ad","IPY_MODEL_80adfef602744159b21c7573a7949bfb","IPY_MODEL_bf5cf07ec47443359a04314bc049b542"],"layout":"IPY_MODEL_55173e01500346a39c02108ecf050bce"}},"35d6a445c9e54081bf893da1ecef35b7":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ebc9df27b93a48578b3360dba73d025b","placeholder":"​","style":"IPY_MODEL_4d03175daac74a1293d80181a04d90cf","value":"Downloading readme: 100%"}},"3811a72f2a244d27b4e9f36e75f7bfc6":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_f7a9fd11ca1047f3a218915f9f688322","IPY_MODEL_be16f19c90aa465db5887e753f59b75a","IPY_MODEL_4e0272c42a66493cbbf3290c7c1af8ea"],"layout":"IPY_MODEL_cb8b2bbee03144acad18269aafd48695"}},"391e02afdcae4d9dada698bbd64a18fe":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3d402afcaad649aca1df59a2f8360558":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"42340c8bb7fb459d951e778d036b6896":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"426bc79a4caf4f1189b74fdffb8ef45e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e623b03befab4832ad447d37bf734328","placeholder":"​","style":"IPY_MODEL_7900b3b219584bff8565cfce53a00b41","value":" 872/872 [00:00<00:00, 2480.68 examples/s]"}},"45a5f11820de45fe943919058d683fb0":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_cdc45a1d930b43b78ab823c989344e64","max":629,"min":0,"orientation":"horizontal","style":"IPY_MODEL_63086db41c8342ca9874a2dbb84ea115","value":629}},"46ec9daa936b489d804ad1aa6eecc5f5":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_472301ae530941bb9ad137d8746c1036","placeholder":"​","style":"IPY_MODEL_f548fe6de8be4bd3a1f51e3aada632b5","value":" 268M/268M [00:02<00:00, 168MB/s]"}},"47174443c6c64856b81bc2203c445f24":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"472301ae530941bb9ad137d8746c1036":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"48760cd2db3d41459b8d91097877e51b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"4d03175daac74a1293d80181a04d90cf":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"4e0272c42a66493cbbf3290c7c1af8ea":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_4e1b74059776480db2cb8241e38150a8","placeholder":"​","style":"IPY_MODEL_5789dc0e01b34841893fa6a59b7b5b7a","value":" 28.8k/28.8k [00:00<00:00, 681kB/s]"}},"4e1b74059776480db2cb8241e38150a8":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"504427e2ab484763a69f2d107c629ff6":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_fddf789d9dcf41058e0d00023180094a","placeholder":"​","style":"IPY_MODEL_bb6b4fd50ab24fda94361b63ece19c4c","value":" 232k/232k [00:00<00:00, 2.97MB/s]"}},"54ba2432454f4c578d8f3b19bae9f751":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"54fcf2d1069e4ee7830b2a3296ecdd93":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_7af809e9d3b940e3be3a1c3801233bad","max":67349,"min":0,"orientation":"horizontal","style":"IPY_MODEL_42340c8bb7fb459d951e778d036b6896","value":67349}},"55173e01500346a39c02108ecf050bce":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5789dc0e01b34841893fa6a59b7b5b7a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"5a2bd39e6ff04d4fadaae2b8c60d0b91":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_9f49f278b7ba4e1bbe10ff820d1d45f2","IPY_MODEL_8ceb5791f71041e6abf669137dd4faf1","IPY_MODEL_a11a5c1c8d73428e9e8cc6696029d686"],"layout":"IPY_MODEL_7a33945797af46569f999e713f09a2ff"}},"5d320de97ffc4d80ab4349129a6545b9":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_0d83e860bf5143c097f86589ec57c838","IPY_MODEL_cc9423181c3744079edabc48bdb93076","IPY_MODEL_9a6803ebcfd44a3f845570ad1de39860"],"layout":"IPY_MODEL_68f422e427e54a4589f3cd7ad6f524c8"}},"6052db4c34ce40f091a76a6c560d7914":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"61bf615f7606462b81e4a9aac67a0416":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_86949ecdab5046fc8c69b233a2fd6add","placeholder":"​","style":"IPY_MODEL_776e9018678d4bd28e73c6edd444dfdf","value":" 27.9k/27.9k [00:00<00:00, 1.03MB/s]"}},"63086db41c8342ca9874a2dbb84ea115":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"678f4a3d9803412da38cd9ef8dbcd45d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_9fa82a947ebd4db894ccd3d234bef14e","placeholder":"​","style":"IPY_MODEL_c168ac49aaf84138b7049ce4905253b4","value":"Map: 100%"}},"68f422e427e54a4589f3cd7ad6f524c8":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"721d831015ef4f2f8cb3bb631a97fdc5":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"74f8367c9d5f48ce89d0ac1560f34178":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_0c90c077bdb6413c8436753e04b0b310","max":267844284,"min":0,"orientation":"horizontal","style":"IPY_MODEL_f5cfa488a4324311abfed875f248062a","value":267844284}},"776e9018678d4bd28e73c6edd444dfdf":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"788b936a1cd54ea2b2d6f3de4f368b03":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"78cde7bec3424f4f989e1b10ec30d9b6":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"7900b3b219584bff8565cfce53a00b41":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"790526aebce849a382f9b940573e8e5e":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7a33945797af46569f999e713f09a2ff":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7af809e9d3b940e3be3a1c3801233bad":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7b41027b0efc45669afca83577e53852":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_1f3eb60a6494457fb8518771d08d538c","IPY_MODEL_45a5f11820de45fe943919058d683fb0","IPY_MODEL_c29963d03a2342c18c4e736470d721a7"],"layout":"IPY_MODEL_dcae284658494527be61b2956a84b76b"}},"8007540f57964519b5d507a320f1ee33":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"80adfef602744159b21c7573a7949bfb":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_96eb2c40da3943b48a6618dfba252cff","max":28682,"min":0,"orientation":"horizontal","style":"IPY_MODEL_e61ceeea4d694d989482b9327c159b46","value":28682}},"814e497aabbb4c6f91af8c237e578502":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"83096e8a9a744c8ab7200130e3e680d9":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"837cd89074834290a54f1a0e72ef2c02":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"85a5b62c72e44a95a4dc3068935927ab":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"86949ecdab5046fc8c69b233a2fd6add":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"878e2fa0b96f46b9836fb15967dd7c8b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_32d41b06e3774d1da15821d27d312a36","IPY_MODEL_b85cebb2e01f4f5ab6256bd5ce83b568","IPY_MODEL_9e3ae64f4f6642e6bd33723294d0dbb5"],"layout":"IPY_MODEL_a1ff2f0dd23c42709d2898c35f5268f4"}},"8c94f58d59f04704a75e53cb2f76a9d1":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8ca1609ba9ff447c8092c9a1ca9f7a4b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_678f4a3d9803412da38cd9ef8dbcd45d","IPY_MODEL_54fcf2d1069e4ee7830b2a3296ecdd93","IPY_MODEL_2be16a678e71496bb0295ec3ad4eb94d"],"layout":"IPY_MODEL_8007540f57964519b5d507a320f1ee33"}},"8ceb5791f71041e6abf669137dd4faf1":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_47174443c6c64856b81bc2203c445f24","max":48,"min":0,"orientation":"horizontal","style":"IPY_MODEL_78cde7bec3424f4f989e1b10ec30d9b6","value":48}},"96eb2c40da3943b48a6618dfba252cff":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"972c3cac08eb4aa0aca34713b00b52db":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_c6d1b4ddb6654c019c5f189d73c0daa6","IPY_MODEL_28ba25fefcdb4f3791c7b2aeba221099","IPY_MODEL_426bc79a4caf4f1189b74fdffb8ef45e"],"layout":"IPY_MODEL_dfd7dd0db7d74a1d9815fa5fdceae0dc"}},"98c9248b1c4a4d2ea2f426dcefc9b1ca":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"9a016e969e42408eb790300a6f5f01be":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_35d6a445c9e54081bf893da1ecef35b7","IPY_MODEL_104eac103a524d27a5752ec152215f3e","IPY_MODEL_61bf615f7606462b81e4a9aac67a0416"],"layout":"IPY_MODEL_788b936a1cd54ea2b2d6f3de4f368b03"}},"9a6803ebcfd44a3f845570ad1de39860":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_98c9248b1c4a4d2ea2f426dcefc9b1ca","placeholder":"​","style":"IPY_MODEL_814e497aabbb4c6f91af8c237e578502","value":" 7.44M/7.44M [00:00<00:00, 22.7MB/s]"}},"9e3ae64f4f6642e6bd33723294d0dbb5":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_fa74999702964cfb9c992bfc82a714ed","placeholder":"​","style":"IPY_MODEL_bce5e9726a83427c87d55ada258052ad","value":" 1821/1821 [00:00<00:00, 5774.41 examples/s]"}},"9f49f278b7ba4e1bbe10ff820d1d45f2":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_391e02afdcae4d9dada698bbd64a18fe","placeholder":"​","style":"IPY_MODEL_12f88028ea3e481183077ae83c45178c","value":"Downloading (…)okenizer_config.json: 100%"}},"9fa82a947ebd4db894ccd3d234bef14e":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a0a89fb0ba9d41d4a0764051e2ab1b18":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_8c94f58d59f04704a75e53cb2f76a9d1","max":231508,"min":0,"orientation":"horizontal","style":"IPY_MODEL_afd9aae7069148d2adf320ea62ecab6a","value":231508}},"a11a5c1c8d73428e9e8cc6696029d686":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_bca10368f3b34fb6807586214c8b2958","placeholder":"​","style":"IPY_MODEL_caed6c63807a42578bca3f955eb6998d","value":" 48.0/48.0 [00:00<00:00, 1.05kB/s]"}},"a175f36b1c41461baa7ee75c0dd698ae":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a1ff2f0dd23c42709d2898c35f5268f4":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a55279d46f25438aa6053684b53ba351":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"a6ba9f59074743268b0e15554942300d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_f51a64dcdb3346cea066451216b87401","IPY_MODEL_a96774f4a4984fa7b5d93120ea7427db","IPY_MODEL_d400a383838f4f21850d1fc2d870a611"],"layout":"IPY_MODEL_790526aebce849a382f9b940573e8e5e"}},"a760fee0c5ef48038aecb72efe79d818":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a96774f4a4984fa7b5d93120ea7427db":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a175f36b1c41461baa7ee75c0dd698ae","max":67349,"min":0,"orientation":"horizontal","style":"IPY_MODEL_837cd89074834290a54f1a0e72ef2c02","value":67349}},"a96a14b9e9e54c2eb6c2530830ccee78":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"a9dd8ead91e7458cb5ac1e9b39238375":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_f1ca7cfb56f6436b8820697747101dca","placeholder":"​","style":"IPY_MODEL_a55279d46f25438aa6053684b53ba351","value":"Downloading pytorch_model.bin: 100%"}},"aa33742745a0407183405f5e5bdbf494":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ac5d29255a514287bfe26f0eab19c1fa":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ac72b3581c1440769eacd5f60a998a94":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"afd9aae7069148d2adf320ea62ecab6a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"b367494954ed43d684988ce13bf182ea":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"b6c073c8ddaa4343a4d42585895fc88d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"b85cebb2e01f4f5ab6256bd5ce83b568":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_d4f6fcb559f94e38904cf3049094b4fd","max":1821,"min":0,"orientation":"horizontal","style":"IPY_MODEL_54ba2432454f4c578d8f3b19bae9f751","value":1821}},"b8dbeed17c8c4de0988127d1474610ad":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"bb6b4fd50ab24fda94361b63ece19c4c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"bca10368f3b34fb6807586214c8b2958":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bce5e9726a83427c87d55ada258052ad":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"bdcebd9082fd4819806ec3c40b681a1f":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"be16f19c90aa465db5887e753f59b75a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_0e954b1f50424ace89ded6ca266b2e47","max":28751,"min":0,"orientation":"horizontal","style":"IPY_MODEL_d334be3726c24ee39a5f34a82ce16013","value":28751}},"bebe1866317f43de8543336525a9b125":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"bf5cf07ec47443359a04314bc049b542":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ac5d29255a514287bfe26f0eab19c1fa","placeholder":"​","style":"IPY_MODEL_c0e1301c7c1048a6b7a5da4a8a421410","value":" 28.7k/28.7k [00:00<00:00, 487kB/s]"}},"c0e1301c7c1048a6b7a5da4a8a421410":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c168ac49aaf84138b7049ce4905253b4":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"c29963d03a2342c18c4e736470d721a7":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_f626b570013e4debbc056f00fd848a61","placeholder":"​","style":"IPY_MODEL_0efee88a1ec54982be57f1a4e3c13512","value":" 629/629 [00:00<00:00, 25.3kB/s]"}},"c2f90037d09e4a1bb4186972d6124369":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c6d1b4ddb6654c019c5f189d73c0daa6":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_721d831015ef4f2f8cb3bb631a97fdc5","placeholder":"​","style":"IPY_MODEL_b367494954ed43d684988ce13bf182ea","value":"Generating validation split: 100%"}},"c798214f4c1744648e6c12be6f0f3ed2":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"caed6c63807a42578bca3f955eb6998d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"cb8b2bbee03144acad18269aafd48695":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"cbaaa99d2ed04dab9ae64bbb2b5575ff":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"cc9423181c3744079edabc48bdb93076":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_bebe1866317f43de8543336525a9b125","max":7439277,"min":0,"orientation":"horizontal","style":"IPY_MODEL_b8dbeed17c8c4de0988127d1474610ad","value":7439277}},"cdc45a1d930b43b78ab823c989344e64":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d23c3c31c829411fac6817d645e201cf":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d334be3726c24ee39a5f34a82ce16013":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"d400a383838f4f21850d1fc2d870a611":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ea4911dca7a641948fa056ead09f9be6","placeholder":"​","style":"IPY_MODEL_2fe4ffbc33164d92a442966e7e62a277","value":" 67349/67349 [00:10<00:00, 6671.93 examples/s]"}},"d4f6fcb559f94e38904cf3049094b4fd":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d76e94e7d3314bde8d00996d8a08379c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"d7c606bba3cd4b27a636ec045f63e5ad":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_d23c3c31c829411fac6817d645e201cf","placeholder":"​","style":"IPY_MODEL_aa33742745a0407183405f5e5bdbf494","value":"Downloading metadata: 100%"}},"d858b9bd0dcc4bd5ad138d5b30a7ec6b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_a9dd8ead91e7458cb5ac1e9b39238375","IPY_MODEL_74f8367c9d5f48ce89d0ac1560f34178","IPY_MODEL_46ec9daa936b489d804ad1aa6eecc5f5"],"layout":"IPY_MODEL_fd32fe1c3ad8420299101cfa00a932d3"}},"dcae284658494527be61b2956a84b76b":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"dfd7dd0db7d74a1d9815fa5fdceae0dc":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e61ceeea4d694d989482b9327c159b46":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"e623b03befab4832ad447d37bf734328":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e78d8f1fdce14a58976034c3451bdb4d":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ea4911dca7a641948fa056ead09f9be6":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ebc9df27b93a48578b3360dba73d025b":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f1ca7cfb56f6436b8820697747101dca":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f2edd2f3a05346a980084353a5a69588":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f51a64dcdb3346cea066451216b87401":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_1acb529a0b934c9dabe4695bbce2605f","placeholder":"​","style":"IPY_MODEL_3d402afcaad649aca1df59a2f8360558","value":"Generating train split: 100%"}},"f548fe6de8be4bd3a1f51e3aada632b5":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"f5cfa488a4324311abfed875f248062a":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"f626b570013e4debbc056f00fd848a61":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f7a9fd11ca1047f3a218915f9f688322":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ac72b3581c1440769eacd5f60a998a94","placeholder":"​","style":"IPY_MODEL_d76e94e7d3314bde8d00996d8a08379c","value":"Downloading builder script: 100%"}},"fa74999702964cfb9c992bfc82a714ed":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fd32fe1c3ad8420299101cfa00a932d3":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"fddf789d9dcf41058e0d00023180094a":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}}}}},"nbformat":4,"nbformat_minor":0} diff --git a/demo/tutorials/misc/MultiPrompt_MultiDataset.ipynb b/demo/tutorials/misc/MultiPrompt_MultiDataset.ipynb new file mode 100644 index 000000000..27812169c --- /dev/null +++ b/demo/tutorials/misc/MultiPrompt_MultiDataset.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","metadata":{"id":"cQcN1kDfAw60"},"source":["![image.png](data:image/png;base64,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)"]},{"cell_type":"markdown","metadata":{"id":"Fu8i_qgCBplG"},"source":["[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/MultiPrompt_MultiDataset.ipynb)"]},{"cell_type":"markdown","metadata":{"id":"IKKgqEEKA3qv"},"source":["**LangTest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification, fill-mask, Translation model using the library. We also support testing LLMS for Question-Answering, Summarization and text-generation tasks on benchmark datasets. The library supports 60+ out of the box tests. For a complete list of supported test categories, please refer to the [documentation](http://langtest.org/docs/pages/docs/test_categories).\n","\n","Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings."]},{"cell_type":"markdown","metadata":{"id":"JzKpAy4mA5jA"},"source":["# Getting started with LangTest"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"jFus50TcGgJA"},"outputs":[],"source":["!pip install \"langtest[openai,transformers,evaluate]==2.2.0\""]},{"cell_type":"markdown","metadata":{"id":"bjK9t-uFBEPw"},"source":["# Harness and Its Parameters\n","\n","The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the LangTest library in the following way."]},{"cell_type":"code","execution_count":1,"metadata":{"executionInfo":{"elapsed":3080,"status":"ok","timestamp":1696324827009,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"9Z2vV7zLBJWz"},"outputs":[],"source":["# Import Harness from the LangTest library\n","from langtest import Harness"]},{"cell_type":"markdown","metadata":{"id":"MW9LVSCyBLoQ"},"source":["It imports the Harness class from within the module, that is designed to provide a blueprint or framework for conducting NLP testing, and that instances of the Harness class can be customized or configured for different testing scenarios or environments.\n","\n","Here is a list of the different parameters that can be passed to the Harness function:\n","\n","
\n","\n","\n","| Parameter | Description | \n","| - | - |\n","|**task** |Task for which the model is to be evaluated (question-answering or summarization)|\n","| **model** | Specifies the model(s) to be evaluated. This parameter can be provided as either a dictionary or a list of dictionaries. Each dictionary should contain the following keys: |\n","| **data** | The data to be used for evaluation. A dictionary providing flexibility and options for data sources. It should include the following keys: |\n","| **config** | Configuration for the tests to be performed, specified in the form of a YAML file. |\n","\n","
\n","
"]},{"cell_type":"markdown","metadata":{"id":"xHwkRUckBw9M"},"source":["# OpenAI Model Testing For Question Answering\n","\n","In this section, we dive into testing of OpenAI models in Question Answering task.\n","\n","LangTest supports robustness tests for LLM testing for now."]},{"cell_type":"markdown","metadata":{"id":"4bgnVoUiBRqU"},"source":["### Set environment for OpenAI"]},{"cell_type":"code","execution_count":2,"metadata":{"executionInfo":{"elapsed":17,"status":"ok","timestamp":1696324827010,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"mVYxDu-E_ssg"},"outputs":[],"source":["import os\n","\n","os.environ[\"OPENAI_API_KEY\"] = \"\""]},{"cell_type":"markdown","metadata":{"id":"tCXcKn_9BXEa"},"source":["### Multi Dataset Testing\n","\n","In order to evaluate the model's performance on multiple datasets, we can utilize a Jupyter notebook and provide a list of dictionaries to the `data` parameter. Each dictionary within the list should contain the following keys:\n","\n","```\n","data=[\n"," {\"data_source\": \"BoolQ\", \"split\": \"test-tiny\"},\n"," {\"data_source\": \"NQ-open\", \"split\": \"test-tiny\"},\n"," {\"data_source\": \"MedQA\", \"split\": \"test-tiny\"},\n"," {\"data_source\": \"LogiQA\", \"split\": \"test-tiny\"},\n","],\n","```\n","\n","Here, we specify different data sources and their corresponding splits for testing. This allows for a comprehensive evaluation of the model's performance across diverse datasets. The notebook can then be executed to assess how well the model generalizes to various types of questions and contexts presented in these datasets."]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":45,"status":"ok","timestamp":1692371630216,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"ASv9E02sBXrp","outputId":"fb19b9ec-3bd9-416e-f2fc-dc3190b8a861"},"outputs":[{"name":"stdout","output_type":"stream","text":["Test Configuration : \n"," {\n"," \"model_parameters\": {\n"," \"max_tokens\": 64\n"," },\n"," \"tests\": {\n"," \"defaults\": {\n"," \"min_pass_rate\": 1.0\n"," },\n"," \"robustness\": {\n"," \"add_typo\": {\n"," \"min_pass_rate\": 0.7\n"," },\n"," \"lowercase\": {\n"," \"min_pass_rate\": 0.7\n"," }\n"," }\n"," }\n","}\n"]}],"source":["harness = Harness(\n"," task=\"question-answering\",\n"," model={\"model\": \"gpt-3.5-turbo-instruct\", \"hub\": \"openai\"},\n"," data=[\n"," {\"data_source\": \"BoolQ\", \"split\": \"dev-tiny\"},\n"," {\"data_source\": \"NQ-open\", \"split\": \"test-tiny\"}\n"," ],\n",")"]},{"cell_type":"markdown","metadata":{"id":"_wvVHxeSDWLV"},"source":["## Robustness\n","\n","For tests we used uppercase, Dyslexia Word Swap, Add Slangs, Insert Abbreviations and Speech to Text typos . Other available robustness tests for QA task are:\n","* `add_context`\n","* `add_contraction`\n","* `add_punctuation`\n","* `add_typo`\n","* `add_ocr_typo`\n","* `american_to_british`\n","* `british_to_american`\n","* `lowercase`\n","* `strip_punctuation`\n","* `titlecase`\n","* `uppercase`\n","* `number_to_word`\n","* `add_abbreviation`\n","* `add_speech_to_text_typo`\n","* `add_slangs`\n","* `dyslexia_word_swap`\n","* `multiple_perturbations`\n","* `adjective_synonym_swap`\n","* `adjective_antonym_swap`\n","* `strip_all_punctuation`"]},{"cell_type":"markdown","metadata":{"id":"HYExqs-pDbvz"},"source":["You can also set prompts and other model parameters in config. Possible parameters are:\n","* `user_prompt:` Prompt to be given to the model.\n","* `temperature:` Temperature of the model.\n","* `max_tokens:` Maximum number of output tokens allowed for model."]},{"cell_type":"markdown","metadata":{},"source":["To configure prompts for different datasets, you can use the `user_prompt` dictionary. Here's how it works:\n","\n","- Each key in the dictionary represents a dataset name or task (e.g., \"BoolQ\", \"NQ-open\").\n","- The corresponding value is a string template that defines the user prompt for the dataset.\n","- The template can include placeholders:\n"," - `{context}`: This will be replaced with the actual context (passage) relevant to the question from the specific dataset.\n"," - `{question}`: This will be replaced with the actual question from the dataset.\n","- The newline character `\\n` can be used to separate the context and question in the final prompt.\n","\n","Here the example:\n","```python\n","harness.configure(\n"," {\n"," \"model_parameters\": {\n"," \"user_prompt\": {\n"," \"BoolQ\": \"Answer the following question with a True or False. {context}\\nQuestion {question}\",\n"," \"NQ-open\": \"Answer the following question. Question {question}\",\n"," }\n"," },\n"," ....\n"," })\n","```"]},{"cell_type":"code","execution_count":4,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":42,"status":"ok","timestamp":1692371630218,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"EzzlV0u4DbN9","outputId":"2a3926cd-9c23-45a6-a0b8-b31b29692be3"},"outputs":[{"data":{"text/plain":["{'model_parameters': {'user_prompt': {'BoolQ': 'Answer the following question with a True or False. {context}\\nQuestion {question}',\n"," 'NQ-open': 'Answer the following question. Question {question}'}},\n"," 'tests': {'defaults': {'min_pass_rate': 0.65},\n"," 'robustness': {'uppercase': {'min_pass_rate': 0.66},\n"," 'dyslexia_word_swap': {'min_pass_rate': 0.6},\n"," 'add_abbreviation': {'min_pass_rate': 0.6},\n"," 'add_slangs': {'min_pass_rate': 0.6},\n"," 'add_speech_to_text_typo': {'min_pass_rate': 0.6}}}}"]},"execution_count":4,"metadata":{},"output_type":"execute_result"}],"source":["harness.configure(\n"," {\n"," \"model_parameters\": {\n"," \"user_prompt\": {\n"," \"BoolQ\": \"Answer the following question with a True or False. {context}\\nQuestion {question}\",\n"," \"NQ-open\": \"Answer the following question. Question {question}\",\n"," }\n"," },\n"," \"tests\": {\n"," \"defaults\": {\"min_pass_rate\": 0.65},\n"," \"robustness\": {\n"," \"uppercase\": {\"min_pass_rate\": 0.66},\n"," \"dyslexia_word_swap\": {\"min_pass_rate\": 0.60},\n"," \"add_abbreviation\": {\"min_pass_rate\": 0.60},\n"," \"add_slangs\": {\"min_pass_rate\": 0.60},\n"," \"add_speech_to_text_typo\": {\"min_pass_rate\": 0.60},\n"," },\n"," }\n"," }\n",")"]},{"cell_type":"markdown","metadata":{"id":"P7TKPJd3Dft1"},"source":["➤ You can adjust the level of transformation in the sentence by using the \"`prob`\" parameter, which controls the proportion of words to be changed during robustness tests.\n","\n","➤ **NOTE** : \"`prob`\" defaults to 1.0, which means all words will be transformed.\n","```\n","harness.configure(\n","{\n"," 'tests': {\n"," 'defaults': {'min_pass_rate': 0.65},\n"," 'robustness': {\n"," 'uppercase': {'min_pass_rate': 0.66, 'prob': 0.50},\n"," 'dyslexia_word_swap':{'min_pass_rate': 0.60, 'prob': 0.70},\n"," }\n"," }\n","})\n","\n","```"]},{"cell_type":"markdown","metadata":{"id":"SW71UKHfDi2q"},"source":["Here we have configured the harness to perform Five robustness tests and defined the minimum pass rate for each test."]},{"cell_type":"code","execution_count":5,"metadata":{"id":"a9Q8i7-KDgR5"},"outputs":[],"source":["#slice the data\n","harness.data = {k: v[:10] for k, v in harness.data.items()}"]},{"cell_type":"markdown","metadata":{"id":"GlBMu35ODm77"},"source":["### Generating the test cases."]},{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":58028,"status":"ok","timestamp":1692371688215,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"L1NQcBCHDomc","outputId":"e3df8f16-fadd-4fbb-e479-2f098f07ba5a"},"outputs":[{"name":"stdout","output_type":"stream","text":["================================================================================\n"," BoolQ \n","================================================================================\n"]},{"name":"stderr","output_type":"stream","text":["Generating testcases...: 100%|██████████| 1/1 [00:00\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorydataset_nametest_typeoriginal_contextoriginal_questionperturbed_contextperturbed_question
0robustnessBoolQuppercaseAll biomass goes through at least some of thes...does ethanol take more energy make that producesALL BIOMASS GOES THROUGH AT LEAST SOME OF THES...DOES ETHANOL TAKE MORE ENERGY MAKE THAT PRODUCES
1robustnessBoolQuppercaseProperty tax or 'house tax' is a local tax on ...is house tax and property tax are samePROPERTY TAX OR 'HOUSE TAX' IS A LOCAL TAX ON ...IS HOUSE TAX AND PROPERTY TAX ARE SAME
2robustnessBoolQuppercasePhantom pain sensations are described as perce...is pain experienced in a missing body part or ...PHANTOM PAIN SENSATIONS ARE DESCRIBED AS PERCE...IS PAIN EXPERIENCED IN A MISSING BODY PART OR ...
3robustnessBoolQuppercaseHarry Potter and the Escape from Gringotts is ...is harry potter and the escape from gringotts ...HARRY POTTER AND THE ESCAPE FROM GRINGOTTS IS ...IS HARRY POTTER AND THE ESCAPE FROM GRINGOTTS ...
4robustnessBoolQuppercaseHydroxyzine preparations require a doctor's pr...is there a difference between hydroxyzine hcl ...HYDROXYZINE PREPARATIONS REQUIRE A DOCTOR'S PR...IS THERE A DIFFERENCE BETWEEN HYDROXYZINE HCL ...
........................
80robustnessNQ-openadd_speech_to_text_typo-who played grand moff tarkin in rogue one-Hoo played grand moff tarkin in rogue one
81robustnessNQ-openadd_speech_to_text_typo-youngest current member of the house of repres...-youngest current member of the Hause of repres...
82robustnessNQ-openadd_speech_to_text_typo-who wrote the miraculous journey of edward tulane-Houx wrote the miraculous journey of edward tu...
83robustnessNQ-openadd_speech_to_text_typo-when did the night mare before christmas come out-when did the night Mehr before christmas come out
84robustnessNQ-openadd_speech_to_text_typo-when does the green book come out in theaters-when does the green book come out Inn theaters
\n","

85 rows × 7 columns

\n",""],"text/plain":[" category dataset_name test_type \\\n","0 robustness BoolQ uppercase \n","1 robustness BoolQ uppercase \n","2 robustness BoolQ uppercase \n","3 robustness BoolQ uppercase \n","4 robustness BoolQ uppercase \n",".. ... ... ... \n","80 robustness NQ-open add_speech_to_text_typo \n","81 robustness NQ-open add_speech_to_text_typo \n","82 robustness NQ-open add_speech_to_text_typo \n","83 robustness NQ-open add_speech_to_text_typo \n","84 robustness NQ-open add_speech_to_text_typo \n","\n"," original_context \\\n","0 All biomass goes through at least some of thes... \n","1 Property tax or 'house tax' is a local tax on ... \n","2 Phantom pain sensations are described as perce... \n","3 Harry Potter and the Escape from Gringotts is ... \n","4 Hydroxyzine preparations require a doctor's pr... \n",".. ... \n","80 - \n","81 - \n","82 - \n","83 - \n","84 - \n","\n"," original_question \\\n","0 does ethanol take more energy make that produces \n","1 is house tax and property tax are same \n","2 is pain experienced in a missing body part or ... \n","3 is harry potter and the escape from gringotts ... \n","4 is there a difference between hydroxyzine hcl ... \n",".. ... \n","80 who played grand moff tarkin in rogue one \n","81 youngest current member of the house of repres... \n","82 who wrote the miraculous journey of edward tulane \n","83 when did the night mare before christmas come out \n","84 when does the green book come out in theaters \n","\n"," perturbed_context \\\n","0 ALL BIOMASS GOES THROUGH AT LEAST SOME OF THES... \n","1 PROPERTY TAX OR 'HOUSE TAX' IS A LOCAL TAX ON ... \n","2 PHANTOM PAIN SENSATIONS ARE DESCRIBED AS PERCE... \n","3 HARRY POTTER AND THE ESCAPE FROM GRINGOTTS IS ... \n","4 HYDROXYZINE PREPARATIONS REQUIRE A DOCTOR'S PR... \n",".. ... \n","80 - \n","81 - \n","82 - \n","83 - \n","84 - \n","\n"," perturbed_question \n","0 DOES ETHANOL TAKE MORE ENERGY MAKE THAT PRODUCES \n","1 IS HOUSE TAX AND PROPERTY TAX ARE SAME \n","2 IS PAIN EXPERIENCED IN A MISSING BODY PART OR ... \n","3 IS HARRY POTTER AND THE ESCAPE FROM GRINGOTTS ... \n","4 IS THERE A DIFFERENCE BETWEEN HYDROXYZINE HCL ... \n",".. ... \n","80 Hoo played grand moff tarkin in rogue one \n","81 youngest current member of the Hause of repres... \n","82 Houx wrote the miraculous journey of edward tu... \n","83 when did the night Mehr before christmas come out \n","84 when does the green book come out Inn theaters \n","\n","[85 rows x 7 columns]"]},"execution_count":7,"metadata":{},"output_type":"execute_result"}],"source":["harness.testcases()"]},{"cell_type":"markdown","metadata":{"id":"akSniLOoDxOp"},"source":["harness.generate() method automatically generates the test cases (based on the provided configuration)"]},{"cell_type":"markdown","metadata":{"id":"wk_cgK2BDzcM"},"source":["### Running the tests"]},{"cell_type":"code","execution_count":8,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":48720,"status":"ok","timestamp":1692371736914,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"nje7KWD9Dx3Y","outputId":"5ac4304a-0078-49ad-84b0-c5b6c2f58155"},"outputs":[{"name":"stdout","output_type":"stream","text":["================================================================================\n"," BoolQ \n","================================================================================\n"]},{"name":"stderr","output_type":"stream","text":["Running testcases... : 100%|██████████| 48/48 [00:52<00:00, 1.10s/it]\n"]},{"name":"stdout","output_type":"stream","text":["--------------------------------------------------------------------------------\n","\n","================================================================================\n"," NQ-open \n","================================================================================\n"]},{"name":"stderr","output_type":"stream","text":["Running testcases... : 100%|██████████| 37/37 [00:48<00:00, 1.31s/it]"]},{"name":"stdout","output_type":"stream","text":["--------------------------------------------------------------------------------\n","\n"]},{"name":"stderr","output_type":"stream","text":["\n"]},{"data":{"text/plain":[]},"execution_count":8,"metadata":{},"output_type":"execute_result"}],"source":["harness.run()"]},{"cell_type":"markdown","metadata":{"id":"7GnDWiU6D2S4"},"source":["Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test."]},{"cell_type":"markdown","metadata":{"id":"q17wkdZcD4T8"},"source":["### Generated Results"]},{"cell_type":"code","execution_count":9,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":805},"executionInfo":{"elapsed":18550,"status":"ok","timestamp":1692371755410,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"yJta_DvJD3xh","outputId":"91be0a8f-f014-4e04-81bd-8eaa521c84c9"},"outputs":[{"data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorydataset_nametest_typeoriginal_contextoriginal_questionperturbed_contextperturbed_questionexpected_resultactual_resultpass
0robustnessBoolQuppercaseAll biomass goes through at least some of thes...does ethanol take more energy make that producesALL BIOMASS GOES THROUGH AT LEAST SOME OF THES...DOES ETHANOL TAKE MORE ENERGY MAKE THAT PRODUCES\\n\\n\\nTrueTRUETrue
1robustnessBoolQuppercaseProperty tax or 'house tax' is a local tax on ...is house tax and property tax are samePROPERTY TAX OR 'HOUSE TAX' IS A LOCAL TAX ON ...IS HOUSE TAX AND PROPERTY TAX ARE SAME\\n\\nTrue\\n\\nTrueTrue
2robustnessBoolQuppercasePhantom pain sensations are described as perce...is pain experienced in a missing body part or ...PHANTOM PAIN SENSATIONS ARE DESCRIBED AS PERCE...IS PAIN EXPERIENCED IN A MISSING BODY PART OR ...?\\n\\n\\nTrue\\nTrueTrue
3robustnessBoolQuppercaseHarry Potter and the Escape from Gringotts is ...is harry potter and the escape from gringotts ...HARRY POTTER AND THE ESCAPE FROM GRINGOTTS IS ...IS HARRY POTTER AND THE ESCAPE FROM GRINGOTTS ...\\n\\nTrue?\\n\\nTrueTrue
4robustnessBoolQuppercaseHydroxyzine preparations require a doctor's pr...is there a difference between hydroxyzine hcl ...HYDROXYZINE PREPARATIONS REQUIRE A DOCTOR'S PR...IS THERE A DIFFERENCE BETWEEN HYDROXYZINE HCL ...\\n\\nTrueOATE\\n\\nTrueFalse
.................................
80robustnessNQ-openadd_speech_to_text_typo-who played grand moff tarkin in rogue one-Hoo played grand moff tarkin in rogue one\\n\\nPeter Cushing\\n\\nPeter Cushing played Grand Moff Tarkin in ...True
81robustnessNQ-openadd_speech_to_text_typo-youngest current member of the house of repres...-youngest current member of the Hause of repres...\\n\\nAs of 2021, the youngest current member of...\\n\\nAs of 2021, the youngest current member of...True
82robustnessNQ-openadd_speech_to_text_typo-who wrote the miraculous journey of edward tulane-Houx wrote the miraculous journey of edward tu...\\n\\nThe Miraculous Journey of Edward Tulane wa...\\n\\nWho wrote \"The Miraculous Journey of Edwar...False
83robustnessNQ-openadd_speech_to_text_typo-when did the night mare before christmas come out-when did the night Mehr before christmas come out\\n\\nThe Nightmare Before Christmas was release...\\n\\nThe Nightmare Before Christmas was release...True
84robustnessNQ-openadd_speech_to_text_typo-when does the green book come out in theaters-when does the green book come out Inn theaters\\n\\nThe green book was released in theaters on...\\n\\nThe release date for the green book in the...False
\n","

85 rows × 10 columns

\n","
"],"text/plain":[" category dataset_name test_type \\\n","0 robustness BoolQ uppercase \n","1 robustness BoolQ uppercase \n","2 robustness BoolQ uppercase \n","3 robustness BoolQ uppercase \n","4 robustness BoolQ uppercase \n",".. ... ... ... \n","80 robustness NQ-open add_speech_to_text_typo \n","81 robustness NQ-open add_speech_to_text_typo \n","82 robustness NQ-open add_speech_to_text_typo \n","83 robustness NQ-open add_speech_to_text_typo \n","84 robustness NQ-open add_speech_to_text_typo \n","\n"," original_context \\\n","0 All biomass goes through at least some of thes... \n","1 Property tax or 'house tax' is a local tax on ... \n","2 Phantom pain sensations are described as perce... \n","3 Harry Potter and the Escape from Gringotts is ... \n","4 Hydroxyzine preparations require a doctor's pr... \n",".. ... \n","80 - \n","81 - \n","82 - \n","83 - \n","84 - \n","\n"," original_question \\\n","0 does ethanol take more energy make that produces \n","1 is house tax and property tax are same \n","2 is pain experienced in a missing body part or ... \n","3 is harry potter and the escape from gringotts ... \n","4 is there a difference between hydroxyzine hcl ... \n",".. ... \n","80 who played grand moff tarkin in rogue one \n","81 youngest current member of the house of repres... \n","82 who wrote the miraculous journey of edward tulane \n","83 when did the night mare before christmas come out \n","84 when does the green book come out in theaters \n","\n"," perturbed_context \\\n","0 ALL BIOMASS GOES THROUGH AT LEAST SOME OF THES... \n","1 PROPERTY TAX OR 'HOUSE TAX' IS A LOCAL TAX ON ... \n","2 PHANTOM PAIN SENSATIONS ARE DESCRIBED AS PERCE... \n","3 HARRY POTTER AND THE ESCAPE FROM GRINGOTTS IS ... \n","4 HYDROXYZINE PREPARATIONS REQUIRE A DOCTOR'S PR... \n",".. ... \n","80 - \n","81 - \n","82 - \n","83 - \n","84 - \n","\n"," perturbed_question \\\n","0 DOES ETHANOL TAKE MORE ENERGY MAKE THAT PRODUCES \n","1 IS HOUSE TAX AND PROPERTY TAX ARE SAME \n","2 IS PAIN EXPERIENCED IN A MISSING BODY PART OR ... \n","3 IS HARRY POTTER AND THE ESCAPE FROM GRINGOTTS ... \n","4 IS THERE A DIFFERENCE BETWEEN HYDROXYZINE HCL ... \n",".. ... \n","80 Hoo played grand moff tarkin in rogue one \n","81 youngest current member of the Hause of repres... \n","82 Houx wrote the miraculous journey of edward tu... \n","83 when did the night Mehr before christmas come out \n","84 when does the green book come out Inn theaters \n","\n"," expected_result \\\n","0 \\n\\n\\nTrue \n","1 \\n\\nTrue \n","2 ?\\n\\n\\nTrue \n","3 \\n\\nTrue \n","4 \\n\\nTrue \n",".. ... \n","80 \\n\\nPeter Cushing \n","81 \\n\\nAs of 2021, the youngest current member of... \n","82 \\n\\nThe Miraculous Journey of Edward Tulane wa... \n","83 \\n\\nThe Nightmare Before Christmas was release... \n","84 \\n\\nThe green book was released in theaters on... \n","\n"," actual_result pass \n","0 TRUE True \n","1 \\n\\nTrue True \n","2 \\nTrue True \n","3 ?\\n\\nTrue True \n","4 OATE\\n\\nTrue False \n",".. ... ... \n","80 \\n\\nPeter Cushing played Grand Moff Tarkin in ... True \n","81 \\n\\nAs of 2021, the youngest current member of... True \n","82 \\n\\nWho wrote \"The Miraculous Journey of Edwar... False \n","83 \\n\\nThe Nightmare Before Christmas was release... True \n","84 \\n\\nThe release date for the green book in the... False \n","\n","[85 rows x 10 columns]"]},"execution_count":9,"metadata":{},"output_type":"execute_result"}],"source":["harness.generated_results()"]},{"cell_type":"markdown","metadata":{"id":"Vtv8wGFyD-XR"},"source":["This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed."]},{"cell_type":"markdown","metadata":{"id":"agT9GO6FEC3E"},"source":["### Final Results\n","\n","We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag."]},{"cell_type":"code","execution_count":10,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"executionInfo":{"elapsed":19430,"status":"ok","timestamp":1692371774826,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"qjFtUmbtEA2G","outputId":"62d274a2-8688-491a-f04e-101ebe5a6450"},"outputs":[{"data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
Benchmarking Results: gpt-3.5-turbo-instruct
fail_countpass_countpass_rateminimum_pass_ratepass
dataset_namecategorytest_type
BoolQrobustnessuppercase2880%66%True
dyslexia_word_swap2880%60%True
add_abbreviation1990%60%True
add_slangs4450%60%False
add_speech_to_text_typo3770%60%True
NQ-openrobustnessuppercase3770%66%True
dyslexia_word_swap2571%60%True
add_abbreviation5444%60%False
add_slangs1150%60%False
add_speech_to_text_typo5444%60%False
\n","
"],"text/plain":[" Benchmarking Results: gpt-3.5-turbo-instruct \\\n"," fail_count \n","dataset_name category test_type \n","BoolQ robustness uppercase 2 \n"," dyslexia_word_swap 2 \n"," add_abbreviation 1 \n"," add_slangs 4 \n"," add_speech_to_text_typo 3 \n","NQ-open robustness uppercase 3 \n"," dyslexia_word_swap 2 \n"," add_abbreviation 5 \n"," add_slangs 1 \n"," add_speech_to_text_typo 5 \n","\n"," \\\n"," pass_count pass_rate \n","dataset_name category test_type \n","BoolQ robustness uppercase 8 80% \n"," dyslexia_word_swap 8 80% \n"," add_abbreviation 9 90% \n"," add_slangs 4 50% \n"," add_speech_to_text_typo 7 70% \n","NQ-open robustness uppercase 7 70% \n"," dyslexia_word_swap 5 71% \n"," add_abbreviation 4 44% \n"," add_slangs 1 50% \n"," add_speech_to_text_typo 4 44% \n","\n"," \n"," minimum_pass_rate pass \n","dataset_name category test_type \n","BoolQ robustness uppercase 66% True \n"," dyslexia_word_swap 60% True \n"," add_abbreviation 60% True \n"," add_slangs 60% False \n"," add_speech_to_text_typo 60% True \n","NQ-open robustness uppercase 66% True \n"," dyslexia_word_swap 60% True \n"," add_abbreviation 60% False \n"," add_slangs 60% False \n"," add_speech_to_text_typo 60% False "]},"execution_count":10,"metadata":{},"output_type":"execute_result"}],"source":["harness.report()"]}],"metadata":{"colab":{"provenance":[],"toc_visible":true},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8.10"},"widgets":{"application/vnd.jupyter.widget-state+json":{"15398d3874e94df1ac6522838e13ad0c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2d921b11f11d4c53a321f7655680694f","placeholder":"​","style":"IPY_MODEL_e40d524a1c5942c0afb8ce31aedf3887","value":" 5.67k/5.67k [00:00<00:00, 389kB/s]"}},"2879b073fcb04b98b719cb4588014355":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"296965fa35704282a286cc46b9916317":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"2d921b11f11d4c53a321f7655680694f":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"31d80c12050640099352549928bb2478":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4508773a55994e9cb874e6378ebe8c9b":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"4b1f6e8e37a24eaaa2df3f6e7a055bc2":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_4508773a55994e9cb874e6378ebe8c9b","placeholder":"​","style":"IPY_MODEL_4b9eb7da58a94a609e8366810223dc5d","value":"Downloading builder script: 100%"}},"4b9eb7da58a94a609e8366810223dc5d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"4f4803210b5b4fcab023adad5b0dc68a":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7094f04d678e4a15869b56aea23b0061":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"7f39ae657f9d4931852e4445daa9d6c0":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"7fcadcf013864862b7315bd3f8ea7b6c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_a87dd94e12614c569730fd85cd9441af","IPY_MODEL_e3d98ad2bb7f411db994c4ecb0919633","IPY_MODEL_15398d3874e94df1ac6522838e13ad0c"],"layout":"IPY_MODEL_4f4803210b5b4fcab023adad5b0dc68a"}},"84ea5fe79f7c43279f5f82f9020608ce":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a48d6d06d40241d9af78b489116357df":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a6be4f84c9204246be7d663548930fa3":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"a87dd94e12614c569730fd85cd9441af":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_84ea5fe79f7c43279f5f82f9020608ce","placeholder":"​","style":"IPY_MODEL_7094f04d678e4a15869b56aea23b0061","value":"Downloading builder script: 100%"}},"ac3e4699290f49ea9594d8c3e6f8f524":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"e3d98ad2bb7f411db994c4ecb0919633":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_a6be4f84c9204246be7d663548930fa3","max":5669,"min":0,"orientation":"horizontal","style":"IPY_MODEL_296965fa35704282a286cc46b9916317","value":5669}},"e40d524a1c5942c0afb8ce31aedf3887":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"ed7b311df5554bc0833a04c9aeb33461":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_31d80c12050640099352549928bb2478","max":6270,"min":0,"orientation":"horizontal","style":"IPY_MODEL_7f39ae657f9d4931852e4445daa9d6c0","value":6270}},"f42ac25dbfa242b899104710097e26c5":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_4b1f6e8e37a24eaaa2df3f6e7a055bc2","IPY_MODEL_ed7b311df5554bc0833a04c9aeb33461","IPY_MODEL_f68d471fc390442cab9be0680cc72648"],"layout":"IPY_MODEL_a48d6d06d40241d9af78b489116357df"}},"f68d471fc390442cab9be0680cc72648":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_2879b073fcb04b98b719cb4588014355","placeholder":"​","style":"IPY_MODEL_ac3e4699290f49ea9594d8c3e6f8f524","value":" 6.27k/6.27k [00:00<00:00, 270kB/s]"}}}}},"nbformat":4,"nbformat_minor":0} diff --git a/demo/tutorials/misc/PerformanceTest_Notebook.ipynb b/demo/tutorials/misc/PerformanceTest_Notebook.ipynb index 609896cc5..4d68133e3 100644 --- a/demo/tutorials/misc/PerformanceTest_Notebook.ipynb +++ b/demo/tutorials/misc/PerformanceTest_Notebook.ipynb @@ -1 +1,4197 @@ -{"cells":[{"cell_type":"markdown","metadata":{"id":"e7PsSmy9sCoR"},"source":["![image.png](data:image/png;base64,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)"]},{"cell_type":"markdown","metadata":{"id":"3o5sAOfwL5qd"},"source":["[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/PerformanceTest_Notebook.ipynb)"]},{"cell_type":"markdown","metadata":{"id":"WJJzt3RWhEc6"},"source":["**LangTest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification, fill-mask, Translation model using the library. We also support testing LLMS for Question-Answering, Summarization and text-generation tasks on benchmark datasets. The library supports 60+ out of the box tests. For a complete list of supported test categories, please refer to the [documentation](http://langtest.org/docs/pages/docs/test_categories).\n","\n","Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings."]},{"cell_type":"markdown","metadata":{"id":"26qXWhCYhHAt"},"source":["# Getting started with LangTest on John Snow Labs"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"azUb114QhOsY"},"outputs":[],"source":["!pip install langtest[transformers]"]},{"cell_type":"markdown","metadata":{"id":"yR6kjOaiheKN"},"source":["# Harness and Its Parameters\n","\n","The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the LangTest library in the following way."]},{"cell_type":"code","execution_count":2,"metadata":{"executionInfo":{"elapsed":925,"status":"ok","timestamp":1692343745209,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"lTzSJpMlhgq5"},"outputs":[],"source":["#Import Harness from the LangTest library\n","from langtest import Harness"]},{"cell_type":"markdown","metadata":{"id":"JFhJ9CcbsKqN"},"source":["# Performance Testing\n","\n","In the testing phase of evaluating Natural Language Processing (NLP) models using LangTest, a dedicated tool for assessing language-related capabilities, the focus is on measuring the time taken to process a given dataset. This metric serves as a key performance indicator, reflecting the efficiency of NLP models in real-world scenarios. The choice of an appropriate dataset is pivotal, ensuring its relevance to the application's context. By comparing the time efficiency of different models, one can identify optimal solutions for specific use cases. Additionally, if processing times are suboptimal, exploration of model architecture adjustments and optimization strategies becomes essential to enhance overall performance and responsiveness, particularly in applications demanding quick and efficient language processing.\n","\n","The formula you provided,\n","\n","$\\ speed $ = $\\frac{number\\ of\\ tokens\\ in\\ given\\ dataset}{time\\ taken}$\n","\n","calculates the speed of processing for an NLP model. Specifically, it represents the number of words processed per unit of time, offering a quantitative measure of the model's efficiency. A higher speed value indicates faster processing, which can be crucial in real-time applications or scenarios where quick language understanding and response are essential. Monitoring and optimizing this speed metric contribute to ensuring the practical utility of NLP models, especially in applications such as chatbots, customer support systems, or any context where rapid language processing is a priority."]},{"cell_type":"markdown","metadata":{"id":"swaYPW-wPlku"},"source":["### Setup and Configure Harness"]},{"cell_type":"code","execution_count":3,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":920,"referenced_widgets":["6c5a9f6544e0442ca68098426c146503","e7f4a1278a7e49aba2ed734c228d0c66","0fe42dba7c4b4df2a64ea2002be642cf","9a06564cc5254e89a762426cf3269a9e","3bb1a7ff75c1490db0334e5162aba497","4790617c8b18415d9cafaceabca7022d","2ffcf6981af34b139f304200934abaee","d2d79f3cb2d8444fa36a6851a208e9f4","6b905fe4f7f542c9890f5cfd195beda3","b4d092df96e04c00a943f3c8e3329c39","966ad3248efb4f29a20f19b06c7dfa77","13f8de2b99ff475fbabbfba66b17125e","3f65fa34feac4f00a89cf74bdb8f5a59","d35f7095c5be4de19b625a00a0ea1798","5f050ded4d6d41509dbad6f17284c18c","58ee9406c08144de989c5a26ed5a1ccb","cee5a9b496cf435b9e746424187cad08","36e4580f19164f5d93280c4a06f0879c","1e99e26f69034ec79f52b512a608c4f7","c749fd792c914727b6ff4386b316df57","e24155477021432cb45793c0743eea1b","6fc068b143fc4e3391dd755e8262fcfd","5c12f56844e546c3aaadc192b2583077","c96e0761975e4290be8f4b287e3f6f42","81e8c8d107034c85aa95252a3838b05e","771f704de66e4d0eab0a2cb71dd24d2f","6cf03247c6374a6b89aaffee79998285","501dd4b2d09b4ae993a5bc2f18769ac4","3cbb3222ae2f4bb7b3dfd1a8c54a3503","edc62d1193fc44e98784da4b1a3fa390","5dce3c96154c4dbba25a57052804c82b","d54d2ab9930a447388f0fea290bef2ac","3ce8b14f48a24349b793b75d9350dc95","3f1c56e797cf43588bad099a0783e179","85ff59f9f7ed47b5ab78f767255f5a56","a12cdebdcf8b476f80b906d97a9ea261","a404d4d49f2046bd85ea64cc2de4a734","265a066b8e564034af96902a1e0347fb","d136b83a79034d20971be55510737103","572b68362a1a4292a43d44ebad043042","db4fc546e2d344018f85cd3deeab1115","ef8256e1afce4f268db5bc38a3a7fa86","afa59a1ecaba4b56a596f4cdbd7b6730","3d6af6f687c54a5eb0db38b2c2ef1899","d2906819c5ec4c82b2731eac4afe519d","1db2003c9e124e4f8b6444c157636983","eaae6733b12047ac9edec3adff0ab765","83aa131ac111451495e97bd710631418","f818144e1d304afd8b15900620abfc1d","314d5fcd2f864d8f941f90d76bd0df1b","b3f1bdcee72a47a791c6eaec72fdf136","06797e19a13d40df8c50322bf4b52f90","6689169d7c9447a1bde80313e6e9a7c2","38476374aa9c49f68dcf96e55e520240","6c506299e96344798ac6e36820e275bf","80393d9f400a4e9c8867808c5f2e8b28","eaff3fe3471b4815ab3d27d72142fe22","030f52c161444051b7215c4cf1b4eb27","d2726e7c8ebc4d0c9dbaf7d919bd064b","012930dde07a4a56af962c6993ecbf03","ab2b92ec8670443a9093c015c6084e95","5aee88b7efe54ce2b646b353cc61b26f","f80fde8b46ba4c7fad2f867f2439ef83","1152e3b558814204a94a058f0d506d20","6ee8c33165a946b8a15516a89203f396","9982d7d8bc634c77838aa10ccead8428"]},"executionInfo":{"elapsed":23923,"status":"ok","timestamp":1692343769123,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"JaarBdfe8DQ8","outputId":"9bc19b92-c518-4bcf-f7e6-16f419898566"},"outputs":[{"data":{"application/vnd.jupyter.widget-view+json":{"model_id":"6c5a9f6544e0442ca68098426c146503","version_major":2,"version_minor":0},"text/plain":["Downloading (…)lve/main/config.json: 0%| | 0.00/829 [00:00\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorytest_typeoriginaltest_case
0robustnesslowercaseSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...soccer - japan get lucky win , china in surpri...
1robustnesslowercaseNadim Ladkinadim ladki
2robustnesslowercaseAL-AIN , United Arab Emirates 1996-12-06al-ain , united arab emirates 1996-12-06
3robustnesslowercaseJapan began the defence of their Asian Cup tit...japan began the defence of their asian cup tit...
4robustnesslowercaseBut China saw their luck desert them in the se...but china saw their luck desert them in the se...
...............
448robustnessuppercaseCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .CRICKET - LARA ENDURES ANOTHER MISERABLE DAY .
449robustnessuppercaseRobert GalvinROBERT GALVIN
450robustnessuppercaseMELBOURNE 1996-12-06MELBOURNE 1996-12-06
451robustnessuppercaseAustralia gave Brian Lara another reason to be...AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE...
452performancespeed--
\n","

453 rows × 4 columns

\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","
\n"," \n"],"text/plain":[" category test_type \\\n","0 robustness lowercase \n","1 robustness lowercase \n","2 robustness lowercase \n","3 robustness lowercase \n","4 robustness lowercase \n",".. ... ... \n","448 robustness uppercase \n","449 robustness uppercase \n","450 robustness uppercase \n","451 robustness uppercase \n","452 performance speed \n","\n"," original \\\n","0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n","1 Nadim Ladki \n","2 AL-AIN , United Arab Emirates 1996-12-06 \n","3 Japan began the defence of their Asian Cup tit... \n","4 But China saw their luck desert them in the se... \n",".. ... \n","448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n","449 Robert Galvin \n","450 MELBOURNE 1996-12-06 \n","451 Australia gave Brian Lara another reason to be... \n","452 - \n","\n"," test_case \n","0 soccer - japan get lucky win , china in surpri... \n","1 nadim ladki \n","2 al-ain , united arab emirates 1996-12-06 \n","3 japan began the defence of their asian cup tit... \n","4 but china saw their luck desert them in the se... \n",".. ... \n","448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n","449 ROBERT GALVIN \n","450 MELBOURNE 1996-12-06 \n","451 AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE... \n","452 - \n","\n","[453 rows x 4 columns]"]},"execution_count":7,"metadata":{},"output_type":"execute_result"}],"source":["harness.testcases()"]},{"cell_type":"markdown","metadata":{"id":"NOJ8BAU2GGzd"},"source":["harness.testcases() method displays the produced test cases in form of a pandas data frame."]},{"cell_type":"markdown","metadata":{"id":"3CwhQw6hGR9S"},"source":["### Running the tests"]},{"cell_type":"code","execution_count":8,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":163600,"status":"ok","timestamp":1692343967668,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"aguX6-aFGOnP","outputId":"66be230c-84f5-4521-a3c5-fb57f91d131a"},"outputs":[{"name":"stderr","output_type":"stream","text":["Running testcases... : 100%|██████████| 453/453 [02:43<00:00, 2.77it/s]\n"]},{"data":{"text/plain":[]},"execution_count":8,"metadata":{},"output_type":"execute_result"}],"source":["harness.run()"]},{"cell_type":"markdown","metadata":{"id":"191O2oaUGWrH"},"source":["Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test."]},{"cell_type":"code","execution_count":9,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":527},"executionInfo":{"elapsed":33,"status":"ok","timestamp":1692343967670,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"XDbd1mpREWR5","outputId":"0375fbee-3ab7-4dca-f10d-eb6c36e23407"},"outputs":[{"data":{"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0robustnesslowercaseSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...soccer - japan get lucky win , china in surpri...JAPAN: MISC, LUCKY: PER, CHINA: ORGFalse
1robustnesslowercaseNadim Ladkinadim ladkiNadim Ladki: PERFalse
2robustnesslowercaseAL-AIN , United Arab Emirates 1996-12-06al-ain , united arab emirates 1996-12-06AL-AIN: LOC, United Arab Emirates: LOCal-ain: LOCFalse
3robustnesslowercaseJapan began the defence of their Asian Cup tit...japan began the defence of their asian cup tit...Japan: LOC, Asian Cup: MISC, Syria: LOC, Group...japan: ORG, syria: ORGFalse
4robustnesslowercaseBut China saw their luck desert them in the se...but china saw their luck desert them in the se...China: LOC, Uzbekistan: LOCuzbekistan: LOCFalse
........................
448robustnessuppercaseCRICKET - LARA ENDURES ANOTHER MISERABLE DAY .CRICKET - LARA ENDURES ANOTHER MISERABLE DAY .LARA: LOC, MISERABLE: PERLARA: LOC, MISERABLE: PERTrue
449robustnessuppercaseRobert GalvinROBERT GALVINRobert Galvin: PERROBERT: ORG, GALVIN: PERFalse
450robustnessuppercaseMELBOURNE 1996-12-06MELBOURNE 1996-12-06MELBOURNE: LOCMELBOURNE: LOCTrue
451robustnessuppercaseAustralia gave Brian Lara another reason to be...AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE...Australia: LOC, Brian Lara: PER, West Indies: ...AUSTRALIA: LOC, BRIAN LARA: LOC, REASON: PER, ...False
452performancespeed--100 token/sec19.20 token/secTrue
\n","

453 rows × 7 columns

\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","
\n","
\n"],"text/plain":[" category test_type \\\n","0 robustness lowercase \n","1 robustness lowercase \n","2 robustness lowercase \n","3 robustness lowercase \n","4 robustness lowercase \n",".. ... ... \n","448 robustness uppercase \n","449 robustness uppercase \n","450 robustness uppercase \n","451 robustness uppercase \n","452 performance speed \n","\n"," original \\\n","0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n","1 Nadim Ladki \n","2 AL-AIN , United Arab Emirates 1996-12-06 \n","3 Japan began the defence of their Asian Cup tit... \n","4 But China saw their luck desert them in the se... \n",".. ... \n","448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n","449 Robert Galvin \n","450 MELBOURNE 1996-12-06 \n","451 Australia gave Brian Lara another reason to be... \n","452 - \n","\n"," test_case \\\n","0 soccer - japan get lucky win , china in surpri... \n","1 nadim ladki \n","2 al-ain , united arab emirates 1996-12-06 \n","3 japan began the defence of their asian cup tit... \n","4 but china saw their luck desert them in the se... \n",".. ... \n","448 CRICKET - LARA ENDURES ANOTHER MISERABLE DAY . \n","449 ROBERT GALVIN \n","450 MELBOURNE 1996-12-06 \n","451 AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE... \n","452 - \n","\n"," expected_result \\\n","0 JAPAN: MISC, LUCKY: PER, CHINA: ORG \n","1 Nadim Ladki: PER \n","2 AL-AIN: LOC, United Arab Emirates: LOC \n","3 Japan: LOC, Asian Cup: MISC, Syria: LOC, Group... \n","4 China: LOC, Uzbekistan: LOC \n",".. ... \n","448 LARA: LOC, MISERABLE: PER \n","449 Robert Galvin: PER \n","450 MELBOURNE: LOC \n","451 Australia: LOC, Brian Lara: PER, West Indies: ... \n","452 100 token/sec \n","\n"," actual_result pass \n","0 False \n","1 False \n","2 al-ain: LOC False \n","3 japan: ORG, syria: ORG False \n","4 uzbekistan: LOC False \n",".. ... ... \n","448 LARA: LOC, MISERABLE: PER True \n","449 ROBERT: ORG, GALVIN: PER False \n","450 MELBOURNE: LOC True \n","451 AUSTRALIA: LOC, BRIAN LARA: LOC, REASON: PER, ... False \n","452 19.20 token/sec True \n","\n","[453 rows x 7 columns]"]},"execution_count":9,"metadata":{},"output_type":"execute_result"}],"source":["harness.generated_results()"]},{"cell_type":"markdown","metadata":{"id":"TKB8Rsr2GZME"},"source":["This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed."]},{"cell_type":"markdown","metadata":{"id":"PBSlpWnUU55G"},"source":["### Final Results"]},{"cell_type":"markdown","metadata":{"id":"umnEgUHM8DRA"},"source":["We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag.\n","\n","To get time_elapsed for each test we pass parameter `return_runtime=True` in `.report()` method. We can also select the unit for time_elapsed i.e, seconds(s), miliseconds(ms) or microseconds(us) etc."]},{"cell_type":"code","execution_count":10,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":143},"executionInfo":{"elapsed":30,"status":"ok","timestamp":1692343967672,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"gp57HcF9yxi7","outputId":"8d990f2e-6b4d-480e-e844-95ff9158e126"},"outputs":[{"data":{"text/html":["\n","
\n","
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0robustnesslowercase1824419%66%False
1robustnessuppercase1527433%66%False
2performancespeed01100%100%True
\n","
\n","
\n","\n","
\n"," \n","\n"," \n","\n"," \n","
\n","\n","\n","
\n"," \n","\n","\n","\n"," \n","
\n","
\n","
\n"],"text/plain":[" category test_type fail_count pass_count pass_rate minimum_pass_rate \\\n","0 robustness lowercase 182 44 19% 66% \n","1 robustness uppercase 152 74 33% 66% \n","2 performance speed 0 1 100% 100% \n","\n"," pass \n","0 False \n","1 False \n","2 True "]},"execution_count":10,"metadata":{},"output_type":"execute_result"}],"source":["harness.report()"]},{"cell_type":"markdown","metadata":{"id":"zg-knds3tq-w"},"source":["# Multiple Models Runtime Testing"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"ElMInPJMu3QK"},"outputs":[],"source":["!pip install spacy johnsnowlabs"]},{"cell_type":"code","execution_count":11,"metadata":{"executionInfo":{"elapsed":28,"status":"ok","timestamp":1692343967673,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"TnUBvYXptq-w"},"outputs":[],"source":["model_dict=[{\"model\": \"ner.dl\", \"hub\": \"johnsnowlabs\"},\n"," {\"model\": \"en_core_web_sm\", \"hub\": \"spacy\"}]"]},{"cell_type":"code","execution_count":13,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":1096,"status":"ok","timestamp":1692344027826,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"PmMwW5IIvGav","outputId":"d9e5c932-b286-46e7-d18c-23e23f4cba6f"},"outputs":[{"name":"stdout","output_type":"stream","text":["--2023-08-18 07:33:45-- https://github.com/JohnSnowLabs/langtest/raw/main/langtest/data/conll/sample.conll\n","Resolving github.com (github.com)... 20.27.177.113\n","Connecting to github.com (github.com)|20.27.177.113|:443... connected.\n","HTTP request sent, awaiting response... 302 Found\n","Location: https://raw.githubusercontent.com/JohnSnowLabs/langtest/main/langtest/data/conll/sample.conll [following]\n","--2023-08-18 07:33:45-- https://raw.githubusercontent.com/JohnSnowLabs/langtest/main/langtest/data/conll/sample.conll\n","Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...\n","Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.\n","HTTP request sent, awaiting response... 200 OK\n","Length: 50519 (49K) [text/plain]\n","Saving to: ‘sample.conll’\n","\n","sample.conll 100%[===================>] 49.33K --.-KB/s in 0.01s \n","\n","2023-08-18 07:33:46 (3.77 MB/s) - ‘sample.conll’ saved [50519/50519]\n","\n"]}],"source":["# Load CoNLL\n","!wget https://github.com/JohnSnowLabs/langtest/raw/main/langtest/data/conll/sample.conll"]},{"cell_type":"code","execution_count":16,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":233178,"status":"ok","timestamp":1692344334665,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"yey-zVICtq-w","outputId":"d94e8722-e009-4c17-85e5-9f8bcafdaf6a"},"outputs":[{"name":"stdout","output_type":"stream","text":["Warning::Spark Session already created, some configs may not take.\n","recognize_entities_dl download started this may take some time.\n","Approx size to download 159 MB\n","[OK!]\n","Test Configuration : \n"," {\n"," \"tests\": {\n"," \"defaults\": {\n"," \"min_pass_rate\": 1.0\n"," },\n"," \"robustness\": {\n"," \"add_typo\": {\n"," \"min_pass_rate\": 0.7\n"," },\n"," \"american_to_british\": {\n"," \"min_pass_rate\": 0.7\n"," }\n"," },\n"," \"accuracy\": {\n"," \"min_micro_f1_score\": {\n"," \"min_score\": 0.7\n"," }\n"," },\n"," \"bias\": {\n"," \"replace_to_female_pronouns\": {\n"," \"min_pass_rate\": 0.7\n"," },\n"," \"replace_to_low_income_country\": {\n"," \"min_pass_rate\": 0.7\n"," }\n"," },\n"," \"fairness\": {\n"," \"min_gender_f1_score\": {\n"," \"min_score\": 0.6\n"," }\n"," },\n"," \"representation\": {\n"," \"min_label_representation_count\": {\n"," \"min_count\": 50\n"," }\n"," }\n"," }\n","}\n"]}],"source":["harness = Harness(task=\"ner\", model=model_dict, data={\"data_source\":\"sample.conll\"})"]},{"cell_type":"code","execution_count":17,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":85,"status":"ok","timestamp":1692344334668,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"JwK7oi7Etq-w","outputId":"11e0d7e4-58f0-497b-d122-07efc38f21cb"},"outputs":[{"data":{"text/plain":["{'tests': {'defaults': {'min_pass_rate': 0.65},\n"," 'robustness': {'uppercase': {'min_pass_rate': 0.66},\n"," 'lowercase': {'min_pass_rate': 0.6}},\n"," 'performance': {'speed': {'min_pass_rate': 100, 'unit': 'tokens/sec'}}}}"]},"execution_count":17,"metadata":{},"output_type":"execute_result"}],"source":["harness.configure(\n","{\n"," 'tests': {'defaults': {'min_pass_rate': 0.65},\n"," 'robustness': {'uppercase': {'min_pass_rate': 0.66},\n"," 'lowercase': {'min_pass_rate': 0.60},\n"," },\n"," 'performance': {'speed': {'min_pass_rate': 100, 'unit': 'tokens/sec'}\n"," },\n"," }\n"," }\n"," )\n"]},{"cell_type":"code","execution_count":18,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"elapsed":130503,"status":"ok","timestamp":1692344465099,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"vTbPwStvtq-x","outputId":"4b2cbf34-6d9e-4942-b6e5-4bccd7153326"},"outputs":[{"name":"stderr","output_type":"stream","text":["Generating testcases...: 100%|██████████| 2/2 [00:00<00:00, 8256.50it/s]\n","Generating testcases...: 100%|██████████| 2/2 [00:00<00:00, 10094.59it/s]\n","Running testcases... : 100%|██████████| 453/453 [01:30<00:00, 4.99it/s]\n","Running testcases... : 100%|██████████| 453/453 [00:11<00:00, 40.56it/s]\n"]},{"data":{"text/plain":[]},"execution_count":18,"metadata":{},"output_type":"execute_result"}],"source":["harness.generate().run()"]},{"cell_type":"code","execution_count":19,"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":143},"executionInfo":{"elapsed":63,"status":"ok","timestamp":1692344465100,"user":{"displayName":"Prikshit sharma","userId":"07819241395213139913"},"user_tz":-330},"id":"AUZUeCpLtq-x","outputId":"406dea53-1a63-4e17-9ffb-7ed7e2a4531d"},"outputs":[{"data":{"text/html":["\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
test_typelowercasespeeduppercase
model_name   
en_core_web_sm0.2900000.5000000.580000
ner.dl0.1100001.0000000.850000
\n"],"text/plain":[""]},"execution_count":19,"metadata":{},"output_type":"execute_result"}],"source":["harness.report()"]}],"metadata":{"accelerator":"TPU","colab":{"machine_shape":"hm","provenance":[]},"gpuClass":"standard","kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.8.9"},"widgets":{"application/vnd.jupyter.widget-state+json":{"012930dde07a4a56af962c6993ecbf03":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"030f52c161444051b7215c4cf1b4eb27":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_f80fde8b46ba4c7fad2f867f2439ef83","max":112,"min":0,"orientation":"horizontal","style":"IPY_MODEL_1152e3b558814204a94a058f0d506d20","value":112}},"06797e19a13d40df8c50322bf4b52f90":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0fe42dba7c4b4df2a64ea2002be642cf":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_d2d79f3cb2d8444fa36a6851a208e9f4","max":829,"min":0,"orientation":"horizontal","style":"IPY_MODEL_6b905fe4f7f542c9890f5cfd195beda3","value":829}},"1152e3b558814204a94a058f0d506d20":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"13f8de2b99ff475fbabbfba66b17125e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_3f65fa34feac4f00a89cf74bdb8f5a59","IPY_MODEL_d35f7095c5be4de19b625a00a0ea1798","IPY_MODEL_5f050ded4d6d41509dbad6f17284c18c"],"layout":"IPY_MODEL_58ee9406c08144de989c5a26ed5a1ccb"}},"1db2003c9e124e4f8b6444c157636983":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_314d5fcd2f864d8f941f90d76bd0df1b","placeholder":"​","style":"IPY_MODEL_b3f1bdcee72a47a791c6eaec72fdf136","value":"Downloading (…)in/added_tokens.json: 100%"}},"1e99e26f69034ec79f52b512a608c4f7":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"265a066b8e564034af96902a1e0347fb":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"2ffcf6981af34b139f304200934abaee":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"314d5fcd2f864d8f941f90d76bd0df1b":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"36e4580f19164f5d93280c4a06f0879c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"38476374aa9c49f68dcf96e55e520240":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3bb1a7ff75c1490db0334e5162aba497":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"3cbb3222ae2f4bb7b3dfd1a8c54a3503":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3ce8b14f48a24349b793b75d9350dc95":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3d6af6f687c54a5eb0db38b2c2ef1899":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"3f1c56e797cf43588bad099a0783e179":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_85ff59f9f7ed47b5ab78f767255f5a56","IPY_MODEL_a12cdebdcf8b476f80b906d97a9ea261","IPY_MODEL_a404d4d49f2046bd85ea64cc2de4a734"],"layout":"IPY_MODEL_265a066b8e564034af96902a1e0347fb"}},"3f65fa34feac4f00a89cf74bdb8f5a59":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_cee5a9b496cf435b9e746424187cad08","placeholder":"​","style":"IPY_MODEL_36e4580f19164f5d93280c4a06f0879c","value":"Downloading pytorch_model.bin: 100%"}},"4790617c8b18415d9cafaceabca7022d":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"501dd4b2d09b4ae993a5bc2f18769ac4":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"572b68362a1a4292a43d44ebad043042":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"58ee9406c08144de989c5a26ed5a1ccb":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"5aee88b7efe54ce2b646b353cc61b26f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"5c12f56844e546c3aaadc192b2583077":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_c96e0761975e4290be8f4b287e3f6f42","IPY_MODEL_81e8c8d107034c85aa95252a3838b05e","IPY_MODEL_771f704de66e4d0eab0a2cb71dd24d2f"],"layout":"IPY_MODEL_6cf03247c6374a6b89aaffee79998285"}},"5dce3c96154c4dbba25a57052804c82b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"5f050ded4d6d41509dbad6f17284c18c":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e24155477021432cb45793c0743eea1b","placeholder":"​","style":"IPY_MODEL_6fc068b143fc4e3391dd755e8262fcfd","value":" 433M/433M [00:05<00:00, 38.8MB/s]"}},"6689169d7c9447a1bde80313e6e9a7c2":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"6b905fe4f7f542c9890f5cfd195beda3":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"6c506299e96344798ac6e36820e275bf":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6c5a9f6544e0442ca68098426c146503":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_e7f4a1278a7e49aba2ed734c228d0c66","IPY_MODEL_0fe42dba7c4b4df2a64ea2002be642cf","IPY_MODEL_9a06564cc5254e89a762426cf3269a9e"],"layout":"IPY_MODEL_3bb1a7ff75c1490db0334e5162aba497"}},"6cf03247c6374a6b89aaffee79998285":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6ee8c33165a946b8a15516a89203f396":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"6fc068b143fc4e3391dd755e8262fcfd":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"771f704de66e4d0eab0a2cb71dd24d2f":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_d54d2ab9930a447388f0fea290bef2ac","placeholder":"​","style":"IPY_MODEL_3ce8b14f48a24349b793b75d9350dc95","value":" 59.0/59.0 [00:00<00:00, 2.43kB/s]"}},"80393d9f400a4e9c8867808c5f2e8b28":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_eaff3fe3471b4815ab3d27d72142fe22","IPY_MODEL_030f52c161444051b7215c4cf1b4eb27","IPY_MODEL_d2726e7c8ebc4d0c9dbaf7d919bd064b"],"layout":"IPY_MODEL_012930dde07a4a56af962c6993ecbf03"}},"81e8c8d107034c85aa95252a3838b05e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_edc62d1193fc44e98784da4b1a3fa390","max":59,"min":0,"orientation":"horizontal","style":"IPY_MODEL_5dce3c96154c4dbba25a57052804c82b","value":59}},"83aa131ac111451495e97bd710631418":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_38476374aa9c49f68dcf96e55e520240","placeholder":"​","style":"IPY_MODEL_6c506299e96344798ac6e36820e275bf","value":" 2.00/2.00 [00:00<00:00, 86.3B/s]"}},"85ff59f9f7ed47b5ab78f767255f5a56":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_d136b83a79034d20971be55510737103","placeholder":"​","style":"IPY_MODEL_572b68362a1a4292a43d44ebad043042","value":"Downloading (…)solve/main/vocab.txt: 100%"}},"966ad3248efb4f29a20f19b06c7dfa77":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"9982d7d8bc634c77838aa10ccead8428":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"9a06564cc5254e89a762426cf3269a9e":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_b4d092df96e04c00a943f3c8e3329c39","placeholder":"​","style":"IPY_MODEL_966ad3248efb4f29a20f19b06c7dfa77","value":" 829/829 [00:00<00:00, 15.0kB/s]"}},"a12cdebdcf8b476f80b906d97a9ea261":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_db4fc546e2d344018f85cd3deeab1115","max":213450,"min":0,"orientation":"horizontal","style":"IPY_MODEL_ef8256e1afce4f268db5bc38a3a7fa86","value":213450}},"a404d4d49f2046bd85ea64cc2de4a734":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_afa59a1ecaba4b56a596f4cdbd7b6730","placeholder":"​","style":"IPY_MODEL_3d6af6f687c54a5eb0db38b2c2ef1899","value":" 213k/213k [00:00<00:00, 7.96MB/s]"}},"ab2b92ec8670443a9093c015c6084e95":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"afa59a1ecaba4b56a596f4cdbd7b6730":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"b3f1bdcee72a47a791c6eaec72fdf136":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"DescriptionStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"b4d092df96e04c00a943f3c8e3329c39":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"c749fd792c914727b6ff4386b316df57":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"c96e0761975e4290be8f4b287e3f6f42":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_501dd4b2d09b4ae993a5bc2f18769ac4","placeholder":"​","style":"IPY_MODEL_3cbb3222ae2f4bb7b3dfd1a8c54a3503","value":"Downloading (…)okenizer_config.json: 100%"}},"cee5a9b496cf435b9e746424187cad08":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d136b83a79034d20971be55510737103":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d2726e7c8ebc4d0c9dbaf7d919bd064b":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_6ee8c33165a946b8a15516a89203f396","placeholder":"​","style":"IPY_MODEL_9982d7d8bc634c77838aa10ccead8428","value":" 112/112 [00:00<00:00, 7.97kB/s]"}},"d2906819c5ec4c82b2731eac4afe519d":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HBoxModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HBoxView","box_style":"","children":["IPY_MODEL_1db2003c9e124e4f8b6444c157636983","IPY_MODEL_eaae6733b12047ac9edec3adff0ab765","IPY_MODEL_83aa131ac111451495e97bd710631418"],"layout":"IPY_MODEL_f818144e1d304afd8b15900620abfc1d"}},"d2d79f3cb2d8444fa36a6851a208e9f4":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"d35f7095c5be4de19b625a00a0ea1798":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_1e99e26f69034ec79f52b512a608c4f7","max":433316646,"min":0,"orientation":"horizontal","style":"IPY_MODEL_c749fd792c914727b6ff4386b316df57","value":433316646}},"d54d2ab9930a447388f0fea290bef2ac":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"db4fc546e2d344018f85cd3deeab1115":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e24155477021432cb45793c0743eea1b":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e7f4a1278a7e49aba2ed734c228d0c66":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_4790617c8b18415d9cafaceabca7022d","placeholder":"​","style":"IPY_MODEL_2ffcf6981af34b139f304200934abaee","value":"Downloading (…)lve/main/config.json: 100%"}},"eaae6733b12047ac9edec3adff0ab765":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"FloatProgressModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"FloatProgressModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ProgressView","bar_style":"success","description":"","description_tooltip":null,"layout":"IPY_MODEL_06797e19a13d40df8c50322bf4b52f90","max":2,"min":0,"orientation":"horizontal","style":"IPY_MODEL_6689169d7c9447a1bde80313e6e9a7c2","value":2}},"eaff3fe3471b4815ab3d27d72142fe22":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"HTMLModel","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_ab2b92ec8670443a9093c015c6084e95","placeholder":"​","style":"IPY_MODEL_5aee88b7efe54ce2b646b353cc61b26f","value":"Downloading (…)cial_tokens_map.json: 100%"}},"edc62d1193fc44e98784da4b1a3fa390":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ef8256e1afce4f268db5bc38a3a7fa86":{"model_module":"@jupyter-widgets/controls","model_module_version":"1.5.0","model_name":"ProgressStyleModel","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ProgressStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","bar_color":null,"description_width":""}},"f80fde8b46ba4c7fad2f867f2439ef83":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"f818144e1d304afd8b15900620abfc1d":{"model_module":"@jupyter-widgets/base","model_module_version":"1.2.0","model_name":"LayoutModel","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}}}}},"nbformat":4,"nbformat_minor":0} +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "e7PsSmy9sCoR" + }, + "source": [ + "![image.png](data:image/png;base64,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)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3o5sAOfwL5qd" + }, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/PerformanceTest_Notebook.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WJJzt3RWhEc6" + }, + "source": [ + "**LangTest** is an open-source python library designed to help developers deliver safe and effective Natural Language Processing (NLP) models. Whether you are using **John Snow Labs, Hugging Face, Spacy** models or **OpenAI, Cohere, AI21, Hugging Face Inference API and Azure-OpenAI** based LLMs, it has got you covered. You can test any Named Entity Recognition (NER), Text Classification, fill-mask, Translation model using the library. We also support testing LLMS for Question-Answering, Summarization and text-generation tasks on benchmark datasets. The library supports 60+ out of the box tests. For a complete list of supported test categories, please refer to the [documentation](http://langtest.org/docs/pages/docs/test_categories).\n", + "\n", + "Metrics are calculated by comparing the model's extractions in the original list of sentences against the extractions carried out in the noisy list of sentences. The original annotated labels are not used at any point, we are simply comparing the model against itself in a 2 settings." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "26qXWhCYhHAt" + }, + "source": [ + "# Getting started with LangTest on John Snow Labs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "azUb114QhOsY", + "outputId": "82bc5501-2218-4aed-dd34-d90788761e02" + }, + "outputs": [], + "source": [ + "!pip install langtest[transformers]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yR6kjOaiheKN" + }, + "source": [ + "# Harness and Its Parameters\n", + "\n", + "The Harness class is a testing class for Natural Language Processing (NLP) models. It evaluates the performance of a NLP model on a given task using test data and generates a report with test results.Harness can be imported from the LangTest library in the following way." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "lTzSJpMlhgq5" + }, + "outputs": [], + "source": [ + "#Import Harness from the LangTest library\n", + "from langtest import Harness" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JFhJ9CcbsKqN" + }, + "source": [ + "# Performance Testing\n", + "\n", + "In the testing phase of evaluating Natural Language Processing (NLP) models using LangTest, a dedicated tool for assessing language-related capabilities, the focus is on measuring the time taken to process a given dataset. This metric serves as a key performance indicator, reflecting the efficiency of NLP models in real-world scenarios. The choice of an appropriate dataset is pivotal, ensuring its relevance to the application's context. By comparing the time efficiency of different models, one can identify optimal solutions for specific use cases. Additionally, if processing times are suboptimal, exploration of model architecture adjustments and optimization strategies becomes essential to enhance overall performance and responsiveness, particularly in applications demanding quick and efficient language processing.\n", + "\n", + "The formula you provided,\n", + "\n", + "$\\ speed $ = $\\frac{number\\ of\\ tokens\\ in\\ given\\ dataset}{time\\ taken}$\n", + "\n", + "calculates the speed of processing for an NLP model. Specifically, it represents the number of words processed per unit of time, offering a quantitative measure of the model's efficiency. A higher speed value indicates faster processing, which can be crucial in real-time applications or scenarios where quick language understanding and response are essential. Monitoring and optimizing this speed metric contribute to ensuring the practical utility of NLP models, especially in applications such as chatbots, customer support systems, or any context where rapid language processing is a priority." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "swaYPW-wPlku" + }, + "source": [ + "### Setup and Configure Harness" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 990, + "referenced_widgets": [ + "2dfb0cd0b71e4523971ef87c2978ead4", + "9e11e578ef824c5a833e1993e4c37d65", + "5ca9c99b0a2f4298851061725876731b", + "67ef12076e9e49a2bef4bc630f3b4280", + "b82fc8ba2a3c43d89228c6ea299ef0d2", + "ec53df8dbac94e5d90b131473d01a232", + "5ba83daef26c4e34b386d974986bcc5a", + "109fd6ccac294c3e8c690d075bd612e4", + "a0a78418c15b4607854d1da5924d501c", + "7426c97a2b9a48ce888df6aa07a18b92", + "5e496da2c3d34eea89b16f0e243ef0da", + "d852ffbc8eab49d7bf805d130a9e21e9", + "cad2ce042df647f181fb192eb3612bca", + "6761482d010040ee8584d40770c0e7b9", + "5022a84ccefa4c888e7b7283f40ad1f8", + "8843bebcd357479a8225e3956586ce34", + "54e485ca393a4c0cad4e06d80287b4e3", + "6b3b952b5d4e4d3b8d9f64092273016c", + "dcc1386faf57485584383aeda8880d77", + "b8cde32f0b0c44d4a3492211ffcda060", + "6a0378e4bdef468ea9633a41f187c100", + "982e805a22224e7ca21119d6dfe2e661", + "e1a46736d7a145e485c8ebfb6e145e65", + "11843b0f61824383ba8f1477837b372d", + "e5c31b70aa7b437bb6370d6bf8522cb8", + "6b1c659ec6a6418eb446bed941361fc6", + "526a57ea6def48e3bf241c41b8179ddf", + "55496e94dacd473f842c3a061021246d", + "6cb3964ce93a41d0a691eb26eaf260d6", + "3b36a4c564954a4db40f0e755af4227a", + "0767a85207994fd1bf8c60e97b42cecc", + "de8eba29e71e47e5b7f4ec1dfeea28e2", + "93fbd5ae29424a4ba2f46700d9ece4fb", + "7216ca2a83d04b389fa9f6b11d6e00d9", + "675cd83e139749a4b1641e21cabcafee", + "059f8125a73f484cb0b2d4f8a2026624", + "500cebec6e4d46a2ba09e3e0ccdf575c", + "7e4121ebd9de4f55a9e8c3dd432a9e83", + "3b9f0b58affa4afd87cc58ee9c65a078", + "174d07b3bcb245f38fd50216c7b78a1d", + "30396d8addf64e62b9aee6fd458b6147", + "af51a3baa3e94847b557e9f994886a0e", + "07b117e164a44f79bc582fdda270076d", + "9bc44d3e346542daafdf6b708d17b2d4", + "683f3df353e1479e8ae5483df5225dbd", + "d279c6275158449e9ec5f58b391b0069", + "65cb9cefe2934ee7a50ca6d4d70bf8ee", + "1001db8a1bee424385929d7dd5113352", + "de722c2bd03f4e638a877882932cf9eb", + "30849f0661544814870e640f197bc422", + "04fad307273b4f54b5b15646efebb157", + "51b19ae99c7f47d38b0cc7460b2fb8e1", + "7731f14c246043d8a76ff9ea44d0b17a", + "17aa55bf55c7451dbc2a5a8ce5442411", + "e13ed70114e2470e97814679ca3c143b", + "c996405fead84c07aefb48c4e0ed8b58", + "3225b9c982b4486dadbcfda73517ea94", + "499a9cfd951f48a9b93692cb97260dd1", + "52b13a75e2bc4291a6039f96dbccbcd3", + "83694568504a4a26ab4d44b2e50f25a4", + "22c62124e1f24bb092e575890497b3a4", + "954f6183d22a44df87f121077c4c8626", + "f48624c6aa0246228b2aa65fccdf0d51", + "f2a586957ad14110ae3394d50e1b0efd", + "4e6e857f002344ff9a6b342a689f243a", + "1967e05f8bd44132919b9856617d1dda" + ] + }, + "id": "JaarBdfe8DQ8", + "outputId": "baed2de8-d1e6-4c3f-a1f8-4781856c2866" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:88: UserWarning: \n", + "The secret `HF_TOKEN` does not exist in your Colab secrets.\n", + "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n", + "You will be able to reuse this secret in all of your notebooks.\n", + "Please note that authentication is recommended but still optional to access public models or datasets.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2dfb0cd0b71e4523971ef87c2978ead4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "config.json: 0%| | 0.00/829 [00:00\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_case
0robustnesslowercaseSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...soccer - japan get lucky win , china in surpri...
1robustnesslowercaseNadim Ladkinadim ladki
2robustnesslowercaseAL-AIN , United Arab Emirates 1996-12-06al-ain , united arab emirates 1996-12-06
3robustnesslowercaseJapan began the defence of their Asian Cup tit...japan began the defence of their asian cup tit...
4robustnesslowercaseBut China saw their luck desert them in the se...but china saw their luck desert them in the se...
...............
417robustnessuppercaseGoias 1 Gremio 3GOIAS 1 GREMIO 3
418robustnessuppercasePortuguesa 1 Atletico Mineiro 0PORTUGUESA 1 ATLETICO MINEIRO 0
419robustnessuppercaseRobert GalvinROBERT GALVIN
420robustnessuppercaseAustralia gave Brian Lara another reason to be...AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE...
421performancespeed--
\n", + "

422 rows × 4 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + " \n" + ], + "text/plain": [ + " category test_type \\\n", + "0 robustness lowercase \n", + "1 robustness lowercase \n", + "2 robustness lowercase \n", + "3 robustness lowercase \n", + "4 robustness lowercase \n", + ".. ... ... \n", + "417 robustness uppercase \n", + "418 robustness uppercase \n", + "419 robustness uppercase \n", + "420 robustness uppercase \n", + "421 performance speed \n", + "\n", + " original \\\n", + "0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 Nadim Ladki \n", + "2 AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 Japan began the defence of their Asian Cup tit... \n", + "4 But China saw their luck desert them in the se... \n", + ".. ... \n", + "417 Goias 1 Gremio 3 \n", + "418 Portuguesa 1 Atletico Mineiro 0 \n", + "419 Robert Galvin \n", + "420 Australia gave Brian Lara another reason to be... \n", + "421 - \n", + "\n", + " test_case \n", + "0 soccer - japan get lucky win , china in surpri... \n", + "1 nadim ladki \n", + "2 al-ain , united arab emirates 1996-12-06 \n", + "3 japan began the defence of their asian cup tit... \n", + "4 but china saw their luck desert them in the se... \n", + ".. ... \n", + "417 GOIAS 1 GREMIO 3 \n", + "418 PORTUGUESA 1 ATLETICO MINEIRO 0 \n", + "419 ROBERT GALVIN \n", + "420 AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE... \n", + "421 - \n", + "\n", + "[422 rows x 4 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.testcases()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NOJ8BAU2GGzd" + }, + "source": [ + "harness.testcases() method displays the produced test cases in form of a pandas data frame." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3CwhQw6hGR9S" + }, + "source": [ + "### Running the tests" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "aguX6-aFGOnP", + "outputId": "20836c7c-0d2b-48c7-842e-78fef784d735" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Running testcases... : 100%|██████████| 422/422 [00:20<00:00, 20.96it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "191O2oaUGWrH" + }, + "source": [ + "Called after harness.generate() and is to used to run all the tests. Returns a pass/fail flag for each test." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 476 + }, + "id": "XDbd1mpREWR5", + "outputId": "e80180c4-775a-49b0-97af-3bb6d12227ff" + }, + "outputs": [ + { + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "summary": "{\n \"name\": \"harness\",\n \"rows\": 422,\n \"fields\": [\n {\n \"column\": \"category\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"performance\",\n \"robustness\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"test_type\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"lowercase\",\n \"uppercase\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"original\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 219,\n \"samples\": [\n \"Alba Berlin ( Germany ) 9 5 4 14\",\n \"Ijaz Ahmad c Spearman b Vaughan 59\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"test_case\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 412,\n \"samples\": [\n \"3. MINNA KARHU ( FINLAND ) 24.05\",\n \"8. dominick gauthier ( canada ) 22.73\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"expected_result\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 192,\n \"samples\": [\n \"Jesper Ronnback: PER, Sweden: LOC\",\n \"Alba Berlin: ORG, Germany: LOC\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"actual_result\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 238,\n \"samples\": [\n \"MOGULS: PER\",\n \"bitar: ORG, kazuyoshi: PER\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"pass\",\n \"properties\": {\n \"dtype\": \"boolean\",\n \"num_unique_values\": 2,\n \"samples\": [\n true,\n false\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}", + "type": "dataframe" + }, + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typeoriginaltest_caseexpected_resultactual_resultpass
0robustnesslowercaseSOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI...soccer - japan get lucky win , china in surpri...JAPAN: MISC, LUCKY: PER, CHINA: ORGFalse
1robustnesslowercaseNadim Ladkinadim ladkiNadim Ladki: PERFalse
2robustnesslowercaseAL-AIN , United Arab Emirates 1996-12-06al-ain , united arab emirates 1996-12-06AL-AIN: LOC, United Arab Emirates: LOCal-ain: LOCFalse
3robustnesslowercaseJapan began the defence of their Asian Cup tit...japan began the defence of their asian cup tit...Japan: LOC, Asian Cup: MISC, Syria: LOC, Group...japan: ORG, syria: ORGFalse
4robustnesslowercaseBut China saw their luck desert them in the se...but china saw their luck desert them in the se...China: LOC, Uzbekistan: LOCuzbekistan: LOCFalse
........................
417robustnessuppercaseGoias 1 Gremio 3GOIAS 1 GREMIO 3Goias: ORG, Gremio: ORGGOIAS: ORG, GREMIO: ORGTrue
418robustnessuppercasePortuguesa 1 Atletico Mineiro 0PORTUGUESA 1 ATLETICO MINEIRO 0Portuguesa: ORG, Atletico Mineiro: ORGPORTUGUESA: ORG, ATLETICO MINEIRO: ORGTrue
419robustnessuppercaseRobert GalvinROBERT GALVINRobert Galvin: PERROBERT: ORG, GALVIN: PERFalse
420robustnessuppercaseAustralia gave Brian Lara another reason to be...AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE...Australia: LOC, Brian Lara: PER, West Indies: ...AUSTRALIA: LOC, BRIAN LARA: LOC, REASON: PER, ...False
421performancespeed--100 token/sec156.00 token/secTrue
\n", + "

422 rows × 7 columns

\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " category test_type \\\n", + "0 robustness lowercase \n", + "1 robustness lowercase \n", + "2 robustness lowercase \n", + "3 robustness lowercase \n", + "4 robustness lowercase \n", + ".. ... ... \n", + "417 robustness uppercase \n", + "418 robustness uppercase \n", + "419 robustness uppercase \n", + "420 robustness uppercase \n", + "421 performance speed \n", + "\n", + " original \\\n", + "0 SOCCER - JAPAN GET LUCKY WIN , CHINA IN SURPRI... \n", + "1 Nadim Ladki \n", + "2 AL-AIN , United Arab Emirates 1996-12-06 \n", + "3 Japan began the defence of their Asian Cup tit... \n", + "4 But China saw their luck desert them in the se... \n", + ".. ... \n", + "417 Goias 1 Gremio 3 \n", + "418 Portuguesa 1 Atletico Mineiro 0 \n", + "419 Robert Galvin \n", + "420 Australia gave Brian Lara another reason to be... \n", + "421 - \n", + "\n", + " test_case \\\n", + "0 soccer - japan get lucky win , china in surpri... \n", + "1 nadim ladki \n", + "2 al-ain , united arab emirates 1996-12-06 \n", + "3 japan began the defence of their asian cup tit... \n", + "4 but china saw their luck desert them in the se... \n", + ".. ... \n", + "417 GOIAS 1 GREMIO 3 \n", + "418 PORTUGUESA 1 ATLETICO MINEIRO 0 \n", + "419 ROBERT GALVIN \n", + "420 AUSTRALIA GAVE BRIAN LARA ANOTHER REASON TO BE... \n", + "421 - \n", + "\n", + " expected_result \\\n", + "0 JAPAN: MISC, LUCKY: PER, CHINA: ORG \n", + "1 Nadim Ladki: PER \n", + "2 AL-AIN: LOC, United Arab Emirates: LOC \n", + "3 Japan: LOC, Asian Cup: MISC, Syria: LOC, Group... \n", + "4 China: LOC, Uzbekistan: LOC \n", + ".. ... \n", + "417 Goias: ORG, Gremio: ORG \n", + "418 Portuguesa: ORG, Atletico Mineiro: ORG \n", + "419 Robert Galvin: PER \n", + "420 Australia: LOC, Brian Lara: PER, West Indies: ... \n", + "421 100 token/sec \n", + "\n", + " actual_result pass \n", + "0 False \n", + "1 False \n", + "2 al-ain: LOC False \n", + "3 japan: ORG, syria: ORG False \n", + "4 uzbekistan: LOC False \n", + ".. ... ... \n", + "417 GOIAS: ORG, GREMIO: ORG True \n", + "418 PORTUGUESA: ORG, ATLETICO MINEIRO: ORG True \n", + "419 ROBERT: ORG, GALVIN: PER False \n", + "420 AUSTRALIA: LOC, BRIAN LARA: LOC, REASON: PER, ... False \n", + "421 156.00 token/sec True \n", + "\n", + "[422 rows x 7 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generated_results()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TKB8Rsr2GZME" + }, + "source": [ + "This method returns the generated results in the form of a pandas dataframe, which provides a convenient and easy-to-use format for working with the test results. You can use this method to quickly identify the test cases that failed and to determine where fixes are needed." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PBSlpWnUU55G" + }, + "source": [ + "### Final Results" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "umnEgUHM8DRA" + }, + "source": [ + "We can call `.report()` which summarizes the results giving information about pass and fail counts and overall test pass/fail flag.\n", + "\n", + "To get time_elapsed for each test we pass parameter `return_runtime=True` in `.report()` method. We can also select the unit for time_elapsed i.e, seconds(s), miliseconds(ms) or microseconds(us) etc." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "gp57HcF9yxi7", + "outputId": "9e9bad8d-35a0-48b6-8f4d-0aebcf0d7af0" + }, + "outputs": [ + { + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "summary": "{\n \"name\": \"harness\",\n \"rows\": 3,\n \"fields\": [\n {\n \"column\": \"category\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"performance\",\n \"robustness\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"test_type\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"lowercase\",\n \"uppercase\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"fail_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 97,\n \"min\": 0,\n \"max\": 182,\n \"num_unique_values\": 3,\n \"samples\": [\n 182,\n 152\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"pass_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 24,\n \"min\": 1,\n \"max\": 46,\n \"num_unique_values\": 3,\n \"samples\": [\n 41,\n 46\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"pass_rate\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"18%\",\n \"23%\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"minimum_pass_rate\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 2,\n \"samples\": [\n \"100%\",\n \"66%\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"pass\",\n \"properties\": {\n \"dtype\": \"boolean\",\n \"num_unique_values\": 2,\n \"samples\": [\n true,\n false\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}", + "type": "dataframe" + }, + "text/html": [ + "\n", + "
\n", + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categorytest_typefail_countpass_countpass_rateminimum_pass_ratepass
0robustnesslowercase1824118%66%False
1robustnessuppercase1524623%66%False
2performancespeed01100%100%True
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "text/plain": [ + " category test_type fail_count pass_count pass_rate minimum_pass_rate \\\n", + "0 robustness lowercase 182 41 18% 66% \n", + "1 robustness uppercase 152 46 23% 66% \n", + "2 performance speed 0 1 100% 100% \n", + "\n", + " pass \n", + "0 False \n", + "1 False \n", + "2 True " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zg-knds3tq-w" + }, + "source": [ + "# Multiple Models Runtime Testing" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "ElMInPJMu3QK", + "outputId": "6af2cf49-6401-499e-b5ac-d2e93d877b9e" + }, + "outputs": [], + "source": [ + "!pip install spacy johnsnowlabs" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "Cof4sk98CFU1" + }, + "outputs": [], + "source": [ + "from langtest import Harness" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "TnUBvYXptq-w" + }, + "outputs": [], + "source": [ + "model_dict=[{\"model\": \"ner.dl\", \"hub\": \"johnsnowlabs\"},\n", + " {\"model\": \"en_core_web_sm\", \"hub\": \"spacy\"}]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PmMwW5IIvGav", + "outputId": "444d8d0a-6d29-4d7f-d056-03adc721732e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2024-04-25 14:19:32-- https://github.com/JohnSnowLabs/langtest/raw/main/langtest/data/conll/sample.conll\n", + "Resolving github.com (github.com)... 20.27.177.113\n", + "Connecting to github.com (github.com)|20.27.177.113|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://raw.githubusercontent.com/JohnSnowLabs/langtest/main/langtest/data/conll/sample.conll [following]\n", + "--2024-04-25 14:19:33-- https://raw.githubusercontent.com/JohnSnowLabs/langtest/main/langtest/data/conll/sample.conll\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 50519 (49K) [text/plain]\n", + "Saving to: ‘sample.conll’\n", + "\n", + "sample.conll 100%[===================>] 49.33K --.-KB/s in 0.04s \n", + "\n", + "2024-04-25 14:19:33 (1.27 MB/s) - ‘sample.conll’ saved [50519/50519]\n", + "\n" + ] + } + ], + "source": [ + "# Load CoNLL\n", + "!wget https://github.com/JohnSnowLabs/langtest/raw/main/langtest/data/conll/sample.conll" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "yey-zVICtq-w", + "outputId": "961d7aa4-3779-49f6-d46d-ca21821c157b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Warning::Spark Session already created, some configs may not take.\n", + "recognize_entities_dl download started this may take some time.\n", + "Approx size to download 159 MB\n", + "[OK!]\n", + "Test Configuration : \n", + " {\n", + " \"tests\": {\n", + " \"defaults\": {\n", + " \"min_pass_rate\": 1.0\n", + " },\n", + " \"robustness\": {\n", + " \"add_typo\": {\n", + " \"min_pass_rate\": 0.7\n", + " },\n", + " \"american_to_british\": {\n", + " \"min_pass_rate\": 0.7\n", + " }\n", + " },\n", + " \"accuracy\": {\n", + " \"min_micro_f1_score\": {\n", + " \"min_score\": 0.7\n", + " }\n", + " },\n", + " \"bias\": {\n", + " \"replace_to_female_pronouns\": {\n", + " \"min_pass_rate\": 0.7\n", + " },\n", + " \"replace_to_low_income_country\": {\n", + " \"min_pass_rate\": 0.7\n", + " }\n", + " },\n", + " \"fairness\": {\n", + " \"min_gender_f1_score\": {\n", + " \"min_score\": 0.6\n", + " }\n", + " },\n", + " \"representation\": {\n", + " \"min_label_representation_count\": {\n", + " \"min_count\": 50\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "harness = Harness(task=\"ner\", model=model_dict, data={\"data_source\":\"sample.conll\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JwK7oi7Etq-w", + "outputId": "398fd619-92b5-4ddd-ce90-8b544847e9fa" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'uppercase': {'min_pass_rate': 0.66},\n", + " 'lowercase': {'min_pass_rate': 0.6}},\n", + " 'performance': {'speed': {'min_pass_rate': 100, 'unit': 'tokens/sec'}}}}" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.configure(\n", + "{\n", + " 'tests': {'defaults': {'min_pass_rate': 0.65},\n", + " 'robustness': {'uppercase': {'min_pass_rate': 0.66},\n", + " 'lowercase': {'min_pass_rate': 0.60},\n", + " },\n", + " 'performance': {'speed': {'min_pass_rate': 100, 'unit': 'tokens/sec'}\n", + " },\n", + " }\n", + " }\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vTbPwStvtq-x", + "outputId": "92d29e65-b0bd-4b92-ea12-c4b308083515" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating testcases...: 100%|██████████| 2/2 [00:00<00:00, 4236.67it/s]\n", + "WARNING:root:[W009] Removing samples where no transformation has been applied:\n", + "[W010] - Test 'uppercase': 28 samples removed out of 226\n", + "[W010] - Test 'lowercase': 3 samples removed out of 226\n", + "\n", + "Generating testcases...: 100%|██████████| 2/2 [00:00<00:00, 17050.02it/s]\n", + "WARNING:root:[W009] Removing samples where no transformation has been applied:\n", + "[W010] - Test 'uppercase': 28 samples removed out of 226\n", + "[W010] - Test 'lowercase': 3 samples removed out of 226\n", + "\n", + "Running testcases... : 100%|██████████| 422/422 [01:11<00:00, 5.91it/s]\n", + "Running testcases... : 100%|██████████| 422/422 [00:02<00:00, 153.07it/s]\n" + ] + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.generate().run()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "AUZUeCpLtq-x", + "outputId": "c6acea0d-a83f-466a-ebbf-fdb96235d3dd" + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
test_typelowercasespeeduppercase
model_name   
en_core_web_sm0.4600001.0000000.220000
ner.dl0.1000000.0000000.830000
\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harness.report()" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "04fad307273b4f54b5b15646efebb157": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "059f8125a73f484cb0b2d4f8a2026624": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_30396d8addf64e62b9aee6fd458b6147", + "max": 213450, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_af51a3baa3e94847b557e9f994886a0e", + "value": 213450 + } + }, + "0767a85207994fd1bf8c60e97b42cecc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "07b117e164a44f79bc582fdda270076d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1001db8a1bee424385929d7dd5113352": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_17aa55bf55c7451dbc2a5a8ce5442411", + "placeholder": "​", + "style": "IPY_MODEL_e13ed70114e2470e97814679ca3c143b", + "value": " 2.00/2.00 [00:00<00:00, 193B/s]" + } + }, + "109fd6ccac294c3e8c690d075bd612e4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "11843b0f61824383ba8f1477837b372d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_55496e94dacd473f842c3a061021246d", + "placeholder": "​", + "style": "IPY_MODEL_6cb3964ce93a41d0a691eb26eaf260d6", + "value": "tokenizer_config.json: 100%" + } + }, + "174d07b3bcb245f38fd50216c7b78a1d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "17aa55bf55c7451dbc2a5a8ce5442411": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1967e05f8bd44132919b9856617d1dda": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "22c62124e1f24bb092e575890497b3a4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2dfb0cd0b71e4523971ef87c2978ead4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9e11e578ef824c5a833e1993e4c37d65", + "IPY_MODEL_5ca9c99b0a2f4298851061725876731b", + "IPY_MODEL_67ef12076e9e49a2bef4bc630f3b4280" + ], + "layout": "IPY_MODEL_b82fc8ba2a3c43d89228c6ea299ef0d2" + } + }, + "30396d8addf64e62b9aee6fd458b6147": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "30849f0661544814870e640f197bc422": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3225b9c982b4486dadbcfda73517ea94": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_22c62124e1f24bb092e575890497b3a4", + "placeholder": "​", + "style": "IPY_MODEL_954f6183d22a44df87f121077c4c8626", + "value": "special_tokens_map.json: 100%" + } + }, + "3b36a4c564954a4db40f0e755af4227a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3b9f0b58affa4afd87cc58ee9c65a078": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "499a9cfd951f48a9b93692cb97260dd1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f48624c6aa0246228b2aa65fccdf0d51", + "max": 112, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f2a586957ad14110ae3394d50e1b0efd", + "value": 112 + } + }, + "4e6e857f002344ff9a6b342a689f243a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "500cebec6e4d46a2ba09e3e0ccdf575c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_07b117e164a44f79bc582fdda270076d", + "placeholder": "​", + "style": "IPY_MODEL_9bc44d3e346542daafdf6b708d17b2d4", + "value": " 213k/213k [00:00<00:00, 532kB/s]" + } + }, + "5022a84ccefa4c888e7b7283f40ad1f8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6a0378e4bdef468ea9633a41f187c100", + "placeholder": "​", + "style": "IPY_MODEL_982e805a22224e7ca21119d6dfe2e661", + "value": " 433M/433M [00:05<00:00, 70.3MB/s]" + } + }, + "51b19ae99c7f47d38b0cc7460b2fb8e1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "526a57ea6def48e3bf241c41b8179ddf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "52b13a75e2bc4291a6039f96dbccbcd3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4e6e857f002344ff9a6b342a689f243a", + "placeholder": "​", + "style": "IPY_MODEL_1967e05f8bd44132919b9856617d1dda", + "value": " 112/112 [00:00<00:00, 10.3kB/s]" + } + }, + "54e485ca393a4c0cad4e06d80287b4e3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "55496e94dacd473f842c3a061021246d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5ba83daef26c4e34b386d974986bcc5a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5ca9c99b0a2f4298851061725876731b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_109fd6ccac294c3e8c690d075bd612e4", + "max": 829, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a0a78418c15b4607854d1da5924d501c", + "value": 829 + } + }, + "5e496da2c3d34eea89b16f0e243ef0da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "65cb9cefe2934ee7a50ca6d4d70bf8ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_51b19ae99c7f47d38b0cc7460b2fb8e1", + "max": 2, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7731f14c246043d8a76ff9ea44d0b17a", + "value": 2 + } + }, + "675cd83e139749a4b1641e21cabcafee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b9f0b58affa4afd87cc58ee9c65a078", + "placeholder": "​", + "style": "IPY_MODEL_174d07b3bcb245f38fd50216c7b78a1d", + "value": "vocab.txt: 100%" + } + }, + "6761482d010040ee8584d40770c0e7b9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dcc1386faf57485584383aeda8880d77", + "max": 433292294, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b8cde32f0b0c44d4a3492211ffcda060", + "value": 433292294 + } + }, + "67ef12076e9e49a2bef4bc630f3b4280": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7426c97a2b9a48ce888df6aa07a18b92", + "placeholder": "​", + "style": "IPY_MODEL_5e496da2c3d34eea89b16f0e243ef0da", + "value": " 829/829 [00:00<00:00, 68.9kB/s]" + } + }, + "683f3df353e1479e8ae5483df5225dbd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d279c6275158449e9ec5f58b391b0069", + "IPY_MODEL_65cb9cefe2934ee7a50ca6d4d70bf8ee", + "IPY_MODEL_1001db8a1bee424385929d7dd5113352" + ], + "layout": "IPY_MODEL_de722c2bd03f4e638a877882932cf9eb" + } + }, + "6a0378e4bdef468ea9633a41f187c100": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b1c659ec6a6418eb446bed941361fc6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_de8eba29e71e47e5b7f4ec1dfeea28e2", + "placeholder": "​", + "style": "IPY_MODEL_93fbd5ae29424a4ba2f46700d9ece4fb", + "value": " 59.0/59.0 [00:00<00:00, 5.05kB/s]" + } + }, + "6b3b952b5d4e4d3b8d9f64092273016c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6cb3964ce93a41d0a691eb26eaf260d6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7216ca2a83d04b389fa9f6b11d6e00d9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_675cd83e139749a4b1641e21cabcafee", + "IPY_MODEL_059f8125a73f484cb0b2d4f8a2026624", + "IPY_MODEL_500cebec6e4d46a2ba09e3e0ccdf575c" + ], + "layout": "IPY_MODEL_7e4121ebd9de4f55a9e8c3dd432a9e83" + } + }, + "7426c97a2b9a48ce888df6aa07a18b92": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7731f14c246043d8a76ff9ea44d0b17a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7e4121ebd9de4f55a9e8c3dd432a9e83": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "83694568504a4a26ab4d44b2e50f25a4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8843bebcd357479a8225e3956586ce34": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "93fbd5ae29424a4ba2f46700d9ece4fb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "954f6183d22a44df87f121077c4c8626": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "982e805a22224e7ca21119d6dfe2e661": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9bc44d3e346542daafdf6b708d17b2d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9e11e578ef824c5a833e1993e4c37d65": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec53df8dbac94e5d90b131473d01a232", + "placeholder": "​", + "style": "IPY_MODEL_5ba83daef26c4e34b386d974986bcc5a", + "value": "config.json: 100%" + } + }, + "a0a78418c15b4607854d1da5924d501c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "af51a3baa3e94847b557e9f994886a0e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b82fc8ba2a3c43d89228c6ea299ef0d2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b8cde32f0b0c44d4a3492211ffcda060": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c996405fead84c07aefb48c4e0ed8b58": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3225b9c982b4486dadbcfda73517ea94", + "IPY_MODEL_499a9cfd951f48a9b93692cb97260dd1", + "IPY_MODEL_52b13a75e2bc4291a6039f96dbccbcd3" + ], + "layout": "IPY_MODEL_83694568504a4a26ab4d44b2e50f25a4" + } + }, + "cad2ce042df647f181fb192eb3612bca": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_54e485ca393a4c0cad4e06d80287b4e3", + "placeholder": "​", + "style": "IPY_MODEL_6b3b952b5d4e4d3b8d9f64092273016c", + "value": "model.safetensors: 100%" + } + }, + "d279c6275158449e9ec5f58b391b0069": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_30849f0661544814870e640f197bc422", + "placeholder": "​", + "style": "IPY_MODEL_04fad307273b4f54b5b15646efebb157", + "value": "added_tokens.json: 100%" + } + }, + "d852ffbc8eab49d7bf805d130a9e21e9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cad2ce042df647f181fb192eb3612bca", + "IPY_MODEL_6761482d010040ee8584d40770c0e7b9", + "IPY_MODEL_5022a84ccefa4c888e7b7283f40ad1f8" + ], + "layout": "IPY_MODEL_8843bebcd357479a8225e3956586ce34" + } + }, + "dcc1386faf57485584383aeda8880d77": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "de722c2bd03f4e638a877882932cf9eb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "de8eba29e71e47e5b7f4ec1dfeea28e2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e13ed70114e2470e97814679ca3c143b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e1a46736d7a145e485c8ebfb6e145e65": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_11843b0f61824383ba8f1477837b372d", + "IPY_MODEL_e5c31b70aa7b437bb6370d6bf8522cb8", + "IPY_MODEL_6b1c659ec6a6418eb446bed941361fc6" + ], + "layout": "IPY_MODEL_526a57ea6def48e3bf241c41b8179ddf" + } + }, + "e5c31b70aa7b437bb6370d6bf8522cb8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3b36a4c564954a4db40f0e755af4227a", + "max": 59, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0767a85207994fd1bf8c60e97b42cecc", + "value": 59 + } + }, + "ec53df8dbac94e5d90b131473d01a232": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f2a586957ad14110ae3394d50e1b0efd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f48624c6aa0246228b2aa65fccdf0d51": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/_includes/docs-langtest-pagination.html b/docs/_includes/docs-langtest-pagination.html index e01638fcb..0eda22c7f 100644 --- a/docs/_includes/docs-langtest-pagination.html +++ b/docs/_includes/docs-langtest-pagination.html @@ -1,12 +1,15 @@ +
  • 1.7.0
  • +
  • 1.6.0
  • +
  • 1.5.0
  • +
  • 1.4.0
  • +
  • 1.3.0
  • +
  • 1.2.0
  • + + diff --git a/docs/pages/docs/langtest_versions/latest_release.md b/docs/pages/docs/langtest_versions/latest_release.md index 0615df8a6..7ee2e2f91 100644 --- a/docs/pages/docs/langtest_versions/latest_release.md +++ b/docs/pages/docs/langtest_versions/latest_release.md @@ -10,285 +10,355 @@ modify_date: 2024-04-02
    -## 2.1.0 +## 2.2.0 ------------------ ## 📢 Highlights -John Snow Labs is thrilled to announce the release of LangTest 2.1.0! This update brings exciting new features and improvements designed to streamline your language model testing workflows and provide deeper insights. +John Snow Labs is excited to announce the release of LangTest 2.2.0! This update introduces powerful new features and enhancements to elevate your language model testing experience and deliver even greater insights. -- **🔗 Enhanced API-based LLM Integration:** LangTest now supports testing API-based Large Language Models (LLMs). This allows you to seamlessly integrate diverse LLM models with LangTest and conduct performance evaluations across various datasets. +- 🏆 **Model Ranking & Leaderboard**: LangTest introduces a comprehensive model ranking system. Use harness.get_leaderboard() to rank models based on various test metrics and retain previous rankings for historical comparison. -- **📂 Expanded File Format Support:** LangTest 2.1.0 introduces support for additional file formats, further increasing its flexibility in handling different data structures used in LLM testing. +- 🔍 **Few-Shot Model Evaluation:** Optimize and evaluate your models using few-shot prompt techniques. This feature enables you to assess model performance with minimal data, providing valuable insights into model capabilities with limited examples. -- **📊 Improved Multi-Dataset Handling:** We've made significant improvements in how LangTest manages multiple datasets. This simplifies workflows and allows for more efficient testing across a wider range of data sources. +- 📊 **Evaluating NER in LLMs:** This release extends support for Named Entity Recognition (NER) tasks specifically for Large Language Models (LLMs). Evaluate and benchmark LLMs on their NER performance with ease. -- **🖥️ New Benchmarking Commands**: LangTest now boasts a set of new commands specifically designed for benchmarking language models. These commands provide a structured approach to evaluating model performance and comparing results across different models and datasets. +- 🚀 **Enhanced Data Augmentation:** The new DataAugmenter module allows for streamlined and harness-free data augmentation, making it simpler to enhance your datasets and improve model robustness. + +- 🎯 **Multi-Dataset Prompts:** LangTest now offers optimized prompt handling for multiple datasets, allowing users to add custom prompts for each dataset, enabling seamless integration and efficient testing.
    ## 🔥 Key Enhancements: -### **🔗 Streamlined Integration and Enhanced Functionality for API-Based Large Language Models:** -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Generic_API-Based_Model_Testing_Demo.ipynb) - -This feature empowers you to seamlessly integrate virtually any language model hosted on an external API platform. Whether you prefer OpenAI, Hugging Face, or even custom vLLM solutions, LangTest now adapts to your workflow. `input_processor` and `output_parser` functions are not required for openai api compatible server. - -#### Key Features: - -- **Effortless API Integration:** Connect to any API system by specifying the API URL, parameters, and a custom function for parsing the returned results. This intuitive approach allows you to leverage your preferred language models with minimal configuration. +### **🏆 Comprehensive Model Ranking & Leaderboard** +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Benchmarking_with_Harness.ipynb) +The new Model Ranking & Leaderboard system offers a comprehensive way to evaluate and compare model performance based on various metrics across different datasets. This feature allows users to rank models, retain historical rankings, and analyze performance trends. -- **Customizable Parameters:** Define the URL, parameters specific to your chosen API, and a parsing function tailored to extract the desired output. This level of control ensures compatibility with diverse API structures. +**Key Features:** +- **Comprehensive Ranking**: Rank models based on various performance metrics across multiple datasets. +- **Historical Comparison**: Retain and compare previous rankings for consistent performance tracking. +- **Dataset-Specific Insights**: Evaluate model performance on different datasets to gain deeper insights. -- **Unparalleled Flexibility:** Generic API Support removes platform limitations. Now, you can seamlessly integrate language models from various sources, including OpenAI, Hugging Face, and even custom vLLM solutions hosted on private platforms. - -#### How it Works: - -**Parameters:** -Define the `input_processer` function for creating a payload and the `output_parser` function is used to extract the output from the response. - -```python -GOOGLE_API_KEY = "" -model_url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={GOOGLE_API_KEY}" +**How It Works:** -# headers -headers = { - "Content-Type": "application/json", -} +The following are steps to do model ranking and visualize the leaderboard for `google/flan-t5-base` and `google/flan-t5-large` models. +**1.** Setup and configuration of the Harness are as follows: -# function to create a payload -def input_processor(content): - return {"contents": [ - { - "role": "user", - "parts": [ - { - "text": content - } - ] - } - ]} - -# function to extract output from model response -def output_parser(response): - try: - return response['candidates'][0]['content']['parts'][0]['text'] - except: - return "" +```yaml +# config.yaml +model_parameters: + max_tokens: 64 + device: 0 + task: text2text-generation +tests: + defaults: + min_pass_rate: 0.65 + robustness: + add_typo: + min_pass_rate: 0.7 + lowercase: + min_pass_rate: 0.7 ``` - -To take advantage of this feature, users can utilize the following setup code: - ```python from langtest import Harness -# Initialize Harness with API parameters harness = Harness( task="question-answering", model={ - "model": { - "url": url, - "headers": headers, - "input_processor": input_processor, - "output_parser": output_parser, - }, - "hub": "web", + "model": "google/flan-t5-base", + "hub": "huggingface" }, - data={ - "data_source": "OpenBookQA", - "split": "test-tiny", + data=[ + { + "data_source": "MedMCQA" + }, + { + "data_source": "PubMedQA" + }, + { + "data_source": "MMLU" + }, + { + "data_source": "MedQA" + } + ], + config="config.yml", + benchmarking={ + "save_dir":"~/.langtest/leaderboard/" # required for benchmarking } ) -# Generate, Run and get Report -harness.generate().run().report() ``` -![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/9754c506-e715-4e2c-8b9d-dfd98f0695e5) +**2**. generate the test cases, run on the model, and get the report as follows: +```python +harness.generate().run().report() +``` +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/d8055592-5501-4139-ad90-55baa4fecbfc) -### 📂 Streamlined Data Handling and Evaluation +**3**. Similarly, do the same steps for the `google/flan-t5-large` model with the same `save_dir` path for benchmarking and the same `config.yaml` -This feature streamlines your testing workflows by enabling LangTest to process a wider range of file formats directly. +**4**. Finally, the leaderboard can show the model rank by calling the below code. +```python +harness.get_leaderboard() +``` +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/ff741d8e-4fc0-4f94-bcc3-9c67653aaba8) -#### Key Features: +**Conclusion:** +The Model Ranking & Leaderboard system provides a robust and structured method for evaluating and comparing models across multiple datasets, enabling users to make data-driven decisions and continuously improve model performance. -- **Effortless File Format Handling:** LangTest now seamlessly ingests data from various file formats, including pickles (.pkl) in addition to previously supported formats. Simply provide the data source path in your harness configuration, and LangTest takes care of the rest. -- **Simplified Data Source Management**: LangTest intelligently recognizes the file extension and automatically selects the appropriate processing method. This eliminates the need for manual configuration, saving you time and effort. +### **🔍 Efficient Few-Shot Model Evaluation** +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Fewshot_QA_Notebook.ipynb) +Few-Shot Model Evaluation optimizes and evaluates model performance using minimal data. This feature provides rapid insights into model capabilities, enabling efficient assessment and optimization with limited examples. -- **Enhanced Maintainability**: The underlying code structure is optimized for flexibility. Adding support for new file formats in the future requires minimal effort, ensuring LangTest stays compatible with evolving data storage practices. +**Key Features:** +- **Few-Shot Techniques**: Evaluate models with minimal data to gauge performance quickly. +- **Optimized Performance**: Improve model outputs using targeted few-shot prompts. +- **Efficient Evaluation**: Streamlined process for rapid and effective model assessment. -#### How it works: +**How It Works:** +**1.** Set up few-shot prompts tailored to specific evaluation needs. +```yaml +# config.yaml +prompt_config: + "BoolQ": + instructions: > + You are an intelligent bot and it is your responsibility to make sure + to give a concise answer. Answer should be `true` or `false`. + prompt_type: "instruct" # instruct for completion and chat for conversation(chat models) + examples: + - user: + context: > + The Good Fight -- A second 13-episode season premiered on March 4, 2018. + On May 2, 2018, the series was renewed for a third season. + question: "is there a third series of the good fight?" + ai: + answer: "True" + - user: + context: > + Lost in Space -- The fate of the castaways is never resolved, + as the series was unexpectedly canceled at the end of season 3. + question: "did the robinsons ever get back to earth" + ai: + answer: "True" + "NQ-open": + instructions: > + You are an intelligent bot and it is your responsibility to make sure + to give a short concise answer. + prompt_type: "instruct" # completion + examples: + - user: + question: "where does the electron come from in beta decay?" + ai: + answer: "an atomic nucleus" + - user: + question: "who wrote you're a grand ol flag?" + ai: + answer: "George M. Cohan" + +tests: + defaults: + min_pass_rate: 0.8 + robustness: + uppercase: + min_pass_rate: 0.8 + add_typo: + min_pass_rate: 0.8 +``` +**2.** Initialize the Harness with `config.yaml` file as below code +```python +harness = Harness( + task="question-answering", + model={"model": "gpt-3.5-turbo-instruct","hub":"openai"}, + data=[{"data_source" :"BoolQ", + "split":"test-tiny"}, + {"data_source" :"NQ-open", + "split":"test-tiny"}], + config="config.yaml" + ) +``` +**3.** Generate the test cases, run them on the model, and then generate the report. ```python -from langtest import Harness +harness.generate().run().report() +``` +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/4bae4008-621c-4d1c-a303-218f9df2700d) -harness = Harness( - task="question-answering", - model={ - "model": "http://localhost:1234/v1/chat/completions", - "hub": "lm-studio", - }, - data={ - "data_source": "path/to/file.pkl", # - }, -) -# generate, run and report +**Conclusion:** +Few-Shot Model Evaluation provides valuable insights into model capabilities with minimal data, allowing for rapid and effective performance optimization. This feature ensures that models can be assessed and improved efficiently, even with limited examples. + + +### **📊 Evaluating NER in LLMs** +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/NER%20Casual%20LLM.ipynb) +Evaluating NER in LLMs enables precise extraction and evaluation of entities using Large Language Models (LLMs). This feature enhances the capability to assess LLM performance on Named Entity Recognition tasks. + +**Key Features:** +- **LLM-Specific Support**: Tailored for evaluating NER tasks using LLMs. +- **Accurate Entity Extraction**: Improved techniques for precise entity extraction. +- **Comprehensive Evaluation**: Detailed assessment of entity extraction performance. + +**How It Works:** +**1.** Set up NER tasks for specific LLM evaluation. +```python +# Create a Harness object +harness = Harness(task="ner", + model={ + "model": "gpt-3.5-turbo-instruct", + "hub": "openai", }, + data={ + "data_source": 'path/to/conll03.conll' + }, + config={ + "model_parameters": { + "temperature": 0, + }, + "tests": { + "defaults": { + "min_pass_rate": 1.0 + }, + "robustness": { + "lowercase": { + "min_pass_rate": 0.7 + } + }, + "accuracy": { + "min_f1_score": { + "min_score": 0.7, + }, + } + } + } + ) +``` +**2.** Generate the test cases based on the configuration in the Harness, run them on the model, and get the report. +```python harness.generate().run().report() ``` -### 📊 Multi-Dataset Handling and Evaluation -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Multiple_dataset.ipynb) +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/9435fa17-d3f7-4d47-934c-4cd483b11a53) + +Examples: +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/2ceb3390-9f07-4b17-b9e7-b32504ad1afe) + +**Conclusion:** +Evaluating NER in LLMs allows for accurate entity extraction and performance assessment using LangTest's comprehensive evaluation methods. This feature ensures thorough and reliable evaluation of LLMs on Named Entity Recognition tasks. -This feature empowers you to efficiently benchmark your language models across a wider range of datasets. -#### Key Features: +### **🚀 Enhanced Data Augmentation** +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Data_Augmenter_Notebook.ipynb) +Enhanced Data Augmentation introduces a new `DataAugmenter` class, enabling streamlined and harness-free data augmentation. This feature simplifies the process of enriching datasets to improve model robustness and performance. -- **Effortless Multi-Dataset Testing:** LangTest now seamlessly integrates and executes tests on multiple datasets within a single harness configuration. This streamlined approach eliminates the need for repetitive setups, saving you time and resources. +**Key Features:** +- **Harness-Free Augmentation**: Perform data augmentation without the need for harness testing. +- **Improved Workflow**: Simplified processes for enhancing datasets efficiently. +- **Robust Models**: Increase model robustness through effective data augmentation techniques. -- **Enhanced Fairness Evaluation**: By testing models across diverse datasets, LangTest helps identify and mitigate potential biases. This ensures your models perform fairly and accurately on a broader spectrum of data, promoting ethical and responsible AI development. +**How It Works:** +The following are steps to import the `DataAugmenter` class from LangTest. +**1.** Create a config.yaml for the data augmentation. +```yaml +# config.yaml +parameters: + type: proportion + style: new +tests: + robustness: + uppercase: + max_proportion: 0.2 + lowercase: + max_proportion: 0.2 + +``` +**2.** Initialize the `DataAugmenter` class and apply various tests for augmentation to your datasets. +```python +from langtest.augmentation import DataAugmenter +from langtest.tasks.task import TaskManager + +data_augmenter = DataAugmenter( + task=TaskManager("ner"), # use the ner, text-classification, question-answering... + config="config.yaml", +) +``` +**3.** Provide the training dataset to `data_augmenter`. +```python +data_augmenter.augment(data={ + 'data_source': 'path/to/conll03.conll' +}) +``` +**4.** Then, save the augmented dataset. +``` +data_augmenter.save("augmented.conll") +``` +**Conclusion:** +Enhanced Data Augmentation capabilities in LangTest ensure that your models are more robust and capable of handling diverse data scenarios. This feature simplifies the augmentation process, leading to improved model performance and reliability. -- **Robust Accuracy Assessment:** Multi-dataset support empowers you to conduct more rigorous accuracy testing. By evaluating models on various datasets, you gain a deeper understanding of their strengths and weaknesses across different data distributions. This comprehensive analysis strengthens your confidence in the model's real-world performance. -#### How it works: +### **🎯Multi-Dataset Prompts** +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/MultiPrompt_MultiDataset.ipynb) +Multi-Dataset Prompts streamline the process of integrating and testing various data sources by allowing users to define custom prompts for each dataset. This enhancement ensures efficient prompt handling across multiple datasets, enabling comprehensive performance evaluations. -Initiate the Harness class +**Key Features:** + +- **Custom Prompts:** Add tailored prompts for each dataset to enhance testing accuracy. +- **Seamless Integration:** Easily incorporate multiple datasets into your testing environment. +- **Improved Efficiency:** Simplified workflows for handling diverse data sources. + +**How It Works:** +**1.** Initiate the Harness with `BoolQ` and `NQ-open` datasets. ```python +# Import Harness from the LangTest library +from langtest import Harness + harness = Harness( task="question-answering", model={"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, data=[ - {"data_source": "NQ-open", "split": "test-tiny",}, - {"data_source": "MedQA", "split": "test-tiny"}, - {"data_source": "LogiQA", "split": "test-tiny"}, + {"data_source": "BoolQ", "split": "dev-tiny"}, + {"data_source": "NQ-open", "split": "test-tiny"} ], ) ``` -Configure the accuracy tests in Harness class +**2.** Configure prompts specific to each dataset, allowing tailored evaluations. ```python harness.configure( { + "model_parameters": { + "user_prompt": { + "BoolQ": "Answer the following question with a True or False. {context}\nQuestion {question}", + "NQ-open": "Answer the following question. Question {question}", + } + }, "tests": { "defaults": {"min_pass_rate": 0.65}, - - "accuracy": { - "llm_eval": {"min_score": 0.60}, - "min_rouge1_score": {"min_score": 0.60}, - "min_rouge2_score": {"min_score": 0.60}, - "min_rougeL_score": {"min_score": 0.60}, - "min_rougeLsum_score": {"min_score": 0.60}, + "robustness": { + "uppercase": {"min_pass_rate": 0.66}, + "dyslexia_word_swap": {"min_pass_rate": 0.60}, + "add_abbreviation": {"min_pass_rate": 0.60}, + "add_slangs": {"min_pass_rate": 0.60}, + "add_speech_to_text_typo": {"min_pass_rate": 0.60}, }, } } ) ``` -harness.generate() generates testcases, .run() executes them, and .report() compiles results. +**3.** Generate the test cases, run them on the model, and get the report. ```python harness.generate().run().report() ``` -![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/0d48be2f-e5bc-4971-b0a1-2756a10d3f24) - -### 🖥️ Streamlined Evaluation Workflows with Enhanced CLI Commands -[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Langtest_Cli_Eval_Command.ipynb) - -LangTest's evaluation capabilities, focusing on report management and leaderboards. These enhancements empower you to: - -- **Streamlined Reporting and Tracking:** Effortlessly save and load detailed evaluation reports directly from the command line using `langtest eval`, enabling efficient performance tracking and comparative analysis over time, with manual file review options in the `~/.langtest` or `./.langtest` folder. - -- **Enhanced Leaderboards:** Gain valuable insights with the new langtest show-leaderboard command. This command displays existing leaderboards, providing a centralized view of ranked model performance across evaluations. - -- **Average Model Ranking:** Leaderboard now include the average ranking for each evaluated model. This metric provides a comprehensive understanding of model performance across various datasets and tests. - -### How it works: - -First, create the `parameter.json` or `parameter.yaml` in the working directory - -**JSON Format** -```json -{ - "task": "question-answering", - "model": { - "model": "google/flan-t5-base", - "hub": "huggingface" - }, - "data": [ - { - "data_source": "MedMCQA" - }, - { - "data_source": "PubMedQA" - }, - { - "data_source": "MMLU" - }, - { - "data_source": "MedQA" - } - ], - "config": { - "model_parameters": { - "max_tokens": 64, - "device": 0, - "task": "text2text-generation" - }, - "tests": { - "defaults": { - "min_pass_rate": 0.70 - }, - "robustness": { - "add_typo": { - "min_pass_rate": 0.70 - } - } - } - } -} -``` -**Yaml Format** -```yaml -task: question-answering -model: - model: google/flan-t5-base - hub: huggingface -data: -- data_source: MedMCQA -- data_source: PubMedQA -- data_source: MMLU -- data_source: MedQA -config: - model_parameters: - max_tokens: 64 - device: 0 - task: text2text-generation - tests: - defaults: - min_pass_rate: 0.70 - robustness: - add_typo: - min_pass_rate: 0.7 - -``` -And open the terminal or cmd in your system -```bash -langtest eval --model \ - --hub \ - -c < your configuration file like parameter.json or parameter.yaml> -``` -Finally, we can know the leaderboard and rank of the model. -![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/a405d0c6-5ef1-4efb-924c-0ba8667ebe43) +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/a961d98d-a229-439e-a9eb-92395dde6f62) ----- - -To visualize the leaderboard anytime using the CLI command -```bash -langtest show-leaderboard -``` -![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/f357c173-e4b1-4dc8-86ad-98438046b89c) +**Conclusion:** +Multi-dataset prompts in LangTest empower users to efficiently manage and test multiple data sources, resulting in more effective and comprehensive language model evaluations. ## 📒 New Notebooks +{:.table2} | Notebooks | Colab Link | |--------------------|-------------| -| Generic API-based Model Testing | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Generic_API-Based_Model_Testing_Demo.ipynb)| -| Multi-Dataset | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Multiple_dataset.ipynb) | -| Langtest Eval Cli Command | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Langtest_Cli_Eval_Command.ipynb) | ----------------- +| Model Ranking & Leaderboard | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Benchmarking_with_Harness.ipynb)| +| Fewshot Model Evaluation | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Fewshot_QA_Notebook.ipynb) | +| Evaluating NER in LLMs | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/NER%20Casual%20LLM.ipynb) | +| Data Augmenter | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Data_Augmenter_Notebook.ipynb) | +| Multi-Dataset Prompts | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/MultiPrompt_MultiDataset.ipynb) | +
    {%- include docs-langtest-pagination.html -%} diff --git a/docs/pages/docs/langtest_versions/release_notes_2_1_0.md b/docs/pages/docs/langtest_versions/release_notes_2_1_0.md new file mode 100644 index 000000000..926aab701 --- /dev/null +++ b/docs/pages/docs/langtest_versions/release_notes_2_1_0.md @@ -0,0 +1,327 @@ +--- +layout: docs +header: true +seotitle: LangTest - Deliver Safe and Effective Language Models | John Snow Labs +title: LangTest Release Notes +permalink: /docs/pages/docs/langtest_versions/release_notes_2_1_0 +key: docs-release-notes +modify_date: 2024-04-02 +--- + +
    + +## 2.1.0 + +## 📢 Highlights + +John Snow Labs is thrilled to announce the release of LangTest 2.1.0! This update brings exciting new features and improvements designed to streamline your language model testing workflows and provide deeper insights. + +- **🔗 Enhanced API-based LLM Integration:** LangTest now supports testing API-based Large Language Models (LLMs). This allows you to seamlessly integrate diverse LLM models with LangTest and conduct performance evaluations across various datasets. + +- **📂 Expanded File Format Support:** LangTest 2.1.0 introduces support for additional file formats, further increasing its flexibility in handling different data structures used in LLM testing. + +- **📊 Improved Multi-Dataset Handling:** We've made significant improvements in how LangTest manages multiple datasets. This simplifies workflows and allows for more efficient testing across a wider range of data sources. + +- **🖥️ New Benchmarking Commands**: LangTest now boasts a set of new commands specifically designed for benchmarking language models. These commands provide a structured approach to evaluating model performance and comparing results across different models and datasets. + +
    + +## 🔥 Key Enhancements: + +### **🔗 Streamlined Integration and Enhanced Functionality for API-Based Large Language Models:** +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Generic_API-Based_Model_Testing_Demo.ipynb) + +This feature empowers you to seamlessly integrate virtually any language model hosted on an external API platform. Whether you prefer OpenAI, Hugging Face, or even custom vLLM solutions, LangTest now adapts to your workflow. `input_processor` and `output_parser` functions are not required for openai api compatible server. + +#### Key Features: + +- **Effortless API Integration:** Connect to any API system by specifying the API URL, parameters, and a custom function for parsing the returned results. This intuitive approach allows you to leverage your preferred language models with minimal configuration. + +- **Customizable Parameters:** Define the URL, parameters specific to your chosen API, and a parsing function tailored to extract the desired output. This level of control ensures compatibility with diverse API structures. + +- **Unparalleled Flexibility:** Generic API Support removes platform limitations. Now, you can seamlessly integrate language models from various sources, including OpenAI, Hugging Face, and even custom vLLM solutions hosted on private platforms. + +#### How it Works: + +**Parameters:** +Define the `input_processer` function for creating a payload and the `output_parser` function is used to extract the output from the response. + +```python +GOOGLE_API_KEY = "" +model_url = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key={GOOGLE_API_KEY}" + +# headers +headers = { + "Content-Type": "application/json", +} + +# function to create a payload +def input_processor(content): + return {"contents": [ + { + "role": "user", + "parts": [ + { + "text": content + } + ] + } + ]} + +# function to extract output from model response +def output_parser(response): + try: + return response['candidates'][0]['content']['parts'][0]['text'] + except: + return "" +``` + +To take advantage of this feature, users can utilize the following setup code: + +```python +from langtest import Harness + +# Initialize Harness with API parameters +harness = Harness( + task="question-answering", + model={ + "model": { + "url": url, + "headers": headers, + "input_processor": input_processor, + "output_parser": output_parser, + }, + "hub": "web", + }, + data={ + "data_source": "OpenBookQA", + "split": "test-tiny", + } +) +# Generate, Run and get Report +harness.generate().run().report() +``` +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/9754c506-e715-4e2c-8b9d-dfd98f0695e5) + + +### 📂 Streamlined Data Handling and Evaluation + +This feature streamlines your testing workflows by enabling LangTest to process a wider range of file formats directly. + +#### Key Features: + +- **Effortless File Format Handling:** LangTest now seamlessly ingests data from various file formats, including pickles (.pkl) in addition to previously supported formats. Simply provide the data source path in your harness configuration, and LangTest takes care of the rest. + +- **Simplified Data Source Management**: LangTest intelligently recognizes the file extension and automatically selects the appropriate processing method. This eliminates the need for manual configuration, saving you time and effort. + +- **Enhanced Maintainability**: The underlying code structure is optimized for flexibility. Adding support for new file formats in the future requires minimal effort, ensuring LangTest stays compatible with evolving data storage practices. + +#### How it works: + +```python +from langtest import Harness + +harness = Harness( + task="question-answering", + model={ + "model": "http://localhost:1234/v1/chat/completions", + "hub": "lm-studio", + }, + data={ + "data_source": "path/to/file.pkl", # + }, +) +# generate, run and report +harness.generate().run().report() +``` +### 📊 Multi-Dataset Handling and Evaluation +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Multiple_dataset.ipynb) + +This feature empowers you to efficiently benchmark your language models across a wider range of datasets. + +#### Key Features: + +- **Effortless Multi-Dataset Testing:** LangTest now seamlessly integrates and executes tests on multiple datasets within a single harness configuration. This streamlined approach eliminates the need for repetitive setups, saving you time and resources. + +- **Enhanced Fairness Evaluation**: By testing models across diverse datasets, LangTest helps identify and mitigate potential biases. This ensures your models perform fairly and accurately on a broader spectrum of data, promoting ethical and responsible AI development. + +- **Robust Accuracy Assessment:** Multi-dataset support empowers you to conduct more rigorous accuracy testing. By evaluating models on various datasets, you gain a deeper understanding of their strengths and weaknesses across different data distributions. This comprehensive analysis strengthens your confidence in the model's real-world performance. + +#### How it works: + +Initiate the Harness class +```python +harness = Harness( + task="question-answering", + model={"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + data=[ + {"data_source": "NQ-open", "split": "test-tiny",}, + {"data_source": "MedQA", "split": "test-tiny"}, + {"data_source": "LogiQA", "split": "test-tiny"}, + ], +) +``` +Configure the accuracy tests in Harness class +```python +harness.configure( + { + "tests": { + "defaults": {"min_pass_rate": 0.65}, + + "accuracy": { + "llm_eval": {"min_score": 0.60}, + "min_rouge1_score": {"min_score": 0.60}, + "min_rouge2_score": {"min_score": 0.60}, + "min_rougeL_score": {"min_score": 0.60}, + "min_rougeLsum_score": {"min_score": 0.60}, + }, + } + } +) +``` +harness.generate() generates testcases, .run() executes them, and .report() compiles results. +```python +harness.generate().run().report() +``` +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/0d48be2f-e5bc-4971-b0a1-2756a10d3f24) + +### 🖥️ Streamlined Evaluation Workflows with Enhanced CLI Commands +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Langtest_Cli_Eval_Command.ipynb) + +LangTest's evaluation capabilities, focusing on report management and leaderboards. These enhancements empower you to: + +- **Streamlined Reporting and Tracking:** Effortlessly save and load detailed evaluation reports directly from the command line using `langtest eval`, enabling efficient performance tracking and comparative analysis over time, with manual file review options in the `~/.langtest` or `./.langtest` folder. + +- **Enhanced Leaderboards:** Gain valuable insights with the new langtest show-leaderboard command. This command displays existing leaderboards, providing a centralized view of ranked model performance across evaluations. + +- **Average Model Ranking:** Leaderboard now include the average ranking for each evaluated model. This metric provides a comprehensive understanding of model performance across various datasets and tests. + +### How it works: + +First, create the `parameter.json` or `parameter.yaml` in the working directory + +**JSON Format** +```json +{ + "task": "question-answering", + "model": { + "model": "google/flan-t5-base", + "hub": "huggingface" + }, + "data": [ + { + "data_source": "MedMCQA" + }, + { + "data_source": "PubMedQA" + }, + { + "data_source": "MMLU" + }, + { + "data_source": "MedQA" + } + ], + "config": { + "model_parameters": { + "max_tokens": 64, + "device": 0, + "task": "text2text-generation" + }, + "tests": { + "defaults": { + "min_pass_rate": 0.70 + }, + "robustness": { + "add_typo": { + "min_pass_rate": 0.70 + } + } + } + } +} +``` +**Yaml Format** +```yaml +task: question-answering +model: + model: google/flan-t5-base + hub: huggingface +data: +- data_source: MedMCQA +- data_source: PubMedQA +- data_source: MMLU +- data_source: MedQA +config: + model_parameters: + max_tokens: 64 + device: 0 + task: text2text-generation + tests: + defaults: + min_pass_rate: 0.70 + robustness: + add_typo: + min_pass_rate: 0.7 + +``` +And open the terminal or cmd in your system +```bash +langtest eval --model \ + --hub \ + -c < your configuration file like parameter.json or parameter.yaml> +``` +Finally, we can know the leaderboard and rank of the model. +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/a405d0c6-5ef1-4efb-924c-0ba8667ebe43) + +---- + +To visualize the leaderboard anytime using the CLI command +```bash +langtest show-leaderboard +``` +![image](https://github.com/JohnSnowLabs/langtest/assets/23481244/f357c173-e4b1-4dc8-86ad-98438046b89c) + +## 📒 New Notebooks + +{:.table2} +| Notebooks | Colab Link | +|--------------------|-------------| +| Generic API-based Model Testing | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Generic_API-Based_Model_Testing_Demo.ipynb)| +| Multi-Dataset | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Multiple_dataset.ipynb) | +| Langtest Eval Cli Command | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Langtest_Cli_Eval_Command.ipynb) | + + +## 🐛 Fixes + +- Fixed multi-dataset support for accuracy task [#998] +- Fixed bugs in langtest package [#1003][#1004] + + +## ⚡ Enhancements +- Improved the error handling in Harness run method [#990] +- Websites Updates [#1001] +- Updated new version for dependencies [#992] +- Improved the data augmentation for Question-Answering task [#991] + +## What's Changed + +* Feautre/integration with web api by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/986 +* Refactor TestFactory class to handle exceptions in async tests by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/990 +* data augmentation support for question-answering task by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/991 +* Updated dependencies by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/992 +* Fix/implement the multiple dataset support for accuracy tests by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/998 +* Feature/add support for other file formats by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/993 +* Bug Fix: Generated results are none by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/1000 +* Feature/implement load & save for benchmark reports by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/999 +* Fix/bug fixes langtest 2 1 0 rc1 by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/1003 +* website updates by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/1001 +* Fix/bug fixes langtest 2 1 0 rc1 by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/1004 +* Release/2.0.1 by @chakravarthik27 in https://github.com/JohnSnowLabs/langtest/pull/1005 + + +**Full Changelog**: https://github.com/JohnSnowLabs/langtest/compare/2.0.0...2.1.0 + +## ⚒️ Previous Versions +
    +{%- include docs-langtest-pagination.html -%} diff --git a/docs/pages/tutorials/LLM_testing_Notebooks/llm_testing_notebooks.md b/docs/pages/tutorials/LLM_testing_Notebooks/llm_testing_notebooks.md index aa0b67247..dcb763825 100644 --- a/docs/pages/tutorials/LLM_testing_Notebooks/llm_testing_notebooks.md +++ b/docs/pages/tutorials/LLM_testing_Notebooks/llm_testing_notebooks.md @@ -39,4 +39,6 @@ The following table gives an overview of the different tutorial notebooks to tes | [**Sycophancy**](sycophancy) : It is an undesirable behavior in which models tailor their responses to align with a human user's view, even when that view is not objectively correct. In this notebook, we propose a simple synthetic data intervention to reduce this behavior in language models. | OpenAI | Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Sycophancy.ipynb) | | [**Stereotype**](stereotype): In this tutorial, we assess the model on gender occupational stereotype statements. | OpenAI/AI21 | Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Wino_Bias_LLM.ipynb) | | [**LM Studio**](lm_studio): Running Hugging Face quantized models through LM-Studio and testing these models for a Question Answering task. | LM Studio | Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/LM-Studio-Demo.ipynb) | -| [**Question Answering Benchmarking**](question_answering_benchmarking): This notebook provides a demo on benchmarking Language Models (LLMs) for Question-Answering tasks. | Hugging Face Inference API | Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Question-Answering.ipynb) | \ No newline at end of file +| [**Question Answering Benchmarking**](question_answering_benchmarking): This notebook provides a demo on benchmarking Language Models (LLMs) for Question-Answering tasks. | Hugging Face Inference API | Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/benchmarks/Question-Answering.ipynb) | +| **Fewshot Model Evaluation**: This notebook provides a demo on Optimize and evaluate your models using few-shot prompt techniques | OpenAI | Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Fewshot_QA_Notebook.ipynb) | +| **Evaluating NER in LLMs**:In this tutorial, we assess the support for Named Entity Recognition (NER) tasks specifically for Large Language Models (LLMs) | OpenAI | Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/NER%20Casual%20LLM.ipynb) | \ No newline at end of file diff --git a/docs/pages/tutorials/miscellaneous_notebooks/miscellaneous_notebooks.md b/docs/pages/tutorials/miscellaneous_notebooks/miscellaneous_notebooks.md index 13c26c50e..530ffd633 100644 --- a/docs/pages/tutorials/miscellaneous_notebooks/miscellaneous_notebooks.md +++ b/docs/pages/tutorials/miscellaneous_notebooks/miscellaneous_notebooks.md @@ -39,3 +39,5 @@ The following table gives an overview of the different tutorial notebooks. In th | **LangTestCallback**: In this section, we discussed how to utilize the LangTestCallback funtion while training an Text Classification transformers model. | Hugging Face | Text-Classification | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/HF_Callback_Text_Classification.ipynb) | | **Multiple_dataset**: In this section, we discussed how to evaluate multiple datasets for a particular model. | OpenAI |Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Multiple_dataset.ipynb) | | **Generic API-Based Model**: In this section, we discussed how to test API-based models hosted using Ollama, vLLM, and other tools. | Web |Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/llm_notebooks/Generic_API-Based_Model_Testing_Demo.ipynb) | +| **Data Augmenter**: In this Notebook, we can allows for streamlined and harness-free data augmentation, making it simpler to enhance your datasets and improve model robustness. | - |NER | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/Data_Augmenter_Notebook.ipynb) | +| **Multi-Dataset Prompt Configs**: In this Notebook, we discussed about optimized prompt handling for multiple datasets, allowing users to add custom prompts for each dataset, enabling seamless integration and efficient testing. | OpenAI |Question-Answering | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/langtest/blob/main/demo/tutorials/misc/MultiPrompt_MultiDataset.ipynb) | diff --git a/langtest/augmentation/__init__.py b/langtest/augmentation/__init__.py index 26ae43e89..e1c70a2a3 100644 --- a/langtest/augmentation/__init__.py +++ b/langtest/augmentation/__init__.py @@ -1,616 +1,4 @@ -import os -import random -import re -import string -from abc import ABC, abstractmethod -from collections import defaultdict -from copy import deepcopy as copy -from typing import Any, Dict, List, Optional, Union +from .base import BaseAugmentaion, AugmentRobustness, TemplaticAugment +from .augmenter import DataAugmenter -import pandas as pd -import yaml - -from langtest.datahandler.datasource import DataFactory, HuggingFaceDataset -from langtest.transform import TestFactory -from langtest.transform.utils import create_terminology -from langtest.utils.custom_types import Sample -from langtest.utils.custom_types.output import NEROutput -from langtest.utils.custom_types.predictions import NERPrediction, SequenceLabel -from langtest.utils.custom_types.sample import NERSample -from langtest.tasks import TaskManager -from ..utils.lib_manager import try_import_lib -from ..errors import Errors - - -class BaseAugmentaion(ABC): - """Abstract base class for data augmentation techniques. - - Methods: - fix: Abstract method that should be implemented by child classes. - This method should perform the data augmentation operation. - """ - - @abstractmethod - def fix(self, *args, **kwargs): - """Abstract method that should be implemented by child classes. - - This method should perform the data augmentation operation. - - Returns: - NotImplementedError: Raised if the method is not implemented by child classes. - """ - return NotImplementedError - - -class AugmentRobustness(BaseAugmentaion): - """A class for performing a specified task with historical results. - - Attributes: - task (str): A string indicating the task being performed. - config (dict): A dictionary containing configuration parameters for the task. - h_report (pandas.DataFrame): A DataFrame containing a report of historical results for the task. - max_prop (float): The maximum proportion of improvement that can be suggested by the class methods. - Defaults to 0.5. - - Methods: - __init__(self, task, h_report, config, max_prop=0.5) -> None: - Initializes an instance of MyClass with the specified parameters. - - fix(self) -> List[Sample]: - . - - suggestions(self, prop) -> pandas.DataFrame: - Calculates suggestions for improving test performance based on a given report. - """ - - def __init__( - self, - task: TaskManager, - h_report: "pd.DataFrame", - config: Dict, - custom_proportions: Union[Dict, List] = None, - max_prop=0.5, - ) -> None: - """Initializes an instance of MyClass with the specified parameters. - - Args: - task (str): A string indicating the task being performed. - h_report (pandas.DataFrame): A DataFrame containing a report of historical results for the task. - config (dict): A dictionary containing configuration parameters for the task. - custom_proportions - max_prop (float): The maximum proportion of improvement that can be suggested by the class methods. - Defaults to 0.5. - - Returns: - None - - """ - super().__init__() - self.task = task - self.config = config - self.h_report = h_report - self.max_prop = max_prop - self.custom_proportions = custom_proportions - - if isinstance(self.config, str): - with open(self.config) as fread: - self.config = yaml.safe_load(fread) - - def fix( - self, - training_data: dict, - output_path: str, - export_mode: str = "add", - ): - """Applies perturbations to the input data based on the recommendations from harness reports. - - Args: - training_data (dict): A dictionary containing the input data for augmentation. - output_path (str): The path to save the augmented data file. - export_mode (str, optional): Determines how the samples are modified or exported. - - 'inplace': Modifies the list of samples in place. - - 'add': Adds new samples to the input data. - - 'transformed': Exports only the transformed data, excluding untransformed samples. - Defaults to 'add'. - - Returns: - List[Dict[str, Any]]: A list of augmented data samples. - """ - - # if "source" in training_data and training_data["source"] == "huggingface": - # self.df = HuggingFaceDataset(training_data, self.task) - # data = self.df.load_data( - # feature_column=training_data.get("feature_column", "text"), - # target_column=training_data.get("target_column", "label"), - # split=training_data.get("split", "test"), - # subset=training_data.get("subset", None), - # ) - # else: - self.df = DataFactory(training_data, self.task) - data = self.df.load() - TestFactory.is_augment = True - supported_tests = TestFactory.test_scenarios() - suggest: pd.DataFrame = self.suggestions(self.h_report) - sum_propotion = suggest["proportion_increase"].sum() - if suggest.shape[0] <= 0 or suggest.empty: - print("All tests have passed. Augmentation will not be applied in this case.") - return None - - self.config = self._parameters_overrides(self.config, data) - - final_aug_data = [] - hash_map = {k: v for k, v in enumerate(data)} - transformed_data = [] - for proportion in suggest.iterrows(): - cat = proportion[-1]["category"].lower() - if cat not in ["robustness", "bias"]: - continue - test = proportion[-1]["test_type"].lower() - test_type = {cat: {test: self.config.get("tests").get(cat).get(test)}} - if proportion[-1]["test_type"] in supported_tests[cat]: - sample_length = ( - len(data) - * self.max_prop - * (proportion[-1]["proportion_increase"] / sum_propotion) - ) - if export_mode in ("inplace"): - sample_indices = random.sample( - range(0, len(data)), int(sample_length) - ) - for each in sample_indices: - if test == "swap_entities": - test_type["robustness"]["swap_entities"]["parameters"][ - "labels" - ] = [self.label[each]] - res = TestFactory.transform( - self.task, [hash_map[each]], test_type - ) - if len(res) == 0: - continue - hash_map[each] = res[0] - else: - if test == "swap_entities": - sample_data = data[: int(sample_length)] - test_type["robustness"]["swap_entities"]["parameters"][ - "labels" - ] = test_type["robustness"]["swap_entities"]["parameters"][ - "labels" - ][ - : int(sample_length) - ] - else: - sample_data = random.choices(data, k=int(sample_length)) - aug_data = TestFactory.transform(self.task, sample_data, test_type) - final_aug_data.extend(aug_data) - - if export_mode == "transformed": - transformed_data.extend(aug_data) - if "." not in training_data["data_source"]: - if export_mode == "inplace": - final_aug_data = list(hash_map.values()) - self.df.export(final_aug_data, output_path) - elif export_mode == "transformed": - self.df.export(transformed_data, output_path) - else: - data.extend(final_aug_data) - self.df.export(data, output_path) - - TestFactory.is_augment = False - return final_aug_data - - else: - if export_mode == "inplace": - final_aug_data = list(hash_map.values()) - self.df.export(final_aug_data, output_path) - elif export_mode == "transformed": - self.df.export(transformed_data, output_path) - else: - data.extend(final_aug_data) - self.df.export(data, output_path) - - TestFactory.is_augment = False - return final_aug_data - - def suggestions(self, report: "pd.DataFrame") -> "pd.DataFrame": - """Calculates suggestions for improving test performance based on a given report. - - Args: - report (pandas.DataFrame): A DataFrame containing test results by category and test type, - including pass rates and minimum pass rates. - - Returns: - pandas.DataFrame: A DataFrame containing the following columns for each suggestion: - - category: the test category - - test_type: the type of test - - ratio: the pass rate divided by the minimum pass rate for the test - - proportion_increase: a proportion indicating how much the pass rate - should increase to reach the minimum pass rate - """ - report["ratio"] = report["pass_rate"] / report["minimum_pass_rate"] - - if self.custom_proportions and isinstance(self.custom_proportions, dict): - report["proportion_increase"] = report["test_type"].map( - self.custom_proportions - ) - elif self.custom_proportions and isinstance(self.custom_proportions, list): - report["proportion_increase"] = report["ratio"].apply(self._proportion_values) - report = report[report["test_type"].isin(self.custom_proportions)] - else: - report["proportion_increase"] = report["ratio"].apply(self._proportion_values) - - report = report.dropna(subset=["proportion_increase"])[ - ["category", "test_type", "ratio", "proportion_increase"] - ] - return report - - @staticmethod - def _proportion_values(x: float) -> Optional[float]: - """Calculates a proportion indicating how much a pass rate should increase to reach a minimum pass rate. - - Args: - x (float): The ratio of the pass rate to the minimum pass rate for a given test. - - Returns: - float: A proportion indicating how much the pass rate should increase to reach the minimum pass rate. - If the pass rate is greater than or equal to the minimum pass rate, returns None. - If the pass rate is between 0.9 and 1.0 times the minimum pass rate, returns 0.05. - If the pass rate is between 0.8 and 0.9 times the minimum pass rate, returns 0.1. - If the pass rate is between 0.7 and 0.8 times the minimum pass rate, returns 0.2. - If the pass rate is less than 0.7 times the minimum pass rate, returns 0.3. - - """ - if x >= 1: - return None - elif x > 0.9: - return 0.05 - elif x > 0.8: - return 0.1 - elif x > 0.7: - return 0.2 - else: - return 0.3 - - def _parameters_overrides(self, config: dict, data_handler: List[Sample]) -> dict: - tests = config.get("tests", {}).get("robustness", {}) - if "swap_entities" in config.get("tests", {}).get("robustness", {}): - df = pd.DataFrame( - { - "text": [sample.original for sample in data_handler], - "label": [ - [i.entity for i in sample.expected_results.predictions] - for sample in data_handler - ], - } - ) - params = tests["swap_entities"] - params["parameters"] = {} - params["parameters"]["terminology"] = create_terminology(df) - params["parameters"]["labels"] = df.label.tolist() - self.label = ( - self.config.get("tests") - .get("robustness") - .get("swap_entities") - .get("parameters") - .get("labels") - ) - return config - - -class TemplaticAugment(BaseAugmentaion): - """This class is used for templatic augmentation. It is a subclass of the BaseAugmentation class. - - Attributes: - __templates: - A string or a list of strings or samples that represents the templates for the augmentation. - __task: - The task for which the augmentation is being performed. - __generate_templates: - if set to True, generates sample templates from the given ones. - __show_templates: - if set to True, displays the used templates. - - - Methods: - __init__(self, templates: Union[str, List[str]], task: str): - Initializes the TemplaticAugment class. - fix(self, training_data: str, output_path: str, *args, **kwargs): - Performs the templatic augmentation and exports the results to a specified path. - """ - - def __init__( - self, - templates: Union[str, List[str]], - task: TaskManager, - generate_templates=False, - show_templates=False, - ) -> None: - """This constructor for the TemplaticAugment class. - - Args: - templates (Union[str, List[str]]): The templates to be used for the augmentation. - task (str): The task for which the augmentation is being performed. - generate_templates (bool, optional): if set to True, generates sample templates from the given ones. - show_templates (bool, optional): if set to True, displays the used templates. - """ - self.__templates: Union[str, List[str], List[Sample]] = templates - self.__task = task - - if generate_templates: - if try_import_lib("openai"): - import openai - - given_template = self.__templates[:] - for template in given_template: - prompt = f"""Based on the template provided, create 10 new and unique templates that are variations on this theme. Present these as a Python list, with each template as a quoted string. The list should contain only the templates without any additional text or explanation. - - Template: - "{template}" - - Expected Python List Output: - ['Template 1', 'Template 2', 'Template 3', ...] # Replace with actual generated templates - """ - - response = openai.Completion.create( - engine="gpt-3.5-turbo-instruct", - prompt=prompt, - max_tokens=500, - temperature=0, - ) - - generated_response = response.choices[0].text.strip() - # Process the generated response - if generated_response: - # Assuming the response format is a Python-like list in a string - templates_list = generated_response.strip("[]").split('",') - templates_list = [ - template.strip().strip('"') - for template in templates_list - if template.strip() - ] - - # Extend the existing templates list - self.__templates.extend(templates_list) - else: - print("No response or unexpected format.") - - else: - raise RuntimeError(Errors.E084) - - if show_templates: - [print(template) for template in self.__templates] - - if isinstance(self.__templates, str) and os.path.exists(self.__templates): - self.__templates = DataFactory(self.__templates, self.__task).load() - elif isinstance(self.__templates, str): - self.__templates = [self.str_to_sample(self.__templates)] - elif isinstance(self.__templates, list) and isinstance(self.__templates[0], str): - self.__templates = [self.str_to_sample(i) for i in self.__templates] - - def fix( - self, - training_data: Dict[str, Any], - output_path: str, - max_num: int = None, - append_original: bool = False, - *args, - **kwargs, - ) -> bool: - """This method is used to perform the templatic augmentation. - - It takes the input data, performs the augmentation and then saves the augmented data to the output path. - - Args: - training_data (dict): A dictionary containing the input data for augmentation. - output_path (str): The path where the augmented data will be saved. - max_num (int): Maximum number of new samples to generate - append_original (bool, optional): If set to True, appends the original data to the augmented data. Defaults to False. - *args: Variable length argument list. - **kwargs: Arbitrary keyword arguments. - - Returns: - bool: Returns True upon successful completion of the method. - """ - df = DataFactory(training_data, self.__task) - data = df.load() - new_data = ( - data.copy() - if isinstance(data, (pd.DataFrame, pd.Series)) - else copy.deepcopy(data) - if append_original - else [] - ) - self.__search_results = self.search_sample_results(data) - - if not max_num: - max_num = max(len(i) for i in self.__search_results.values()) - - for template in self.__templates: - for _ in range(max_num): - new_sample = self.new_sample(template) - if new_sample: - new_data.append(new_sample) - - df.export(new_data, output_path) - return True - - @staticmethod - def search_sample_results( - samples: List[Sample], - ) -> Dict[str, List[Union[NERPrediction, SequenceLabel]]]: - """This method is used to search the results of the samples for the entities in the templates. - - Args: - samples (List[Sample]): The samples for which the results are to be searched. - - Returns: - Dict[str, List[Union[NERPrediction, SequenceLabel]]]: A dictionary containing the search results. - """ - results_dict = defaultdict(list) - for sample in samples: - chunk = [] - ent_name = "" - for result in sample.expected_results.predictions: - ent = result.entity.split("-")[-1] - if ent != "O" and ent_name == "": - ent_name = ent - if result.entity.endswith(ent_name) and ent != "O": - result.doc_id = 0 - result.doc_name = "" - chunk.append(result) - elif len(chunk) > 0: - results_dict[ent_name].append(tuple(chunk)) - ent_name = "" - chunk = [] - - if chunk: - results_dict[ent_name].append(tuple(chunk)) - return results_dict - - @staticmethod - def extract_variable_names(f_string: str) -> List[str]: - """This method is used to extract the variable names from the templates. - - Args: - f_string (str): The template string. - - Returns: - List[str]: A list of variable names. - """ - pattern = r"{([^{}]*)}" - matches = re.findall(pattern, f_string) - variable_names = [match.strip() for match in matches] - return variable_names - - def new_sample(self, template: Sample): - """This method is used to generate a new sample from a template. - - Args: - template (Sample): The template from which the new sample is to be generated. - - Returns: - Sample: The new sample generated from the template. - """ - template = copy(template) - matches = re.finditer(r"{([^{}]*)}", template.original) - cursor = 0 - other_predictions = [] - if matches: - for match in matches: - entity = match.group(1) - if entity in self.__search_results: - prediction = random.choice(self.__search_results[entity]) - word = " ".join( - i.span.word for i in prediction if isinstance(i, NERPrediction) - ) - - template.original = template.original.replace( - "{" + entity + "}", word, 1 - ) - for result in template.expected_results.predictions[cursor:]: - if prediction[0].entity.endswith(result.entity): - for each_prediction in prediction: - if isinstance(each_prediction, NERPrediction): - each_prediction.chunk_tag = "-X-" - each_prediction.pos_tag = "-X-" - other_predictions.extend(prediction) - cursor += 1 - break - else: - if "{" in result.span.word and "}" in result.span.word: - continue - other_predictions.append(result) - cursor += 1 - else: - continue - template.expected_results.predictions = ( - other_predictions + template.expected_results.predictions[cursor:] - ) - return template - else: - return None - - def str_to_sample(self, template: str): - """This method is used to convert a template string to a Sample object. - - Args: - template (str): The template string to be converted. - - Returns: - Sample: The Sample object generated from the template string. - """ - if self.__task == "ner": - template = self.add_spaces_around_punctuation(template) - sample = NERSample() - sample.original = template - words = template.split() - predictions = [] - cursor = 0 - for word in words: - if "{" in word and "}" in word: - entity = word.replace("{", "").replace("}", "") - else: - entity = "O" - predictions.append( - NERPrediction.from_span( - entity, - word, - cursor, - cursor + len(word), - pos_tag="-X-", - chunk_tag="-X-", - doc_id=0, - doc_name="", - ) - ) - cursor += len(word) + 1 - sample.expected_results = NEROutput(predictions=predictions) - - elif self.__task == "text-classification": - raise NotImplementedError - - return sample - - @property - def templates(self): - """Templates getter""" - return self.__templates - - @templates.setter - def templates(self, templates: Union[str, List[str]]): - self.__init__(templates, self.__task) - - @property - def task(self): - """Task getter""" - return self.__task - - @task.setter - def task(self, task: str): - self.__task = task - - @staticmethod - def add_spaces_around_punctuation(text: str): - """This method is used to add spaces around punctuation in a string. - - Args: - text (str): The string to which spaces are to be added. - - Returns: - str: The string with spaces added around punctuation. - """ - for punct in string.punctuation: - if punct not in ["{", "}", "_"]: - if punct == ".": - # To prevent spaces being added around decimal points - text = re.sub(r"(\d)\.(\d)", r"\1[DOT]\2", text) - - text = text.replace(punct, f" {punct} ") - - if punct == ".": - # Putting back the decimal points to original state - text = text.replace("[DOT]", ".") - - # Removing extra spaces - text = re.sub(r"\s+", " ", text).strip() - - return text +__all__ = ["BaseAugmentaion", "AugmentRobustness", "TemplaticAugment", "DataAugmenter"] diff --git a/langtest/augmentation/augmenter.py b/langtest/augmentation/augmenter.py new file mode 100644 index 000000000..96b5125e1 --- /dev/null +++ b/langtest/augmentation/augmenter.py @@ -0,0 +1,184 @@ +import random +import yaml + +from typing import Any, Dict, Iterable, Union +from langtest.datahandler.datasource import DataFactory +from langtest.transform import TestFactory +from langtest.tasks.task import TaskManager + + +class DataAugmenter: + def __init__(self, task: Union[str, TaskManager], config: Union[str, dict]) -> None: + """ + Initialize the DataAugmenter. + + Args: + config (Union[str, dict]): Configuration file or dictionary. + task (Union[str, TaskManager]): Task Manager. + columns_info ([type], optional): Columns information. Defaults to None. + + """ + + self.__config = config + if isinstance(config, str): + self.__config = self.load_config(config) + + self.__tests: dict = self.__config.get("tests", []) + if isinstance(task, str): + if task in ["ner", "text-classification", "question-answering"]: + task = TaskManager(task) + else: + raise ValueError( + "check the task name. It should be one of the following: ner, text-classification, question-answering" + ) + self.__task = task + + # Test Factory and Data Factory + self.__testfactory = TestFactory + self.__datafactory = DataFactory + + self.__testfactory.is_augment = True + + # parameters + self.__max_proportion = self.__tests.get("defaults", {}).get( + "max_proportion", 0.6 + ) + # self.__ntests = len(v for k, v in self.__tests.items()) - 1 + self.__type = self.__config.get("parameters", {}).get("type", "proportion") + self.__style = self.__config.get("parameters", {}).get("style", "extend") + + self.__df_config = self.__config_df() + + def load_config(self, config: str) -> dict: + """ + Load the configuration file. + """ + with open(config, "r") as f: + return yaml.safe_load(f) + + def augment(self, data: Union[str, Iterable]) -> str: + """ + Augment the content. + """ + # load the data + if isinstance(data, dict): + self.__datafactory = self.__datafactory(file_path=data, task=self.__task) + data = self.__datafactory.load() + + # check the style of augmentation to be applied. Default is extend + if self.__style == "extend": + self.extend(data) + elif self.__style == "inplace": + self.inplace(data) + elif self.__style == "new": + self.new_data(data) + else: + raise ValueError("Invalid style") + + return self + + def extend(self, data: Iterable) -> "DataAugmenter": + """ + Extend the content. + """ + # calculate the number of rows to be added + n = len(data) + + data_cut = random.sample(data, int(n * self.__max_proportion)) + + test_cases: list = self.__testfactory.transform( + self.__task, data_cut, self.__tests + ) + + self.__augmented_data = [*data, *test_cases] if isinstance(data, list) else data + + return self + + def inplace(self, data: Iterable) -> "DataAugmenter": + """ + Inplace augmentation. + """ + # calculate the number of rows to be added + size = int(len(data) * self.__max_proportion) + + # create a dictionary with index as key and data as value + data_dict = self.prepare_hash_map(data) + + # select random rows based on the size with its index + selected = random.sample(data_dict.keys(), int(size)) + + for idx in selected: + test_cases = self.__testfactory.transform( + self.__task, [data_dict[idx]], self.__tests + ) + data_dict[idx] = test_cases[0] if test_cases else data_dict[idx] + + self.__augmented_data = data_dict.values() + + return self + + def new_data(self, data: Iterable) -> "DataAugmenter": + """ + Create new data. + """ + # calculate the number of rows to be added + size = int(len(data) * self.__max_proportion) + + data_cut = random.sample(data, size) + + test_cases = self.__testfactory.transform(self.__task, data_cut, self.__tests) + + self.__augmented_data = test_cases + + return self + + def size(self, category: str, test_name: str) -> int: + return ( + self.__max_proportion + * self.__tests.get(category, {}).get(test_name, {}).get("max_proportion", 0.6) + ) / self.__df_config.shape[0] + + def prepare_hash_map(self, data: Union[str, Iterable]) -> Dict[str, Any]: + hashmap = {index: sample for index, sample in enumerate(data)} + + return hashmap + + def save(self, file_path: str): + """ + Save the augmented data. + """ + self.__datafactory.export(data=self.__augmented_data, output_path=file_path) + + def __or__(self, other: Iterable): + results = self.augment(other) + return results + + def __ror__(self, other: Iterable): + results = self.augment(other) + return results + + def __config_df(self): + """ + Configure the data frame. + """ + + import pandas as pd + + df = pd.DataFrame(columns=["category", "test_name", "proportion"]) + + # read the configuration + for category, tests in self.__tests.items(): + if category not in ["robustness", "bias"]: + continue + for test_name, test in tests.items(): + proportion = test.get("max_proportion", 0.6) + temp = pd.DataFrame( + { + "category": [category], + "test_name": [test_name], + "proportion": [proportion], + }, + ) + df = pd.concat([df, temp], ignore_index=True) + + return df diff --git a/langtest/augmentation/base.py b/langtest/augmentation/base.py new file mode 100644 index 000000000..5b1036c4b --- /dev/null +++ b/langtest/augmentation/base.py @@ -0,0 +1,616 @@ +import os +import random +import re +import string +from abc import ABC, abstractmethod +from collections import defaultdict +from copy import deepcopy as copy +from typing import Any, Dict, List, Optional, Union + +import pandas as pd +import yaml + +from langtest.datahandler.datasource import DataFactory +from langtest.transform import TestFactory +from langtest.transform.utils import create_terminology +from langtest.utils.custom_types import Sample +from langtest.utils.custom_types.output import NEROutput +from langtest.utils.custom_types.predictions import NERPrediction, SequenceLabel +from langtest.utils.custom_types.sample import NERSample +from langtest.tasks import TaskManager +from ..utils.lib_manager import try_import_lib +from ..errors import Errors + + +class BaseAugmentaion(ABC): + """Abstract base class for data augmentation techniques. + + Methods: + fix: Abstract method that should be implemented by child classes. + This method should perform the data augmentation operation. + """ + + @abstractmethod + def fix(self, *args, **kwargs): + """Abstract method that should be implemented by child classes. + + This method should perform the data augmentation operation. + + Returns: + NotImplementedError: Raised if the method is not implemented by child classes. + """ + return NotImplementedError + + +class AugmentRobustness(BaseAugmentaion): + """A class for performing a specified task with historical results. + + Attributes: + task (str): A string indicating the task being performed. + config (dict): A dictionary containing configuration parameters for the task. + h_report (pandas.DataFrame): A DataFrame containing a report of historical results for the task. + max_prop (float): The maximum proportion of improvement that can be suggested by the class methods. + Defaults to 0.5. + + Methods: + __init__(self, task, h_report, config, max_prop=0.5) -> None: + Initializes an instance of MyClass with the specified parameters. + + fix(self) -> List[Sample]: + . + + suggestions(self, prop) -> pandas.DataFrame: + Calculates suggestions for improving test performance based on a given report. + """ + + def __init__( + self, + task: TaskManager, + h_report: "pd.DataFrame", + config: Dict, + custom_proportions: Union[Dict, List] = None, + max_prop=0.5, + ) -> None: + """Initializes an instance of MyClass with the specified parameters. + + Args: + task (str): A string indicating the task being performed. + h_report (pandas.DataFrame): A DataFrame containing a report of historical results for the task. + config (dict): A dictionary containing configuration parameters for the task. + custom_proportions + max_prop (float): The maximum proportion of improvement that can be suggested by the class methods. + Defaults to 0.5. + + Returns: + None + + """ + super().__init__() + self.task = task + self.config = config + self.h_report = h_report + self.max_prop = max_prop + self.custom_proportions = custom_proportions + + if isinstance(self.config, str): + with open(self.config) as fread: + self.config = yaml.safe_load(fread) + + def fix( + self, + training_data: dict, + output_path: str, + export_mode: str = "add", + ): + """Applies perturbations to the input data based on the recommendations from harness reports. + + Args: + training_data (dict): A dictionary containing the input data for augmentation. + output_path (str): The path to save the augmented data file. + export_mode (str, optional): Determines how the samples are modified or exported. + - 'inplace': Modifies the list of samples in place. + - 'add': Adds new samples to the input data. + - 'transformed': Exports only the transformed data, excluding untransformed samples. + Defaults to 'add'. + + Returns: + List[Dict[str, Any]]: A list of augmented data samples. + """ + + # if "source" in training_data and training_data["source"] == "huggingface": + # self.df = HuggingFaceDataset(training_data, self.task) + # data = self.df.load_data( + # feature_column=training_data.get("feature_column", "text"), + # target_column=training_data.get("target_column", "label"), + # split=training_data.get("split", "test"), + # subset=training_data.get("subset", None), + # ) + # else: + self.df = DataFactory(training_data, self.task) + data = self.df.load() + TestFactory.is_augment = True + supported_tests = TestFactory.test_scenarios() + suggest: pd.DataFrame = self.suggestions(self.h_report) + sum_propotion = suggest["proportion_increase"].sum() + if suggest.shape[0] <= 0 or suggest.empty: + print("All tests have passed. Augmentation will not be applied in this case.") + return None + + self.config = self._parameters_overrides(self.config, data) + + final_aug_data = [] + hash_map = {k: v for k, v in enumerate(data)} + transformed_data = [] + for proportion in suggest.iterrows(): + cat = proportion[-1]["category"].lower() + if cat not in ["robustness", "bias"]: + continue + test = proportion[-1]["test_type"].lower() + test_type = {cat: {test: self.config.get("tests").get(cat).get(test)}} + if proportion[-1]["test_type"] in supported_tests[cat]: + sample_length = ( + len(data) + * self.max_prop + * (proportion[-1]["proportion_increase"] / sum_propotion) + ) + if export_mode in ("inplace"): + sample_indices = random.sample( + range(0, len(data)), int(sample_length) + ) + for each in sample_indices: + if test == "swap_entities": + test_type["robustness"]["swap_entities"]["parameters"][ + "labels" + ] = [self.label[each]] + res = TestFactory.transform( + self.task, [hash_map[each]], test_type + ) + if len(res) == 0: + continue + hash_map[each] = res[0] + else: + if test == "swap_entities": + sample_data = data[: int(sample_length)] + test_type["robustness"]["swap_entities"]["parameters"][ + "labels" + ] = test_type["robustness"]["swap_entities"]["parameters"][ + "labels" + ][ + : int(sample_length) + ] + else: + sample_data = random.choices(data, k=int(sample_length)) + aug_data = TestFactory.transform(self.task, sample_data, test_type) + final_aug_data.extend(aug_data) + + if export_mode == "transformed": + transformed_data.extend(aug_data) + if "." not in training_data["data_source"]: + if export_mode == "inplace": + final_aug_data = list(hash_map.values()) + self.df.export(final_aug_data, output_path) + elif export_mode == "transformed": + self.df.export(transformed_data, output_path) + else: + data.extend(final_aug_data) + self.df.export(data, output_path) + + TestFactory.is_augment = False + return final_aug_data + + else: + if export_mode == "inplace": + final_aug_data = list(hash_map.values()) + self.df.export(final_aug_data, output_path) + elif export_mode == "transformed": + self.df.export(transformed_data, output_path) + else: + data.extend(final_aug_data) + self.df.export(data, output_path) + + TestFactory.is_augment = False + return final_aug_data + + def suggestions(self, report: "pd.DataFrame") -> "pd.DataFrame": + """Calculates suggestions for improving test performance based on a given report. + + Args: + report (pandas.DataFrame): A DataFrame containing test results by category and test type, + including pass rates and minimum pass rates. + + Returns: + pandas.DataFrame: A DataFrame containing the following columns for each suggestion: + - category: the test category + - test_type: the type of test + - ratio: the pass rate divided by the minimum pass rate for the test + - proportion_increase: a proportion indicating how much the pass rate + should increase to reach the minimum pass rate + """ + report["ratio"] = report["pass_rate"] / report["minimum_pass_rate"] + + if self.custom_proportions and isinstance(self.custom_proportions, dict): + report["proportion_increase"] = report["test_type"].map( + self.custom_proportions + ) + elif self.custom_proportions and isinstance(self.custom_proportions, list): + report["proportion_increase"] = report["ratio"].apply(self._proportion_values) + report = report[report["test_type"].isin(self.custom_proportions)] + else: + report["proportion_increase"] = report["ratio"].apply(self._proportion_values) + + report = report.dropna(subset=["proportion_increase"])[ + ["category", "test_type", "ratio", "proportion_increase"] + ] + return report + + @staticmethod + def _proportion_values(x: float) -> Optional[float]: + """Calculates a proportion indicating how much a pass rate should increase to reach a minimum pass rate. + + Args: + x (float): The ratio of the pass rate to the minimum pass rate for a given test. + + Returns: + float: A proportion indicating how much the pass rate should increase to reach the minimum pass rate. + If the pass rate is greater than or equal to the minimum pass rate, returns None. + If the pass rate is between 0.9 and 1.0 times the minimum pass rate, returns 0.05. + If the pass rate is between 0.8 and 0.9 times the minimum pass rate, returns 0.1. + If the pass rate is between 0.7 and 0.8 times the minimum pass rate, returns 0.2. + If the pass rate is less than 0.7 times the minimum pass rate, returns 0.3. + + """ + if x >= 1: + return None + elif x > 0.9: + return 0.05 + elif x > 0.8: + return 0.1 + elif x > 0.7: + return 0.2 + else: + return 0.3 + + def _parameters_overrides(self, config: dict, data_handler: List[Sample]) -> dict: + tests = config.get("tests", {}).get("robustness", {}) + if "swap_entities" in config.get("tests", {}).get("robustness", {}): + df = pd.DataFrame( + { + "text": [sample.original for sample in data_handler], + "label": [ + [i.entity for i in sample.expected_results.predictions] + for sample in data_handler + ], + } + ) + params = tests["swap_entities"] + params["parameters"] = {} + params["parameters"]["terminology"] = create_terminology(df) + params["parameters"]["labels"] = df.label.tolist() + self.label = ( + self.config.get("tests") + .get("robustness") + .get("swap_entities") + .get("parameters") + .get("labels") + ) + return config + + +class TemplaticAugment(BaseAugmentaion): + """This class is used for templatic augmentation. It is a subclass of the BaseAugmentation class. + + Attributes: + __templates: + A string or a list of strings or samples that represents the templates for the augmentation. + __task: + The task for which the augmentation is being performed. + __generate_templates: + if set to True, generates sample templates from the given ones. + __show_templates: + if set to True, displays the used templates. + + + Methods: + __init__(self, templates: Union[str, List[str]], task: str): + Initializes the TemplaticAugment class. + fix(self, training_data: str, output_path: str, *args, **kwargs): + Performs the templatic augmentation and exports the results to a specified path. + """ + + def __init__( + self, + templates: Union[str, List[str]], + task: TaskManager, + generate_templates=False, + show_templates=False, + ) -> None: + """This constructor for the TemplaticAugment class. + + Args: + templates (Union[str, List[str]]): The templates to be used for the augmentation. + task (str): The task for which the augmentation is being performed. + generate_templates (bool, optional): if set to True, generates sample templates from the given ones. + show_templates (bool, optional): if set to True, displays the used templates. + """ + self.__templates: Union[str, List[str], List[Sample]] = templates + self.__task = task + + if generate_templates: + if try_import_lib("openai"): + import openai + + given_template = self.__templates[:] + for template in given_template: + prompt = f"""Based on the template provided, create 10 new and unique templates that are variations on this theme. Present these as a Python list, with each template as a quoted string. The list should contain only the templates without any additional text or explanation. + + Template: + "{template}" + + Expected Python List Output: + ['Template 1', 'Template 2', 'Template 3', ...] # Replace with actual generated templates + """ + + response = openai.Completion.create( + engine="gpt-3.5-turbo-instruct", + prompt=prompt, + max_tokens=500, + temperature=0, + ) + + generated_response = response.choices[0].text.strip() + # Process the generated response + if generated_response: + # Assuming the response format is a Python-like list in a string + templates_list = generated_response.strip("[]").split('",') + templates_list = [ + template.strip().strip('"') + for template in templates_list + if template.strip() + ] + + # Extend the existing templates list + self.__templates.extend(templates_list) + else: + print("No response or unexpected format.") + + else: + raise RuntimeError(Errors.E084) + + if show_templates: + [print(template) for template in self.__templates] + + if isinstance(self.__templates, str) and os.path.exists(self.__templates): + self.__templates = DataFactory(self.__templates, self.__task).load() + elif isinstance(self.__templates, str): + self.__templates = [self.str_to_sample(self.__templates)] + elif isinstance(self.__templates, list) and isinstance(self.__templates[0], str): + self.__templates = [self.str_to_sample(i) for i in self.__templates] + + def fix( + self, + training_data: Dict[str, Any], + output_path: str, + max_num: int = None, + append_original: bool = False, + *args, + **kwargs, + ) -> bool: + """This method is used to perform the templatic augmentation. + + It takes the input data, performs the augmentation and then saves the augmented data to the output path. + + Args: + training_data (dict): A dictionary containing the input data for augmentation. + output_path (str): The path where the augmented data will be saved. + max_num (int): Maximum number of new samples to generate + append_original (bool, optional): If set to True, appends the original data to the augmented data. Defaults to False. + *args: Variable length argument list. + **kwargs: Arbitrary keyword arguments. + + Returns: + bool: Returns True upon successful completion of the method. + """ + df = DataFactory(training_data, self.__task) + data = df.load() + new_data = ( + data.copy() + if isinstance(data, (pd.DataFrame, pd.Series)) + else copy.deepcopy(data) + if append_original + else [] + ) + self.__search_results = self.search_sample_results(data) + + if not max_num: + max_num = max(len(i) for i in self.__search_results.values()) + + for template in self.__templates: + for _ in range(max_num): + new_sample = self.new_sample(template) + if new_sample: + new_data.append(new_sample) + + df.export(new_data, output_path) + return True + + @staticmethod + def search_sample_results( + samples: List[Sample], + ) -> Dict[str, List[Union[NERPrediction, SequenceLabel]]]: + """This method is used to search the results of the samples for the entities in the templates. + + Args: + samples (List[Sample]): The samples for which the results are to be searched. + + Returns: + Dict[str, List[Union[NERPrediction, SequenceLabel]]]: A dictionary containing the search results. + """ + results_dict = defaultdict(list) + for sample in samples: + chunk = [] + ent_name = "" + for result in sample.expected_results.predictions: + ent = result.entity.split("-")[-1] + if ent != "O" and ent_name == "": + ent_name = ent + if result.entity.endswith(ent_name) and ent != "O": + result.doc_id = 0 + result.doc_name = "" + chunk.append(result) + elif len(chunk) > 0: + results_dict[ent_name].append(tuple(chunk)) + ent_name = "" + chunk = [] + + if chunk: + results_dict[ent_name].append(tuple(chunk)) + return results_dict + + @staticmethod + def extract_variable_names(f_string: str) -> List[str]: + """This method is used to extract the variable names from the templates. + + Args: + f_string (str): The template string. + + Returns: + List[str]: A list of variable names. + """ + pattern = r"{([^{}]*)}" + matches = re.findall(pattern, f_string) + variable_names = [match.strip() for match in matches] + return variable_names + + def new_sample(self, template: Sample): + """This method is used to generate a new sample from a template. + + Args: + template (Sample): The template from which the new sample is to be generated. + + Returns: + Sample: The new sample generated from the template. + """ + template = copy(template) + matches = re.finditer(r"{([^{}]*)}", template.original) + cursor = 0 + other_predictions = [] + if matches: + for match in matches: + entity = match.group(1) + if entity in self.__search_results: + prediction = random.choice(self.__search_results[entity]) + word = " ".join( + i.span.word for i in prediction if isinstance(i, NERPrediction) + ) + + template.original = template.original.replace( + "{" + entity + "}", word, 1 + ) + for result in template.expected_results.predictions[cursor:]: + if prediction[0].entity.endswith(result.entity): + for each_prediction in prediction: + if isinstance(each_prediction, NERPrediction): + each_prediction.chunk_tag = "-X-" + each_prediction.pos_tag = "-X-" + other_predictions.extend(prediction) + cursor += 1 + break + else: + if "{" in result.span.word and "}" in result.span.word: + continue + other_predictions.append(result) + cursor += 1 + else: + continue + template.expected_results.predictions = ( + other_predictions + template.expected_results.predictions[cursor:] + ) + return template + else: + return None + + def str_to_sample(self, template: str): + """This method is used to convert a template string to a Sample object. + + Args: + template (str): The template string to be converted. + + Returns: + Sample: The Sample object generated from the template string. + """ + if self.__task == "ner": + template = self.add_spaces_around_punctuation(template) + sample = NERSample() + sample.original = template + words = template.split() + predictions = [] + cursor = 0 + for word in words: + if "{" in word and "}" in word: + entity = word.replace("{", "").replace("}", "") + else: + entity = "O" + predictions.append( + NERPrediction.from_span( + entity, + word, + cursor, + cursor + len(word), + pos_tag="-X-", + chunk_tag="-X-", + doc_id=0, + doc_name="", + ) + ) + cursor += len(word) + 1 + sample.expected_results = NEROutput(predictions=predictions) + + elif self.__task == "text-classification": + raise NotImplementedError + + return sample + + @property + def templates(self): + """Templates getter""" + return self.__templates + + @templates.setter + def templates(self, templates: Union[str, List[str]]): + self.__init__(templates, self.__task) + + @property + def task(self): + """Task getter""" + return self.__task + + @task.setter + def task(self, task: str): + self.__task = task + + @staticmethod + def add_spaces_around_punctuation(text: str): + """This method is used to add spaces around punctuation in a string. + + Args: + text (str): The string to which spaces are to be added. + + Returns: + str: The string with spaces added around punctuation. + """ + for punct in string.punctuation: + if punct not in ["{", "}", "_"]: + if punct == ".": + # To prevent spaces being added around decimal points + text = re.sub(r"(\d)\.(\d)", r"\1[DOT]\2", text) + + text = text.replace(punct, f" {punct} ") + + if punct == ".": + # Putting back the decimal points to original state + text = text.replace("[DOT]", ".") + + # Removing extra spaces + text = re.sub(r"\s+", " ", text).strip() + + return text diff --git a/langtest/datahandler/datasource.py b/langtest/datahandler/datasource.py index 61ed9dd21..674af8664 100644 --- a/langtest/datahandler/datasource.py +++ b/langtest/datahandler/datasource.py @@ -923,9 +923,11 @@ def _import_data(self, file_name, **kwargs) -> List[Sample]: temp_data = data.groupby("dataset_name") samples = {} for name, df in temp_data: + temp_samples = [] for i in df.to_dict(orient="records"): sample = self.task.get_sample_class(**i) - samples[name] = sample + temp_samples.append(sample) + samples[name] = temp_samples return samples for i in data.to_dict(orient="records"): diff --git a/langtest/langtest.py b/langtest/langtest.py index b3f5b614e..f3e1f51d6 100644 --- a/langtest/langtest.py +++ b/langtest/langtest.py @@ -20,11 +20,12 @@ from .transform import TestFactory from .utils import report_utils as report, config_utils - from .transform.utils import RepresentationOperation +from langtest.utils.benchmark_utils import Leaderboard, Summary from langtest.utils.lib_manager import try_import_lib from langtest.utils.custom_types.helpers import TestResultManager from langtest.utils.checkpoints import divide_into_batches, CheckpointManager +from langtest.prompts import PromptManager from .errors import Warnings, Errors EVAL_MODEL = None @@ -92,6 +93,7 @@ def __init__( model: Optional[Union[list, dict]] = None, data: Optional[Union[list, dict]] = None, config: Optional[Union[str, dict]] = None, + benchmarking: dict = None, ): """Initialize the Harness object. @@ -111,6 +113,25 @@ def __init__( self.is_default = False self.__data_dict = data self.__is_multi_model = False + self.__model_info = model + self.__benchmarking = benchmarking + + # check the list of strings in the data + if isinstance(data, list) and all(isinstance(i, str) for i in data): + temp_data = [] + for dataset in data: + if isinstance(task, dict): + temp_task = task["category"] + else: + temp_task = task + temp_data.append( + config_utils.BenchmarkDatasets.get_dataset_dict( + dataset_name=dataset, task=temp_task + ) + ) + + data = temp_data + self.__data_dict = data # reset classes to default state self.__reset_defaults() @@ -181,6 +202,11 @@ def __init__( resource_filename("langtest", "data/config.yml") ) + # prompt config + self.__prompt_config = self._config.get("prompt_config", None) + if self.__prompt_config: + self.prompt_manager = PromptManager.from_prompt_configs(self.__prompt_config) + # model section if isinstance(model, list): model_dict = {} @@ -446,6 +472,11 @@ def report( pd.DataFrame: DataFrame containing the results of the tests. """ + + # benchmarking true + if self.__benchmarking: + self.__tracking() + if self._generated_results is None: raise RuntimeError(Errors.E011) @@ -991,6 +1022,22 @@ def import_edited_testcases(self, input_path: str, **kwargs): Args: input_path (str): location of the file to load """ + if isinstance(self.data, dict) and not self.__is_multi_model: + self._testcases = {} + elif isinstance(self.data, list): + self._testcases = [] + + # check the category of the testcases and count the categories + categories_count = list(self._config.get("tests", {})) + + # Remove the "robustness" and "bias" categories from categories_count + categories_count = len( + [ + category + for category in categories_count + if category not in ["robustness", "bias", "defaults"] + ] + ) # multi dataset case is handled separately if isinstance(self._testcases, dict) and not self.__is_multi_model: @@ -1003,15 +1050,31 @@ def import_edited_testcases(self, input_path: str, **kwargs): for k, v in self._testcases.items() } + if categories_count > 0: + testcases = self.__temp_generate()._testcases + for k, v in testcases.items(): + if k in temp_testcases: + temp_testcases[k].extend(v) + else: + temp_testcases[k] = v + imported_testcases = DataFactory( {"data_source": input_path}, task=self.task, is_import=True ).load() + # merge the testcases with the imported ones to the temp_testcases for name, list_samples in imported_testcases.items(): if name not in temp_testcases: temp_testcases[name] = list_samples temp_testcases[name].extend(list_samples) + # update the testcases in the harness + for k, v in temp_testcases.items(): + if k in self._testcases: + self._testcases[k].extend(v) + else: + self._testcases[k] = v + # single dataset case elif isinstance(self._testcases, list): temp_testcases = [ @@ -1020,6 +1083,10 @@ def import_edited_testcases(self, input_path: str, **kwargs): if sample.category not in ["robustness", "bias"] ] + if categories_count > 0: + testcases = self.__temp_generate()._testcases + temp_testcases.extend(testcases) + self._testcases = DataFactory( {"data_source": input_path}, task=self.task, is_import=True ).load() @@ -1342,7 +1409,11 @@ def __single_dataset_generate(self, dataset: list): return testcases elif str(self.task) in ("question-answering", "summarization"): - if "bias" in tests.keys() and "bias" == self.__data_dict.get("split"): + if ( + "bias" in tests.keys() + and isinstance(self.__data_dict, dict) + and "bias" == self.__data_dict.get("split") + ): if self.__data_dict["data_source"] in ("BoolQ", "XSum"): tests_to_filter = tests["bias"].keys() testcases = DataFactory.filter_curated_bias(tests_to_filter, dataset) @@ -1572,8 +1643,21 @@ def __multi_datasets_run( ): generated_results = {} + # temp_store_prompt + temp_store_prompt = self._config.get("model_parameters", {}).get( + "user_prompt", None + ) + # Run the testcases for each dataset for dataset_name, samples in testcases.items(): + # set prompt in prompt manager + if hasattr(self, "prompt_manager") and self.prompt_manager is not None: + self.prompt_manager.default_state = dataset_name + # update user prompt for each dataset + if temp_store_prompt and isinstance(temp_store_prompt, dict): + self._config.get("model_parameters", {}).update( + {"user_prompt": temp_store_prompt.get(dataset_name)} + ) # Get the raw data for the dataset if isinstance(self.data, dict): raw_data = self.data.get(dataset_name) @@ -1597,6 +1681,12 @@ def __multi_datasets_run( print(f"{'':-^80}\n") + # resore user prompt + if temp_store_prompt: + self._config.get("model_parameters", {}).update( + {"user_prompt": temp_store_prompt} + ) + if ( self.is_multi_dataset and self._generated_results is None @@ -1611,3 +1701,113 @@ def __reset_defaults(self): """Reset the default values.""" model_response = TestResultManager() model_response.clear_data() + + # Reset the PromptManager + prompt_manager = PromptManager() + prompt_manager.reset() + + def __tracking(self, *args, **kwargs): + """Track the progress of the testcases.""" + if self.__benchmarking: + df = self.generated_results() + + path = self.__benchmarking.get( + os.path.expanduser("save_dir"), + os.path.expanduser("~/.langtest/leaderboard/"), + ) + summary = Summary(path) + + # temp dict + temp_dict = {} + if isinstance(self.__data_dict, dict): + temp_dict[self.__data_dict.get("data_source")] = self.__data_dict + else: + for i in self.__data_dict: + temp_dict[i.get("data_source")] = i + + # add the dataset_name column if the data is single dataset + if isinstance(self.__data_dict, dict) and (not self.is_multi_dataset): + df["dataset_name"] = self.__data_dict.get("data_source", "-") + + df["split"] = df["dataset_name"].apply( + lambda x: temp_dict[x].get("split", "-") + ) + df["subset"] = df["dataset_name"].apply( + lambda x: temp_dict[x].get("subset", "-") + ) + + df["hub"] = self.__model_info.get("hub", "-") + if self.__model_info.get("hub", "-") == "lm-studio": + import requests as req + + response = req.get( + "http://localhost:1234/v1/models", + ).json() + + model_name = response["data"][0]["id"] + df["model"] = model_name + else: + df["model"] = self.__model_info.get("model", "-") + df["task"] = str(self.task) + summary.add_report(df) + + def get_leaderboard( + self, + indices=[], + columns=[], + category=False, + split_wise=False, + test_wise=False, + rank_by: Union[str, list] = "Avg", + *args, + **kwargs, + ): + """Get the rank of the model on the leaderboard.""" + + if os.path.exists(os.path.expanduser(self.__benchmarking.get("save_dir"))): + path = os.path.expanduser(self.__benchmarking.get("save_dir")) + elif os.path.exists(os.path.expanduser("~/.langtest/leaderboard/")): + path = os.path.expanduser("./.langtest/leaderboard/") + else: + raise FileNotFoundError(f"Summary.csv File is not exists in {path}") + + leaderboard = Leaderboard(path) + + # print(leaderboard.default().to_markdown()) + if indices or columns: + return leaderboard.custom_wise(indices, columns) + if category: + return leaderboard.category_wise(rank_by=rank_by) + + if test_wise: + return leaderboard.test_wise(rank_by=rank_by) + + if split_wise: + return leaderboard.split_wise(rank_by=rank_by) + + return leaderboard.default(rank_by=rank_by) + + def __temp_generate(self, *args, **kwargs): + """Temporary function to generate the testcases.""" + + # temp config other than robustness and bias + temp_config = { + "tests": { + k: v + for k, v in self._config.get("tests", {}).items() + if k not in ["robustness", "bias"] + } + } + print( + f"{'':=^80}\n{'Adding Test Cases Other than Robustness and Bias Categories ':^80}\n{'':=^80}" + ) + temp_harness = self.__class__( + task=str(self.task), + model=self.__model_info, + data=self.__data_dict, + config=temp_config, + ) + temp_harness.generate() + print(f"{'':-^80}\n") + + return temp_harness diff --git a/langtest/modelhandler/llm_modelhandler.py b/langtest/modelhandler/llm_modelhandler.py index 4a9081f33..884be8797 100644 --- a/langtest/modelhandler/llm_modelhandler.py +++ b/langtest/modelhandler/llm_modelhandler.py @@ -1,9 +1,13 @@ import inspect -from typing import Any, Union +from typing import Any, List, Union import langchain.llms as lc -import langchain.chat_models as cm -from langchain import LLMChain, PromptTemplate -from pydantic import ValidationError +from langchain.chains import LLMChain +from langchain_core.prompts import PromptTemplate +from langchain_core.exceptions import OutputParserException +from pydantic import Field, ValidationError + +from langtest.utils.custom_types.output import NEROutput +from langtest.utils.custom_types.predictions import NERPrediction from ..modelhandler.modelhandler import ModelAPI, LANGCHAIN_HUBS from ..errors import Errors, Warnings import logging @@ -76,7 +80,9 @@ def load_model(cls, hub: str, path: str, *args, **kwargs) -> "PretrainedModelFor try: cls._update_model_parameters(hub, filtered_kwargs) if path in ("gpt-4", "gpt-3.5-turbo", "gpt-4-1106-preview"): - model = cm.ChatOpenAI(model=path, *args, **filtered_kwargs) + from langchain_openai.chat_models import ChatOpenAI + + model = ChatOpenAI(model=path, *args, **filtered_kwargs) return cls(hub, model, *args, **filtered_kwargs) else: model = getattr(lc, LANGCHAIN_HUBS[hub]) @@ -131,10 +137,19 @@ def predict(self, text: Union[str, dict], prompt: dict, *args, **kwargs): The prediction result. """ try: - prompt_template = PromptTemplate(**prompt) + # loading a prompt manager + from langtest.prompts import PromptManager + + prompt_manager = PromptManager() + + prompt_template = prompt_manager.get_prompt() + + if prompt_template is None: + prompt_template = PromptTemplate(**prompt) + llmchain = LLMChain(prompt=prompt_template, llm=self.model) - output = llmchain.run(**text) - return output + output = llmchain.invoke(text) + return output.get(llmchain.output_key, "") except Exception as e: raise ValueError(Errors.E089.format(error_message=e)) @@ -197,6 +212,93 @@ def __str__(self): return self.message +class PretrainedModelForNER(PretrainedModelForQA, ModelAPI): + """A class representing a pretrained model for named entity recognition. + + Inherits: + PretrainedModelForQA: The base class for pretrained models. + """ + + @lru_cache(maxsize=102400) + def predict(self, text: Union[str, dict], *args, **kwargs) -> NEROutput: + """Perform prediction using the pretrained model. + + Args: + text (Union[str, dict]): The input text or dictionary. + *args: Additional positional arguments. + **kwargs: Additional keyword arguments. + + Returns: + dict: A dictionary containing the prediction result. + - 'result': The prediction result. + """ + try: + prompt = { + "input_variables": ["text"], + "template": "Extract the named entities from the text. \n{format_instructions}\n {text}", + "partial_variables": { + "format_instructions": self.__output_parser().get_format_instructions() + }, + } + prompt_template = PromptTemplate(**prompt) + llmchain = LLMChain( + prompt=prompt_template, + llm=self.model, + output_parser=self.__output_parser(), + ) + result = llmchain.invoke({"text": text}) + result: dict = result.get(llmchain.output_key, {"entities": []}) + + try: + predictions = [] + for entity in result.get("entities", []): + try: + entity = NERPrediction.from_span(**entity) + predictions.append(entity) + except Exception: + pass + + return NEROutput(predictions=predictions) + except Exception: + return NEROutput(predictions=[]) + + except OutputParserException: + return NEROutput(predictions=[]) + + except Exception as e: + raise ValueError(Errors.E089.format(error_message=e)) + + def __call__(self, text: str, *args, **kwargs): + return self.predict(text, *args, **kwargs) + + def __output_parser(self): + from langchain_core.output_parsers import JsonOutputParser + from pydantic import BaseModel + + class Word(BaseModel): + """Single word in a named entity recognition prediction""" + + word: str = Field(description="Word in the text") + start: int = Field( + description="Start index of the character in the word from the text" + ) + end: int = Field( + description="End index of the character in the word from the text" + ) + entity: str = Field(description="Named entity type") + score: float = Field(description="Confidence score of the prediction") + pos_tag: str = Field(description="Part of speech tag") + chunk_tag: str = Field(description="Chunk tag") + + class NERParser(BaseModel): + """Named entity recognition prediction parser""" + + entities: List[Word] = Field(description="List of named entities in the text") + + parser = JsonOutputParser(pydantic_object=NERParser) + return parser + + class PretrainedModelForSummarization(PretrainedModelForQA, ModelAPI): """A class representing a pretrained model for summarization. diff --git a/langtest/modelhandler/lmstudio_modelhandler.py b/langtest/modelhandler/lmstudio_modelhandler.py index 33b652477..fbcc59f4f 100644 --- a/langtest/modelhandler/lmstudio_modelhandler.py +++ b/langtest/modelhandler/lmstudio_modelhandler.py @@ -1,4 +1,7 @@ from typing import Any, Callable, Union + +from langtest.prompts import PromptManager + from .modelhandler import ModelAPI from abc import ABC from functools import lru_cache @@ -6,6 +9,8 @@ from ..errors import Errors from langtest.utils.lib_manager import try_import_lib from ..utils.custom_types.helpers import SimplePromptTemplate +from langtest.utils.custom_types.output import NEROutput +from langtest.utils.custom_types.predictions import NERPrediction from langtest.utils.custom_types.helpers import HashableDict @@ -42,10 +47,20 @@ def chat_completion_api(text: str, url: str, server_prompt: str, **kwargs): input_data_func = kwargs.get("data") data = input_data_func(text) else: - server_prompt = {"role": "assistant", "content": server_prompt} + examples = [] user_text = {"role": "user", "content": text} + + if kwargs.get("examples", None) and isinstance(kwargs.get("examples"), list): + examples.extend(kwargs.get("examples", [])) + + if isinstance(server_prompt, str): + server_prompt = {"role": "system", "content": server_prompt} + # user_text = {"role": "user", "content": text} + messages = [*examples, user_text] + # if server_prompt: + # messages.insert(0, server_prompt) data = { - "messages": [server_prompt, user_text], + "messages": messages, "temperature": kwargs.get("temperature", 0.2), "max_tokens": kwargs.get("max_tokens", -1), "stream": kwargs.get("stream", False), @@ -146,12 +161,21 @@ def predict( str: The predicted output. """ try: - prompt_template = SimplePromptTemplate(**prompt) - p = prompt_template.format(**text) + prompt_examples = PromptManager() + examples = prompt_examples.get_prompt(hub="lm-studio") + + if examples: + prompt["template"] = "".join(f"{k.title()}: {{{k}}}" for k in text.keys()) + prompt_template = SimplePromptTemplate(**prompt) + p = prompt_template.format(**text) + else: + prompt_template = SimplePromptTemplate(**prompt) + p = prompt_template.format(**text) op = chat_completion_api( text=p, url=self.model, server_prompt=server_prompt, + examples=examples, *args, **self.kwargs, ) @@ -206,6 +230,96 @@ def __call__( ) +class PretrainedModelForNER(PretrainedModel, ModelAPI): + """A class representing a pretrained model for named entity recognition. + + Inherits: + PretrainedModel: The base class for pretrained models. + + Methods + ------- + predict(text: str, *args, **kwargs) + Predicts the answer to a given question based on the pre-trained model. + + Raises + ------ + Exception + If an error occurs during prediction. + """ + + @lru_cache(maxsize=102400) + def predict(self, text: str, *args, **kwargs) -> NEROutput: + """ + Perform prediction using the pretrained model.""" + + # prompt configuration + prompt = HashableDict( + { + "input_variables": ["text"], + "template": "Given the text: {text}, identify the named entities.", + } + ) + + # server prompt configuration + server_prompt = self.kwargs.get( + "system_prompt", "Please identify the named entities in the given text." + ) + + # check if server prompt is a list and convert it to a tuple + if isinstance(server_prompt, list): + server_prompt = tuple(HashableDict(item) for item in server_prompt) + + # convert text to a dictionary + text = HashableDict({"text": text}) + + # result + predictions = None + + try: + prompt_template = SimplePromptTemplate(**prompt) + p = prompt_template.format(**text) + op = chat_completion_api( + text=p, + url=self.model, + server_prompt=server_prompt, + *args, + **self.kwargs, + ) + if self.output_parser: + predictions = self.output_parser(op) + else: + predictions = op["choices"][0]["message"]["content"] + except Exception as e: + raise ValueError(Errors.E089.format(error_message=e)) + + if isinstance(predictions, str): + try: + predictions = eval(predictions) + if not isinstance(predictions, list): + predictions = [] + except SyntaxError: + predictions = [] + + return NEROutput( + predictions=[ + NERPrediction.from_span( + entity=prediction.get("entity_group", prediction.get("entity", None)), + word=prediction.get("word", ""), + start=prediction.get("start", -1), + end=prediction.get("end", -1), + ) + for prediction in predictions + ] + ) + + def __call__(self, text: str, *args, **kwargs) -> NEROutput: + """ + Calls the predict method for the given input text. + """ + + return self.predict(text, *args, **kwargs) + + class PretrainedModelForQA(PretrainedModel, ModelAPI): """ A class for handling a pre-trained model for question answering. diff --git a/langtest/modelhandler/transformers_modelhandler.py b/langtest/modelhandler/transformers_modelhandler.py index eff7f77f8..5ab16b5c5 100644 --- a/langtest/modelhandler/transformers_modelhandler.py +++ b/langtest/modelhandler/transformers_modelhandler.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Tuple, Union +from typing import Any, Dict, List, Tuple, Union import logging import numpy as np from functools import lru_cache @@ -11,7 +11,11 @@ TranslationOutput, ) from ..errors import Errors, Warnings -from ..utils.custom_types.helpers import SimplePromptTemplate, HashableDict +from ..utils.custom_types.helpers import ( + SimplePromptTemplate, + HashableDict, + default_llm_chat_prompt, +) from ..utils.hf_utils import HuggingFacePipeline @@ -22,7 +26,7 @@ class PretrainedModelForNER(ModelAPI): model (transformers.pipeline.Pipeline): Pretrained HuggingFace NER pipeline for predictions. """ - def __init__(self, model): + def __init__(self, model, **kwargs): """Constructor method Args: @@ -33,6 +37,7 @@ def __init__(self, model): ) self.model = model + self.kwargs = kwargs self.predict.cache_clear() @staticmethod @@ -136,7 +141,7 @@ def group_entities(self, entities: List[Dict]) -> List[Dict]: return entity_groups @classmethod - def load_model(cls, path: str) -> "Pipeline": + def load_model(cls, path: Union[str, Any], **kwargs) -> "Pipeline": """Load the NER model into the `model` attribute. Args: @@ -146,9 +151,27 @@ def load_model(cls, path: str) -> "Pipeline": Returns: 'Pipeline': """ - if isinstance(path, str): - return cls(pipeline(model=path, task="ner", ignore_labels=[])) - return cls(path) + # cls.kwargs = kwargs + task = kwargs.get("task", "ner") + device = kwargs.get("device", -1) + + if isinstance(path, str) and task == "ner": + return cls( + pipeline(model=path, task=task, device=device, ignore_labels=[]), **kwargs + ) + elif isinstance(path, str): + import torch + + return cls( + pipeline( + model=path, + task="text-generation", + device=device, + torch_dtype=torch.bfloat16, + ), + **kwargs, + ) + return cls(path, **kwargs) @lru_cache(maxsize=102400) def predict(self, text: str, **kwargs) -> NEROutput: @@ -164,17 +187,37 @@ def predict(self, text: str, **kwargs) -> NEROutput: Returns: NEROutput: A list of named entities recognized in the input text. """ - predictions = self.model(text, **kwargs) - aggregated_words = self._aggregate_words(predictions) - aggregated_predictions = self.group_entities(aggregated_words) + + if self.model.model.__class__.__name__.endswith("ForCausalLM"): + predictions, _ = self.__predict_causalLm(text, **kwargs) + if predictions: + if not isinstance(predictions, list): + predictions = [predictions] + else: + predictions = [ + { + "entity": "", + "score": -1, + "index": -1, + "word": "", + "start": -1, + "end": -1, + } + ] + + aggregated_predictions = predictions + else: + predictions = self.model(text, **kwargs) + aggregated_words = self._aggregate_words(predictions) + aggregated_predictions = self.group_entities(aggregated_words) return NEROutput( predictions=[ NERPrediction.from_span( entity=prediction.get("entity_group", prediction.get("entity", None)), - word=prediction["word"], - start=prediction["start"], - end=prediction["end"], + word=prediction.get("word", ""), + start=prediction.get("start", -1), + end=prediction.get("end", -1), ) for prediction in aggregated_predictions ] @@ -203,6 +246,81 @@ def __call__(self, text: str, *args, **kwargs) -> NEROutput: """Alias of the 'predict' method""" return self.predict(text=text, **kwargs) + def __predict_causalLm(self, text: str, **kwargs): + """Perform predictions on the input text using a causal language model.""" + + # override default tokenizer parameters with the user-defined parameters + tokenizer_params = { + "tokenize": False, + "add_generation_prompt": True, + "return_dict": True, + **self.kwargs.get("tokenizer_kwargs", {}), + } + + # override default model parameters with the user-defined parameters + model_params = { + "max_new_tokens": 512, + "do_sample": True, + "temperature": 0.2, + "top_k": 10, + "top_p": 0.95, + "batch_size": 1, + **self.kwargs.get("model_kwargs", {}), + } + + # override the default parameters for the tokenizer + tokenizer_params = { + **tokenizer_params, + "add_generation_prompt": True, + } + # override the default parameters for the model + model_params = { + **model_params, + "return_full_text": False, + "handle_long_generation": "hole", + } + + # process the input text + messages = self.input_process(text) + + # preprocess the messages and generate the prompt for the model + prompt = self.model.tokenizer.apply_chat_template(messages, **tokenizer_params) + + # generate the response from the model + outputs = self.model( + prompt, + **model_params, + ) + + # Extracting the structured responses from the generated text + predictions = [] + if isinstance(outputs[0]["generated_text"], str): + try: + predictions = eval(outputs[0]["generated_text"]) + if not isinstance(predictions, list): + predictions = [] + except SyntaxError: + predictions = [] + + return predictions, outputs + + def input_process(self, input_sen): + """ + Process the input text to be used in the model + """ + + # extract the system prompt from the user-defined parameters + system_prompt = self.kwargs.get("system_prompt", default_llm_chat_prompt) + + if system_prompt: + if isinstance(system_prompt, str): + return f"{system_prompt}\n\n {input_sen}" + elif isinstance(system_prompt, list): + input_sen = {"role": "user", "content": input_sen} + return [*system_prompt, input_sen] + + return default_llm_chat_prompt + class PretrainedModelForTextClassification(ModelAPI): """Transformers pretrained model for text classification tasks diff --git a/langtest/prompts.py b/langtest/prompts.py new file mode 100644 index 000000000..b9df1d28e --- /dev/null +++ b/langtest/prompts.py @@ -0,0 +1,262 @@ +from collections import defaultdict +from typing import Dict, List, Union + +from pydantic import BaseModel, Extra, validator + + +class MessageType(BaseModel): + __field_order: List[str] = [ + "content", + "context", + "question", + "original", + "testcase", + "options", + "answer", + ] + + class Config: + extra = ( + Extra.allow + ) # Allow any additional fields that are not explicitly declared + + @validator("*", pre=True, allow_reuse=True) + def add_field(cls, v, values, field, **kwargs): + if "fields" not in values: + values["fields"] = [] + values["fields"].append(field) + return v + + @property + def get_template(self): + """Generate a template string based on the dynamic fields of the instance.""" + + temp = [] + order_less = [] + for field in self.__dict__: + if field in self.__field_order: + temp.append(f"{field.title()}: {{{field}}}") + else: + order_less.append(f"{field.title()}: {{{field}}}") + if order_less: + temp.extend(order_less) + return "\n" + "\n".join(temp) + + @property + def get_example(self): + """Generate an example string based on the dynamic fields of the instance.""" + # return {k: v for k, v in self.__dict__.items() if k != 'fields'} + temp = {} + for field in self.__field_order: + if field in self.__dict__: + temp[field] = self.__dict__[field] + return temp + + @property + def input_variables(self): + temp = [] + for field in self.__field_order: + if field in self.__dict__: + temp.append(field) + return temp + + +class Conversion(BaseModel): + """Conversion model for the conversion of the input and output of the model.""" + + user: MessageType + ai: MessageType + + class Config: + extra = ( + Extra.allow + ) # Allow any additional fields that are not explicitly declared + + @validator("*", pre=True, allow_reuse=True) + def add_field(cls, v, values, field, **kwargs): + if "fields" not in values: + values["fields"] = [] + values["fields"].append(field) + return v + + @property + def get_examples(self): + """Generate a list of examples based on the dynamic fields of the instance.""" + return {**self.user.get_example, **self.ai.get_example} + + @property + def get_suffix_user(self): + if self.user.get_template: + return self.user.get_template + + +class PromptConfig(BaseModel): + instructions: str + prompt_type: str + examples: Union[Conversion, List[Conversion]] = None + + @property + def get_examples(self) -> List[dict]: + """Generate a list of examples based on the dynamic fields of the instance.""" + if isinstance(self.examples, Conversion): + return [self.examples.get_examples] + elif isinstance(self.examples, list): + return [example.get_examples for example in self.examples] + + @property + def get_template(self): + """Generate a template string based on the dynamic fields of the instance.""" + if isinstance(self.examples, Conversion): + return self.examples.user.get_template + elif isinstance(self.examples, list): + return [ + ("human", self.examples[0].user.get_template), + ("ai", self.examples[0].ai.get_template), + ] + # return self.examples.get_template + + @property + def get_input_variables(self): + """Generate a list of input variables based on the dynamic fields of the instance.""" + if isinstance(self.examples, Conversion): + return self.examples.user.input_variables + elif isinstance(self.examples, list): + return self.examples[0].user.input_variables + + def prompt_style(self): + """Generate a prompt based on the prompt type.""" + if self.prompt_type == "chat": + from langchain.prompts import ( + ChatPromptTemplate, + FewShotChatMessagePromptTemplate, + ) + + example_prompt = ChatPromptTemplate.from_messages(self.get_template) + + few_shot_prompt = FewShotChatMessagePromptTemplate( + examples=self.get_examples, + example_prompt=example_prompt, + ) + + final_prompt = ChatPromptTemplate.from_messages( + [ + ("system", self.instructions), + few_shot_prompt, + # ('human', conf), + self.get_template[0], + ] + ) + return final_prompt + + elif self.prompt_type == "instruct": + from langchain.prompts import FewShotPromptTemplate, PromptTemplate + + template = "".join(v for _, v in self.get_template) + template = f"{template.replace('Answer:', '')}" + examples = [v.get_examples for v in self.examples] + suffix = self.examples[0].get_suffix_user + + example = PromptTemplate.from_template(template) + + final_prompt = FewShotPromptTemplate( + examples=examples, + example_prompt=example, + input_variables=self.get_input_variables, + suffix=suffix, + prefix=self.instructions, + ) + + return final_prompt + + def get_prompt(self, hub=None): + if hub == "lm-studio": + return self.lm_studio_prompt() + return self.prompt_style() + + def get_shot_prompt(self): + print(self.get_examples) + return f"{len(self.get_examples)}-shot prompt" + + def lm_studio_prompt(self): + messages = [ + {"role": "system", "content": self.instructions}, + ] + + for example in self.examples: + temp_user = {} + temp_ai = {} + + # user role + temp_user["role"] = "user" + temp_user["content"] = example.user.get_template.format( + **example.user.get_example + ) + + # assistant role + temp_ai["role"] = "assistant" + temp_ai["content"] = example.ai.get_template.format(**example.ai.get_example) + + messages.append(temp_user) + messages.append(temp_ai) + # return messages + return messages + + +class PromptManager: + _instance = None + prompt_configs: Dict[str, PromptConfig] = defaultdict(PromptConfig) + _default_state = None + + def __new__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance.prompt_configs = defaultdict(PromptConfig) + return cls._instance + + @classmethod + def from_prompt_configs(cls, prompt_configs: dict): + """Create a prompt manager from a dictionary of prompt configurations.""" + prompt_manager = cls() + if set(["instructions", "prompt_type", "examples"]).issubset( + set(prompt_configs.keys()) + ): + prompt_manager.add_prompt("default", prompt_configs) + return prompt_manager + for name, prompt_config in prompt_configs.items(): + prompt_manager.add_prompt(name, prompt_config) + + if len(prompt_manager.prompt_configs) == 1: + prompt_manager.default_state = list(prompt_manager.prompt_configs.keys())[0] + return prompt_manager + + def add_prompt(self, name: str, prompt_config: dict): + """Add a prompt template to the prompt manager.""" + prompt_config_o = PromptConfig(**prompt_config) + self.prompt_configs[name] = prompt_config_o + + def get_prompt(self, name: str = None, hub: str = None): + """Get a prompt template based on the name.""" + if name is None and self.default_state is None: + return None + if name is None: + name = self.default_state + prompt_template = self.prompt_configs[name].get_prompt(hub) + return prompt_template + + @property + def default_state(self): + return self._default_state + + @default_state.setter + def default_state(self, name: str): + self._default_state = name + + @property + def get_prompt_shot(self): + return self.get_prompt().get_shot_prompt() + + def reset(self): + """Reset the prompt manager to its initial state.""" + self.prompt_configs = defaultdict(PromptConfig) + self._instance = None + return self diff --git a/langtest/transform/robustness.py b/langtest/transform/robustness.py index 990ece8ca..7c6671ecb 100644 --- a/langtest/transform/robustness.py +++ b/langtest/transform/robustness.py @@ -1680,12 +1680,12 @@ def randomize_ages(text): for i in range(count): if isinstance(sample, str): s, _ = randomize_ages(sample) - perturbed_samples.append(s) else: s = deepcopy(sample) s.test_case, transformations = randomize_ages(s.original) if s.task in ("ner", "text-classification"): s.transformations = transformations s.category = "robustness" + perturbed_samples.append(s) return perturbed_samples diff --git a/langtest/utils/benchmark_utils.py b/langtest/utils/benchmark_utils.py new file mode 100644 index 000000000..f3e08f839 --- /dev/null +++ b/langtest/utils/benchmark_utils.py @@ -0,0 +1,376 @@ +import os +from typing import TypeVar, Generic, Union +import pandas as pd + + +class Leaderboard(Generic[TypeVar("T", bound="Leaderboard")]): + + """ + Leaderboard class to manage the ranking of the models + + Args: + path (str): The path to the summary file + + + """ + + _instance = None + + def __new__(cls, *args, **kwargs): + """ + Singleton pattern to ensure only one instance of the class is created + """ + if not cls._instance: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__( + self, + path: str = os.path.expanduser("~/.langtest/leaderboard/summary.csv"), + *args, + **kwargs, + ) -> None: + """ + Initialize the Leaderboard class with the summary file + """ + self.summary = Summary(path, *args, **kwargs) + + def default(self, rank_by: Union[str, list] = "Avg"): + """ + Get the score board for the models + """ + # check if the rank_by is a string + if isinstance(rank_by, str): + rank_by = [rank_by] + + ascending = [False] * len(rank_by) + + df = self.summary.summary_df + df = self.__drop_duplicates(df) + pvt_table = df.pivot_table( + index=["model"], columns="dataset_name", values="score" + ) + + # mean column + pvt_table.insert(0, "Avg", pvt_table.mean(axis=1)) + pvt_table = pvt_table.sort_values(by=rank_by, ascending=ascending) + + # reset the index and fill the NaN values + pvt_table = pvt_table.rename_axis(None, axis=1).reset_index() + pvt_table = pvt_table.fillna("-") + + return pvt_table + + def split_wise(self, rank_by: Union[str, list] = "Avg"): + """ + Get the score board for the models by test type + """ + + # check if the rank_by is a string + if isinstance(rank_by, str): + rank_by = [rank_by] + + ascending = [False] * len(rank_by) + + df = self.summary.summary_df + df = self.__drop_duplicates(df) + pvt_table = df.pivot_table( + index=["model", "split"], + columns=["dataset_name"], + values="score", + ) + + # mean column + pvt_table.insert(0, "Avg", pvt_table.mean(axis=1)) + pvt_table = pvt_table.sort_values(by=rank_by, ascending=ascending) + + pvt_table = pvt_table.fillna("-") + + return pvt_table + + def test_wise(self, rank_by: Union[str, list] = "Avg"): + """ + Get the score board for the models by test type + """ + + # check if the rank_by is a string + if isinstance(rank_by, str): + rank_by = [rank_by] + + # check if the test_type in the rank_by + if "test_type" not in rank_by: + rank_by.insert(0, "test_type") + rank_by.insert(0, "category") + + ascending = [True, True] + [False] * (len(rank_by) - 2) + + df = self.summary.summary_df + df = self.__drop_duplicates(df) + pvt_table = df.pivot_table( + index=["category", "test_type", "model"], + columns=["dataset_name"], + values="score", + ) + + # mean column + pvt_table.insert(0, "Avg", pvt_table.mean(axis=1)) + pvt_table = pvt_table.sort_values(by=rank_by, ascending=ascending) + + pvt_table = pvt_table.fillna("-") + + return pvt_table + + def category_wise(self, rank_by: Union[str, list] = "Avg"): + """ + Get the score board for the models by category + """ + # check if the rank_by is a string + if isinstance(rank_by, str): + rank_by = [rank_by] + + ascending = [False] * len(rank_by) + + df = self.summary.summary_df + df = self.__drop_duplicates(df) + pvt_table = df.pivot_table( + index=["category", "model"], columns=["dataset_name"], values="score" + ) + pvt_table.insert(0, "Avg", pvt_table.mean(axis=1)) + pvt_table = pvt_table.sort_values(by=rank_by, ascending=ascending) + pvt_table = pvt_table.fillna("-") + + return pvt_table + + def custom_wise( + self, indices: list, columns: list = [], rank_by: Union[str, list] = "Avg" + ): + """ + Get the score board for the models by custom group + """ + # check if the rank_by is a string + if isinstance(rank_by, str): + rank_by = [rank_by] + + ascending = [False] * len(rank_by) + + df = self.summary.summary_df + df = self.__drop_duplicates(df) + pvt_table = df.pivot_table( + index=["model", *indices], + columns=["dataset_name", *columns], + values="score", + aggfunc="first", + ) + pvt_table.insert(0, "Avg", pvt_table.mean(axis=1)) + pvt_table = pvt_table.fillna("-") + pvt_table = pvt_table.sort_values(by=rank_by, ascending=ascending) + + return pvt_table + + def __drop_duplicates(self, df: pd.DataFrame): + """ + Drop duplicates from the dataframe + """ + # arrange the dataframe by timestamp in descending order + df["timestamp"] = pd.to_datetime(df["timestamp"]) + df = df.sort_values(by="timestamp", ascending=False) + + # remove duplicates + df["timestamp"] = pd.to_datetime(df["timestamp"], format="%Y-%m-%d-%H-%M-%S") + df = df.sort_values(by="timestamp", ascending=False) + df.reset_index(drop=True, inplace=True) + unique_records = df.drop_duplicates( + subset=[ + # "timestamp", + "category", + "test_type", + "model", + "hub", + "dataset_name", + "split", + "subset", + "task", + ], + # keep=, + ) + + unique_records.reset_index(drop=True, inplace=True) + + return df + + def __repr__(self) -> str: + return self.summary.summary_df.to_markdown() + + +class Summary(Generic[TypeVar("T", bound="Summary")]): + """ + Summary class to manage the summary report + """ + + _instance = None + + def __new__(cls, *args, **kwargs): + """ + Singleton pattern to ensure only one instance of the class is created + """ + if not cls._instance: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self, path: str, *args, **kwargs) -> None: + """ + Initialize the summary + """ + self.save_dir = path + self.file_path = f"{path}summary.csv" + + self.summary_df: pd.DataFrame = self.__update_summary_df() + + def load_data_from_file(self, path: str, *args, **kwargs) -> pd.DataFrame: + """ + Check if file exists + """ + try: + if os.path.exists(path): + return self.__read_from_csv(path, *args, **kwargs) + else: + os.makedirs(os.path.dirname(path), exist_ok=True) + # Create a new file + df = pd.DataFrame(columns=self.__default_columns()) + df.to_csv(path, index=False) + return df + except FileNotFoundError: + raise FileNotFoundError(f"File not found at {path}") + + def __read_from_csv(self, path: str) -> pd.DataFrame: + """ + Read data from csv file + """ + df = pd.read_csv(path) + return df + + def __default_columns(self): + """ + Default columns for the summary report + """ + cols = [ + "timestamp", + "task", + "model", + "hub", + "category", + "test_type", + "dataset_name", + "split", + "subset", + "total_records", + "success_records", + "failure_records", + "score", + ] + return cols + + def add_report( + self, + generated_results: pd.DataFrame, + ) -> None: + """ + Add a new report to the summary + """ + # Load and Update the summary dataframe + self.summary_df = self.__update_summary_df() + + from datetime import datetime + + # Filter the dataframe for accuracy, fairness and representation + afr_df = self.__afr(generated_results) + not_afr_df = self.__not_afr(generated_results) + + # concatenate the dataframes + temp_summary_df = pd.concat([afr_df, not_afr_df], axis=0) + + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + temp_summary_df["timestamp"] = timestamp + + # insert row to the summary df + self.summary_df = pd.concat([self.summary_df, temp_summary_df], ignore_index=True) + + # Save the summary to the file + self.save_summary() + + def save_summary(self) -> None: + """ + Save the summary to the file + """ + self.summary_df.to_csv(self.file_path, index=False) + + def __afr(self, df: pd.DataFrame) -> pd.DataFrame: + """ + Filter the dataframe for accuracy, fairness and representation + to be used in the summary report + """ + df = df[df["category"].isin(["accuracy", "fairness", "representation"])] + df = df[self.__group_by_cols() + ["actual_result"]] + df = df.rename(columns={"actual_result": "score"}) + + return df + + def __not_afr(self, df: pd.DataFrame) -> pd.DataFrame: + """ + Filter the dataframe for non accuracy, fairness and representation + to be used in the summary report + """ + df = df[~df["category"].isin(["accuracy", "fairness", "representation"])] + + grouped = df.groupby(self.__group_by_cols()) + + # Filter the columns + import numpy as np + + total_records = grouped.size().reset_index(name="total_records") + success_records = grouped["pass"].sum().reset_index(name="success_records") + score = grouped["pass"].mean().reset_index(name="score") + failure_records = grouped.apply( + lambda x: np.size(x["pass"]) - np.sum(x["pass"]) + ).reset_index(name="failure_records") + + # concatenate the dataframes + result = pd.concat( + [ + success_records, + failure_records["failure_records"], + total_records["total_records"], + score["score"], + ], + axis=1, + ) + + return result + + def __group_by_cols(self): + """ + Group by columns + """ + return [ + "category", + "dataset_name", + "test_type", + "model", + "hub", + "split", + "subset", + "task", + ] + + @property + def df(self) -> pd.DataFrame: + return self.summary_df + + def __update_summary_df(self): + """ + Update the summary dataframe + """ + if self.file_path.startswith("~"): + self.file_path = os.path.expanduser(self.file_path) + self.summary_df = self.load_data_from_file(self.file_path) + return self.summary_df diff --git a/langtest/utils/config_utils.py b/langtest/utils/config_utils.py index eab207c5d..9f762ce30 100644 --- a/langtest/utils/config_utils.py +++ b/langtest/utils/config_utils.py @@ -1,3 +1,4 @@ +from typing import List from pkg_resources import resource_filename @@ -47,3 +48,193 @@ "default": resource_filename("langtest", "data/config/wino_llm_config.yml"), }, } + +BENCHMARK_DATASETS_DICT = { + "ASDiv": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "ASDiv", "split": "test-tiny"}, + }, + "BBQ": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "BBQ", "split": "test-tiny"}, + }, + "Bigbench": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": { + "data_source": "Bigbench", + "subset": "Abstract-narrative-understanding", + "split": "test-tiny", + }, + }, + "BoolQ": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "BoolQ", "split": "test-tiny"}, + }, + "CommonsenseQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "CommonsenseQA", "split": "validation-tiny"}, + }, + "FIQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "Fiqa", "split": "test-tiny"}, + }, + "HellaSwag": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "HellaSwag", "split": "test-tiny"}, + }, + "Consumer-Contracts": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "Consumer-Contracts", "split": "test"}, + }, + "Contracts": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "Contracts", "split": "test"}, + }, + "Privacy-Policy": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "Privacy-Policy", "split": "test"}, + }, + "LogiQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "LogiQA", "split": "test-tiny"}, + }, + "MMLU": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "MMLU", "split": "test-tiny"}, + }, + "NarrativeQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "NarrativeQA", "split": "test-tiny"}, + }, + "NQ-open": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "NQ-open", "split": "test-tiny"}, + }, + "OpenBookQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "OpenBookQA", "split": "test-tiny"}, + }, + "PIQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "PIQA", "split": "test-tiny"}, + }, + "Quac": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "Quac", "split": "test-tiny"}, + }, + "SIQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "SIQA", "split": "test-tiny"}, + }, + "TruthfulQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "TruthfulQA", "split": "test-tiny"}, + }, + "XSum": { + "task": "summarization", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "XSum", "split": "test-tiny"}, + }, + "MultiLexSum": { + "task": "summarization", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": {"data_source": "MultiLexSum", "split": "test-tiny"}, + }, + "MedMCQA": { + "task": "question-answering", + "model": {"model": "gpt-3.5-turbo-instruct", "hub": "openai"}, + "data": { + "data_source": "MedMCQA", + "subset": "MedMCQA-Test", + "split": "Radiology", + }, + }, + "MedQA": { + "task": "question-answering", + "model": {"model": "mistralai/Mistral-7B-Instruct-v0.1", "hub": "huggingface"}, + "data": {"data_source": "MedQA", "split": "test"}, + "config": { + "evaluation": { + "metric": "string_distance", + "distance": "jaro", + "threshold": 0.1, + }, + "tests": { + "defaults": {"min_pass_rate": 0.65}, + "robustness": { + "add_ocr_typo": {"min_pass_rate": 0.66}, + "dyslexia_word_swap": {"min_pass_rate": 0.60}, + }, + }, + }, + }, + "PubMedQA": { + "task": "question-answering", + "model": {"model": "j2-jumbo-instruct", "hub": "ai21"}, + "data": {"data_source": "PubMedQA", "split": "pqaa"}, + "config": { + "evaluation": { + "metric": "string_distance", + "distance": "jaro", + "threshold": 0.1, + }, + "tests": { + "defaults": {"min_pass_rate": 0.65}, + "robustness": { + "add_ocr_typo": {"min_pass_rate": 0.66}, + "dyslexia_word_swap": {"min_pass_rate": 0.60}, + }, + }, + }, + }, +} + + +class BenchmarkDatasets: + def __init__(self, task: str, dataset_name: str): + self.__dataset_name = dataset_name + self.__task = task + + @classmethod + def get_dataset_dict(cls, dataset_name: str, task: str) -> dict: + """Get the benchmark dataset configuration for the given dataset name.""" + dataset_config = BENCHMARK_DATASETS_DICT.get(dataset_name, None) + + if dataset_config is None: + raise ValueError( + f"Dataset {dataset_name} not found in the benchmark datasets list - {cls.get_datasets()}." + ) + + return dataset_config.get("data", None) + + @classmethod + def get_datasets(cls) -> List[str]: + """Get the list of benchmark datasets available in the library.""" + return list(BENCHMARK_DATASETS_DICT.keys()) + + @property + def dataset_name(self) -> str: + return self.__dataset_name + + @property + def task(self) -> str: + return self.__task diff --git a/langtest/utils/custom_types/helpers.py b/langtest/utils/custom_types/helpers.py index 30bba5858..ab989f23c 100644 --- a/langtest/utils/custom_types/helpers.py +++ b/langtest/utils/custom_types/helpers.py @@ -113,6 +113,33 @@ "pubmedqa": "Context: {context}\nQuestion: {question}\n I've provided a question and context. From here on, I want you to become an intelligent bot that can only answer with one of these three choices: 'yes', 'no', or 'maybe'. If you think the answer to the question is yes, then say 'yes'. If it is no, then say 'no'. If the answer is uncertain or could be either yes or no, say 'maybe'. Do not say anything else other than that.", } +default_llm_chat_prompt = { + "ner": [ + { + "role": "system", + "content": "You are an NER model designed to identify entities in the text. Your task is to classify each identified entity with its type, confidence score, word index, and the start and end positions in the input text. Respond with a list of dictionaries, each containing the keys 'entity', 'score', 'index', 'word', 'start', and 'end'. Note that all keys are mandatory and choose only ORG, and PER enities. Let's start with a few examples.", + }, + {"role": "user", "content": "The sentence is: John is working at Google."}, + { + "role": "assistant", + "content": "[{'entity': 'PER', 'score': 0.99, 'index': 1, 'word': 'John', 'start': 0, 'end': 4}, {'entity': 'ORG', 'score': 0.98, 'index': 5, 'word': 'Google', 'start': 19, 'end': 25}]", + }, + {"role": "user", "content": "The sentence is: Elon Musk founded SpaceX."}, + { + "role": "assistant", + "content": "[{'entity': 'PER', 'score': 0.99, 'index': 1, 'word': 'Elon Musk', 'start': 0, 'end': 9}, {'entity': 'ORG', 'score': 0.97, 'index': 4, 'word': 'SpaceX', 'start': 18, 'end': 24}]", + }, + { + "role": "user", + "content": "The sentence is: Ada Lovelace is considered the first computer programmer.", + }, + { + "role": "assistant", + "content": "[{'entity': 'PER', 'score': 0.98, 'index': 1, 'word': 'Ada Lovelace', 'start': 0, 'end': 12}]", + }, + ] +} + class Span(BaseModel): """Representation of a text's slice""" diff --git a/langtest/utils/custom_types/sample.py b/langtest/utils/custom_types/sample.py index 9fc752548..3a8d1abf2 100644 --- a/langtest/utils/custom_types/sample.py +++ b/langtest/utils/custom_types/sample.py @@ -373,7 +373,7 @@ class BaseQASample(BaseModel): original_question: str original_context: str - options: str + options: str = None test_type: str = None perturbed_question: str = None perturbed_context: str = None @@ -948,7 +948,7 @@ def is_pass(self): expected_unit = self.expected_results.split("/")[1] actual_unit = self.actual_results.split("/")[1] - return (expected_tokens >= actual_tokens) and (expected_unit == actual_unit) + return (expected_tokens <= actual_tokens) and (expected_unit == actual_unit) class TranslationSample(BaseModel): diff --git a/poetry.lock b/poetry.lock index 7d22c5c89..807f568a5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -414,35 +414,44 @@ numpy = [ [[package]] name = "boto3" -version = "1.7.84" +version = "1.34.93" description = "The AWS SDK for Python" optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "boto3-1.7.84-py2.py3-none-any.whl", hash = "sha256:0ed4b107c3b4550547aaec3c9bb17df068ff92d1f6f4781205800e2cb8a66de5"}, - {file = "boto3-1.7.84.tar.gz", hash = "sha256:64496f2c814e454e26c024df86bd08fb4643770d0e2b7a8fd70055fc6683eb9d"}, + {file = "boto3-1.34.93-py3-none-any.whl", hash = "sha256:b59355bf4a1408563969526f314611dbeacc151cf90ecb22af295dcc4fe18def"}, + {file = "boto3-1.34.93.tar.gz", hash = "sha256:e39516e4ca21612932599819662759c04485d53ca457996a913163da11f052a4"}, ] [package.dependencies] -botocore = ">=1.10.84,<1.11.0" -jmespath = ">=0.7.1,<1.0.0" -s3transfer = ">=0.1.10,<0.2.0" +botocore = ">=1.34.93,<1.35.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.10.0,<0.11.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.10.84" +version = "1.34.93" description = "Low-level, data-driven core of boto 3." optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "botocore-1.10.84-py2.py3-none-any.whl", hash = "sha256:380852e1adb9ba4ba9ff096af61f88a6888197b86e580e1bd786f04ebe6f9c0c"}, - {file = "botocore-1.10.84.tar.gz", hash = "sha256:d3e4b5a2c903ea30d19d41ea2f65d0e51dce54f4f4c4dfd6ecd7b04f240844a8"}, + {file = "botocore-1.34.93-py3-none-any.whl", hash = "sha256:6fbd5a53a2adc9b3d4ebd90ae0ede83a91a41d96231f8a5984051f75495f246d"}, + {file = "botocore-1.34.93.tar.gz", hash = "sha256:79d39b0b87e962991c6dd55e78ce15155099f6fb741be88b1b8a456a702cc150"}, ] [package.dependencies] -docutils = ">=0.10" -jmespath = ">=0.7.1,<1.0.0" -python-dateutil = {version = ">=2.1,<3.0.0", markers = "python_version >= \"2.7\""} +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = [ + {version = ">=1.25.4,<1.27", markers = "python_version < \"3.10\""}, + {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""}, +] + +[package.extras] +crt = ["awscrt (==0.20.9)"] [[package]] name = "catalogue" @@ -914,17 +923,6 @@ websocket-client = ">=0.32.0" [package.extras] ssh = ["paramiko (>=2.4.3)"] -[[package]] -name = "docutils" -version = "0.20.1" -description = "Docutils -- Python Documentation Utilities" -optional = true -python-versions = ">=3.7" -files = [ - {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, - {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, -] - [[package]] name = "en-core-web-sm" version = "3.5.0" @@ -1947,28 +1945,42 @@ extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15. [[package]] name = "langchain-core" -version = "0.1.29" +version = "0.1.46" description = "Building applications with LLMs through composability" optional = true -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.1.29-py3-none-any.whl", hash = "sha256:b96d599ff98810a7fcba726c151d473a4b938e0f90b9907c460b0bf0a1c7a0f7"}, - {file = "langchain_core-0.1.29.tar.gz", hash = "sha256:6731dabffad03b9213ada2640d54ed7f4ef6b99fce87ade3c71474ae154dd3cc"}, + {file = "langchain_core-0.1.46-py3-none-any.whl", hash = "sha256:1c0befcd2665dd4aa153318aa9bf729071644b4c179e491769b8e583b4bf7441"}, + {file = "langchain_core-0.1.46.tar.gz", hash = "sha256:17c416349f5c7a9808e70e3725749a3a2df5088f1ecca045c883871aa95f9c9e"}, ] [package.dependencies] -anyio = ">=3,<5" jsonpatch = ">=1.33,<2.0" langsmith = ">=0.1.0,<0.2.0" packaging = ">=23.2,<24.0" pydantic = ">=1,<3" PyYAML = ">=5.3" -requests = ">=2,<3" tenacity = ">=8.1.0,<9.0.0" [package.extras] extended-testing = ["jinja2 (>=3,<4)"] +[[package]] +name = "langchain-openai" +version = "0.1.4" +description = "An integration package connecting OpenAI and LangChain" +optional = true +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "langchain_openai-0.1.4-py3-none-any.whl", hash = "sha256:a349ada8724921e380aab03ee312568f5ca99adbc806f6878d79ff9cd1d6d353"}, + {file = "langchain_openai-0.1.4.tar.gz", hash = "sha256:1a3220464c270d73ea3987010617789adc2099d4d4740b15c7734ab07e1f054b"}, +] + +[package.dependencies] +langchain-core = ">=0.1.46,<0.2.0" +openai = ">=1.10.0,<2.0.0" +tiktoken = ">=0.5.2,<1" + [[package]] name = "langchain-text-splitters" version = "0.0.1" @@ -3629,17 +3641,20 @@ six = ">=1.14.0" [[package]] name = "s3transfer" -version = "0.1.13" +version = "0.10.1" description = "An Amazon S3 Transfer Manager" optional = true -python-versions = "*" +python-versions = ">= 3.8" files = [ - {file = "s3transfer-0.1.13-py2.py3-none-any.whl", hash = "sha256:c7a9ec356982d5e9ab2d4b46391a7d6a950e2b04c472419f5fdec70cc0ada72f"}, - {file = "s3transfer-0.1.13.tar.gz", hash = "sha256:90dc18e028989c609146e241ea153250be451e05ecc0c2832565231dacdf59c1"}, + {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, + {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, ] [package.dependencies] -botocore = ">=1.3.0,<2.0.0" +botocore = ">=1.33.2,<2.0a.0" + +[package.extras] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "safetensors" @@ -4394,6 +4409,58 @@ files = [ {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, ] +[[package]] +name = "tiktoken" +version = "0.6.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = true +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:277de84ccd8fa12730a6b4067456e5cf72fef6300bea61d506c09e45658d41ac"}, + {file = "tiktoken-0.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c44433f658064463650d61387623735641dcc4b6c999ca30bc0f8ba3fccaf5c"}, + {file = "tiktoken-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb9a2a866ae6eef1995ab656744287a5ac95acc7e0491c33fad54d053288ad3"}, + {file = "tiktoken-0.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c62c05b3109fefca26fedb2820452a050074ad8e5ad9803f4652977778177d9f"}, + {file = "tiktoken-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ef917fad0bccda07bfbad835525bbed5f3ab97a8a3e66526e48cdc3e7beacf7"}, + {file = "tiktoken-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e095131ab6092d0769a2fda85aa260c7c383072daec599ba9d8b149d2a3f4d8b"}, + {file = "tiktoken-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:05b344c61779f815038292a19a0c6eb7098b63c8f865ff205abb9ea1b656030e"}, + {file = "tiktoken-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cefb9870fb55dca9e450e54dbf61f904aab9180ff6fe568b61f4db9564e78871"}, + {file = "tiktoken-0.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:702950d33d8cabc039845674107d2e6dcabbbb0990ef350f640661368df481bb"}, + {file = "tiktoken-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d49d076058f23254f2aff9af603863c5c5f9ab095bc896bceed04f8f0b013a"}, + {file = "tiktoken-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:430bc4e650a2d23a789dc2cdca3b9e5e7eb3cd3935168d97d43518cbb1f9a911"}, + {file = "tiktoken-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:293cb8669757301a3019a12d6770bd55bec38a4d3ee9978ddbe599d68976aca7"}, + {file = "tiktoken-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7bd1a288b7903aadc054b0e16ea78e3171f70b670e7372432298c686ebf9dd47"}, + {file = "tiktoken-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac76e000183e3b749634968a45c7169b351e99936ef46f0d2353cd0d46c3118d"}, + {file = "tiktoken-0.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17cc8a4a3245ab7d935c83a2db6bb71619099d7284b884f4b2aea4c74f2f83e3"}, + {file = "tiktoken-0.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:284aebcccffe1bba0d6571651317df6a5b376ff6cfed5aeb800c55df44c78177"}, + {file = "tiktoken-0.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c1a3a5d33846f8cd9dd3b7897c1d45722f48625a587f8e6f3d3e85080559be8"}, + {file = "tiktoken-0.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6318b2bb2337f38ee954fd5efa82632c6e5ced1d52a671370fa4b2eff1355e91"}, + {file = "tiktoken-0.6.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f5f0f2ed67ba16373f9a6013b68da298096b27cd4e1cf276d2d3868b5c7efd1"}, + {file = "tiktoken-0.6.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:75af4c0b16609c2ad02581f3cdcd1fb698c7565091370bf6c0cf8624ffaba6dc"}, + {file = "tiktoken-0.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:45577faf9a9d383b8fd683e313cf6df88b6076c034f0a16da243bb1c139340c3"}, + {file = "tiktoken-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7c1492ab90c21ca4d11cef3a236ee31a3e279bb21b3fc5b0e2210588c4209e68"}, + {file = "tiktoken-0.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e2b380c5b7751272015400b26144a2bab4066ebb8daae9c3cd2a92c3b508fe5a"}, + {file = "tiktoken-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f497598b9f58c99cbc0eb764b4a92272c14d5203fc713dd650b896a03a50ad"}, + {file = "tiktoken-0.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e65e8bd6f3f279d80f1e1fbd5f588f036b9a5fa27690b7f0cc07021f1dfa0839"}, + {file = "tiktoken-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5f1495450a54e564d236769d25bfefbf77727e232d7a8a378f97acddee08c1ae"}, + {file = "tiktoken-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6c4e4857d99f6fb4670e928250835b21b68c59250520a1941618b5b4194e20c3"}, + {file = "tiktoken-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:168d718f07a39b013032741867e789971346df8e89983fe3c0ef3fbd5a0b1cb9"}, + {file = "tiktoken-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:47fdcfe11bd55376785a6aea8ad1db967db7f66ea81aed5c43fad497521819a4"}, + {file = "tiktoken-0.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb7d2ccbf1a7784810aff6b80b4012fb42c6fc37eaa68cb3b553801a5cc2d1fc"}, + {file = "tiktoken-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ccb7a111ee76af5d876a729a347f8747d5ad548e1487eeea90eaf58894b3138"}, + {file = "tiktoken-0.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2048e1086b48e3c8c6e2ceeac866561374cd57a84622fa49a6b245ffecb7744"}, + {file = "tiktoken-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07f229a5eb250b6403a61200199cecf0aac4aa23c3ecc1c11c1ca002cbb8f159"}, + {file = "tiktoken-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:432aa3be8436177b0db5a2b3e7cc28fd6c693f783b2f8722539ba16a867d0c6a"}, + {file = "tiktoken-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:8bfe8a19c8b5c40d121ee7938cd9c6a278e5b97dc035fd61714b4f0399d2f7a1"}, + {file = "tiktoken-0.6.0.tar.gz", hash = "sha256:ace62a4ede83c75b0374a2ddfa4b76903cf483e9cb06247f566be3bf14e6beed"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + [[package]] name = "tokenizers" version = "0.15.2" @@ -4732,6 +4799,22 @@ files = [ {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] +[[package]] +name = "urllib3" +version = "1.26.18" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, + {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, +] + +[package.extras] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + [[package]] name = "urllib3" version = "2.0.4" @@ -5058,15 +5141,15 @@ datasets = ["datasets"] evaluate = ["evaluate", "rouge-score", "seqeval"] huggingface-hub = ["huggingface_hub", "langchain"] johnsnowlabs = ["johnsnowlabs"] -langchain = ["langchain"] +langchain = ["langchain", "langchain-openai"] matplotlib = ["matplotlib"] metaflow = ["metaflow"] mlflow = ["mlflow"] -openai = ["langchain", "openai"] +openai = ["langchain", "langchain-openai", "openai"] spacy = ["spacy"] transformers = ["accelerate", "datasets", "torch", "transformers"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "86f5459a00c684b7232e2f9b5d4ae9d8b4975e942877b2accf238152a59a10d6" +content-hash = "673eafe78578cc2d9f31a928a0ca5d898998f81a7abfaad65293a1ba8a27e8ed" diff --git a/pyproject.toml b/pyproject.toml index 8bb09a15a..21806b1b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langtest" -version = "2.1.0" +version = "2.2.0" description = "John Snow Labs provides a library for delivering safe & effective NLP models." authors = ["John Snow Labs "] readme = "README.md" @@ -70,14 +70,16 @@ matplotlib = {version = "^3.7.2", optional = true} tenacity = {version = "^8.2.2", optional = true} langchain = {version = "^0.1.11", optional = true} typing-extensions = "^4.10.0" +langchain-openai = {version = "^0.1.4", optional = true} +boto3 = {version = "^1.34.93", optional = true} [tool.poetry.extras] transformers = ["transformers", "torch", "accelerate", "datasets"] evaluate = ["evaluate", "rouge-score", "seqeval"] spacy = ["spacy"] -langchain = ["langchain"] +langchain = ["langchain", "langchain-openai"] johnsnowlabs = ["johnsnowlabs"] -openai = ["openai", "langchain"] +openai = ["openai", "langchain", "langchain-openai"] cohere = ["cohere", "langchain"] ai21 = ["ai21", "langchain"] huggingface_hub = ["huggingface_hub", "langchain"] diff --git a/tests/fixtures/test.conll b/tests/fixtures/test.conll index 79bcd5603..577a4a17a 100644 --- a/tests/fixtures/test.conll +++ b/tests/fixtures/test.conll @@ -160,6 +160,71 @@ first JJ I-NP O time NN I-NP O . . O O +A DT B-NP O +London-based JJ I-NP B-MISC +spokesman NN I-NP O +of IN B-PP O +the DT B-NP O +Iraqi JJ I-NP B-ORG +National NNP I-NP I-ORG +Congress NNP B-NP I-ORG +said VBD B-VP O +Iraqi JJ B-NP B-MISC +artillery NN I-NP O +was VBD B-VP O +shelling VBG I-VP O +the DT B-NP O +city NN I-NP O +and CC I-NP O +Iraqi JJ I-NP B-MISC +tanks NNS I-NP O +had VBD B-VP O +advanced VBN I-VP O +to TO B-PP O +within IN B-NP O +10 CD I-NP O +km NN I-NP O +( ( O O +six CD B-NP O +miles NNS I-NP O +) ) O O +of IN B-PP O +Arbil NNP B-NP B-LOC +, , O O +the DT B-NP O +administrative JJ I-NP O +centre NN I-NP O +of IN B-PP O +the DT B-NP O +Kurdish JJ I-NP B-MISC +rebel-controlled JJ I-NP O +region NN I-NP O +of IN B-PP O +northern JJ B-NP O +Iraq NNP I-NP B-LOC +. . O O + +Brokers NNS B-NP O +said VBD B-VP O +blue JJ B-NP O +chips NNS I-NP O +like IN B-PP O +IDLC NNP B-NP B-ORG +, , O O +Bangladesh NNP B-NP B-ORG +Lamps NNP I-NP I-ORG +, , O O +Chittagong NNP B-NP B-ORG +Cement NNP I-NP I-ORG +and CC O O +Atlas NNP B-NP B-ORG +Bangladesh NNP I-NP I-ORG +were VBD B-VP O +expected VBN I-VP O +to TO B-PP O +rise VB B-NP O +. . O O + Despite IN B-PP O winning VBG B-VP O the DT B-NP O @@ -1466,3 +1531,122 @@ China NNP B-NP B-LOC 0 CD I-NP O 2 CD I-NP O 0 CD I-NP O + +A DT B-NP O +London-based JJ I-NP B-MISC +spokesman NN I-NP O +of IN B-PP O +the DT B-NP O +Iraqi JJ I-NP B-ORG +National NNP I-NP I-ORG +Congress NNP B-NP I-ORG +said VBD B-VP O +Iraqi JJ B-NP B-MISC +artillery NN I-NP O +was VBD B-VP O +shelling VBG I-VP O +the DT B-NP O +city NN I-NP O +and CC I-NP O +Iraqi JJ I-NP B-MISC +tanks NNS I-NP O +had VBD B-VP O +advanced VBN I-VP O +to TO B-PP O +within IN B-NP O +10 CD I-NP O +km NN I-NP O +( ( O O +six CD B-NP O +miles NNS I-NP O +) ) O O +of IN B-PP O +Arbil NNP B-NP B-LOC +, , O O +the DT B-NP O +administrative JJ I-NP O +centre NN I-NP O +of IN B-PP O +the DT B-NP O +Kurdish JJ I-NP B-MISC +rebel-controlled JJ I-NP O +region NN I-NP O +of IN B-PP O +northern JJ B-NP O +Iraq NNP I-NP B-LOC +. . O O + +Brokers NNS B-NP O +said VBD B-VP O +blue JJ B-NP O +chips NNS I-NP O +like IN B-PP O +IDLC NNP B-NP B-ORG +, , O O +Bangladesh NNP B-NP B-ORG +Lamps NNP I-NP I-ORG +, , O O +Chittagong NNP B-NP B-ORG +Cement NNP I-NP I-ORG +and CC O O +Atlas NNP B-NP B-ORG +Bangladesh NNP I-NP I-ORG +were VBD B-VP O +expected VBN I-VP O +to TO B-PP O +rise VB B-NP O +. . O O + +They PRP B-NP O +said VBD B-VP O +there EX B-NP O +was VBD B-VP O +still RB I-VP O +demand VB I-VP O +for IN B-PP O +blue JJ B-NP O +chips NNS I-NP O +in IN B-PP O +engineering NN B-NP O +sector NN I-NP O +despite IN B-PP O +their PRP$ B-NP O +persistent JJ I-NP O +rise NN I-NP O +over IN B-PP O +the DT B-NP O +past JJ I-NP O +several JJ I-NP O +sessions NNS I-NP O +. . O O + +The DT B-NP O +DSE NN I-NP B-ORG +all DT B-NP O +share NN I-NP O +price NN I-NP O +index NN I-NP O +closed VBD B-VP O +2.73 CD B-NP O +points NNS I-NP O +or CC O O +0.22 CD B-NP O +percent NN I-NP O +up IN B-PP O +at IN B-PP O +1,196.35 CD B-NP O +on IN B-PP O +a DT B-NP O +turnover NN I-NP O +of IN B-PP O +133.7 CD B-NP O +million CD I-NP O +taka NN I-NP O +on IN B-PP O +Thursday NNP B-NP O +. . O O + +-- : O O +Dhaka NNP B-NP B-ORG +Newsroom NNP I-NP I-ORG +880-2-506363 CD I-NP O \ No newline at end of file diff --git a/tests/test_datasource.py b/tests/test_datasource.py index 55f2c0e29..d83054f7e 100644 --- a/tests/test_datasource.py +++ b/tests/test_datasource.py @@ -83,10 +83,10 @@ def test_load_raw_data(self, dataset, feature_col, target_col): ( HuggingFaceDataset( source_info={ - "data_source": "wikiann", - "subset": "fo", + "data_source": "tner/wikiann", + "subset": "ace", "feature_column": "tokens", - "target_column": "ner_tags", + "target_column": "tags", "split": "test", }, task=TaskManager("ner"),