Files changed (3) hide show
  1. app.ipynb +45 -55
  2. app.py +1 -1
  3. requirements.txt +1 -2
app.ipynb CHANGED
@@ -9,7 +9,12 @@
9
  "\n",
10
  "> A demo of using nbdev with Hugging Face Spaces & Gradio\n",
11
  "\n",
12
- "[Hugging Face Spaces](https://huggingface.co/spaces/launch) provides an easy ways to deploy a web app with python. [Gradio](https://gradio.app/) is one of my favorite tools for building these web apps. Gradio allows you to prototype your web apps in notebooks which allow you to iterate fast. However, Hugging Face Spaces requires you to package your web application code as a python script named `app.py`. However, **thanks to [nbdev](https://nbdev.fast.ai) you can deploy a Gradio app to Spaces from a notebook without having to refactor your code into a script!**, When you finish this tutorial, you will have an app that looks like this:\n",
 
 
 
 
 
13
  "\n",
14
  "[![<a href=\"https://huggingface.co/spaces/hamel/hfspace_demo\">A Gradio app</a> that shows the size of a HF Dataset.](final_app.png)](https://huggingface.co/spaces/hamel/hfspace_demo)\n",
15
  "\n",
@@ -81,7 +86,7 @@
81
  },
82
  {
83
  "cell_type": "code",
84
- "execution_count": 1,
85
  "id": "e5e5d597-19ad-46e5-81ad-8f646d8a1c21",
86
  "metadata": {},
87
  "outputs": [],
@@ -101,7 +106,7 @@
101
  },
102
  {
103
  "cell_type": "code",
104
- "execution_count": 2,
105
  "id": "38a4389f-ef53-4626-a6f5-a859354f854b",
106
  "metadata": {},
107
  "outputs": [],
@@ -128,7 +133,7 @@
128
  },
129
  {
130
  "cell_type": "code",
131
- "execution_count": 3,
132
  "id": "95bc32b8-d8ff-4761-a2d7-0880c51d0a42",
133
  "metadata": {},
134
  "outputs": [
@@ -138,7 +143,7 @@
138
  "'5.49 GB'"
139
  ]
140
  },
141
- "execution_count": 3,
142
  "metadata": {},
143
  "output_type": "execute_result"
144
  }
@@ -157,7 +162,7 @@
157
  },
