diff --git a/chart/web-app/app.py b/chart/web-app/app.py index 8c50a89..f515fba 100644 --- a/chart/web-app/app.py +++ b/chart/web-app/app.py @@ -184,4 +184,9 @@ def inference_wrapper(*args): app.launch() # For running on cluster else: - app.launch(server_name="0.0.0.0") + app.queue( + # Allow 10 concurrent requests to backend + # vLLM backend should be clever enough to + # batch these requests appropriately. + default_concurrency_limit=10, + ).launch(server_name="0.0.0.0") diff --git a/scripts/perf-test/perf-test.ipynb b/scripts/perf-test/perf-test.ipynb new file mode 100644 index 0000000..02459ab --- /dev/null +++ b/scripts/perf-test/perf-test.ipynb @@ -0,0 +1,180 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "c3c973d1-a5e6-4cfa-a9e6-95976f5c23f7", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install langchain_openai joblib pandas matplotlib" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "6b1981e5-5db6-49a0-82d2-9ff5211c50f0", + "metadata": {}, + "outputs": [], + "source": [ + "import time, requests\n", + "from langchain_openai import ChatOpenAI\n", + "from joblib import Parallel, delayed\n", + "from tqdm import tqdm\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Check that URL is correct\n", + "assert requests.get(url + \"/health\").status_code == 200\n", + "\n", + "def make_request():\n", + " llm = ChatOpenAI(\n", + " base_url=url + \"/v1/\",\n", + " model=model,\n", + " openai_api_key=\"not-used\",\n", + " )\n", + " timings = []\n", + " for r in range(request_per_client):\n", + " start_time = time.time()\n", + " results = llm.invoke(\"Hello, how are you?\")\n", + " timings.append(time.time() - start_time)\n", + " return timings\n", + "\n", + "def run_perf_test(url, model, clients, requests_per_client):\n", + "\n", + " avg_timings = []\n", + " for clients in tqdm(clients):\n", + " for request_per_client in requests_per_client:\n", + " result = Parallel(n_jobs=clients)(delayed(make_request)() for i in range(clients))\n", + " for ts in result:\n", + " avg_timings.append({\"clients\": clients, \"requests_per_client\": request_per_client, \"avg_t\": sum(ts) / len(ts)})\n", + "\n", + " df = pd.DataFrame.from_records(avg_timings)\n", + " data = df.groupby(['clients', 'requests_per_client']).mean().reset_index()\n", + "\n", + " fig, ax = plt.subplots()\n", + " for c in data.clients.unique():\n", + " _data = data[data.clients == c]\n", + " ax.plot(_data.requests_per_client, _data.avg_t, label=c)\n", + "\n", + " ax.set_ylabel(\"Avg response time (seconds)\")\n", + " ax.legend(title=\"Clients\");\n", + "\n", + " return fig, ax" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "380d2bbb-df45-4919-b489-5630d43f50b8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 3/3 [01:43<00:00, 34.41s/it]\n" + ] + }, + { + "data": { + "text/plain": [ + "(
,\n", + " )" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "url = \"http://llm-backend.default.svc\"\n", + "model = \"ise-uiuc/Magicoder-S-DS-6.7B\"\n", + "run_perf_test(url, model, [2, 5, 10], [5, 10, 20])\n", + "# run_perf_test(url, model, [2, 5, 10, 20], [5, 10, 20])" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "6bb2a399-bb2a-40ac-8efb-74c2bead9926", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 3/3 [12:31<00:00, 250.61s/it]\n" + ] + }, + { + "data": { + "text/plain": [ + "(
,\n", + " )" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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DhzQrbfeWuH6hIQErVq1SlOnTnUsW7lypRISEqq1PwAA4HtcOi01YsQI3XzzzWrbtq2++uor5ebm6ujRo8rIyNCpU6e0f/9+PfTQQ1q1apU6deqklStXurTzv/zlL0pOTtbPP/+slJQUjR49Wv7+/kpMTJQkjR8/XjNnznS0v+eee7RixQrNnz9f//d//6dZs2Zp8+bNmjJlSjUOHQAA+CKXem6GDRumjz76SIGBgRWub9++vdq3b68JEyZo9+7dyszMdGnnGRkZSkxM1NGjR9W8eXNdccUV2rBhg5o3by5JSktLk5/fufzVr18/LV68WA899JAefPBBdezYUcuXL1f37t1d2h8AAPB9hmmapreLqE05OTmKjIxUdna2IiIivF0OAABwgZXvb8tXS6WnpysjI8Mx/91332nq1Kl69dVXrVcKAADgZpbDzdixY7V69WpJxfedGTRokL777jv99a9/1ezZs91eIAAAgBWWw83OnTv1m9/8RpK0dOlSde/eXSkpKXrvvfe0aNEid9cHAABgieVwU1hY6LhvzNdff60RI0ZIkuLj410eSAwAAOAplsNNt27d9PLLL+u///2vVq5cqeuvv16SdOjQITVt2tTtBQIAAFhhOdw88cQTeuWVV3T11VcrMTFRF198sSTpk08+cZyuAgAA8JZqXQpus9mUk5Ojxo0bO5b9/PPPatCggaKiotxaoLtxKTgAAPWPle9vy8+WkiR/f3+nYCNJbdu2rc6mAAAA3MqlcNOrVy8ZhuHSBrdu3VqjggAAAGrCpXAzatQox+v8/Hz94x//UNeuXR0PrNywYYN27dqlO++80yNFAgAAuMqlcPPII484Xk+ePFl333235syZU65Nenq6e6sDAACwyPKA4sjISG3evFkdO3Z0Wr5//3717dtX2dnZbi3Q3RhQDABA/ePRZ0uFhoZq3bp15ZavW7dOISEhVjcHAADgVpavlpo6daruuOMObd261XFfm40bN+rNN9/Uww8/7PYCAQAArLAcbh544AG1b99eCxYs0LvvvitJ6tKli9566y2NGTPG7QUCAABYUa2b+NVnjLkBAKD+8fhN/CTpzJkzOnLkiOx2u9Py1q1bV3eTAAAANWY53Ozfv18TJ05USkqK03LTNGUYhmw2m9uKAwAAsMpyuPnDH/6ggIAAffbZZ2rRooXLdy4GAACoDZbDzbZt27RlyxbFx8d7oh4AAIAasXyfm65du+rXX3/1RC0AAAA1ZjncPPHEE7rvvvu0Zs0aHT16VDk5OU4TAACAN1m+FNzPrzgPlR1rU18GFHMpOAAA9Y9HLwVfvXp1tQsDAADwNMvhZsCAAZ6oAwAAwC2qdRO/EydO6I033tCePXskSd26ddPEiRMVGRnp1uIAAACssjygePPmzbrooov07LPP6tixYzp27JieeeYZXXTRRdq6dasnagQAAHCZ5QHFV155pTp06KDXXntNAQHFHT9FRUWaPHmyfvrpJ3377bceKdRdGFAMAED9Y+X723K4CQ0N1ffff1/uJn67d+9W3759derUKesV1yLCDQAA9Y+V72/Lp6UiIiKUlpZWbnl6errCw8Otbg4AAMCtLIebm2++WZMmTdIHH3yg9PR0paena8mSJZo8ebISExM9USMAAIDLLF8t9fTTT8swDI0fP15FRUWSpMDAQN1xxx2aN2+e2wsEAACwwvKYmxKnTp3SgQMHJEkXXXSRGjRo4NbCPIUxNwAA1D8evUNxdna2bDabmjRpoh49ejiWHzt2TAEBAQQGAADgVZbH3Nxyyy1asmRJueVLly7VLbfc4paiAAAAqstyuNm4caOuueaacsuvvvpqbdy40S1FAQAAVJflcFNQUOAYSFxaYWGhTp8+7ZaiAAAAqstyuPnNb36jV199tdzyl19+WX369HFLUQAAANVleUDxY489poEDB2r79u267rrrJEmrVq3Spk2b9NVXX7m9QAAAACss99z0799f69evV6tWrbR06VJ9+umn6tChg3744QddeeWVnqgRAADAZdW+z019xX1uAACofzz6bClJOnDggB566CGNHTtWR44ckSR98cUX2rVrV3U2J0maN2+eDMPQ1KlTK22zaNEiGYbhNIWEhFR7nwAAwPdYDjfJycnq0aOHNm7cqI8++kh5eXmSpO3bt+uRRx6pVhGbNm3SK6+8op49e563bUREhDIzMx1TampqtfYJAAB8k+Vw88ADD+ixxx7TypUrFRQU5Fh+7bXXasOGDZYLyMvL07hx4/Taa6+pcePG521vGIZiYmIcU3R0tOV9AgAA32U53OzYsUOjR48utzwqKkq//vqr5QKSkpI0bNgwDRw40KX2eXl5atOmjeLi4jRy5MjzngorKChQTk6O0wQAAHyX5XDTqFEj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1K1bN02fPr3CixMqOi21c+dODR06VA0bNlR0dLRuvfVWp390XX311br77rt13333qUmTJoqJidGsWbMc69u2bStJGj16tAzDcMxv375d11xzjcLDwxUREaE+ffpo8+bNnvgYAHiA5aulwsLCNHHiRK1du1Y7duzQvffeq3nz5ikqKkojRozwRI0AfMyxY8e0YsUKJSUlKSwsrNz6Ro0anXcbJ06c0LXXXqtevXpp8+bNWrFihQ4fPqwxY8Y4tXv77bcVFhamjRs36sknn9Ts2bO1cuVKSdKmTZskSW+99ZYyMzMd8+PGjVOrVq20adMmbdmyRQ888IACAwNreNQAaku1LwWXpM6dO+vJJ59URkaG3n//fXfVBMDH/fjjjzJNU/Hx8dXexosvvqhevXrp8ccfV3x8vHr16qU333xTq1ev1r59+xztevbsqUceeUQdO3bU+PHj1bdvX8eYnubNm0s697iEkvm0tDQNHDhQ8fHx6tixo2666SZdfPHFNThiALWpRuGmhL+/v0aNGqVPPvnEHZsD4ONM06zxNrZv367Vq1erYcOGjqkkLB04cMDRrmfPnk7va9GihePxCJWZPn26Jk+erIEDB2revHlO2wNQ97kl3FTXwoUL1bNnT0VERCgiIkIJCQn64osvqnzPhx9+qPj4eIWEhKhHjx76/PPPa6laAO7SsWNHGYah//u//6v2NvLy8jR8+HBt27bNadq/f7+uuuoqR7uyp5MMw5Ddbq9y27NmzdKuXbs0bNgwffPNN+ratauWLVtW7VoB1C6vhptWrVpp3rx52rJlizZv3qxrr71WI0eO1K5duypsn5KSosTERE2aNEnff/+9Ro0apVGjRmnnzp21XDmAmmjSpImGDBmil156SSdPniy33pUni/fu3Vu7du1S27Zt1aFDB6eponE8lQkMDKzwsTGdOnXStGnT9NVXX+nGG2/UW2+95fI2AXiXV8PN8OHDdcMNN6hjx47q1KmT/v73v6thw4aVPsZhwYIFuv766zVjxgx16dJFc+bMUe/evfXiiy/WcuUAauqll16SzWbTb37zG3300Ufav3+/9uzZo+eff14JCQnnfX9SUpKOHTumxMREbdq0SQcOHNCXX36p2267zdIz7tq2batVq1YpKytLx48f1+nTpzVlyhStWbNGqampWrdunTZt2qQuXbrU5HAB1CKv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33yz+fvf/947BXlYRcfbrVs3c/bs2U7Levfubf71r3+txco858iRI6YkMzk52TTN4p9PgYGB5ocffuhos2fPHlOSuX79eo/XQ89NPfXJJ5+ob9++uummmxQVFaVevXrptdde83ZZHtOvXz+tWrVK+/btkyRt375da9eu1dChQ71cWe04ePCgsrKyNHDgQMeyyMhIXXbZZVq/fr0XK6s92dnZMgxDjRo18nYpHmG323XrrbdqxowZ6tatm7fL8Si73a7//Oc/6tSpk4YMGaKoqChddtllVZ6qq+/69eunTz75RL/88otM09Tq1au1b98+DR482NuluUV2drYkqUmTJpKkLVu2qLCw0OlnVnx8vFq3bl0rP7MIN/XUTz/9pIULF6pjx4768ssvdccdd+juu+/W22+/7e3SPOKBBx7QLbfcovj4eAUGBqpXr16aOnWqxo0b5+3SakVWVpYkKTo62ml5dHS0Y50vy8/P1/3336/ExESfffjgE088oYCAAN19993eLsXjjhw5ory8PM2bN0/XX3+9vvrqK40ePVo33nijkpOTvV2eR7zwwgvq2rWrWrVqpaCgIF1//fV66aWXdNVVV3m7tBqz2+2aOnWq+vfvr+7du0sq/pkVFBRU7h8jtfUz64J7KrivsNvt6tu3rx5//HFJUq9evbRz5069/PLLmjBhgperc7+lS5fqvffe0+LFi9WtWzdt27ZNU6dOVWxsrE8eL84pLCzUmDFjZJqmFi5c6O1yPGLLli1asGCBtm7dKsMwvF2Ox9ntdknSyJEjNW3aNEnSJZdcopSUFL388ssaMGCAN8vziBdeeEEbNmzQJ598ojZt2ujbb79VUlKSYmNjnXo36qOkpCTt3LlTa9eu9XYpDvTc1FMtWrRQ165dnZZ16dKl3l5pcD4zZsxw9N706NFDt956q6ZNm6a5c+d6u7RaERMTI0nlrjQ4fPiwY50vKgk2qampWrlypc/22vz3v//VkSNH1Lp1awUEBCggIECpqam699571bZtW2+X53bNmjVTQEDABfMz7PTp03rwwQf1zDPPaPjw4erZs6emTJmim2++WU8//bS3y6uRKVOm6LPPPtPq1avVqlUrx/KYmBidOXNGJ06ccGpfWz+zCDf1VP/+/ctddrdv3z61adPGSxV51qlTp+Tn5/zH1d/f3/EvQF/Xrl07xcTEaNWqVY5lOTk52rhxoxISErxYmeeUBJv9+/fr66+/VtOmTb1dksfceuut+uGHH7Rt2zbHFBsbqxkzZujLL7/0dnluFxQUpEsvvfSC+RlWWFiowsJCn/oZZpqmpkyZomXLlumbb75Ru3btnNb36dNHgYGBTj+z9u7dq7S0tFr5mcVpqXpq2rRp6tevnx5//HGNGTNG3333nV599VW9+uqr3i7NI4YPH66///3vat26tbp166bvv/9ezzzzjCZOnOjt0twmLy9PP/74o2P+4MGD2rZtm5o0aaLWrVtr6tSpeuyxx9SxY0e1a9dODz/8sGJjYzVq1CjvFV0DVR1vixYt9Lvf/U5bt27VZ599JpvN5jhP36RJEwUFBXmr7Go73+9v2fAWGBiomJgYde7cubZLdYvzHe+MGTN0880366qrrtI111yjFStW6NNPP9WaNWu8V3QNnO94BwwYoBkzZig0NFRt2rRRcnKy3nnnHT3zzDNerLr6kpKStHjxYn388ccKDw93/P2MjIxUaGioIiMjNWnSJE2fPl1NmjRRRESE7rrrLiUkJOjyyy/3fIEevx4LHvPpp5+a3bt3N4ODg834+Hjz1Vdf9XZJHpOTk2Pec889ZuvWrc2QkBCzffv25l//+lezoKDA26W5zerVq01J5aYJEyaYpll8OfjDDz9sRkdHm8HBweZ1111n7t2717tF10BVx3vw4MEK10kyV69e7e3Sq+V8v79l1fdLwV053jfeeMPs0KGDGRISYl588cXm8uXLvVdwDZ3veDMzM80//OEPZmxsrBkSEmJ27tzZnD9/vmm3271beDVV9vfzrbfecrQ5ffq0eeedd5qNGzc2GzRoYI4ePdrMzMyslfqMs0UCAAD4BMbcAAAAn0K4AQAAPoVwAwAAfArhBgAA+BTCDQAA8CmEGwAA4FMINwAAwKcQbgAAgE8h3AAAAJ9CuAEAAD6FcAMAAHwK4QYAAPiU/weam7eKMk6cRwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "url = \"http://llm-backend.scott-test-2.svc\"\n", + "model = \"TheBloke/SauerkrautLM-70B-v1-AWQ\"\n", + "\n", + "run_perf_test(url, model, [2, 5, 10], [5, 10, 20])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "165e7a72-aff8-4f66-b8e3-f13826b7331f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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": 5 +} diff --git a/scripts/perf-test/requirements.txt b/scripts/perf-test/requirements.txt new file mode 100644 index 0000000..ef830bc --- /dev/null +++ b/scripts/perf-test/requirements.txt @@ -0,0 +1,26 @@ +anyio==4.3.0 +certifi==2024.2.2 +charset-normalizer==3.3.2 +filelock==3.13.3 +fsspec==2024.3.1 +gradio_client==0.15.0 +h11==0.14.0 +httpcore==1.0.5 +httpx==0.27.0 +huggingface-hub==0.22.2 +idna==3.6 +joblib==1.3.2 +numpy==1.26.4 +packaging==24.0 +pandas==2.2.1 +python-dateutil==2.9.0.post0 +pytz==2024.1 +PyYAML==6.0.1 +requests==2.31.0 +six==1.16.0 +sniffio==1.3.1 +tqdm==4.66.2 +typing_extensions==4.10.0 +tzdata==2024.1 +urllib3==2.2.1 +websockets==11.0.3 diff --git a/scripts/perf-test/stress.py b/scripts/perf-test/stress.py new file mode 100644 index 0000000..6af6426 --- /dev/null +++ b/scripts/perf-test/stress.py @@ -0,0 +1,39 @@ +# NOTE: In its current state this script is not a useful benchmark for the LLM system. +# It seems that Gradio is doing some kind of session based queuing which results in serial +# execution of requests even when multiple Gradio client instances running inside separate +# python jobs are created via Joblib. This script should be updated in the future once the +# Gradio session behaviour is better understood, but for now the perf-test jupyter notebook +# should be used to benchmark an LLM running on the same Kubernetes cluster by directly +# targetting the internal service corresponding to the backend API. + +import time, random +import pandas as pd +from gradio_client import Client +from joblib import Parallel, delayed + +url = "http://localhost:7860" + +prompts = [ + "Hi, how are you?", + "What's the weather like with you?", + "Who's the best footballer of all time?" +] + +client_count = 3 +request_count = 5 # Requests per client + +def make_requests(client_id: int): + client = Client(url) + timings = [] + for n in range(request_count): + print(f"Starting request {n+1}/{request_count} for client {client_id}") + start_time = time.time() + client.predict(random.choice(prompts), api_name="/chat") + timings.append(time.time() - start_time) + return timings + +results = list(Parallel(n_jobs=client_count)(delayed(make_requests)(i) for i in range(1, client_count+1))) +all_timings = [] +for client_timings in results: + all_timings += client_timings +print(pd.Series(all_timings).describe())