|
# Batch functions |
|
|
|
Gradio supports the ability to pass _batch_ functions. Batch functions are just |
|
functions which take in a list of inputs and return a list of predictions. |
|
|
|
For example, here is a batched function that takes in two lists of inputs (a list of |
|
words and a list of ints), and returns a list of trimmed words as output: |
|
|
|
```py |
|
import time |
|
|
|
def trim_words(words, lens): |
|
trimmed_words = [] |
|
time.sleep(5) |
|
for w, l in zip(words, lens): |
|
trimmed_words.append(w[:int(l)]) |
|
return [trimmed_words] |
|
``` |
|
|
|
The advantage of using batched functions is that if you enable queuing, the Gradio server can automatically _batch_ incoming requests and process them in parallel, |
|
potentially speeding up your demo. Here's what the Gradio code looks like (notice the `batch=True` and `max_batch_size=16`) |
|
|
|
With the `gr.Interface` class: |
|
|
|
```python |
|
demo = gr.Interface( |
|
fn=trim_words, |
|
inputs=["textbox", "number"], |
|
outputs=["output"], |
|
batch=True, |
|
max_batch_size=16 |
|
) |
|
|
|
demo.launch() |
|
``` |
|
|
|
With the `gr.Blocks` class: |
|
|
|
```py |
|
import gradio as gr |
|
|
|
with gr.Blocks() as demo: |
|
with gr.Row(): |
|
word = gr.Textbox(label="word") |
|
leng = gr.Number(label="leng") |
|
output = gr.Textbox(label="Output") |
|
with gr.Row(): |
|
run = gr.Button() |
|
|
|
event = run.click(trim_words, [word, leng], output, batch=True, max_batch_size=16) |
|
|
|
demo.launch() |
|
``` |
|
|
|
In the example above, 16 requests could be processed in parallel (for a total inference time of 5 seconds), instead of each request being processed separately (for a total |
|
inference time of 80 seconds). Many Hugging Face `transformers` and `diffusers` models work very naturally with Gradio's batch mode: here's [an example demo using diffusers to |
|
generate images in batches](https://github.com/gradio-app/gradio/blob/main/demo/diffusers_with_batching/run.py) |
|
|
|
|
|
|