一、前言
Gradio提供了直观的用户界面,当与Fastapi结合后,用户可以通过界面轻松地与模型进行交互,上传数据、获取推理结果等,使得交互性增强,提升了用户体验。
在开源大语言模型遍地开花的时代,正确的使用Gradio和Fastapi,通过两者的集成,使得模型的部署和使用过程更加简化和规范化。
二、术语
2.1.Gradio
是一个用于构建交互式界面的Python库。它使得在Python中创建快速原型、构建和共享机器学习模型变得更加容易。
Gradio的主要功能是为机器学习模型提供一个即时的Web界面,使用户能够与模型进行交互,输入数据并查看结果,而无需编写复杂的前端代码。它提供了一个简单的API,可以将输入和输出绑定到模型的函数或方法,并自动生成用户界面。
2.2.Fastapi
FastAPI 是一个用于构建 API 的现代、快速(高性能)的 Python Web 框架。它是基于标准 Python 类型注释的 ASGI (Asynchronous Server Gateway Interface) 框架。
FastAPI 具有以下主要特点:
-
快速: FastAPI 使用 ASGI 服务器和 Starlette 框架,在性能测试中表现出色。它可以与 Uvicorn 一起使用,提供非常高的性能。
-
简单: FastAPI 利用 Python 类型注释,使 API 定义变得简单且直观。开发人员只需要定义输入和输出模型,FastAPI 会自动生成 API 文档。
-
现代: FastAPI 支持 OpenAPI 标准,可以自动生成 API 文档和交互式文档。它还支持 JSON Schema 和数据验证。
-
全功能: FastAPI 提供了路由、依赖注入、数据验证、安全性、测试等功能,是一个功能齐全的 Web 框架。
-
可扩展: FastAPI 被设计为可扩展的。开发人员可以轻松地集成其他库和组件,如数据库、身份验证等。
三、前置条件
3.1. windows or linux操作系统均可
3.2. 创建虚拟环境&安装依赖
conda create --name gradio python=3.10
conda activate gradio
pip install gradio fastapi uvicorn
四、技术实现
4.1. 使用Gradio实现小Demo
import gradio as gr
def greet(name):
return "Hello " + name + "!"
with gr.Blocks() as demo:
#设置输入组件
name = gr.Textbox(label="Name")
# 设置输出组件
output = gr.Textbox(label="Output Box")
#设置按钮
greet_btn = gr.Button("Greet")
#设置按钮点击事件
greet_btn.click(fn=greet, inputs=name, outputs=output)
if __name__ == '__main__':
demo.launch(server_name='0.0.0.0',server_port=8000)
调用结果:
4.2. 错误集成Gradio和Fastapi
先启动gradio
import gradio as gr
def greet(name):
return "Hello " + name + "!"
with gr.Blocks() as demo:
#设置输入组件
name = gr.Textbox(label="Name")
# 设置输出组件
output = gr.Textbox(label="Output Box")
#设置按钮
greet_btn = gr.Button("Greet")
#设置按钮点击事件
greet_btn.click(fn=greet, inputs=name, outputs=output)
if __name__ == '__main__':
demo.launch(server_name='0.0.0.0',server_port=8000)
再启动Fastapi,端口还被Gradio占用了,只能改端口咯
import uvicorn
from fastapi import FastAPI
import gradio as gr
fastapi_app = FastAPI()
@fastapi_app.get("/chat")
def read_main():
return {"message": "This is your main app"}
if __name__ == '__main__':
uvicorn.run(fastapi_app, host='0.0.0.0', port=8001)
调用结果:
Fastapi正常返回接口内容
gradio正常交互
4.3. 正确集成Gradio和Fastapi
import uvicorn
from fastapi import FastAPI
import gradio as gr
fastapi_app = FastAPI()
@fastapi_app.get("/chat")
def read_main():
return {"message": "This is your main app"}
def greet(name):
return "Hello " + name + "!"
with gr.Blocks() as demo:
#设置输入组件
name = gr.Textbox(label="Name")
# 设置输出组件
output = gr.Textbox(label="Output Box")
#设置按钮
greet_btn = gr.Button("Greet")
#设置按钮点击事件
greet_btn.click(fn=greet, inputs=name, outputs=output)
if __name__ == '__main__':
app = gr.mount_gradio_app(fastapi_app, demo, path="/gr")
uvicorn.run(fastapi_app, host='0.0.0.0',port=8000)
调用结果:
Fastapi正常返回接口内容
gradio正常交互
PS:
各位老铁,千万不要认为上述Demo很简单,万丈高楼平地起,任何复杂的代码都是通过简单的开始逐步演化而来。后面我们将把模型推理集成到上述的代码中。
五、附带说明
5.1. 问题:gradio交互失败,请求/run/predict地址,并返回422状态码
原因:Gradio版本太低,建议更新至最新版本,本章示例使用gradio-4.31.5版本