{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "bf596b85",
"metadata": {},
"outputs": [],
"source": [
"!pip install -Uqq fastai"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "f6529ac6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/Users/devudilip/projects/AI/fastai_pet_classifier\r\n"
]
}
],
"source": [
"!pwd"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "0473c217",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"fastai: 2.8.0\n",
"fastcore: 1.8.0\n",
"torch: 2.4.1\n"
]
}
],
"source": [
"import fastai\n",
"import fastcore\n",
"import torch\n",
"\n",
"print(f\"fastai: {fastai.__version__}\")\n",
"print(f\"fastcore: {fastcore.__version__}\")\n",
"print(f\"torch: {torch.__version__}\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "15b4cdfd",
"metadata": {},
"outputs": [],
"source": [
"from fastai.vision.all import *\n",
"import dill"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "399533a7",
"metadata": {},
"outputs": [],
"source": [
"path = untar_data(URLs.PETS)/'images'"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "51e0bbe2",
"metadata": {},
"outputs": [],
"source": [
"def is_cat(x): return x[0].isupper() "
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "915cbf12",
"metadata": {},
"outputs": [],
"source": [
"dls = ImageDataLoaders.from_name_func('.',\n",
" get_image_files(path), valid_pct=0.2, seed=42,\n",
" label_func=is_cat,\n",
" item_tfms=Resize(192))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "9bae55cc",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Downloading: \"https://download.pytorch.org/models/resnet18-f37072fd.pth\" to /Users/devudilip/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth\n",
"100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 44.7M/44.7M [00:09<00:00, 4.89MB/s]\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
" epoch | \n",
" train_loss | \n",
" valid_loss | \n",
" error_rate | \n",
" time | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.197639 | \n",
" 0.045730 | \n",
" 0.015562 | \n",
" 01:37 | \n",
"
\n",
" \n",
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" \n",
" epoch | \n",
" train_loss | \n",
" valid_loss | \n",
" error_rate | \n",
" time | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.078331 | \n",
" 0.054597 | \n",
" 0.018268 | \n",
" 02:22 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.049279 | \n",
" 0.038220 | \n",
" 0.010149 | \n",
" 02:40 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.023927 | \n",
" 0.026168 | \n",
" 0.008796 | \n",
" 02:56 | \n",
"
\n",
" \n",
"
"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"learn = vision_learner(dls, resnet18, metrics=error_rate)\n",
"learn.fine_tune(3)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "8034b898",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"{'Dog': 1.0, 'Cat': 6.59496190991149e-09}"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pred, idx, probs = learn.predict('i1.jpg')\n",
"dict(zip(categories, map(float, probs)))"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "9119ee21",
"metadata": {},
"outputs": [
{
"ename": "AttributeError",
"evalue": "Can't get local object 'Transform.__init__..wrapped_enc'",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[38]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mlearn\u001b[49m\u001b[43m.\u001b[49m\u001b[43mexport\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mmodel.pkl\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/fastai/learner.py:444\u001b[39m, in \u001b[36mexport\u001b[39m\u001b[34m(self, fname, pickle_module, pickle_protocol)\u001b[39m\n\u001b[32m 441\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m warnings.catch_warnings():\n\u001b[32m 442\u001b[39m \u001b[38;5;66;03m#To avoid the warning that come from PyTorch about model not being checked\u001b[39;00m\n\u001b[32m 443\u001b[39m warnings.simplefilter(\u001b[33m\"\u001b[39m\u001b[33mignore\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m444\u001b[39m \u001b[43mtorch\u001b[49m\u001b[43m.\u001b[49m\u001b[43msave\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m/\u001b[49m\u001b[43mfname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpickle_module\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpickle_module\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpickle_protocol\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpickle_protocol\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 445\u001b[39m \u001b[38;5;28mself\u001b[39m.create_opt()\n\u001b[32m 446\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m state \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m: \u001b[38;5;28mself\u001b[39m.opt.load_state_dict(state)\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/torch/serialization.py:652\u001b[39m, in \u001b[36msave\u001b[39m\u001b[34m(obj, f, pickle_module, pickle_protocol, _use_new_zipfile_serialization, _disable_byteorder_record)\u001b[39m\n\u001b[32m 650\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m _use_new_zipfile_serialization:\n\u001b[32m 651\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m _open_zipfile_writer(f) \u001b[38;5;28;01mas\u001b[39;00m opened_zipfile:\n\u001b[32m--> \u001b[39m\u001b[32m652\u001b[39m \u001b[43m_save\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mopened_zipfile\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpickle_module\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpickle_protocol\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_disable_byteorder_record\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 653\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[32m 654\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/torch/serialization.py:864\u001b[39m, in \u001b[36m_save\u001b[39m\u001b[34m(obj, zip_file, pickle_module, pickle_protocol, _disable_byteorder_record)\u001b[39m\n\u001b[32m 862\u001b[39m pickler = pickle_module.Pickler(data_buf, protocol=pickle_protocol)\n\u001b[32m 863\u001b[39m pickler.persistent_id = persistent_id\n\u001b[32m--> \u001b[39m\u001b[32m864\u001b[39m \u001b[43mpickler\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdump\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 865\u001b[39m data_value = data_buf.getvalue()\n\u001b[32m 866\u001b[39m zip_file.write_record(\u001b[33m'\u001b[39m\u001b[33mdata.pkl\u001b[39m\u001b[33m'\u001b[39m, data_value, \u001b[38;5;28mlen\u001b[39m(data_value))\n",
"\u001b[31mAttributeError\u001b[39m: Can't get local object 'Transform.__init__..wrapped_enc'"
]
}
],
"source": [
"learn.export('model.pkl')"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "25a3e6c4",
"metadata": {},
"outputs": [],
"source": [
"!pip install -q gradio\n",
"import gradio as gr"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "03631813",
"metadata": {},
"outputs": [
{
"ename": "ImportError",
"evalue": "cannot import name 'http_server' from 'gradio' (/Users/devudilip/miniforge3/lib/python3.12/site-packages/gradio/__init__.py)",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mImportError\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[27]\u001b[39m\u001b[32m, line 13\u001b[39m\n\u001b[32m 10\u001b[39m examples = [\u001b[33m'\u001b[39m\u001b[33msiamese.png\u001b[39m\u001b[33m'\u001b[39m]\n\u001b[32m 12\u001b[39m intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)\n\u001b[32m---> \u001b[39m\u001b[32m13\u001b[39m \u001b[43mintf\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlaunch\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/gradio/blocks.py:2597\u001b[39m, in \u001b[36mlaunch\u001b[39m\u001b[34m(self, inline, inbrowser, share, debug, max_threads, auth, auth_message, prevent_thread_lock, show_error, server_name, server_port, height, width, favicon_path, ssl_keyfile, ssl_certfile, ssl_keyfile_password, ssl_verify, quiet, show_api, allowed_paths, blocked_paths, root_path, app_kwargs, state_session_capacity, share_server_address, share_server_protocol, share_server_tls_certificate, auth_dependency, max_file_size, enable_monitoring, strict_cors, node_server_name, node_port, ssr_mode, pwa, _frontend)\u001b[39m\n\u001b[32m 0\u001b[39m \n",
"\u001b[31mImportError\u001b[39m: cannot import name 'http_server' from 'gradio' (/Users/devudilip/miniforge3/lib/python3.12/site-packages/gradio/__init__.py)"
]
}
],
"source": [
"categories = ('Dog', 'Cat')\n",
"\n",
"def classify_image(img):\n",
" pred, idx, probs = learn.predict(img)\n",
" return dict(zip(categories, map(float, probs)))\n",
"\n",
"image = gr.Image()\n",
"label = gr.Label()\n",
"\n",
"examples = ['siamese.png']\n",
"\n",
"intf = gr.Interface(fn=classify_image, inputs=image, outputs=label, examples=examples)\n",
"intf.launch()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "47d99904",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: gradio in /Users/devudilip/miniforge3/lib/python3.12/site-packages (3.0)\n",
"Collecting gradio\n",
" Using cached gradio-5.22.0-py3-none-any.whl.metadata (16 kB)\n",
"Requirement already satisfied: aiofiles<24.0,>=22.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (23.2.1)\n",
"Requirement already satisfied: anyio<5.0,>=3.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (4.9.0)\n",
"Requirement already satisfied: fastapi<1.0,>=0.115.2 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.115.11)\n",
"Requirement already satisfied: ffmpy in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.5.0)\n",
"Collecting gradio-client==1.8.0 (from gradio)\n",
" Using cached gradio_client-1.8.0-py3-none-any.whl.metadata (7.1 kB)\n",
"Requirement already satisfied: groovy~=0.1 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.1.2)\n",
"Requirement already satisfied: httpx>=0.24.1 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.28.1)\n",
"Requirement already satisfied: huggingface-hub>=0.28.1 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.29.3)\n",
"Requirement already satisfied: jinja2<4.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (3.1.6)\n",
"Requirement already satisfied: markupsafe<4.0,>=2.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (2.1.5)\n",
"Requirement already satisfied: numpy<3.0,>=1.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (1.26.4)\n",
"Requirement already satisfied: orjson~=3.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (3.10.15)\n",
"Requirement already satisfied: packaging in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (24.2)\n",
"Requirement already satisfied: pandas<3.0,>=1.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (2.2.3)\n",
"Requirement already satisfied: pillow<12.0,>=8.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (10.4.0)\n",
"Requirement already satisfied: pydantic>=2.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (2.10.6)\n",
"Requirement already satisfied: pydub in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.25.1)\n",
"Requirement already satisfied: python-multipart>=0.0.18 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.0.20)\n",
"Requirement already satisfied: pyyaml<7.0,>=5.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (6.0.2)\n",
"Requirement already satisfied: ruff>=0.9.3 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.11.2)\n",
"Requirement already satisfied: safehttpx<0.2.0,>=0.1.6 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.1.6)\n",
"Requirement already satisfied: semantic-version~=2.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (2.10.0)\n",
"Requirement already satisfied: starlette<1.0,>=0.40.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.46.1)\n",
"Requirement already satisfied: tomlkit<0.14.0,>=0.12.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.13.2)\n",
"Requirement already satisfied: typer<1.0,>=0.12 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.15.2)\n",
"Requirement already satisfied: typing-extensions~=4.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (4.12.2)\n",
"Requirement already satisfied: uvicorn>=0.14.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio) (0.34.0)\n",
"Requirement already satisfied: fsspec in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio-client==1.8.0->gradio) (2024.12.0)\n",
"Requirement already satisfied: websockets<16.0,>=10.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from gradio-client==1.8.0->gradio) (11.0.3)\n",
"Requirement already satisfied: idna>=2.8 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from anyio<5.0,>=3.0->gradio) (3.10)\n",
"Requirement already satisfied: sniffio>=1.1 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from anyio<5.0,>=3.0->gradio) (1.3.1)\n",
"Requirement already satisfied: certifi in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from httpx>=0.24.1->gradio) (2025.1.31)\n",
"Requirement already satisfied: httpcore==1.* in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from httpx>=0.24.1->gradio) (1.0.7)\n",
"Requirement already satisfied: h11<0.15,>=0.13 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from httpcore==1.*->httpx>=0.24.1->gradio) (0.14.0)\n",
"Requirement already satisfied: filelock in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from huggingface-hub>=0.28.1->gradio) (3.18.0)\n",
"Requirement already satisfied: requests in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from huggingface-hub>=0.28.1->gradio) (2.32.3)\n",
"Requirement already satisfied: tqdm>=4.42.1 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from huggingface-hub>=0.28.1->gradio) (4.67.1)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from pandas<3.0,>=1.0->gradio) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from pandas<3.0,>=1.0->gradio) (2024.1)\n",
"Requirement already satisfied: tzdata>=2022.7 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from pandas<3.0,>=1.0->gradio) (2025.1)\n",
"Requirement already satisfied: annotated-types>=0.6.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from pydantic>=2.0->gradio) (0.7.0)\n",
"Requirement already satisfied: pydantic-core==2.27.2 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from pydantic>=2.0->gradio) (2.27.2)\n",
"Requirement already satisfied: click>=8.0.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from typer<1.0,>=0.12->gradio) (8.1.8)\n",
"Requirement already satisfied: shellingham>=1.3.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from typer<1.0,>=0.12->gradio) (1.5.4)\n",
"Requirement already satisfied: rich>=10.11.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from typer<1.0,>=0.12->gradio) (13.9.4)\n",
"Requirement already satisfied: six>=1.5 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas<3.0,>=1.0->gradio) (1.17.0)\n",
"Requirement already satisfied: markdown-it-py>=2.2.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (3.0.0)\n",
"Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from rich>=10.11.0->typer<1.0,>=0.12->gradio) (2.19.1)\n",
"Requirement already satisfied: charset_normalizer<4,>=2 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from requests->huggingface-hub>=0.28.1->gradio) (3.4.1)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from requests->huggingface-hub>=0.28.1->gradio) (2.3.0)\n",
"Requirement already satisfied: mdurl~=0.1 in /Users/devudilip/miniforge3/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer<1.0,>=0.12->gradio) (0.1.2)\n",
"Using cached gradio-5.22.0-py3-none-any.whl (46.2 MB)\n",
"Using cached gradio_client-1.8.0-py3-none-any.whl (322 kB)\n",
"Installing collected packages: gradio-client, gradio\n",
" Attempting uninstall: gradio-client\n",
" Found existing installation: gradio_client 0.5.0\n",
" Uninstalling gradio_client-0.5.0:\n",
" Successfully uninstalled gradio_client-0.5.0\n",
" Attempting uninstall: gradio\n",
" Found existing installation: gradio 3.0\n",
" Uninstalling gradio-3.0:\n",
" Successfully uninstalled gradio-3.0\n",
"Successfully installed gradio-5.22.0 gradio-client-1.8.0\n"
]
}
],
"source": [
"!pip install --upgrade gradio"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "f43155f8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Name: gradio\r\n",
"Version: 5.22.0\r\n",
"Summary: Python library for easily interacting with trained machine learning models\r\n",
"Home-page: https://github.com/gradio-app/gradio\r\n",
"Author: \r\n",
"Author-email: Abubakar Abid , Ali Abid , Ali Abdalla , Dawood Khan , Ahsen Khaliq , Pete Allen , Ömer Faruk Özdemir , Freddy A Boulton , Hannah Blair \r\n",
"License-Expression: Apache-2.0\r\n",
"Location: /Users/devudilip/miniforge3/lib/python3.12/site-packages\r\n",
"Requires: aiofiles, anyio, fastapi, ffmpy, gradio-client, groovy, httpx, huggingface-hub, jinja2, markupsafe, numpy, orjson, packaging, pandas, pillow, pydantic, pydub, python-multipart, pyyaml, ruff, safehttpx, semantic-version, starlette, tomlkit, typer, typing-extensions, uvicorn\r\n",
"Required-by: \r\n"
]
}
],
"source": [
"!pip show gradio"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "78a256f7",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Exception in thread Thread-90 (run):\n",
"Traceback (most recent call last):\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/threading.py\", line 1075, in _bootstrap_inner\n",
" self.run()\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/ipykernel/ipkernel.py\", line 766, in run_closure\n",
" _threading_Thread_run(self)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/threading.py\", line 1012, in run\n",
" self._target(*self._args, **self._kwargs)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 66, in run\n",
" return asyncio.run(self.serve(sockets=sockets))\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/runners.py\", line 195, in run\n",
" return runner.run(main)\n",
" ^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/runners.py\", line 118, in run\n",
" return self._loop.run_until_complete(task)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/base_events.py\", line 691, in run_until_complete\n",
" return future.result()\n",
" ^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 70, in serve\n",
" await self._serve(sockets)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 77, in _serve\n",
" config.load()\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/config.py\", line 427, in load\n",
" ws_protocol_class = import_from_string(WS_PROTOCOLS[self.ws])\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/importer.py\", line 22, in import_from_string\n",
" raise exc from None\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/importer.py\", line 19, in import_from_string\n",
" module = importlib.import_module(module_str)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/importlib/__init__.py\", line 90, in import_module\n",
" return _bootstrap._gcd_import(name[level:], package, level)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"\", line 1387, in _gcd_import\n",
" File \"\", line 1360, in _find_and_load\n",
" File \"\", line 1331, in _find_and_load_unlocked\n",
" File \"\", line 935, in _load_unlocked\n",
" File \"\", line 999, in exec_module\n",
" File \"\", line 488, in _call_with_frames_removed\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/protocols/websockets/auto.py\", line 19, in \n",
" from uvicorn.protocols.websockets.websockets_impl import WebSocketProtocol\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/protocols/websockets/websockets_impl.py\", line 16, in \n",
" from websockets.legacy.server import HTTPResponse\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/legacy/server.py\", line 29, in \n",
" from ..exceptions import (\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/imports.py\", line 91, in __getattr__\n",
" \n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/imports.py\", line 28, in import_name\n",
" return getattr(module, name)\n",
" ^^^^^^^^^^^^^^^^^^^^\n",
"ModuleNotFoundError: No module named 'websockets.legacy.exceptions'\n",
"Exception in thread Thread-91 (run):\n",
"Traceback (most recent call last):\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/threading.py\", line 1075, in _bootstrap_inner\n",
" self.run()\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/ipykernel/ipkernel.py\", line 766, in run_closure\n",
" _threading_Thread_run(self)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/threading.py\", line 1012, in run\n",
" self._target(*self._args, **self._kwargs)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 66, in run\n",
" return asyncio.run(self.serve(sockets=sockets))\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/runners.py\", line 195, in run\n",
" return runner.run(main)\n",
" ^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/runners.py\", line 118, in run\n",
" return self._loop.run_until_complete(task)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/base_events.py\", line 691, in run_until_complete\n",
" return future.result()\n",
" ^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 70, in serve\n",
" await self._serve(sockets)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 77, in _serve\n",
" config.load()\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/config.py\", line 427, in load\n",
" ws_protocol_class = import_from_string(WS_PROTOCOLS[self.ws])\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/importer.py\", line 22, in import_from_string\n",
" raise exc from None\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/importer.py\", line 19, in import_from_string\n",
" module = importlib.import_module(module_str)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/importlib/__init__.py\", line 90, in import_module\n",
" return _bootstrap._gcd_import(name[level:], package, level)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"\", line 1387, in _gcd_import\n",
" File \"\", line 1360, in _find_and_load\n",
" File \"\", line 1331, in _find_and_load_unlocked\n",
" File \"\", line 935, in _load_unlocked\n",
" File \"\", line 999, in exec_module\n",
" File \"\", line 488, in _call_with_frames_removed\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/protocols/websockets/auto.py\", line 19, in \n",
" from uvicorn.protocols.websockets.websockets_impl import WebSocketProtocol\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/protocols/websockets/websockets_impl.py\", line 16, in \n",
" from websockets.legacy.server import HTTPResponse\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/legacy/server.py\", line 29, in \n",
" from ..exceptions import (\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/imports.py\", line 91, in __getattr__\n",
" \n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/imports.py\", line 28, in import_name\n",
" return getattr(module, name)\n",
" ^^^^^^^^^^^^^^^^^^^^\n",
"ModuleNotFoundError: No module named 'websockets.legacy.exceptions'\n",
"Exception in thread Thread-92 (run):\n",
"Traceback (most recent call last):\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/threading.py\", line 1075, in _bootstrap_inner\n",
" self.run()\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/ipykernel/ipkernel.py\", line 766, in run_closure\n",
" _threading_Thread_run(self)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/threading.py\", line 1012, in run\n",
" self._target(*self._args, **self._kwargs)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 66, in run\n",
" return asyncio.run(self.serve(sockets=sockets))\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/runners.py\", line 195, in run\n",
" return runner.run(main)\n",
" ^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/runners.py\", line 118, in run\n",
" return self._loop.run_until_complete(task)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/asyncio/base_events.py\", line 691, in run_until_complete\n",
" return future.result()\n",
" ^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 70, in serve\n",
" await self._serve(sockets)\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/server.py\", line 77, in _serve\n",
" config.load()\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/config.py\", line 427, in load\n",
" ws_protocol_class = import_from_string(WS_PROTOCOLS[self.ws])\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/importer.py\", line 22, in import_from_string\n",
" raise exc from None\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/importer.py\", line 19, in import_from_string\n",
" module = importlib.import_module(module_str)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/importlib/__init__.py\", line 90, in import_module\n",
" return _bootstrap._gcd_import(name[level:], package, level)\n",
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"\", line 1387, in _gcd_import\n",
" File \"\", line 1360, in _find_and_load\n",
" File \"\", line 1331, in _find_and_load_unlocked\n",
" File \"\", line 935, in _load_unlocked\n",
" File \"\", line 999, in exec_module\n",
" File \"\", line 488, in _call_with_frames_removed\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/protocols/websockets/auto.py\", line 19, in \n",
" from uvicorn.protocols.websockets.websockets_impl import WebSocketProtocol\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/uvicorn/protocols/websockets/websockets_impl.py\", line 16, in \n",
" from websockets.legacy.server import HTTPResponse\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/legacy/server.py\", line 29, in \n",
" from ..exceptions import (\n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/imports.py\", line 91, in __getattr__\n",
" \n",
" File \"/Users/devudilip/miniforge3/lib/python3.12/site-packages/websockets/imports.py\", line 28, in import_name\n",
" return getattr(module, name)\n",
" ^^^^^^^^^^^^^^^^^^^^\n",
"ModuleNotFoundError: No module named 'websockets.legacy.exceptions'\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
"\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)",
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[33]\u001b[39m\u001b[32m, line 12\u001b[39m\n\u001b[32m 4\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[33m\"\u001b[39m\u001b[33mHello, \u001b[39m\u001b[33m\"\u001b[39m + name + \u001b[33m\"\u001b[39m\u001b[33m!\u001b[39m\u001b[33m\"\u001b[39m * \u001b[38;5;28mint\u001b[39m(intensity)\n\u001b[32m 6\u001b[39m demo = gr.Interface(\n\u001b[32m 7\u001b[39m fn=greet,\n\u001b[32m 8\u001b[39m inputs=[\u001b[33m\"\u001b[39m\u001b[33mtext\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mslider\u001b[39m\u001b[33m\"\u001b[39m],\n\u001b[32m 9\u001b[39m outputs=[\u001b[33m\"\u001b[39m\u001b[33mtext\u001b[39m\u001b[33m\"\u001b[39m],\n\u001b[32m 10\u001b[39m )\n\u001b[32m---> \u001b[39m\u001b[32m12\u001b[39m \u001b[43mdemo\u001b[49m\u001b[43m.\u001b[49m\u001b[43mlaunch\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/gradio/blocks.py:2604\u001b[39m, in \u001b[36mBlocks.launch\u001b[39m\u001b[34m(self, inline, inbrowser, share, debug, max_threads, auth, auth_message, prevent_thread_lock, show_error, server_name, server_port, height, width, favicon_path, ssl_keyfile, ssl_certfile, ssl_keyfile_password, ssl_verify, quiet, show_api, allowed_paths, blocked_paths, root_path, app_kwargs, state_session_capacity, share_server_address, share_server_protocol, share_server_tls_certificate, auth_dependency, max_file_size, enable_monitoring, strict_cors, node_server_name, node_port, ssr_mode, pwa, _frontend)\u001b[39m\n\u001b[32m 2596\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 2597\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mgradio\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m http_server\n\u001b[32m 2599\u001b[39m (\n\u001b[32m 2600\u001b[39m server_name,\n\u001b[32m 2601\u001b[39m server_port,\n\u001b[32m 2602\u001b[39m local_url,\n\u001b[32m 2603\u001b[39m server,\n\u001b[32m-> \u001b[39m\u001b[32m2604\u001b[39m ) = \u001b[43mhttp_server\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstart_server\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 2605\u001b[39m \u001b[43m \u001b[49m\u001b[43mapp\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mapp\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2606\u001b[39m \u001b[43m \u001b[49m\u001b[43mserver_name\u001b[49m\u001b[43m=\u001b[49m\u001b[43mserver_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2607\u001b[39m \u001b[43m \u001b[49m\u001b[43mserver_port\u001b[49m\u001b[43m=\u001b[49m\u001b[43mserver_port\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2608\u001b[39m \u001b[43m \u001b[49m\u001b[43mssl_keyfile\u001b[49m\u001b[43m=\u001b[49m\u001b[43mssl_keyfile\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2609\u001b[39m \u001b[43m \u001b[49m\u001b[43mssl_certfile\u001b[49m\u001b[43m=\u001b[49m\u001b[43mssl_certfile\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2610\u001b[39m \u001b[43m \u001b[49m\u001b[43mssl_keyfile_password\u001b[49m\u001b[43m=\u001b[49m\u001b[43mssl_keyfile_password\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2611\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2612\u001b[39m \u001b[38;5;28mself\u001b[39m.server_name = server_name\n\u001b[32m 2613\u001b[39m \u001b[38;5;28mself\u001b[39m.local_url = local_url\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/gradio/http_server.py:151\u001b[39m, in \u001b[36mstart_server\u001b[39m\u001b[34m(app, server_name, server_port, ssl_keyfile, ssl_certfile, ssl_keyfile_password)\u001b[39m\n\u001b[32m 141\u001b[39m reloader = SourceFileReloader(\n\u001b[32m 142\u001b[39m app=app,\n\u001b[32m 143\u001b[39m watch_dirs=GRADIO_WATCH_DIRS,\n\u001b[32m (...)\u001b[39m\u001b[32m 148\u001b[39m watch_module=sys.modules[\u001b[33m\"\u001b[39m\u001b[33m__main__\u001b[39m\u001b[33m\"\u001b[39m],\n\u001b[32m 149\u001b[39m )\n\u001b[32m 150\u001b[39m server = Server(config=config, reloader=reloader)\n\u001b[32m--> \u001b[39m\u001b[32m151\u001b[39m \u001b[43mserver\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrun_in_thread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 152\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[32m 153\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mOSError\u001b[39;00m, ServerFailedToStartError):\n",
"\u001b[36mFile \u001b[39m\u001b[32m~/miniforge3/lib/python3.12/site-packages/gradio/http_server.py:58\u001b[39m, in \u001b[36mServer.run_in_thread\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 56\u001b[39m start = time.time()\n\u001b[32m 57\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m.started:\n\u001b[32m---> \u001b[39m\u001b[32m58\u001b[39m \u001b[43mtime\u001b[49m\u001b[43m.\u001b[49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m1e-3\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 59\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m time.time() - start > \u001b[32m5\u001b[39m:\n\u001b[32m 60\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ServerFailedToStartError(\n\u001b[32m 61\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mServer failed to start. Please check that the port is available.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 62\u001b[39m )\n",
"\u001b[31mKeyboardInterrupt\u001b[39m: "
]
}
],
"source": [
"import gradio as gr\n",
"\n",
"def greet(name, intensity):\n",
" return \"Hello, \" + name + \"!\" * int(intensity)\n",
"\n",
"demo = gr.Interface(\n",
" fn=greet,\n",
" inputs=[\"text\", \"slider\"],\n",
" outputs=[\"text\"],\n",
")\n",
"\n",
"demo.launch()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "74837fee",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "f61cb7c0",
"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.12.9"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 5
}