{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: pydantic in c:\\users\\soura\\anaconda3\\envs\\py311_genai\\lib\\site-packages (2.5.2)\n", "Requirement already satisfied: annotated-types>=0.4.0 in c:\\users\\soura\\anaconda3\\envs\\py311_genai\\lib\\site-packages (from pydantic) (0.6.0)\n", "Requirement already satisfied: pydantic-core==2.14.5 in c:\\users\\soura\\anaconda3\\envs\\py311_genai\\lib\\site-packages (from pydantic) (2.14.5)\n", "Requirement already satisfied: typing-extensions>=4.6.1 in c:\\users\\soura\\anaconda3\\envs\\py311_genai\\lib\\site-packages (from pydantic) (4.10.0)\n", "Requirement already satisfied: pydantic in c:\\users\\soura\\anaconda3\\envs\\py311_genai\\lib\\site-packages (2.5.2)\n", "Requirement already satisfied: annotated-types>=0.4.0 in c:\\users\\soura\\anaconda3\\envs\\py311_genai\\lib\\site-packages (from pydantic) (0.6.0)\n", "Requirement already satisfied: pydantic-core==2.14.5 in c:\\users\\soura\\anaconda3\\envs\\py311_genai\\lib\\site-packages (from pydantic) (2.14.5)\n", "Requirement already satisfied: typing-extensions>=4.6.1 in c:\\users\\soura\\anaconda3\\envs\\py311_genai\\lib\\site-packages (from pydantic) (4.10.0)\n" ] } ], "source": [ "%pip install pydantic datasets locust gradio " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from pydantic import BaseModel\n", "from typing import List\n", "import requests\n", "\n", "class NERRequest(BaseModel):\n", " text: str\n", "\n", "class Entity(BaseModel):\n", " entity: str\n", " score: float\n", " start: int\n", " end: int\n", " word: str\n", "\n", "class NERResponse(BaseModel):\n", " entities: List[Entity]\n", "\n", "NER_API_URL = \"http://127.0.0.1:8000\"\n", "NER_API_URL = \"https://lampofsocrates-hf-gradio-plodcw-group27:7860\"" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Found cached dataset parquet (C:/Users/soura/.cache/huggingface/datasets/surrey-nlp___parquet/surrey-nlp--PLOD-CW-843ef47e3e665cc1/0.0.0/2a3b91fbd88a2c90d1dbbb32b460cf621d31bd5b05b934492fdef7d8d6f236ec)\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "089d97a26277479d8685bc27bc8c952d", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/3 [00:00, 'Connection to 10.25.188.70 timed out. (connect timeout=None)'))", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTimeoutError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connection.py:174\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 173\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 174\u001b[0m conn \u001b[38;5;241m=\u001b[39m connection\u001b[38;5;241m.\u001b[39mcreate_connection(\n\u001b[0;32m 175\u001b[0m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dns_host, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mport), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimeout, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mextra_kw\n\u001b[0;32m 176\u001b[0m )\n\u001b[0;32m 178\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SocketTimeout:\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\util\\connection.py:95\u001b[0m, in \u001b[0;36mcreate_connection\u001b[1;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[0;32m 94\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m err \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m---> 95\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err\n\u001b[0;32m 97\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m socket\u001b[38;5;241m.\u001b[39merror(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgetaddrinfo returns an empty list\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\util\\connection.py:85\u001b[0m, in \u001b[0;36mcreate_connection\u001b[1;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[0;32m 84\u001b[0m sock\u001b[38;5;241m.\u001b[39mbind(source_address)\n\u001b[1;32m---> 85\u001b[0m sock\u001b[38;5;241m.\u001b[39mconnect(sa)\n\u001b[0;32m 86\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m sock\n", "\u001b[1;31mTimeoutError\u001b[0m: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mConnectTimeoutError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connectionpool.py:715\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[0;32m 714\u001b[0m \u001b[38;5;66;03m# Make the request on the httplib connection object.\u001b[39;00m\n\u001b[1;32m--> 715\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_request(\n\u001b[0;32m 716\u001b[0m conn,\n\u001b[0;32m 717\u001b[0m method,\n\u001b[0;32m 718\u001b[0m url,\n\u001b[0;32m 719\u001b[0m timeout\u001b[38;5;241m=\u001b[39mtimeout_obj,\n\u001b[0;32m 720\u001b[0m body\u001b[38;5;241m=\u001b[39mbody,\n\u001b[0;32m 721\u001b[0m headers\u001b[38;5;241m=\u001b[39mheaders,\n\u001b[0;32m 722\u001b[0m chunked\u001b[38;5;241m=\u001b[39mchunked,\n\u001b[0;32m 723\u001b[0m )\n\u001b[0;32m 725\u001b[0m \u001b[38;5;66;03m# If we're going to release the connection in ``finally:``, then\u001b[39;00m\n\u001b[0;32m 726\u001b[0m \u001b[38;5;66;03m# the response doesn't need to know about the connection. Otherwise\u001b[39;00m\n\u001b[0;32m 727\u001b[0m \u001b[38;5;66;03m# it will also try to release it and we'll have a double-release\u001b[39;00m\n\u001b[0;32m 728\u001b[0m \u001b[38;5;66;03m# mess.\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connectionpool.py:416\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[1;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001b[0m\n\u001b[0;32m 415\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 416\u001b[0m conn\u001b[38;5;241m.\u001b[39mrequest(method, url, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mhttplib_request_kw)\n\u001b[0;32m 418\u001b[0m \u001b[38;5;66;03m# We are swallowing BrokenPipeError (errno.EPIPE) since the server is\u001b[39;00m\n\u001b[0;32m 419\u001b[0m \u001b[38;5;66;03m# legitimately able to close the connection after sending a valid response.\u001b[39;00m\n\u001b[0;32m 420\u001b[0m \u001b[38;5;66;03m# With this behaviour, the received response is still readable.\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connection.py:244\u001b[0m, in \u001b[0;36mHTTPConnection.request\u001b[1;34m(self, method, url, body, headers)\u001b[0m\n\u001b[0;32m 243\u001b[0m headers[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUser-Agent\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m _get_default_user_agent()\n\u001b[1;32m--> 244\u001b[0m \u001b[38;5;28msuper\u001b[39m(HTTPConnection, \u001b[38;5;28mself\u001b[39m)\u001b[38;5;241m.\u001b[39mrequest(method, url, body\u001b[38;5;241m=\u001b[39mbody, headers\u001b[38;5;241m=\u001b[39mheaders)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\http\\client.py:1286\u001b[0m, in \u001b[0;36mHTTPConnection.request\u001b[1;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[0;32m 1285\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Send a complete request to the server.\"\"\"\u001b[39;00m\n\u001b[1;32m-> 1286\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_send_request(method, url, body, headers, encode_chunked)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\http\\client.py:1332\u001b[0m, in \u001b[0;36mHTTPConnection._send_request\u001b[1;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[0;32m 1331\u001b[0m body \u001b[38;5;241m=\u001b[39m _encode(body, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbody\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m-> 1332\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mendheaders(body, encode_chunked\u001b[38;5;241m=\u001b[39mencode_chunked)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\http\\client.py:1281\u001b[0m, in \u001b[0;36mHTTPConnection.endheaders\u001b[1;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[0;32m 1280\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CannotSendHeader()\n\u001b[1;32m-> 1281\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_send_output(message_body, encode_chunked\u001b[38;5;241m=\u001b[39mencode_chunked)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\http\\client.py:1041\u001b[0m, in \u001b[0;36mHTTPConnection._send_output\u001b[1;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[0;32m 1040\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_buffer[:]\n\u001b[1;32m-> 1041\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend(msg)\n\u001b[0;32m 1043\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m message_body \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1044\u001b[0m \n\u001b[0;32m 1045\u001b[0m \u001b[38;5;66;03m# create a consistent interface to message_body\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\http\\client.py:979\u001b[0m, in \u001b[0;36mHTTPConnection.send\u001b[1;34m(self, data)\u001b[0m\n\u001b[0;32m 978\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mauto_open:\n\u001b[1;32m--> 979\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconnect()\n\u001b[0;32m 980\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connection.py:205\u001b[0m, in \u001b[0;36mHTTPConnection.connect\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 204\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m--> 205\u001b[0m conn \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_new_conn()\n\u001b[0;32m 206\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_prepare_conn(conn)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connection.py:179\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 178\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SocketTimeout:\n\u001b[1;32m--> 179\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ConnectTimeoutError(\n\u001b[0;32m 180\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 181\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConnection to \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m timed out. (connect timeout=\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 182\u001b[0m \u001b[38;5;241m%\u001b[39m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhost, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimeout),\n\u001b[0;32m 183\u001b[0m )\n\u001b[0;32m 185\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SocketError \u001b[38;5;28;01mas\u001b[39;00m e:\n", "\u001b[1;31mConnectTimeoutError\u001b[0m: (, 'Connection to 10.25.188.70 timed out. (connect timeout=None)')", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mMaxRetryError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\adapters.py:486\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[0;32m 485\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 486\u001b[0m resp \u001b[38;5;241m=\u001b[39m conn\u001b[38;5;241m.\u001b[39murlopen(\n\u001b[0;32m 487\u001b[0m method\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mmethod,\n\u001b[0;32m 488\u001b[0m url\u001b[38;5;241m=\u001b[39murl,\n\u001b[0;32m 489\u001b[0m body\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mbody,\n\u001b[0;32m 490\u001b[0m headers\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mheaders,\n\u001b[0;32m 491\u001b[0m redirect\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 492\u001b[0m assert_same_host\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 493\u001b[0m preload_content\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 494\u001b[0m decode_content\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 495\u001b[0m retries\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmax_retries,\n\u001b[0;32m 496\u001b[0m timeout\u001b[38;5;241m=\u001b[39mtimeout,\n\u001b[0;32m 497\u001b[0m chunked\u001b[38;5;241m=\u001b[39mchunked,\n\u001b[0;32m 498\u001b[0m )\n\u001b[0;32m 500\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connectionpool.py:799\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[0;32m 797\u001b[0m e \u001b[38;5;241m=\u001b[39m ProtocolError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConnection aborted.\u001b[39m\u001b[38;5;124m\"\u001b[39m, e)\n\u001b[1;32m--> 799\u001b[0m retries \u001b[38;5;241m=\u001b[39m retries\u001b[38;5;241m.\u001b[39mincrement(\n\u001b[0;32m 800\u001b[0m method, url, error\u001b[38;5;241m=\u001b[39me, _pool\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m, _stacktrace\u001b[38;5;241m=\u001b[39msys\u001b[38;5;241m.\u001b[39mexc_info()[\u001b[38;5;241m2\u001b[39m]\n\u001b[0;32m 801\u001b[0m )\n\u001b[0;32m 802\u001b[0m retries\u001b[38;5;241m.\u001b[39msleep()\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\util\\retry.py:592\u001b[0m, in \u001b[0;36mRetry.increment\u001b[1;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[0;32m 591\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m new_retry\u001b[38;5;241m.\u001b[39mis_exhausted():\n\u001b[1;32m--> 592\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m MaxRetryError(_pool, url, error \u001b[38;5;129;01mor\u001b[39;00m ResponseError(cause))\n\u001b[0;32m 594\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIncremented Retry for (url=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m): \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, url, new_retry)\n", "\u001b[1;31mMaxRetryError\u001b[0m: HTTPConnectionPool(host='10.25.188.70', port=80): Max retries exceeded with url: /predict (Caused by ConnectTimeoutError(, 'Connection to 10.25.188.70 timed out. (connect timeout=None)'))", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mConnectTimeout\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[16], line 11\u001b[0m\n\u001b[0;32m 8\u001b[0m request_json \u001b[38;5;241m=\u001b[39m request_data\u001b[38;5;241m.\u001b[39mjson()\n\u001b[0;32m 10\u001b[0m \u001b[38;5;66;03m# Make the POST request\u001b[39;00m\n\u001b[1;32m---> 11\u001b[0m response \u001b[38;5;241m=\u001b[39m requests\u001b[38;5;241m.\u001b[39mpost(url, data\u001b[38;5;241m=\u001b[39mrequest_json, headers\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mContent-Type\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapplication/json\u001b[39m\u001b[38;5;124m\"\u001b[39m})\n\u001b[0;32m 14\u001b[0m \u001b[38;5;66;03m# Check if the request was successful\u001b[39;00m\n\u001b[0;32m 15\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m200\u001b[39m:\n\u001b[0;32m 16\u001b[0m \u001b[38;5;66;03m# Parse the response JSON to the NERResponse model\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\api.py:115\u001b[0m, in \u001b[0;36mpost\u001b[1;34m(url, data, json, **kwargs)\u001b[0m\n\u001b[0;32m 103\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mpost\u001b[39m(url, data\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, json\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m 104\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"Sends a POST request.\u001b[39;00m\n\u001b[0;32m 105\u001b[0m \n\u001b[0;32m 106\u001b[0m \u001b[38;5;124;03m :param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 112\u001b[0m \u001b[38;5;124;03m :rtype: requests.Response\u001b[39;00m\n\u001b[0;32m 113\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 115\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m request(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpost\u001b[39m\u001b[38;5;124m\"\u001b[39m, url, data\u001b[38;5;241m=\u001b[39mdata, json\u001b[38;5;241m=\u001b[39mjson, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\api.py:59\u001b[0m, in \u001b[0;36mrequest\u001b[1;34m(method, url, **kwargs)\u001b[0m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001b[39;00m\n\u001b[0;32m 56\u001b[0m \u001b[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001b[39;00m\n\u001b[0;32m 57\u001b[0m \u001b[38;5;66;03m# cases, and look like a memory leak in others.\u001b[39;00m\n\u001b[0;32m 58\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m sessions\u001b[38;5;241m.\u001b[39mSession() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[1;32m---> 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m session\u001b[38;5;241m.\u001b[39mrequest(method\u001b[38;5;241m=\u001b[39mmethod, url\u001b[38;5;241m=\u001b[39murl, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[1;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[0;32m 584\u001b[0m send_kwargs \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m 585\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimeout\u001b[39m\u001b[38;5;124m\"\u001b[39m: timeout,\n\u001b[0;32m 586\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow_redirects\u001b[39m\u001b[38;5;124m\"\u001b[39m: allow_redirects,\n\u001b[0;32m 587\u001b[0m }\n\u001b[0;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[1;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend(prep, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39msend_kwargs)\n\u001b[0;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[1;34m(self, request, **kwargs)\u001b[0m\n\u001b[0;32m 700\u001b[0m start \u001b[38;5;241m=\u001b[39m preferred_clock()\n\u001b[0;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[1;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m adapter\u001b[38;5;241m.\u001b[39msend(request, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[0;32m 706\u001b[0m elapsed \u001b[38;5;241m=\u001b[39m preferred_clock() \u001b[38;5;241m-\u001b[39m start\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\adapters.py:507\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[0;32m 504\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e\u001b[38;5;241m.\u001b[39mreason, ConnectTimeoutError):\n\u001b[0;32m 505\u001b[0m \u001b[38;5;66;03m# TODO: Remove this in 3.0.0: see #2811\u001b[39;00m\n\u001b[0;32m 506\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e\u001b[38;5;241m.\u001b[39mreason, NewConnectionError):\n\u001b[1;32m--> 507\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ConnectTimeout(e, request\u001b[38;5;241m=\u001b[39mrequest)\n\u001b[0;32m 509\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e\u001b[38;5;241m.\u001b[39mreason, ResponseError):\n\u001b[0;32m 510\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m RetryError(e, request\u001b[38;5;241m=\u001b[39mrequest)\n", "\u001b[1;31mConnectTimeout\u001b[0m: HTTPConnectionPool(host='10.25.188.70', port=80): Max retries exceeded with url: /predict (Caused by ConnectTimeoutError(, 'Connection to 10.25.188.70 timed out. (connect timeout=None)'))" ] } ], "source": [ "\n", "\n", "# URL of the FastAPI server\n", "url = f\"https://huggingface.co/spaces/LampOfSocrates/hf_gradio_plodcw_group27/predict\"\n", "\n", "# Create an instance of NERRequest\n", "request_data = NERRequest(text=pick_random_payload()) # Pick from PLOD-CW\n", "\n", "# Convert the request data to a JSON string\n", "request_json = request_data.json()\n", "\n", "# Make the POST request\n", "response = requests.post(url, data=request_json, headers={\"Content-Type\": \"application/json\"})\n", "\n", "\n", "# Check if the request was successful\n", "if response.status_code == 200:\n", " # Parse the response JSON to the NERResponse model\n", " ner_response = NERResponse(**response.json())\n", " print(ner_response)\n", "else:\n", " print(f\"Request failed with status code {response.status_code}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Single Request to /hello Endpoint" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "ename": "ConnectTimeout", "evalue": "HTTPSConnectionPool(host='lampofsocrates-hf_gradio_plodcw_group27.hf.space', port=7860): Max retries exceeded with url: /hello (Caused by ConnectTimeoutError(, 'Connection to lampofsocrates-hf_gradio_plodcw_group27.hf.space timed out. (connect timeout=None)'))", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTimeoutError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connection.py:174\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 173\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 174\u001b[0m conn \u001b[38;5;241m=\u001b[39m connection\u001b[38;5;241m.\u001b[39mcreate_connection(\n\u001b[0;32m 175\u001b[0m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dns_host, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mport), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimeout, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mextra_kw\n\u001b[0;32m 176\u001b[0m )\n\u001b[0;32m 178\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SocketTimeout:\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\util\\connection.py:95\u001b[0m, in \u001b[0;36mcreate_connection\u001b[1;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[0;32m 94\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m err \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m---> 95\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err\n\u001b[0;32m 97\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m socket\u001b[38;5;241m.\u001b[39merror(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgetaddrinfo returns an empty list\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\util\\connection.py:85\u001b[0m, in \u001b[0;36mcreate_connection\u001b[1;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[0;32m 84\u001b[0m sock\u001b[38;5;241m.\u001b[39mbind(source_address)\n\u001b[1;32m---> 85\u001b[0m sock\u001b[38;5;241m.\u001b[39mconnect(sa)\n\u001b[0;32m 86\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m sock\n", "\u001b[1;31mTimeoutError\u001b[0m: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mConnectTimeoutError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connectionpool.py:715\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[0;32m 714\u001b[0m \u001b[38;5;66;03m# Make the request on the httplib connection object.\u001b[39;00m\n\u001b[1;32m--> 715\u001b[0m httplib_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_request(\n\u001b[0;32m 716\u001b[0m conn,\n\u001b[0;32m 717\u001b[0m method,\n\u001b[0;32m 718\u001b[0m url,\n\u001b[0;32m 719\u001b[0m timeout\u001b[38;5;241m=\u001b[39mtimeout_obj,\n\u001b[0;32m 720\u001b[0m body\u001b[38;5;241m=\u001b[39mbody,\n\u001b[0;32m 721\u001b[0m headers\u001b[38;5;241m=\u001b[39mheaders,\n\u001b[0;32m 722\u001b[0m chunked\u001b[38;5;241m=\u001b[39mchunked,\n\u001b[0;32m 723\u001b[0m )\n\u001b[0;32m 725\u001b[0m \u001b[38;5;66;03m# If we're going to release the connection in ``finally:``, then\u001b[39;00m\n\u001b[0;32m 726\u001b[0m \u001b[38;5;66;03m# the response doesn't need to know about the connection. Otherwise\u001b[39;00m\n\u001b[0;32m 727\u001b[0m \u001b[38;5;66;03m# it will also try to release it and we'll have a double-release\u001b[39;00m\n\u001b[0;32m 728\u001b[0m \u001b[38;5;66;03m# mess.\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connectionpool.py:404\u001b[0m, in \u001b[0;36mHTTPConnectionPool._make_request\u001b[1;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001b[0m\n\u001b[0;32m 403\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 404\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_conn(conn)\n\u001b[0;32m 405\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (SocketTimeout, BaseSSLError) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 406\u001b[0m \u001b[38;5;66;03m# Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout.\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connectionpool.py:1058\u001b[0m, in \u001b[0;36mHTTPSConnectionPool._validate_conn\u001b[1;34m(self, conn)\u001b[0m\n\u001b[0;32m 1057\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(conn, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msock\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m): \u001b[38;5;66;03m# AppEngine might not have `.sock`\u001b[39;00m\n\u001b[1;32m-> 1058\u001b[0m conn\u001b[38;5;241m.\u001b[39mconnect()\n\u001b[0;32m 1060\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m conn\u001b[38;5;241m.\u001b[39mis_verified:\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connection.py:363\u001b[0m, in \u001b[0;36mHTTPSConnection.connect\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 361\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mconnect\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m 362\u001b[0m \u001b[38;5;66;03m# Add certificate verification\u001b[39;00m\n\u001b[1;32m--> 363\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msock \u001b[38;5;241m=\u001b[39m conn \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_new_conn()\n\u001b[0;32m 364\u001b[0m hostname \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhost\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connection.py:179\u001b[0m, in \u001b[0;36mHTTPConnection._new_conn\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 178\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SocketTimeout:\n\u001b[1;32m--> 179\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ConnectTimeoutError(\n\u001b[0;32m 180\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 181\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConnection to \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m timed out. (connect timeout=\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m)\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 182\u001b[0m \u001b[38;5;241m%\u001b[39m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhost, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtimeout),\n\u001b[0;32m 183\u001b[0m )\n\u001b[0;32m 185\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m SocketError \u001b[38;5;28;01mas\u001b[39;00m e:\n", "\u001b[1;31mConnectTimeoutError\u001b[0m: (, 'Connection to lampofsocrates-hf_gradio_plodcw_group27.hf.space timed out. (connect timeout=None)')", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mMaxRetryError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\adapters.py:486\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[0;32m 485\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 486\u001b[0m resp \u001b[38;5;241m=\u001b[39m conn\u001b[38;5;241m.\u001b[39murlopen(\n\u001b[0;32m 487\u001b[0m method\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mmethod,\n\u001b[0;32m 488\u001b[0m url\u001b[38;5;241m=\u001b[39murl,\n\u001b[0;32m 489\u001b[0m body\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mbody,\n\u001b[0;32m 490\u001b[0m headers\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mheaders,\n\u001b[0;32m 491\u001b[0m redirect\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 492\u001b[0m assert_same_host\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 493\u001b[0m preload_content\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 494\u001b[0m decode_content\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 495\u001b[0m retries\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmax_retries,\n\u001b[0;32m 496\u001b[0m timeout\u001b[38;5;241m=\u001b[39mtimeout,\n\u001b[0;32m 497\u001b[0m chunked\u001b[38;5;241m=\u001b[39mchunked,\n\u001b[0;32m 498\u001b[0m )\n\u001b[0;32m 500\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (ProtocolError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m err:\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\connectionpool.py:799\u001b[0m, in \u001b[0;36mHTTPConnectionPool.urlopen\u001b[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[0;32m 797\u001b[0m e \u001b[38;5;241m=\u001b[39m ProtocolError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConnection aborted.\u001b[39m\u001b[38;5;124m\"\u001b[39m, e)\n\u001b[1;32m--> 799\u001b[0m retries \u001b[38;5;241m=\u001b[39m retries\u001b[38;5;241m.\u001b[39mincrement(\n\u001b[0;32m 800\u001b[0m method, url, error\u001b[38;5;241m=\u001b[39me, _pool\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m, _stacktrace\u001b[38;5;241m=\u001b[39msys\u001b[38;5;241m.\u001b[39mexc_info()[\u001b[38;5;241m2\u001b[39m]\n\u001b[0;32m 801\u001b[0m )\n\u001b[0;32m 802\u001b[0m retries\u001b[38;5;241m.\u001b[39msleep()\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\urllib3\\util\\retry.py:592\u001b[0m, in \u001b[0;36mRetry.increment\u001b[1;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[0;32m 591\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m new_retry\u001b[38;5;241m.\u001b[39mis_exhausted():\n\u001b[1;32m--> 592\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m MaxRetryError(_pool, url, error \u001b[38;5;129;01mor\u001b[39;00m ResponseError(cause))\n\u001b[0;32m 594\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIncremented Retry for (url=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m): \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, url, new_retry)\n", "\u001b[1;31mMaxRetryError\u001b[0m: HTTPSConnectionPool(host='lampofsocrates-hf_gradio_plodcw_group27.hf.space', port=7860): Max retries exceeded with url: /hello (Caused by ConnectTimeoutError(, 'Connection to lampofsocrates-hf_gradio_plodcw_group27.hf.space timed out. (connect timeout=None)'))", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mConnectTimeout\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[21], line 7\u001b[0m\n\u001b[0;32m 4\u001b[0m url \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhttps://lampofsocrates-hf_gradio_plodcw_group27.hf.space:7860/hello\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 6\u001b[0m \u001b[38;5;66;03m# Make the GET request\u001b[39;00m\n\u001b[1;32m----> 7\u001b[0m response \u001b[38;5;241m=\u001b[39m requests\u001b[38;5;241m.\u001b[39mget(url)\n\u001b[0;32m 9\u001b[0m \u001b[38;5;66;03m# Check if the request was successful\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m200\u001b[39m:\n\u001b[0;32m 11\u001b[0m \u001b[38;5;66;03m# Print the response JSON\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\api.py:73\u001b[0m, in \u001b[0;36mget\u001b[1;34m(url, params, **kwargs)\u001b[0m\n\u001b[0;32m 62\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget\u001b[39m(url, params\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m 63\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"Sends a GET request.\u001b[39;00m\n\u001b[0;32m 64\u001b[0m \n\u001b[0;32m 65\u001b[0m \u001b[38;5;124;03m :param url: URL for the new :class:`Request` object.\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 70\u001b[0m \u001b[38;5;124;03m :rtype: requests.Response\u001b[39;00m\n\u001b[0;32m 71\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m---> 73\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m request(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mget\u001b[39m\u001b[38;5;124m\"\u001b[39m, url, params\u001b[38;5;241m=\u001b[39mparams, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\api.py:59\u001b[0m, in \u001b[0;36mrequest\u001b[1;34m(method, url, **kwargs)\u001b[0m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we\u001b[39;00m\n\u001b[0;32m 56\u001b[0m \u001b[38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some\u001b[39;00m\n\u001b[0;32m 57\u001b[0m \u001b[38;5;66;03m# cases, and look like a memory leak in others.\u001b[39;00m\n\u001b[0;32m 58\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m sessions\u001b[38;5;241m.\u001b[39mSession() \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[1;32m---> 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m session\u001b[38;5;241m.\u001b[39mrequest(method\u001b[38;5;241m=\u001b[39mmethod, url\u001b[38;5;241m=\u001b[39murl, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\sessions.py:589\u001b[0m, in \u001b[0;36mSession.request\u001b[1;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[0;32m 584\u001b[0m send_kwargs \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m 585\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtimeout\u001b[39m\u001b[38;5;124m\"\u001b[39m: timeout,\n\u001b[0;32m 586\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mallow_redirects\u001b[39m\u001b[38;5;124m\"\u001b[39m: allow_redirects,\n\u001b[0;32m 587\u001b[0m }\n\u001b[0;32m 588\u001b[0m send_kwargs\u001b[38;5;241m.\u001b[39mupdate(settings)\n\u001b[1;32m--> 589\u001b[0m resp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msend(prep, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39msend_kwargs)\n\u001b[0;32m 591\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m resp\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\sessions.py:703\u001b[0m, in \u001b[0;36mSession.send\u001b[1;34m(self, request, **kwargs)\u001b[0m\n\u001b[0;32m 700\u001b[0m start \u001b[38;5;241m=\u001b[39m preferred_clock()\n\u001b[0;32m 702\u001b[0m \u001b[38;5;66;03m# Send the request\u001b[39;00m\n\u001b[1;32m--> 703\u001b[0m r \u001b[38;5;241m=\u001b[39m adapter\u001b[38;5;241m.\u001b[39msend(request, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 705\u001b[0m \u001b[38;5;66;03m# Total elapsed time of the request (approximately)\u001b[39;00m\n\u001b[0;32m 706\u001b[0m elapsed \u001b[38;5;241m=\u001b[39m preferred_clock() \u001b[38;5;241m-\u001b[39m start\n", "File \u001b[1;32mc:\\Users\\soura\\anaconda3\\envs\\py311_genai\\Lib\\site-packages\\requests\\adapters.py:507\u001b[0m, in \u001b[0;36mHTTPAdapter.send\u001b[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[0;32m 504\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e\u001b[38;5;241m.\u001b[39mreason, ConnectTimeoutError):\n\u001b[0;32m 505\u001b[0m \u001b[38;5;66;03m# TODO: Remove this in 3.0.0: see #2811\u001b[39;00m\n\u001b[0;32m 506\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e\u001b[38;5;241m.\u001b[39mreason, NewConnectionError):\n\u001b[1;32m--> 507\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ConnectTimeout(e, request\u001b[38;5;241m=\u001b[39mrequest)\n\u001b[0;32m 509\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(e\u001b[38;5;241m.\u001b[39mreason, ResponseError):\n\u001b[0;32m 510\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m RetryError(e, request\u001b[38;5;241m=\u001b[39mrequest)\n", "\u001b[1;31mConnectTimeout\u001b[0m: HTTPSConnectionPool(host='lampofsocrates-hf_gradio_plodcw_group27.hf.space', port=7860): Max retries exceeded with url: /hello (Caused by ConnectTimeoutError(, 'Connection to lampofsocrates-hf_gradio_plodcw_group27.hf.space timed out. (connect timeout=None)'))" ] } ], "source": [ "import requests\n", "\n", "# URL of the FastAPI server\n", "url = f\"https://lampofsocrates-hf_gradio_plodcw_group27.hf.space:7860/hello\"\n", "\n", "# Make the GET request\n", "response = requests.get(url)\n", "\n", "# Check if the request was successful\n", "if response.status_code == 200:\n", " # Print the response JSON\n", " print(response.json())\n", "else:\n", " print(f\"Request failed with status code {response.status_code}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiple request to /ner endpoint" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Time Taken\n", "count 100.000000\n", "mean 0.018420\n", "std 0.008319\n", "min 0.002018\n", "25% 0.012080\n", "50% 0.018285\n", "75% 0.021183\n", "max 0.050951\n" ] } ], "source": [ "import threading\n", "import time\n", "import pandas as pd\n", "from gradio_client import Client\n", "\n", "# List to store the time taken for each request\n", "times = []\n", "\n", "# Lock to ensure thread-safe operations on the times list\n", "lock = threading.Lock()\n", "\n", "# Function to send a request to the API and measure time taken\n", "def send_request():\n", " start_time = time.time()\n", "\n", " # Create an instance of NERRequest\n", " request_data = NERRequest(text=\"Hello, world!\")\n", "\n", " # Convert the request data to a JSON string\n", " request_json = request_data.json()\n", "\n", " # Make the POST request\n", " response = requests.post(url, data=request_json, headers={\"Content-Type\": \"application/json\"})\n", "\n", " end_time = time.time()\n", " time_taken = end_time - start_time\n", "\n", " # Append the time taken to the list in a thread-safe manner\n", " with lock:\n", " times.append(time_taken)\n", "\n", "# Number of concurrent requests\n", "num_requests = 100\n", "\n", "# Create threads\n", "threads = []\n", "for _ in range(num_requests):\n", " thread = threading.Thread(target=send_request)\n", " threads.append(thread)\n", "\n", "# Start threads\n", "for thread in threads:\n", " thread.start()\n", "\n", "# Wait for all threads to complete\n", "for thread in threads:\n", " thread.join()\n", "\n", "# Create a pandas DataFrame with the times\n", "df = pd.DataFrame(times, columns=[\"Time Taken\"])\n", "\n", "# Print the describe of the time distribution\n", "print(df.describe())\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot the distribution of times" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0.010957\n", "1 0.013984\n", "2 0.008043\n", "3 0.013479\n", "4 0.007442\n", " ... \n", "95 0.029726\n", "96 0.032254\n", "97 0.028206\n", "98 0.030225\n", "99 0.020141\n", "Name: Time Taken, Length: 100, dtype: float64" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Time Taken\"]" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "image/png": "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Bw40hQoVSrft9GT0Ws6LsvK9I7PzadWqlSlTpozTsqy+X2TUB5YsWWIkmaeffjpbtWTE/nn3wAMPmICAAHP27Fmn9X369DHNmzc3tWrVMlFRUVluNyuy873uavbzXLRokUvryQ8YeleAREREaObMmTp37pxef/11x/L0hsNt3LhRbdq0UWhoqAICAhQREaH//Oc/SkxM1NGjR1WyZElJ0uTJkx2XiPv37+/U3k8//aQePXqoePHiqly5cobHslu1apXq1q0rf39/VapUSa+88orT+oyGj9kvh9svUduHYhw7dizdIUPpXVres2ePbr/9dhUvXlz+/v6qX7++lixZku5xli5dqgkTJqhs2bIqUqSI2rdvr/3792f8wF/l66+/Vrt27RQcHKzAwEC1aNHCadjIpEmTHFdJxo4dm+bSf06l99jZhydt27ZNLVq0UEBAgCpUqKBFixZJ+vcqTsOGDRUYGKg6dero888/T9PugQMH1KtXL5UqVUp+fn6qUaOG5s6d67RNamqqpkyZomrVqikgIEDFihVT3bp19fLLL1/XOa1fv1633367ypcvL39/f1WpUkWDBw/O0hC7ffv2qVKlSmrWrJljOOrJkyc1ePBglS9fXr6+vqpYsaImT56sy5cvO/azDy948cUXNWvWLFWsWFGFCxdW8+bN9d1332V6zGs9t9fqG9L/nsd169Zp4MCBKlmypAIDAzMcqmbXtm1bderUSc8++6zOnTt3zcfnejRu3FiS9Ndff2V5nyVLlujy5csaOXKk7rrrLm3YsCHLQ5mKFSumatWq5WjoU0YyOofly5erefPmCgoKUuHChdWpUyft3Lkzzf6LFy9WtWrVHK+Jt99+W/379093GI91aE1GQ1i2b9+u2267TSEhIfL391eDBg20YsUKp20SExM1ZswYVaxYUf7+/goJCVHjxo21dOlSSf8ONbS/Pq9+b7S/L7z//vtq1qyZihYtqsDAQFWqVEkDBw685uOVlJSk8ePHq2LFivL19VW5cuX08MMP659//nHazj4k7vPPP1fDhg0VEBCg6tWr66233rrmMTJSuXJllSxZMlvP/0svvaTExETNmTNHQUFBadbPnDlTxYoV03PPPZel9kJCQvT666/r8uXLeumll665/axZs3ThwgW99tprKlq0aJr1NptNd911lyQpNDRUderUSdNPNm/erDZt2igqKspxBenqdQ0bNky37azK6uet9L/Pkh9//FGtWrVy9J3p06crNTXVaf+EhARHH7X3lREjRujChQtptnvwwQcVGhqqwoUL69Zbb9Vvv/2W4/OxK1q0aJauqmdHTt7zsuK+++6TJMfrV5LOnj2rDz74IMPX5enTpzV06FCVK1dOvr6+qlSpkiZMmJDmMyI7j29WPudvZASlAqZLly7y8vLSV199leE2R48eVdeuXeXr66u33npLn3/+uaZPn66goCBdunRJZcqUcXxpHjRokLZt26Zt27bpqaeecmrnrrvuUpUqVfT+++9r/vz5mda1a9cujRgxQiNHjtSqVavUokULDR8+3DHEJjtee+01tWzZUmFhYY7atm3bluH2+/fvV4sWLbR371698sor+vDDD1WzZk31798/3aEXTzzxhI4dO6Y333xTb7zxhg4cOKDu3bunGfdstWXLFrVt21Znz57VwoULtXTpUgUHB6t79+5avny5pH+HRHz44YeS/h02sG3bNq1atSrbj0FWnTx5UgMGDNADDzygjz/+WHXq1NHAgQP1zDPPaPz48Xr88cf1wQcfqHDhwrrjjjv0559/Ovb99ddf1aRJE+3Zs0czZ87Up59+qq5du2rYsGGOYZmS9Pzzz2vSpEm67777tGbNGi1fvlyDBg1K8yUquw4dOqTmzZtr3rx5WrdunZ5++ml9//33uuWWW5SSkpLhflu2bFGLFi1Ut25dbdq0SaVKldLJkyfVtGlTffHFF3r66ae1du1aDRo0SNOmTdODDz6Ypo25c+dq/fr1mj17tv773//qwoUL6tKli86ePZvhcTN7brPSN642cOBA+fj46J133tHKlSuz9ME/Y8YMxcXF6YUXXrjmtpJ0+fLlNDfrl570HDlyRJJUtWrVLB1Hkt566y2VKVNGnTt31sCBA5Wamprlse4pKSk6duyY4z9vXOHIkSPy9vZWpUqVHMumTp2q++67TzVr1tSKFSv0zjvv6Ny5c2rVqpV+/fVXx3aLFy/WgAEDVKNGDX3wwQd68skn9eyzz2Z5KGN6Nm3apJYtW+qff/7R/Pnz9fHHH6t+/frq2bOn0+M0atQozZs3T8OGDdPnn3+ud955R3fffbfi4+MlSU899ZR69OghSU7vjWXKlNG2bdvUs2dPVapUScuWLdOaNWv09NNPO/1HQXqMMbrjjjv04osv6v7779eaNWs0atQoLVmyRG3btk3zBW337t0aPXq0Ro4cqY8//lh169bVoEGDMv1MysyZM2cUHx+fred//fr1Kl26tG6++eZ01wcGBqpjx47as2dPmt8GZaRJkyYqU6ZMls5j3bp1mR7fKjo6Wvv379eJEyckSfHx8frll18UFRWlqKgo/fTTT46hysePH9fhw4czHHbnLidPnlTv3r3Vp08frV69Wp07d9b48eP17rvvOrZJTExUVFSUlixZomHDhmnt2rUaO3asFi9erNtuu03GGEn/61PvvPOORo8erVWrVunmm29W586ds1VTamqq470rPj7e8X3m/vvvT3f73HzPy4oiRYqoR48eTv+RsHTpUhUqVCjdoclJSUmKjo7W22+/rVGjRmnNmjXq06ePnn/+eUfwlrL3+Gb1c/6G5tkLWsiurAxRKl26tKlRo4bjvn34jd3KlSuNJLNr164M28hs6J29vfQuQ1uPZcy/wyRsNlua43Xo0MEUKVLEMWzPfm5Hjhxx2s5+OXzTpk2OZZkNvbPWfe+99xo/Pz8TGxvrtF3nzp1NYGCgY/iC/ThdunRx2m7FihVGktm2bVu6x7O7+eabTalSpcy5c+ccyy5fvmxq165typcv7xg+ldNhEJk99+k9dlFRUUaS2b59u2NZfHy88fLyMgEBAeaPP/5wLN+1a1eaoVudOnUy5cuXTzMs4JFHHjH+/v7m9OnTxhhjunXrZurXr5+tc8nOuRnz71CVlJQUc+zYMSPJfPzxx451Vw8ve+edd4yvr68ZNmyYuXLlimObwYMHm8KFC5tjx445tfviiy8aSWbv3r3GmP89N3Xq1DGXL192bPfDDz+kGaqTnoye26z2DfvjkNVhbdbj9e7d2wQFBZkTJ06keWzs+vXrZySle2vXrl2atmfMmGFSUlJMUlKS2bVrl2nevLkpU6ZMmtdpRr766isjyYwbN84Y8+9zWbFiRRMZGZlmSGFkZKTp0qWLSUlJMSkpKebIkSOOeh977DHHdtkdemdvLy4uzsybN88UKlTIPPHEE47tYmNjjbe3t3n00Ued9j937pwJCwsz99xzjzHGmCtXrpiyZcuahg0bOtV+9OhR4+Pj4/SelN77ljHpD2GpXr26adCggUlJSXHatlu3bqZMmTKOvly7dm1zxx13ZHrOGQ29s/f1rA7Xsvv888+NJPP88887LV++fLmRZN544w3HssjISOPv7+/0Ort48aIJCQlJM7QsPZLM0KFDTUpKirl06ZKJiYlxDCudO3eu03EyG3rn7+9vbr755kyPNXbsWCPJfP/998aYzIfe2TVr1swEBARc8zyycvyrffTRR0aSee+994wxxnzwwQfG29vbnDt3ziQkJBgvLy/z6aefGmP+Nwzss88+y3L76b0vZefz1v5ZYn+s7GrWrGk6derkuD9t2jRTqFChNO/j9u8c9prXrl1rJJmXX37ZabvnnnsuW0Pv0rv179/f6b376vrTuw0aNCjNuS9fvtykpKSYxMRE880335hq1aqZmjVrmjNnzmRYS06G3v3444+OY+7Zs8cYY0yTJk1M//79jTEmzdC7+fPnG0lmxYoVTu3NmDHDSDLr1q0zxmTv8c3q5zxD71CgmP//vzYZqV+/vnx9ffV///d/WrJkiQ4fPpyj4/znP//J8ra1atVSvXr1nJb16tVLCQkJ+umnn3J0/KzauHGj2rVrp/DwcKfl/fv3V2JiYpqrUbfddpvT/bp160pSpkM/Lly4oO+//149evRQ4cKFHcu9vLx0//336/fff8/y8D1XKlOmjBo1auS4HxISolKlSql+/foqW7asY3mNGjUk/e8ck5KStGHDBt15550KDAx0+h+4Ll26KCkpyTEUrWnTptq9e7eGDh2qL774wmWziZ06dUpDhgxReHi4vL295ePjo8jISEn/zmZl9dxzz6l///6aPn26Xn75ZRUq9L+3t08//VTR0dEqW7as07nY/4dty5YtTm117dpVXl5ejvtZ6QMZyUnfyM5r62pTpkxRSkrKNf8nMCAgQD/++GOa22uvvZZm27Fjx8rHx8cxZHXPnj365JNPsjxk1D6Jg30oiX0Y77Fjx7Rhw4Y023/22Wfy8fGRj4+PKlasqBUrVujRRx/VlClTsnQ8qwsXLjjaK1GihB566CH17NnTadjVF198ocuXL6tv375O/cPf319RUVGOYUj79+/Xn3/+qV69ejkN942MjFSLFi1yVN/Bgwe1b98+xyQB1tfaiRMnHP2jadOmWrt2rcaNG6fNmzfr4sWLWT5OkyZNJEn33HOPVqxY4Zh17VrsV8rsQ6/t7r77bgUFBaV5DuvXr6+IiAjHfX9/f1WtWjXLr53XXntNPj4+8vX1VY0aNfTtt9/q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7b4RGhqqsWPHauXKlfrhhx9c1q5d79691aZNGy1YsOCaw6kWLlyo4OBgbdiwQZs2bXK6vfDCC0pOTk73b5u4k5+fn+bOnaukpCTHcL5OnTrJ29tbhw4dSrd/2L80VatWTWXKlNHSpUudhlkdO3ZM3377rdNxsvp+Vq1aNd10003avXt3hsdO7+pB6dKl1b9/f913333av3+/EhMTHecnZf7e7efnp6ioKM2YMUOS0p3Zz65du3aS5PSjfUn64IMPdOHCBcf6vGTkyJEKCAjQo48+mma2Nenfq3dnzpzRk08+maX2Tp8+rSFDhsjHx0cjR46U9O9V+Iyep5EjRyooKEhDhw5NdwIYY0yaSXzskzNMnjxZhQoVchpaZ/+3fUitKyZyyM7nbVZ169ZNhw4dUmhoaLr92H5Me/3W1/57772X42Pb7dq1S9K/V1lc5fHHH1eVKlU0ffp0t8wqWq5cOT322GPq3r27038MWrVr107nz59P80fM7X+Q2/5azOrjm9PP+RsNV5TyqT179jjGkp46dUpbt27VokWL5OXlpVWrVmU6Q9D8+fO1ceNGde3aVREREUpKSnL8D5B9GExwcLAiIyP18ccfq127dgoJCVGJEiVyPJV12bJlddttt2nSpEkqU6aM3n33Xa1fv14zZsxwXHFo0qSJqlWrpjFjxujy5csqXry4Vq1apa+//jpNe3Xq1NGHH36oefPmqVGjRpkOJZo4caLjNypPP/20QkJC9N///ldr1qzR888/f11TrF5t2rRp6tChg6KjozVmzBj5+vrqtdde0549e7R06dLrukrgCS+//LJuueUWtWrVSg899JAqVKigc+fO6eDBg/rkk08cv13o3r27ateurcaNGzum8Z09e7YiIyOvORwoI9WrV1flypU1btw4GWMUEhKiTz75ROvXr890vzJlymjLli3q1KmTWrdu7fhf42eeeUbr169XixYtNGzYMFWrVk1JSUk6evSoPvvsM82fP9+tf9w2t/vGiBEjNHfuXK1duzbd9ampqRmOPW/QoME1h5fMmDFDzZo107PPPqs333wz3W327NmjH374QQ899JDatm2bZn3Lli01c+ZMLVy4UI888sg1zsi1oqKi1KVLFy1atEjjxo1TxYoV9cwzz2jChAk6fPiwbr31VhUvXlx//fWXfvjhB8eVnEKFCunZZ5/VAw88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AAAAAMCCoAQAAAAAFgQlAAAAALAgKAEAAACABUEJAAAAACwISgAAAABgQVACAAAAAAuCEgAAAABY5CgoHTlyxNV1AAAAAECekaOgVKVKFUVHR+vdd99VUlKSq2sCAAAAAI/KUVDavXu3GjRooNGjRyssLEyDBw/WDz/84OraAAAAAMAjchSUateurVmzZumPP/7QokWLdPLkSd1yyy2qVauWZs2apb///tvVdQIAAABArrmuyRy8vb115513asWKFZoxY4YOHTqkMWPGqHz58urbt69OnDjhqjoBAAAAINdcV1Davn27hg4dqjJlymjWrFkaM2aMDh06pI0bN+qPP/7Q7bff7qo6AQAAACDXeOdkp1mzZmnRokXav3+/unTporfffltdunRRoUL/5q6KFSvq9ddfV/Xq1V1aLAAAAADkhhwFpXnz5mngwIEaMGCAwsLC0t0mIiJCCxcuvK7iAAAAAMATcjT07sCBAxo/fnyGIUmSfH191a9fvxwXJkmXL1/Wk08+qYoVKyogIECVKlXSM888o9TU1OtqFwAAAAAyk6MrSosWLVLhwoV19913Oy1///33lZiYeN0ByW7GjBmaP3++lixZolq1amn79u0aMGCAihYtquHDh7vkGAAAAABglaMrStOnT1eJEiXSLC9VqpSmTp163UXZbdu2Tbfffru6du2qChUqqEePHurYsaO2b9/usmMAAAAAgFWOrigdO3ZMFStWTLM8MjJSsbGx112U3S233KL58+frt99+U9WqVbV79259/fXXmj17dob7JCcnKzk52XE/ISHBZfUg/4qNjVVcXJzb2i9RooQiIiLc1j4AAAByV46CUqlSpfTzzz+rQoUKTst3796t0NBQV9QlSRo7dqzOnj2r6tWry8vLS1euXNFzzz2n++67L8N9pk2bpsmTJ7usBuR/sbGxqla9hpIuJrrtGP4Bgdq/L4awBAAAUEDkKCjde++9GjZsmIKDg9W6dWtJ0pYtWzR8+HDde++9Litu+fLlevfdd/Xee++pVq1a2rVrl0aMGKGyZctm+Duo8ePHa9SoUY77CQkJCg8Pd1lNyH/i4uKUdDFRod1GyyfU9X0hJf644j+dqbi4OIISAABAAZGjoDRlyhQdO3ZM7dq1k7f3v02kpqaqb9++Lv2N0mOPPaZx48Y5wledOnV07NgxTZs2LcOg5Ofn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+uijj665XXJysiIiIrRjxw73FwUA+QhBCQDyMZvNlumtf//+GjNmjDZs2JCrdU2aNOmatR09ejRXa8qqxx9/XBMmTFChQjfGR6Sfn5/GjBmjsWPHeroUAMhTbMYY4+kiAAA5c/LkSce/ly9frqefflr79+93LAsICFDRokVzva7z58/r/PnzjvtNmjTR//3f/+nBBx90LCtZsqS8vLzS3X/z5s2Kjo7WmTNnVKxYMXeX6/Dtt9+qc+fO+uuvv+Tv759rx3UHm82mVatW6Y477rjmtvHx8Spbtqx27dqlGjVquL84AMgHboz/LgOAAiosLMxxK1q0qGw2W5pl1qF3/fv31x133KGpU6eqdOnSKlasmCZPnqzLly/rscceU0hIiMqXL6+33nrL6Vh//PGHevbsqeLFiys0NFS33357hleFChcu7FSHl5eXgoODHfe//PJLNWvWzLGsV69eOnXqVIbnefHiRXXt2lU333yzTp8+LUlatGiRatSoIX9/f1WvXl2vvfaaY/ujR4/KZrPpww8/VHR0tAIDA1WvXj1t27Yt08dz2bJl6tixo1NI2r17t6KjoxUcHKwiRYqoUaNG2r59u2P9t99+q9atWysgIEDh4eEaNmyYLly44FifnJysxx9/XOHh4fLz89NNN92khQsXOtZv2bJFTZs2lZ+fn8qUKaNx48bp8uXLjvVt2rTRsGHD9PjjjyskJERhYWGaNGmSU90HDhxQ69at5e/vr5o1a2r9+vVO6y9duqRHHnlEZcqUkb+/vypUqKBp06Y51oeGhqpFixZaunRppo8PANxICEoAcAPauHGj/vzzT3311VeaNWuWJk2apG7duql48eL6/vvvNWTIEA0ZMkTHjx+XJCUmJio6OlqFCxfWV199pa+//lqFCxfWrbfeqkuXLmX7+JcuXdKzzz6r3bt366OPPtKRI0fUv3//dLc9e/asOnbsqEuXLmnDhg0KCQnRggULNGHCBD333HOKiYnR1KlT9dRTT2nJkiVO+06YMEFjxozRrl27VLVqVd13331OIcTqq6++UuPGjZ2W9e7dW+XLl9ePP/6oHTt2aNy4cfLx8ZEk/fLLL+rUqZPuuusu/fzzz1q+fLm+/vprPfLII479+/btq2XLlumVV15RTEyM5s+fr8KFC0v6N3x26dJFTZo00e7duzVv3jwtXLhQU6ZMcaphyZIlCgoK0vfff6/nn39ezzzzjCMMpaam6q677pKXl5e+++47zZ8/P80wuldeeUWrV6/WihUrtH//fr377ruqUKGC0zZNmzbV1q1bM3xsAOCGYwAABcKiRYtM0aJF0yyfOHGiqVevnuN+v379TGRkpLly5YpjWbVq1UyrVq0c9y9fvmyCgoLM0qVLjTHGLFy40FSrVs2kpqY6tklOTjYBAQHmiy++uGZtkZGR5qWXXspw/Q8//GAkmXPnzhljjNm0aZORZPbt22fq1atn7rrrLpOcnOzYPjw83Lz33ntObTz77LOmefPmxhhjjhw5YiSZN99807F+7969RpKJiYnJsI6iRYuat99+22lZcHCwWbx4cbrb33///eb//u//nJZt3brVFCpUyFy8eNHs37/fSDLr169Pd/8nnngizeM6d+5cU7hwYcfzExUVZW655Ran/Zo0aWLGjh1rjDHmiy++MF5eXub48eOO9WvXrjWSzKpVq4wxxjz66KOmbdu2Tsexevnll02FChUyXA8ANxquKAHADahWrVpOkxWULl1aderUcdz38vJSaGioYzjcjh07dPDgQQUHB6tw4cIqXLiwQkJClJSUpEOHDmX7+Dt37tTtt9+uyMhIBQcHq02bNpKk2NhYp+3at2+vSpUqacWKFfL19ZUk/f333zp+/LgGDRrkqKVw4cKaMmVKmlrq1q3r+HeZMmUk6ZpD/Ky/TRo1apQeeOABtW/fXtOnT3c6xo4dO7R48WKnOjp16qTU1FQdOXJEu3btkpeXl6KiotI9XkxMjJo3by6bzeZY1rJlS50/f16///57uudhPxf7ecTExCgiIkLly5d3rG/evLnT9v3799euXbtUrVo1DRs2TOvWrUtTS0BAgBITEzN8bADgRuPt6QIAALnPPnTMzmazpbvMPkV2amqqGjVqpP/+979p2ipZsmS2jn3hwgV17NhRHTt21LvvvquSJUsqNjZWnTp1SjOMr2vXrvrggw/066+/OoKcvaYFCxaoWbNmTttbJ4e4+pzsYSSzab9LlCihM2fOOC2bNGmSevXqpTVr1mjt2rWaOHGili1bpjvvvFOpqakaPHiwhg0blqatiIgIHTx4MNPHwhjjFJLsy66u13oe9nX28zDpzMlkbbNhw4Y6cuSI1q5dqy+//FL33HOP2rdvr5UrVzq2OX36dLafSwAoyAhKAIBratiwoZYvX65SpUqpSJEi19XWvn37FBcXp+nTpys8PFySnCZHuNr06dNVuHBhtWvXTps3b1bNmjVVunRplStXTocPH1bv3r2vqxarBg0a6Ndff02zvGrVqqpatapGjhyp++67T4sWLdKdd96phg0bau/evapSpUq67dWpU0epqanasmWL2rdvn2Z9zZo19cEHHzgFpm+//VbBwcEqV65clmquWbOmYmNj9eeff6ps2bKSlO6kFUWKFFHPnj3Vs2dP9ejRQ7feeqtOnz6tkJAQSdKePXvUoEGDLB0TAG4EDL0DAFxT7969VaJECd1+++3aunWrjhw5oi1btmj48OFOQ8SyIiIiQr6+vpozZ44OHz6s1atX69lnn81w+xdffFG9e/dW27ZttW/fPkn/XuWZNm2aXn75Zf3222/65ZdftGjRIs2aNeu6zrNTp076+uuvHfcvXryoRx55RJs3b9axY8f0zTff6Mcff3RMoT127Fht27ZNDz/8sHbt2qUDBw5o9erVevTRRyVJFSpUUL9+/TRw4EDHpBWbN2/WihUrJElDhw7V8ePH9eijj2rfvn36+OOPNXHiRI0aNSrLf8epffv2qlatmvr27avdu3dr69atmjBhgtM2L730kpYtW6Z9+/bpt99+0/vvv6+wsDCnqde3bt2qjh07Xs/DBwAFCkEJAHBNgYGB+uqrrxQREaG77rpLNWrU0MCBA3Xx4sVsX2EqWbKkFi9erPfff181a9bU9OnT9eKLL2a6z0svvaR77rlHbdu21W+//aYHHnhAb775phYvXqw6deooKipKixcvVsWKFa/nNNWnTx/9+uuvjr9F5eXlpfj4ePXt21dVq1bVPffco86dO2vy5MmS/v3t0JYtW3TgwAG1atVKDRo00FNPPeX4PZQkzZs3Tz169NDQoUNVvXp1Pfjgg47pw8uVK6fPPvtMP/zwg+rVq6chQ4Zo0KBBevLJJ7Ncc6FChbRq1SolJyeradOmeuCBB/Tcc885bVO4cGHNmDFDjRs3VpMmTXT06FF99tlnjjC2bds2nT17Vj169Liuxw8AChL+4CwAAFd5/PHHdfbsWb3++uueLiXX3H333WrQoIGeeOIJT5cCAHkGV5QAALjKhAkTFBkZqStXrni6lFyRnJysevXqaeTIkZ4uBQDyFK4oAQAAAIAFV5QAAAAAwIKgBAAAAAAWBCUAAAAAsCAoAQAAAIAFQQkAAAAALAhKAAAAAGBBUAIAAAAAC4ISAAAAAFgQlAAAAADA4v8BEH+0Sx4NAy8AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0oAAAIhCAYAAABwnkrAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAACB3ElEQVR4nOzdeXhU1f3H8c+dNZnsAbKwJKwCLoAioCgCiriLUnexoNjan3utdalWcSkILqVq1WoRte51t1oFFVCLC6KgQkRESNhCCGSfLLOc3x8hI5kESEKSyfJ+Pc88MHfu3PnemZuZ+cw59xzLGGMEAAAAAAixRboAAAAAAGhrCEoAAAAAEIagBAAAAABhCEoAAAAAEIagBAAAAABhCEoAAAAAEIagBAAAAABhCEoAAAAAEIagBAAAAABhCEqd2FNPPSXLskKXqKgopaWlafz48Zo1a5by8vLq3GfGjBmyLKtRj+P1ejVjxgwtXry4Ufer77F69+6tU089tVHb2Zfnn39ec+fOrfc2y7I0Y8aMZn285vbhhx/q8MMPV0xMjCzL0htvvFFnnXHjxtV6rfd0mTFjRui42LBhQ6vvS1M0Zt/2peaYy8/Pb/nCG6Ahr21L+O6772RZlpxOp7Zu3VrvOuHPe3R0tIYOHaq5c+cqGAyG1ps2bZpiY2P3+Zg1z33Nxel0KiMjQ7/5zW+Um5vbbPvWlixdulQzZsxQYWFhpEtptN69e9d6vWJjYzVq1Cg988wztdYbN26cDj744H1ub+PGjbryyivVr18/RUVFKSkpSePGjdNzzz0nY0ytdTds2FDnWOnSpYtGjBih3//+91q1alWj92fbtm266aabdMghhyg2NlZRUVEaMGCArrnmGq1du1aSdN9998myLH3xxRe17hsMBpWcnCzLsrRmzZpat1VVVcnj8Wjy5Mn1Pm745/CeLr179270PrW03r17a9q0aftcL3xfYmJiNHjwYN1xxx0qKyurte60adP2+jzUCD8GbDabkpKSdNxxx2nBggWSmue5Xbx4cWi9p556qt51jj322BZ5jRr6/NanPXx3aS8ckS4AkTd//nwNGjRIPp9PeXl5+vTTTzV79mzdd999eumllzRhwoTQupdeeqlOPPHERm3f6/XqjjvukFT9odlQTXmspnj++ef1/fff69prr61z22effaaePXu2eA1NZYzROeecowMOOEBvvfWWYmJiNHDgwDrrPfLIIyouLg5df+edd3T33XeHXvsaPXv2lNvt1meffab09PRW2Yf91Zh9a08a+tq2hH/+85+SJL/fr2eeeUY33nhjvev17dtXzz33nCQpLy9Pjz32mH7/+99r69atmj17dpMe+7333lNCQoJKS0u1YMEC3X///Vq6dKlWrFghp9PZtB1qo5YuXao77rhD06ZNU2JiYqTLabSjjjpK9913nyRp06ZNuu+++zR16lSVlZXp//7v/xq8nf/973869dRTFRsbqz/+8Y8aMmSIioqK9PLLL2vKlCl6++239fzzz8tmq/3b7lVXXaULLrhAwWBQhYWF+uabb/Tkk0/qoYce0qxZs/THP/6xQY//5Zdf6tRTT5UxRldeeaWOPPJIuVwurVmzRs8++6xGjhypgoICjR8/XpK0aNEijRo1KnT/lStXqqCgQDExMVq0aFGtv9MvvvhC5eXlofuGO+WUU/TZZ5/VWnbkkUfqrLPO0h/+8IfQMrfb3aB9aat235/S0lItWbJEd955p7799lu9+uqrtdaNjo7WRx991KDt1hwDgUBAP/zwg+644w6dfPLJ+uijj5r1uY2Li9O8efPqBJf169dr8eLFio+Pb1C9aIcMOq358+cbSWbZsmV1bsvOzja9evUycXFxJjc3d78eZ/v27UaSuf322xu0fllZ2R5vy8zMNKeccsp+1RPulFNOMZmZmc26zdayadMmI8nMnj27Uffb22vf3u3Pvt1+++1Gktm+fXsLVNY4TX1t98br9ZpgMLjXdSoqKkyXLl3M0KFDTY8ePcwBBxxQ73pjx441Bx10UK1lVVVVpm/fvsbj8ZiqqipjjDFTp041MTEx+6xtT8/9xRdfbCSZjz76aJ/baG/uvfdeI8msX78+0qU0Wn3vxQUFBSY+Pt70798/tKy+4yT8PikpKSYzM7Pez5p77rnHSDKzZs0KLVu/fr2RZO69994663u9XnPiiScaSebdd9/d534UFRWZtLQ006tXL7Nx48Z61/n3v/9tjDEmEAiYxMREc8IJJ9S6/YEHHjDdu3c3559/vjnnnHNq3XbnnXcaSea7777bZy01JJkrrriiwetHSmZmppk6deo+19vT/lx00UXGZrOZ8vLy0LKGvl/s6RhYsmSJkWR+/etfN6qWPVm0aJGRZC699FIjyfz444+1br/11ltNz549zUknndTs3yMa+vzWpzHfubB3dL1DvTIyMnT//ferpKRE//jHP0LL6+sO99FHH2ncuHHq0qWLoqOjlZGRoV/96lfyer3asGGDunXrJkm64447Qk3YNb/K1Gzv66+/1llnnaWkpCT169dvj49V4/XXX9eQIUMUFRWlvn376sEHH6x1+566j9U0o9d0Axw3bpzeeecdZWdn19u8X1/z9ffff69JkyYpKSlJUVFRGjZsmJ5++ul6H+eFF17QLbfcou7duys+Pl4TJkyo0zVjTz799FMdd9xxiouLk8fj0ejRo/XOO++Ebp8xY0aoleTGG29stqb/+p67mu4zn332mUaPHq3o6Gj17t1b8+fPl1TdinPYYYfJ4/HokEMO0XvvvVdnu2vXrtUFF1yglJQUud1uDR48WH//+99rrRMMBnX33Xdr4MCBio6OVmJiooYMGaK//e1v+7VPCxcu1KRJk9SzZ09FRUWpf//+uuyyyxrUxe6HH35Q3759NWrUqFB31NzcXF122WXq2bOnXC6X+vTpozvuuEN+vz90v5quIffdd58eeOAB9enTR7GxsTryyCP1+eef7/Ux9/Xa7uvYkH55HRcsWKBLLrlE3bp1k8fjUWVl5V4f+4033tCOHTt06aWXaurUqfrxxx/16aef7vN5kiSn06nhw4fL6/Vq+/btDbrPvhx++OGSqrtG7e6DDz7Qcccdp/j4eHk8Hh111FH68MMP69z/nXfe0bBhw+R2u9WnTx/dd999dd5bal6r+rrW1Pce0BzH8owZM0ItHn369Am999S8N+3tfXVvgsGg5syZo0GDBsntdislJUW//vWvtWnTplrr1fxNL1u2TGPGjJHH41Hfvn11zz331Oo62RiJiYkaOHCgsrOzG3yff/7zn8rLy9M999yj1NTUOrffcMMNGjRokO699175fL59bi86Olrz5s2T0+nUvffeu8/1n3jiCeXm5mrOnDl7bHU+66yzJEk2m03HHHOM/ve//9X6W1+8eLHGjRunsWPH1ulivnjxYnXr1k0HHXTQPmvZk/DPrRr1Hbc1XV1/+uknnXzyyYqNjVWvXr30hz/8oc7fflVVle6+++7QsdKtWzddfPHFdf52fT6fbrjhBqWlpcnj8ejoo4/Wl19+2eT9qZGQkCDLsmS32/d7WzX29H6xv44//nj16tVLTz75ZGhZMBjU008/ralTp9Zp7ZSkiooK3XzzzerTp49cLpd69OihK664ok5X28Y8vw357EHzIihhj04++WTZ7XZ9/PHHe1xnw4YNOuWUU+RyufTkk0/qvffe0z333KOYmBhVVVUpPT099KV5+vTp+uyzz/TZZ5/pz3/+c63tTJ48Wf3799e///1vPfbYY3uta8WKFbr22mv1+9//Xq+//rpGjx6ta665JtQFpDEeeeQRHXXUUUpLSwvVFt5Uv7s1a9Zo9OjRWrVqlR588EG99tprOvDAAzVt2jTNmTOnzvp/+tOflJ2drX/+8596/PHHtXbtWp122mkKBAJ7rWvJkiU69thjVVRUpHnz5umFF15QXFycTjvtNL300kuSqrsmvvbaa5Kqux989tlnev311xv9HDRUbm6uLr74Yl166aV68803dcghh+iSSy7RnXfeqZtvvlk33HCDXn31VcXGxuqMM87Qli1bQvddvXq1RowYoe+//17333+//vOf/+iUU07R1VdfHeqWKUlz5szRjBkzdP755+udd97RSy+9pOnTp+/3ORzr1q3TkUceqUcffVQLFizQbbfdpi+++EJHH330Xr98LVmyRKNHj9aQIUO0aNEipaSkKDc3VyNHjtT777+v2267Tf/97381ffp0zZo1S7/5zW/qbOPvf/+7Fi5cqLlz5+q5555TWVmZTj75ZBUVFe3xcff22jbk2NjdJZdcIqfTqX/961965ZVX9tl9bd68eXK73brwwgt1ySWXyLIszZs3b6/32d26devkcDiUlJTU4Pvszfr16yVJBxxwQGjZs88+q4kTJyo+Pl5PP/20Xn75ZSUnJ+uEE06oFZY+/PBDTZo0SXFxcXrxxRd177336uWXXw4F/KZormP50ksv1VVXXSVJeu2110LvPYcddtg+31f35v/+7/9044036vjjj9dbb72lu+66S++9955Gjx5d54eB3NxcXXjhhZoyZYreeustnXTSSbr55pv17LPPNum58fl8ys7ODv041hALFy6U3W7XaaedVu/tlmXp9NNP186dO7V8+fIGbbN79+4aPny4li5dus8vkAsWLNjr44cbP368SktLtWzZMknVX5Y//vhjjR07VmPHjlVeXp5Wr14tqTqIfPbZZ6Hz+VqLz+fT6aefruOOO05vvvmmLrnkEv31r3+t1R02GAxq0qRJuueee3TBBRfonXfe0T333KOFCxdq3LhxKi8vD637m9/8Rvfdd59+/etf680339SvfvUrTZ48WQUFBQ2uyRgjv98vv9+vwsJCvfnmm3r66ad13nnn1fueVLPu7peGBPj63i+ag81m07Rp0/TMM8+EPr8XLFigTZs26eKLL66zvjFGZ5xxhu677z5ddNFFeuedd3Tdddfp6aef1rHHHlsrtDb0+W3sZw+aSaSbtBA5DemilJqaagYPHhy6XtM9psYrr7xiJJkVK1bscRt763pXs73bbrttj7ftLjMz01iWVefxjj/+eBMfHx/qtlezb+FdWmqa0RctWhRatreud+F1n3feecbtdpucnJxa65100knG4/GYwsLCWo9z8skn11rv5ZdfNpLMZ599Vu/j1TjiiCNMSkqKKSkpCS3z+/3m4IMPNj179gx1n9pbF5S92dtrX99zN3bsWCPJfPXVV6FlO3bsMHa73URHR5vNmzeHlq9YscJIMg8++GBo2QknnGB69uxpioqKaj3WlVdeaaKioszOnTuNMcaceuqpZtiwYY3al8bsmzHGBINB4/P5THZ2tpFk3nzzzdBtu3f/+te//mVcLpe5+uqrTSAQCK1z2WWXmdjYWJOdnV1ru/fdd5+RZFatWmWM+eW1OeSQQ4zf7w+t9+WXXxpJ5oUXXtjrfuzptW3osVHzPOypC0p9NmzYYGw2mznvvPNCy8aOHWtiYmJMcXFxrXVrulT5fD7j8/nMli1bzE033WQkmbPPPju0XmO73uXm5hqfz2cKCgrMyy+/bGJiYsz5558fWq+srMwkJyeb0047rdb9A4GAGTp0qBk5cmRo2ahRo0z37t1rde0pLi42ycnJtd5bap7r+fPn16kr/D2gOY/lPXW9a8j7an2ysrKMJHP55ZfXWv7FF18YSeZPf/pTaFnN3/QXX3xRa90DDzywTtey+mRmZpqTTz459PqvX7/eTJ061Ugyf/zjH2s9zt663g0aNMikpaXt9bEeffRRI8m89NJLxpiGve+de+65RpLZtm3bXrfdkMffXc3728yZM40xxixfvtxIMj/88IMxpvoz8+GHHzbG/NIN7JFHHmnw9o2p2z2svs8tY+o/bmteg5dffrnWuieffLIZOHBg6PoLL7xgJJlXX3211nrLli2rVXPNMfX73/++1nrPPfeckdTgrnf1XU466SRTWlpaa92a+uu7HHfccXX2ffbs2cbn85mKigqzYsUKc+SRR5r09PQ9dmcNf273pea5//e//21+/vlnY1mW+c9//mOMMebss88248aNM8bU/R7x3nvvGUlmzpw5tbb30ksvGUnm8ccfN8Y07vlt6GdPzX7S9a550KKEvTJhow2FGzZsmFwul37729/q6aef1s8//9ykx/nVr37V4HUPOuggDR06tNayCy64QMXFxfr666+b9PgN9dFHH+m4445Tr169ai2fNm2avF5vndao008/vdb1IUOGSNJeu6aUlZXpiy++0FlnnVVrtDC73a6LLrpImzZtanD3veaUnp6u4cOHh64nJycrJSVFw4YNU/fu3UPLBw8eLOmXfayoqNCHH36oM888Ux6Pp9YvhCeffLIqKipCXdFGjhyplStX6vLLL9f7779fa5CG/ZGXl6ff/e536tWrlxwOh5xOpzIzMyVJWVlZddb/y1/+omnTpumee+7R3/72t1rdKv7zn/9o/Pjx6t69e619OemkkyRVt/js7pRTTqnVtaQhx8CeNOXYaMzf1vz58xUMBnXJJZeEll1yySUqKyurt7Vq1apVcjqdcjqd6t69u+6//35deOGFeuKJJxq9bzXS0tLkdDqVlJSkc845R8OHD6/VtXXp0qXauXOnpk6dWufX5hNPPFHLli1TWVmZysrKtGzZMk2ePFlRUVGh+9e0vjVFax3LTX1fXbRokSTVOeF85MiRGjx4cJ2uiWlpaRo5cmStZUOGDGnwsfnuu++GXv8+ffro5Zdf1lVXXaW77767QfdvqJrPoca0yoR/doW3Tuzrs21PhgwZoi5duoS6wS1evFhpaWmhARyOOeaY0OtQs86eBnJoKZZl1TnGw1/X//znP0pMTNRpp51W63kZNmyY0tLSQrXX7MuFF15Ya3vnnHOOHI6Gjwd2zjnnaNmyZVq2bJk+/vhjPfjgg/rqq6904okn1ukSGB0dHVp398sjjzxSZ7s33nijnE5nqBv8999/r7fffrtFRgns06ePxo0bpyeffFI7duwItdbVp2YwivC/xbPPPlsxMTGhv8XGPL+N/exB82DUO+xRWVmZduzYoUMOOWSP6/Tr108ffPCB5syZoyuuuEJlZWXq27evrr76al1zzTUNfqzGjLCWlpa2x2U7duxo8HaaYseOHfXWWhMUwh+/S5cuta7XjK6ze7eGcAUFBTLGNOpxWkNycnKdZS6Xq85yl8slqfpLpVRdq9/v10MPPaSHHnqo3m3XdAm6+eabFRMTo2effVaPPfaY7Ha7jjnmGM2ePTvU97yxgsGgJk6cqC1btujPf/6zDjnkEMXExCgYDOqII46o97V49tln1aNHD5133nl1btu2bZvefvvtPXZhC+/e1JRjYE+acmw09G8rGAzqqaeeCnVbqukiNmHCBMXExGjevHm69NJLa92nX79+evHFF0PTC/Tp00cej6fR+7W7Dz74QAkJCdq5c6cef/xxvfrqq7rqqqtCXXJrzj2oOW+kPjt37pRlWQoGg3t9v2is1jqWm/q+WvPa7+n4CA9A4cemVH18NvTYPProo/XXv/5VlmXJ4/GoX79+ob//hsrIyNDatWtVVlammJiYetepOV8y/AeqvcnOzpbb7Q69P4X/vc6fP1/Tpk1r0OPvzrIsjR07Vu+//758Pp8WLVqksWPHhm4fO3asZsyYIWOMFi1apLS0tFqjb7YGj8dT68cBqfp1rXlPlqr/jgoLC/f4etUcxzXHVPjfjMPhqPf42ZNu3brVOu7HjBmjbt266fzzz9dTTz2lyy67LHSbzWZr8Pv9NddcoylTpqiyslKff/65br31Vk2aNEkrV65sVH0NNX36dF188cV64IEHFB0dvcf3oR07dsjhcNTphmpZltLS0kLPa2Oe38Z+9qB5EJSwR++8844CgcA+h/QeM2aMxowZo0AgoK+++koPPfSQrr32WqWmptb7RbM+jfmlsL45VWqW1byx1HxIhP9Stb9vJF26dKl3Xpma83G6du26X9uXpKSkJNlsthZ/nNaSlJQUavG44oor6l2nT58+kqo/HK677jpdd911Kiws1AcffKA//elPOuGEE7Rx48YmfQn//vvvtXLlSj311FOaOnVqaPlPP/20x/u89957OvfcczVmzBh9+OGHodYnqfq5HzJkiP7yl7/Ue9/dW9eaW1OOjYb+bX3wwQehL9L1fcH4/PPPtXr1ah144IGhZVFRUU0OsHsydOjQ0D4cf/zxOuGEE/T4449r+vTpGjFiROi2hx56SEcccUS920hNTZXP55NlWXt9v9h9P6S67xfhobM1j+WmvK/WvG5bt26tMzDBli1bmv19IyEhYb9f/+OPP14LFizQ22+/Xe9+GWP01ltvKTk5uVaL9t5s3rxZy5cv19ixY0O/ytecU1Sj5nU64YQT9vr49Rk/frxee+01ffHFF/rkk080a9as0G1jx45Vfn6+li9frs8//1xnnnlmg7a5Ny3xeda1a1d16dKl3oF3pOqWV+mXYyo3N1c9evQI3e73+/f7B7ua1vWVK1c2eRs9e/YMHYM15xtPmTJFt99+ux5++OH9qq8+kydP1hVXXKF77rlHv/nNbxQdHV3vel26dJHf79f27dtrhSVjjHJzczVixIjQelLDnt9IfvZ0ZnS9Q71ycnJ0/fXXKyEhodYvPXtjt9s1atSo0OhPNd3g9ucX9PqsWrWqzhvr888/r7i4OB122GGSFGp2//bbb2ut99Zbb9XZXmN+QT3uuOP00Ucf1RqoQJKeeeYZeTyePX5xa4yYmBiNGjVKr732Wq26gsGgnn32WfXs2bPZT1RtSR6PR+PHj9c333yjIUOG6PDDD69zqe+LeWJios466yxdccUV2rlzZ5MnwK0JCuFzZew+mmO4zMxMffLJJ3K73RozZkxowklJOvXUU/X999+rX79+9e5LS35YteSxMW/ePNlsNr3xxhtatGhRrcu//vUvSao14lNrsCxLf//732W323XrrbdKqv4ylJiYqNWrV9f7/B9++OFyuVyKiYnRyJEj9dprr9X6Jb2kpERvv/12rcdJTU1VVFRUnfeLN998s9b15j6WG/LeuKf31foce+yxklRnMIZly5YpKytLxx133B7vGymXXnqpUlJSdPPNN9c7yfmcOXP0ww8/6IYbbmjQPFrl5eW69NJL5ff7dcMNN4SW7+l1mj59utLS0nTDDTdo8+bN9W6zZmCVGjVd6f7617+qqKio1o+JBx10kLp06aJZs2apoqKiWbrdNebzrKFOPfVU7dixQ4FAoN7juKYrYc2+1cyXVuPll1/e75HWVqxYIUlKSUnZr+3s7sILL9S4ceP0xBNPNKl7875ER0frtttu02mnnbbXucJq/tbC/xZfffVVlZWVhW5vzPMbyc+ezowWJej7778P9XXNy8vTJ598ovnz58tut+v111/f6whGjz32WGhit4yMDFVUVIS+TNVMVBsXF6fMzEy9+eabOu6445ScnKyuXbs2uQ9x9+7ddfrpp2vGjBlKT0/Xs88+q4ULF2r27NmhX2lHjBihgQMH6vrrr5ff71dSUpJef/31eoc5PuSQ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crvdOvDAA/X666+3VPmIsOY+flatWqVf/epX6t27tyzL0ty5c1uwekRacx8/TzzxhMaMGaOkpCQlJSVpwoQJ+vLLL1tyFxBBzX38vPbaazr88MOVmJiomJgYDRs2TP/6179achcQQS3x/afGiy++KMuydMYZZzRz1WgLmvvYeeqpp2RZVp1LRUVFS+5GyzEdxIsvvmicTqd54oknzOrVq80111xjYmJiTHZ2dr3r//zzz8bj8ZhrrrnGrF692jzxxBPG6XSaV155JbTO0qVLjd1uNzNnzjRZWVlm5syZxuFwmM8//7y1dgutpCWOny+//NJcf/315oUXXjBpaWnmr3/9ayvtDVpbSxw/F1xwgfn73/9uvvnmG5OVlWUuvvhik5CQYDZt2tRau4VW0hLHz6JFi8xrr71mVq9ebX766Sczd+5cY7fbzXvvvddau4VW0hLHT40NGzaYHj16mDFjxphJkya18J6gtbXEsTN//nwTHx9vtm7dWuvSXnWYoDRy5Ejzu9/9rtayQYMGmZtuuqne9W+44QYzaNCgWssuu+wyc8QRR4Sun3POOebEE0+stc4JJ5xgzjvvvGaqGm1FSxw/u8vMzCQodWAtffwYY4zf7zdxcXHm6aef3v+C0aa0xvFjjDGHHnqoufXWW/evWLQ5LXX8+P1+c9RRR5l//vOfZurUqQSlDqgljp358+ebhISEZq81UjpE17uqqiotX75cEydOrLV84sSJWrp0ab33+eyzz+qsf8IJJ+irr76Sz+fb6zp72ibap5Y6ftA5tNbx4/V65fP5lJyc3DyFo01ojePHGKMPP/xQa9as0THHHNN8xSPiWvL4ufPOO9WtWzdNnz69+QtHxLXksVNaWqrMzEz17NlTp556qr755pvm34FW0iGCUn5+vgKBgFJTU2stT01NVW5ubr33yc3NrXd9v9+v/Pz8va6zp22ifWqp4wedQ2sdPzfddJN69OihCRMmNE/haBNa8vgpKipSbGysXC6XTjnlFD300EM6/vjjm38nEDEtdfz873//07x58/TEE0+0TOGIuJY6dgYNGqSnnnpKb731ll544QVFRUXpqKOO0tq1a1tmR1qYI9IFNCfLsmpdN8bUWbav9cOXN3abaL9a4vhB59GSx8+cOXP0wgsvaPHixYqKimqGatHWtMTxExcXpxUrVqi0tFQffvihrrvuOvXt21fjxo1rvsLRJjTn8VNSUqIpU6boiSeeUNeuXZu/WLQpzf3ec8QRR+iII44I3X7UUUfpsMMO00MPPaQHH3ywucpuNR0iKHXt2lV2u71OAs7Ly6uTfGukpaXVu77D4VCXLl32us6eton2qaWOH3QOLX383HfffZo5c6Y++OADDRkypHmLR8S15PFjs9nUv39/SdKwYcOUlZWlWbNmEZQ6kJY4flatWqUNGzbotNNOC90eDAYlSQ6HQ2vWrFG/fv2aeU/Q2lrru4/NZtOIESPabYtSh+h653K5NHz4cC1cuLDW8oULF2r06NH13ufII4+ss/6CBQt0+OGHy+l07nWdPW0T7VNLHT/oHFry+Ln33nt111136b333tPhhx/e/MUj4lrz/ccYo8rKyv0vGm1GSxw/gwYN0nfffacVK1aELqeffrrGjx+vFStWqFevXi22P2g9rfXeY4zRihUrlJ6e3jyFt7bWHz+iZdQMcThv3jyzevVqc+2115qYmBizYcMGY4wxN910k7noootC69cMcfj73//erF692sybN6/OEIf/+9//jN1uN/fcc4/Jysoy99xzD8ODd1AtcfxUVlaab775xnzzzTcmPT3dXH/99eabb74xa9eubfX9Q8tqieNn9uzZxuVymVdeeaXWEKslJSWtvn9oWS1x/MycOdMsWLDArFu3zmRlZZn777/fOBwO88QTT7T6/qFltcTxE45R7zqmljh2ZsyYYd577z2zbt06880335iLL77YOBwO88UXX7T6/jWHDhOUjDHm73//u8nMzDQul8scdthhZsmSJaHbpk6dasaOHVtr/cWLF5tDDz3UuFwu07t3b/Poo4/W2ea///1vM3DgQON0Os2gQYPMq6++2tK7gQhp7uNn/fr1RlKdS/h20DE09/GTmZlZ7/Fz++23t8LeoLU19/Fzyy23mP79+5uoqCiTlJRkjjzySPPiiy+2xq4gAlri+8/uCEodV3MfO9dee63JyMgwLpfLdOvWzUycONEsXbq0NXalRVjG7DoLCwAAAAAgqYOcowQAAAAAzYmgBAAAAABhCEoAAAAAEIagBAAAAABhCEoAAAAAEIagBAAAAABhCEoAAAAAEIagBAAAAABhCEoA0MHNmDFDw4YNi3QZjbJ48WJZlqXCwsJWf+yPPvpIgwYNUjAYbPXHbk6WZemNN97Y53qVlZXKyMjQ8uXLW74oAGhHCEoA0I5ZlrXXy7Rp03T99dfrww8/bNW6ZsyYsc/aNmzY0Ko1NdQNN9ygW265RTZb5/iIdLvduv7663XjjTdGuhQAaFMsY4yJdBEAgKbJzc0N/f+ll17SbbfdpjVr1oSWRUdHKyEhodXrKi0tVWlpaej6iBEj9Nvf/la/+c1vQsu6desmu91e7/0XL16s8ePHq6CgQImJiS1dbsjSpUt10kknadu2bYqKimq1x20JlmXp9ddf1xlnnLHPdXfs2KHu3btrxYoVGjx4cMsXBwDtQOf4uQwAOqi0tLTQJSEhQZZl1VkW3vVu2rRpOuOMMzRz5kylpqYqMTFRd9xxh/x+v/74xz8qOTlZPXv21JNPPlnrsTZv3qxzzz1XSUlJ6tKliyZNmrTHVqHY2NhaddjtdsXFxYWuf/DBBxo1alRo2QUXXKC8vLw97md5eblOOeUUHXHEEdq5c6ckaf78+Ro8eLCioqI0aNAgPfLII6H1N2zYIMuy9Nprr2n8+PHyeDwaOnSoPvvss70+ny+++KImTpxYKyStXLlS48ePV1xcnOLj4zV8+HB99dVXoduXLl2qY445RtHR0erVq5euvvpqlZWVhW6vrKzUDTfcoF69esntdmvAgAGaN29e6PYlS5Zo5MiRcrvdSk9P10033SS/3x+6fdy4cbr66qt1ww03KDk5WWlpaZoxY0atuteuXatjjjlGUVFROvDAA7Vw4cJat1dVVenKK69Uenq6oqKi1Lt3b82aNSt0e5cuXTR69Gi98MILe31+AKAzISgBQCf00UcfacuWLfr444/1wAMPaMaMGTr11FOVlJSkL774Qr/73e/0u9/9Ths3bpQkeb1ejR8/XrGxsfr444/16aefKjY2VieeeKKqqqoa/fhVVVW66667tHLlSr3xxhtav369pk2bVu+6RUVFmjhxoqqqqvThhx8qOTlZTzzxhG655Rb95S9/UVZWlmbOnKk///nPevrpp2vd95ZbbtH111+vFStW6IADDtD5559fK4SE+/jjj3X44YfXWnbhhReqZ8+eWrZsmZYvX66bbrpJTqdTkvTdd9/phBNO0OTJk/Xtt9/qpZde0qeffqorr7wydP9f//rXevHFF/Xggw8qKytLjz32mGJjYyVVh8+TTz5ZI0aM0MqVK/Xoo49q3rx5uvvuu2vV8PTTTysmJkZffPGF5syZozvvvDMUhoLBoCZPniy73a7PP/9cjz32WJ1udA8++KDeeustvfzyy1qzZo2effZZ9e7du9Y6I0eO1CeffLLH5wYAOh0DAOgQ5s+fbxISEuosv/32283QoUND16dOnWoyMzNNIBAILRs4cKAZM2ZM6Lrf7zcxMTHmhRdeMMYYM2/ePDNw4EATDAZD61RWVpro6Gjz/vvv77O2zMxM89e//nWPt3/55ZdGkikpKTHGGLNo0SIjyfzwww9m6NChZvLkyaaysjK0fq9evczzzz9faxt33XWXOfLII40xxqxfv95IMv/85z9Dt69atcpIMllZWXusIyEhwTzzzDO1lsXFxZmnnnqq3vUvuugi89vf/rbWsk8++cTYbDZTXl5u1qxZYySZhQsX1nv/P/3pT3We17///e8mNjY29PqMHTvWHH300bXuN2LECHPjjTcaY4x5//33jd1uNxs3bgzd/t///tdIMq+//roxxpirrrrKHHvssbUeJ9zf/vY307t37z3eDgCdDS1KANAJHXTQQbUGK0hNTdUhhxwSum6329WlS5dQd7jly5frp59+UlxcnGJjYxUbG6vk5GRVVFRo3bp1jX78b775RpMmTVJmZqbi4uI0btw4SVJOTk6t9SZMmKC+ffvq5ZdflsvlkiRt375dGzdu1PTp00O1xMbG6u67765Ty5AhQ0L/T09Pl6R9dvELPzfpuuuu06WXXqoJEybonnvuqfUYy5cv11NPPVWrjhNOOEHBYFDr16/XihUrZLfbNXbs2HofLysrS0ceeaQsywotO+qoo1RaWqpNmzbVux81+1KzH1lZWcrIyFDPnj1Dtx955JG11p82bZpWrFihgQMH6uqrr9aCBQvq1BIdHS2v17vH5wYAOhtHpAsAALS+mq5jNSzLqndZzRDZwWBQw4cP13PPPVdnW926dWvUY5eVlWnixImaOHGinn32WXXr1k05OTk64YQT6nTjO+WUU/Tqq69q9erVoSBXU9MTTzyhUaNG1Vo/fHCI3fepJozsbdjvrl27qqCgoNayGTNm6IILLtA777yj//73v7r99tv14osv6swzz1QwGNRll12mq6++us62MjIy9NNPP+31uTDG1ApJNct2rzd8P2puq9kPU8+YTOHbPOyww7R+/Xr997//1QcffKBzzjlHEyZM0CuvvBJaZ+fOnY1+LQGgIyMoAQD26bDDDtNLL72klJQUxcfH79e2fvjhB+Xn5+uee+5Rr169JKnW4Ai7u+eeexQbG6vjjjtOixcv1oEHHqjU1FT16NFDP//8sy688ML9qiXcoYceqtWrV9dZfsABB+iAAw7Q73//e51//vmaP3++zjzzTB122GFatWqV+vfvX+/2DjnkEAWDQS1ZskQTJkyoc/uBBx6oV199tVZgWrp0qeLi4tSjR48G1XzggQcqJydHW7ZsUffu3SWp3kEr4uPjde655+rcc8/VWWedpRNPPFE7d+5UcnKyJOn777/XoYf+f3t3ExHbH8dx/KNokZZFxFSbnsgYql1ipLSKTLOZTEwTmRqpRdGUJKkYjbRIRGeZZpFmMeuZThlqUyLHGXrQusWsxiziLi7jdrj39he36/7fr93hd5zv+e0+vr8Hz4e+CQD/Byy9AwD8ViAQUG1trYaHh2Waph4fH5XNZjU7O/tuidhHuFwuVVVVaW9vTw8PD0qlUlpfX//p+Hg8rkAgIK/XK8uyJH3v8mxubmp3d1e2bevu7k5HR0fa2dn51H8ODg7q4uKi/FwsFjUzM6NMJqPn52ddXl7q+vq6fIT24uKicrmcpqendXNzo3w+r1QqpWg0KklqamrS+Pi4QqFQ+dCKTCajk5MTSVIkEtHLy4ui0agsy9LZ2ZlWV1c1Pz//4Xuc+vv71draqmAwqNvbW5mmqVgs9m5MIpHQ8fGxLMuSbdtKJpOqr69/d/S6aZoaGBj4zPQBwD+FoAQA+K3q6mqdn5/L5XJpZGRE7e3tCoVCKhaL/7nDVFdXJ8MwlEwm1dHRoa2tLcXj8V++k0gk5Pf75fV6Zdu2wuGwDg8PZRiGOjs71dfXJ8Mw1Nzc/Jnf1NjYmO7v78t3UVVWVur19VXBYFAtLS3y+/0aGhrS2tqapO97h7LZrPL5vHp7e+XxeLSyslLeDyVJ+/v78vl8ikQiamtr0+TkZPn48IaGBqXTaV1dXcntdmtqakoTExNaXl7+cM0VFRU6PT1VqVRST0+PwuGwNjY23o2pqanR9va2urq61N3draenJ6XT6XIYy+VyKhQK8vl8n5o/APiXcOEsAAA/WFhYUKFQ0MHBwVeX8seMjo7K4/FoaWnpq0sBgL8GHSUAAH4Qi8XU2Niot7e3ry7ljyiVSnK73Zqbm/vqUgDgr0JHCQAAAAAc6CgBAAAAgANBCQAAAAAcCEoAAAAA4EBQAgAAAAAHghIAAAAAOBCUAAAAAMCBoAQAAAAADgQlAAAAAHAgKAEAAACAwzc1qyYLNAjIoQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "# Plot the times taken\n", "plt.figure(figsize=(10, 6))\n", "plt.hist(times, bins=30, edgecolor='black')\n", "plt.title(\"Distribution of Times Taken for NER API Requests on PLOD-CW Tuned BERT Model\")\n", "plt.xlabel(\"Time Taken (seconds)\")\n", "plt.ylabel(\"Frequency\")\n", "plt.show()\n", "\n", "# Plot the KDE distribution and histogram of the times taken\n", "# Plot the histogram and KDE distribution of the times taken\n", "plt.figure(figsize=(10, 6))\n", "sns.histplot(df[\"Time Taken\"], kde=True, bins=30, color='skyblue', stat='density', edgecolor='black')\n", "plt.title(\"Distribution of Times Taken for API Requests on PLOD-CW Tuned BERT Model\")\n", "plt.xlabel(\"Time Taken (seconds)\")\n", "plt.ylabel(\"Density\")\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "base", "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.11.5" } }, "nbformat": 4, "nbformat_minor": 2 }