|
# Building Serverless Machine Learning Apps with Gradio-Lite and Transformers.js
|
|
|
|
Tags: SERVERLESS, BROWSER, PYODIDE, TRANSFORMERS
|
|
|
|
Gradio and [Transformers](https://huggingface.co/docs/transformers/index) are a powerful combination for building machine learning apps with a web interface. Both libraries have serverless versions that can run entirely in the browser: [Gradio-Lite](./gradio-lite) and [Transformers.js](https://huggingface.co/docs/transformers.js/index).
|
|
In this document, we will introduce how to create a serverless machine learning application using Gradio-Lite and Transformers.js.
|
|
You will just write Python code within a static HTML file and host it without setting up a server-side Python runtime.
|
|
|
|
|
|
## Libraries Used
|
|
|
|
### Gradio-Lite
|
|
|
|
Gradio-Lite is the serverless version of Gradio, allowing you to build serverless web UI applications by embedding Python code within HTML. For a detailed introduction to Gradio-Lite itself, please read [this Guide](./gradio-lite).
|
|
|
|
### Transformers.js and Transformers.js.py
|
|
|
|
Transformers.js is the JavaScript version of the Transformers library that allows you to run machine learning models entirely in the browser.
|
|
Since Transformers.js is a JavaScript library, it cannot be directly used from the Python code of Gradio-Lite applications. To address this, we use a wrapper library called [Transformers.js.py](https://github.com/whitphx/transformers.js.py).
|
|
The name Transformers.js.py may sound unusual, but it represents the necessary technology stack for using Transformers.js from Python code within a browser environment. The regular Transformers library is not compatible with browser environments.
|
|
|
|
## Sample Code
|
|
|
|
Here's an example of how to use Gradio-Lite and Transformers.js together.
|
|
Please create an HTML file and paste the following code:
|
|
|
|
```html
|
|
<html>
|
|
<head>
|
|
<script type="module" crossorigin src="https://cdn.jsdelivr.net/npm/@gradio/lite/dist/lite.js"></script>
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@gradio/lite/dist/lite.css" />
|
|
</head>
|
|
<body>
|
|
<gradio-lite>
|
|
import gradio as gr
|
|
from transformers_js_py import pipeline
|
|
|
|
pipe = await pipeline('sentiment-analysis')
|
|
|
|
demo = gr.Interface.from_pipeline(pipe)
|
|
|
|
demo.launch()
|
|
|
|
<gradio-requirements>
|
|
transformers-js-py
|
|
</gradio-requirements>
|
|
</gradio-lite>
|
|
</body>
|
|
</html>
|
|
```
|
|
|
|
Here is a running example of the code above (after the app has loaded, you could disconnect your Internet connection and the app will still work since its running entirely in your browser):
|
|
|
|
<gradio-lite shared-worker>
|
|
import gradio as gr
|
|
from transformers_js_py import pipeline
|
|
<!-- --->
|
|
pipe = await pipeline('sentiment-analysis')
|
|
<!-- --->
|
|
demo = gr.Interface.from_pipeline(pipe)
|
|
<!-- --->
|
|
demo.launch()
|
|
<gradio-requirements>
|
|
transformers-js-py
|
|
</gradio-requirements>
|
|
</gradio-lite>
|
|
|
|
And you you can open your HTML file in a browser to see the Gradio app running!
|
|
|
|
The Python code inside the `<gradio-lite>` tag is the Gradio application code. For more details on this part, please refer to [this article](./gradio-lite).
|
|
The `<gradio-requirements>` tag is used to specify packages to be installed in addition to Gradio-Lite and its dependencies. In this case, we are using Transformers.js.py (`transformers-js-py`), so it is specified here.
|
|
|
|
Let's break down the code:
|
|
|
|
`pipe = await pipeline('sentiment-analysis')` creates a Transformers.js pipeline.
|
|
In this example, we create a sentiment analysis pipeline.
|
|
For more information on the available pipeline types and usage, please refer to the [Transformers.js documentation](https://huggingface.co/docs/transformers.js/index).
|
|
|
|
`demo = gr.Interface.from_pipeline(pipe)` creates a Gradio app instance. By passing the Transformers.js.py pipeline to `gr.Interface.from_pipeline()`, we can create an interface that utilizes that pipeline with predefined input and output components.
|
|
|
|
Finally, `demo.launch()` launches the created app.
|
|
|
|
## Customizing the Model or Pipeline
|
|
|
|
You can modify the line `pipe = await pipeline('sentiment-analysis')` in the sample above to try different models or tasks.
|
|
|
|
For example, if you change it to `pipe = await pipeline('sentiment-analysis', 'Xenova/bert-base-multilingual-uncased-sentiment')`, you can test the same sentiment analysis task but with a different model. The second argument of the `pipeline` function specifies the model name.
|
|
If it's not specified like in the first example, the default model is used. For more details on these specs, refer to the [Transformers.js documentation](https://huggingface.co/docs/transformers.js/index).
|
|
|
|
<gradio-lite shared-worker>
|
|
import gradio as gr
|
|
from transformers_js_py import pipeline
|
|
<!-- --->
|
|
pipe = await pipeline('sentiment-analysis', 'Xenova/bert-base-multilingual-uncased-sentiment')
|
|
<!-- --->
|
|
demo = gr.Interface.from_pipeline(pipe)
|
|
<!-- --->
|
|
demo.launch()
|
|
<gradio-requirements>
|
|
transformers-js-py
|
|
</gradio-requirements>
|
|
</gradio-lite>
|
|
|
|
As another example, changing it to `pipe = await pipeline('image-classification')` creates a pipeline for image classification instead of sentiment analysis.
|
|
In this case, the interface created with `demo = gr.Interface.from_pipeline(pipe)` will have a UI for uploading an image and displaying the classification result. The `gr.Interface.from_pipeline` function automatically creates an appropriate UI based on the type of pipeline.
|
|
|
|
<gradio-lite shared-worker>
|
|
import gradio as gr
|
|
from transformers_js_py import pipeline
|
|
<!-- --->
|
|
pipe = await pipeline('image-classification')
|
|
<!-- --->
|
|
demo = gr.Interface.from_pipeline(pipe)
|
|
<!-- --->
|
|
demo.launch()
|
|
<gradio-requirements>
|
|
transformers-js-py
|
|
</gradio-requirements>
|
|
</gradio-lite>
|
|
|
|
<br>
|
|
|
|
**Note**: If you use an audio pipeline, such as `automatic-speech-recognition`, you will need to put `transformers-js-py[audio]` in your `<gradio-requirements>` as there are additional requirements needed to process audio files.
|
|
|
|
## Customizing the UI
|
|
|
|
Instead of using `gr.Interface.from_pipeline()`, you can define the user interface using Gradio's regular API.
|
|
Here's an example where the Python code inside the `<gradio-lite>` tag has been modified from the previous sample:
|
|
|
|
```html
|
|
<html>
|
|
<head>
|
|
<script type="module" crossorigin src="https://cdn.jsdelivr.net/npm/@gradio/lite/dist/lite.js"></script>
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@gradio/lite/dist/lite.css" />
|
|
</head>
|
|
<body>
|
|
<gradio-lite>
|
|
import gradio as gr
|
|
from transformers_js_py import pipeline
|
|
|
|
pipe = await pipeline('sentiment-analysis')
|
|
|
|
async def fn(text):
|
|
result = await pipe(text)
|
|
return result
|
|
|
|
demo = gr.Interface(
|
|
fn=fn,
|
|
inputs=gr.Textbox(),
|
|
outputs=gr.JSON(),
|
|
)
|
|
|
|
demo.launch()
|
|
|
|
<gradio-requirements>
|
|
transformers-js-py
|
|
</gradio-requirements>
|
|
</gradio-lite>
|
|
</body>
|
|
</html>
|
|
```
|
|
|
|
In this example, we modified the code to construct the Gradio user interface manually so that we could output the result as JSON.
|
|
|
|
<gradio-lite shared-worker>
|
|
import gradio as gr
|
|
from transformers_js_py import pipeline
|
|
<!-- --->
|
|
pipe = await pipeline('sentiment-analysis')
|
|
<!-- --->
|
|
async def fn(text):
|
|
result = await pipe(text)
|
|
return result
|
|
<!-- --->
|
|
demo = gr.Interface(
|
|
fn=fn,
|
|
inputs=gr.Textbox(),
|
|
outputs=gr.JSON(),
|
|
)
|
|
<!-- --->
|
|
demo.launch()
|
|
<gradio-requirements>
|
|
transformers-js-py
|
|
</gradio-requirements>
|
|
</gradio-lite>
|
|
|
|
## Conclusion
|
|
|
|
By combining Gradio-Lite and Transformers.js (and Transformers.js.py), you can create serverless machine learning applications that run entirely in the browser.
|
|
|
|
Gradio-Lite provides a convenient method to create an interface for a given Transformers.js pipeline, `gr.Interface.from_pipeline()`.
|
|
This method automatically constructs the interface based on the pipeline's task type.
|
|
|
|
Alternatively, you can define the interface manually using Gradio's regular API, as shown in the second example.
|
|
|
|
By using these libraries, you can build and deploy machine learning applications without the need for server-side Python setup or external dependencies.
|
|
|