158
  {
159
  "cell_type": "code",
160
- "execution_count": 4,
161
  "id": "7b20e2a1-b622-4970-9069-0202ce10a2ce",
162
  "metadata": {},
163
  "outputs": [
@@ -185,10 +190,10 @@
185
  {
186
  "data": {
187
  "text/plain": [
188
- "(<gradio.routes.App at 0x107b8f490>, 'http://127.0.0.1:7861/', None)"
189
  ]
190
  },
191
- "execution_count": 4,
192
  "metadata": {},
193
  "output_type": "execute_result"
194
  }
@@ -209,7 +214,7 @@
209
  },
210
  {
211
  "cell_type": "code",
212
- "execution_count": 5,
213
  "id": "39d7be72-9389-42cf-91b1-78e8f4bbd083",
214
  "metadata": {},
215
  "outputs": [
@@ -239,7 +244,7 @@
239
  },
240
  {
241
  "cell_type": "code",
242
- "execution_count": 6,
243
  "id": "6706d92c-5785-4f09-9773-b9a944c493a5",
244
  "metadata": {},
245
  "outputs": [],
@@ -266,36 +271,38 @@
266
  },
267
  {
268
  "cell_type": "code",
269
- "execution_count": 7,
270
  "id": "4bae6a5c-58bc-4a0f-9aac-34c092150fdc",
271
  "metadata": {},
272
  "outputs": [
273
  {
274
- "name": "stdout",
275
- "output_type": "stream",
276
- "text": [
277
- "\u001b[0;31m# AUTOGENERATED! DO NOT EDIT! File to edit: app.ipynb.\u001b[0m\u001b[0;34m\u001b[0m\n",
278
- "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
279
- "\u001b[0;34m\u001b[0m\u001b[0;31m# %% auto 0\u001b[0m\u001b[0;34m\u001b[0m\n",
280
- "\u001b[0;34m\u001b[0m\u001b[0m__all__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'iface'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'size'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n",
281
- "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
282
- "\u001b[0;34m\u001b[0m\u001b[0;31m# %% app.ipynb 6\u001b[0m\u001b[0;34m\u001b[0m\n",
283
- "\u001b[0;34m\u001b[0m\u001b[0;32mimport\u001b[0m \u001b[0mgradio\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mgr\u001b[0m\u001b[0;34m\u001b[0m\n",
284
- "\u001b[0;34m\u001b[0m\u001b[0;32mfrom\u001b[0m \u001b[0mfastcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnet\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0murljson\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m\u001b[0m\n",
285
- "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
286
- "\u001b[0;34m\u001b[0m\u001b[0;31m# %% app.ipynb 8\u001b[0m\u001b[0;34m\u001b[0m\n",
287
- "\u001b[0;34m\u001b[0m\u001b[0;32mdef\u001b[0m \u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepo\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n",
288
- "\u001b[0;34m\u001b[0m \u001b[0;34m\"Returns the size in GB of a HuggingFace Dataset.\"\u001b[0m\u001b[0;34m\u001b[0m\n",
289
- "\u001b[0;34m\u001b[0m \u001b[0murl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf'https://huggingface.co/api/datasets/{repo}'\u001b[0m\u001b[0;34m\u001b[0m\n",
290
- "\u001b[0;34m\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mresp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0murljson\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'{url}/treesize/main'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
291
- "\u001b[0;34m\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34mf'Did not find repo: {url}'\u001b[0m\u001b[0;34m\u001b[0m\n",
292
- "\u001b[0;34m\u001b[0m \u001b[0mgb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'size'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;36m1e9\u001b[0m\u001b[0;34m\u001b[0m\n",
293
- "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34mf'{gb:.2f} GB'\u001b[0m\u001b[0;34m\u001b[0m\n",
294
- "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
295
- "\u001b[0;34m\u001b[0m\u001b[0;31m# %% app.ipynb 12\u001b[0m\u001b[0;34m\u001b[0m\n",
296
- "\u001b[0;34m\u001b[0m\u001b[0miface\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mInterface\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mText\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"tglcourse/CelebA-faces-cropped-128\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moutputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"text\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
297
- "\u001b[0;34m\u001b[0m\u001b[0miface\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlaunch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m450\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m500\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
298
- ]
 
 
299
  }
300
  ],
301
  "source": [
@@ -314,7 +321,7 @@
314
  },
315
  {
316
  "cell_type": "code",
317
- "execution_count": 8,
318
  "id": "0b611d9c-d262-4124-9e9e-4fe754ac4378",
319
  "metadata": {},
320
  "outputs": [
@@ -390,26 +397,9 @@
390
  ],
391
  "metadata": {
392
  "kernelspec": {
393
- "display_name": "Python 3.9.13 ('MLME-22')",
394
  "language": "python",
395
  "name": "python3"
396
- },
397
- "language_info": {
398
- "codemirror_mode": {
399
- "name": "ipython",
400
- "version": 3
401
- },
402
- "file_extension": ".py",
403
- "mimetype": "text/x-python",
404
- "name": "python",
405
- "nbconvert_exporter": "python",
406
- "pygments_lexer": "ipython3",
407
- "version": "3.9.13"
408
- },
409
- "vscode": {
410
- "interpreter": {
411
- "hash": "2cb9b8e4ba0e26b1cdc35fa509fd363b1c45cea0b423b3e9d0e061db9bbef286"
412
- }
413
  }
414
  },
415
  "nbformat": 4,
 
9
  "\n",
10
  "> A demo of using nbdev with Hugging Face Spaces & Gradio\n",
11
  "\n",
12
+ "![Image created with Stable Diffusion from [this space](https://huggingface.co/spaces/stabilityai/stable-diffusion)](blog_cover.jpeg)\n",
13
+ "\n",
14
+ "[Hugging Face Spaces](https://huggingface.co/spaces/launch) provides an easy ways to deploy a web app with python. [Gradio](https://gradio.app/) is one of my favorite tools for building these web apps. Gradio allows you to prototype your web apps in notebooks which allow you to iterate fast. However, Hugging Face Spaces requires you to package your web application code as a python script named `app.py`. \n",
15
+ "\n",
16
+ "\n",
17
+ "However, **thanks to [nbdev](https://nbdev.fast.ai) you can deploy a Gradio app to Spaces from a notebook without having to refactor your code into a script!**, When you finish this tutorial, you will have an app that looks like this:\n",
18
  "\n",
19
  "[![<a href=\"https://huggingface.co/spaces/hamel/hfspace_demo\">A Gradio app</a> that shows the size of a HF Dataset.](final_app.png)](https://huggingface.co/spaces/hamel/hfspace_demo)\n",
20
  "\n",
 
86
  },
87
  {
88
  "cell_type": "code",
89
+ "execution_count": null,
90
  "id": "e5e5d597-19ad-46e5-81ad-8f646d8a1c21",
91
  "metadata": {},
92
  "outputs": [],
 
106
  },
107
  {
108
  "cell_type": "code",
109
+ "execution_count": null,
110
  "id": "38a4389f-ef53-4626-a6f5-a859354f854b",
111
  "metadata": {},
112
  "outputs": [],
 
133
  },
134
  {
135
  "cell_type": "code",
136
+ "execution_count": null,
137
  "id": "95bc32b8-d8ff-4761-a2d7-0880c51d0a42",
138
  "metadata": {},
139
  "outputs": [
 
143
  "'5.49 GB'"
144
  ]
145
  },
146
+ "execution_count": null,
147
  "metadata": {},
148
  "output_type": "execute_result"
149
  }
 
162
  },
163
  {
164
  "cell_type": "code",
165
+ "execution_count": null,
166
  "id": "7b20e2a1-b622-4970-9069-0202ce10a2ce",
167
  "metadata": {},
168
  "outputs": [
 
190
  {
191
  "data": {
192
  "text/plain": [
193
+ "(<gradio.routes.App>, 'http://127.0.0.1:7861/', None)"
194
  ]
195
  },
196
+ "execution_count": null,
197
  "metadata": {},
198
  "output_type": "execute_result"
199
  }
 
214
  },
215
  {
216
  "cell_type": "code",
217
+ "execution_count": null,
218
  "id": "39d7be72-9389-42cf-91b1-78e8f4bbd083",
219
  "metadata": {},
220
  "outputs": [
 
244
  },
245
  {
246
  "cell_type": "code",
247
+ "execution_count": null,
248
  "id": "6706d92c-5785-4f09-9773-b9a944c493a5",
249
  "metadata": {},
250
  "outputs": [],
 
271
  },
272
  {
273
  "cell_type": "code",
274
+ "execution_count": null,
275
  "id": "4bae6a5c-58bc-4a0f-9aac-34c092150fdc",
276
  "metadata": {},
277
  "outputs": [
278
  {
279
+ "data": {
280
+ "text/plain": [
281
+ "\u001b[0;31m# AUTOGENERATED! DO NOT EDIT! File to edit: app.ipynb.\u001b[0m\u001b[0;34m\u001b[0m\n",
282
+ "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
283
+ "\u001b[0;34m\u001b[0m\u001b[0;31m# %% auto 0\u001b[0m\u001b[0;34m\u001b[0m\n",
284
+ "\u001b[0;34m\u001b[0m\u001b[0m__all__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'iface'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'size'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\n",
285
+ "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
286
+ "\u001b[0;34m\u001b[0m\u001b[0;31m# %% app.ipynb 6\u001b[0m\u001b[0;34m\u001b[0m\n",
287
+ "\u001b[0;34m\u001b[0m\u001b[0;32mimport\u001b[0m \u001b[0mgradio\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mgr\u001b[0m\u001b[0;34m\u001b[0m\n",
288
+ "\u001b[0;34m\u001b[0m\u001b[0;32mfrom\u001b[0m \u001b[0mfastcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnet\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0murljson\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m\u001b[0m\n",
289
+ "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
290
+ "\u001b[0;34m\u001b[0m\u001b[0;31m# %% app.ipynb 8\u001b[0m\u001b[0;34m\u001b[0m\n",
291
+ "\u001b[0;34m\u001b[0m\u001b[0;32mdef\u001b[0m \u001b[0msize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepo\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\n",
292
+ "\u001b[0;34m\u001b[0m \u001b[0;34m\"Returns the size in GB of a HuggingFace Dataset.\"\u001b[0m\u001b[0;34m\u001b[0m\n",
293
+ "\u001b[0;34m\u001b[0m \u001b[0murl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf'https://huggingface.co/api/datasets/{repo}'\u001b[0m\u001b[0;34m\u001b[0m\n",
294
+ "\u001b[0;34m\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mresp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0murljson\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'{url}/treesize/main'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
295
+ "\u001b[0;34m\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34mf'Did not find repo: {url}'\u001b[0m\u001b[0;34m\u001b[0m\n",
296
+ "\u001b[0;34m\u001b[0m \u001b[0mgb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'size'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;36m1e9\u001b[0m\u001b[0;34m\u001b[0m\n",
297
+ "\u001b[0;34m\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34mf'{gb:.2f} GB'\u001b[0m\u001b[0;34m\u001b[0m\n",
298
+ "\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\n",
299
+ "\u001b[0;34m\u001b[0m\u001b[0;31m# %% app.ipynb 12\u001b[0m\u001b[0;34m\u001b[0m\n",
300
+ "\u001b[0;34m\u001b[0m\u001b[0miface\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mInterface\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msize\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mText\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"tglcourse/CelebA-faces-cropped-128\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moutputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"text\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\n",
301
+ "\u001b[0;34m\u001b[0m\u001b[0miface\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlaunch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m450\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m500\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n"
302
+ ]
303
+ },
304
+ "metadata": {},
305
+ "output_type": "display_data"
306
  }
307
  ],
308
  "source": [
 
321
  },
322
  {
323
  "cell_type": "code",
324
+ "execution_count": null,
325
  "id": "0b611d9c-d262-4124-9e9e-4fe754ac4378",
326
  "metadata": {},
327
  "outputs": [
 
397
  ],
398
  "metadata": {
399
  "kernelspec": {
400
+ "display_name": "Python 3 (ipykernel)",
401
  "language": "python",
402
  "name": "python3"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403
  }
404
  },
405
  "nbformat": 4,
app.py CHANGED
@@ -18,4 +18,4 @@ def size(repo:str):
18
 
19
  # %% app.ipynb 12
20
  iface = gr.Interface(fn=size, inputs=gr.Text(value="tglcourse/CelebA-faces-cropped-128"), outputs="text")
21
- iface.launch(height=450, width=500)
 
18
 
19
  # %% app.ipynb 12
20
  iface = gr.Interface(fn=size, inputs=gr.Text(value="tglcourse/CelebA-faces-cropped-128"), outputs="text")
21
+ iface.launch(height=450, width=500)
requirements.txt CHANGED
@@ -1,2 +1 @@
1
- fastcore==1.5.27
2
-
 
1
+ fastcore