第2章(3)------Gradio三类部署方式
-
- [2.4 launch()本地部署](#2.4 launch()本地部署)
-
- [2.4.1 局域网与互联网分享](#2.4.1 局域网与互联网分享)
- [2.4.2 密码保护与登录退出](#2.4.2 密码保护与登录退出)
- [2.5 Hugging Face Spaces与魔塔创空间托管](#2.5 Hugging Face Spaces与魔塔创空间托管)
- [2.6 FastAPI挂载](#2.6 FastAPI挂载)
2.4 launch()本地部署
本节开始介绍三种常用的部署方式。第一种方法launch()将启动一个简单的Web服务器演示应用,执行成功后返回三个值:①App,为Gradio演示提供支持的FastAPI应用程序;②local_url,应用本地访问地址;③share_url,可选公开访问地址,当share=True时生成。launch()可接受多个部署参数,下面分别演示。
2.4.1 局域网与互联网分享
在启动Gradio应用,可根据需要选择分享在局域网或互联网。
局域网分享:不带参数的launch()默认提供的是形如http://127.0.0.1:7860的局域网地址,但可以通过设置参数server_name(localhost:命令cat /etc/hosts可查看)与server_port进行更改,方法如代码2-2所示:
代码2-2
python
import gradio as gr
def greet(name):
return "Hello " + name + "!!!!"
demo = gr.Interface(fn=greet, inputs="textbox", outputs="textbox")
if __name__ == "__main__":
demo.launch(server_name='127.0.0.1', server_port=7861) # share=True
互联网分享:如果希望向外网提供Gradio应用的访问地址,只需设置launch()的参数share=true即可。运行程序后,Gradio的服务器会提供形式为xxx.gradio.app的外网url,同时提供本地url。这种方式下,外网链接只是本地服务器的代理,不会存储向该链接发送的任何数据。在旧版Gradio首次运行时,会出现错误提示,要求下载并重命名文件frpc_linux_amd64(Linux)或frpc_windows_amd64(Windows),按照提示操作即可。操作成功后,运行提示如下:
bash
* Running on local URL: http://127.0.0.1:7860
* Running on public URL: https://105f76ea6b299b400e.gradio.live
This share link expires in 1 week. For free permanent hosting and GPU upgrades, run `gradio deploy` from the terminal in the working directory to deploy to Hugging Face Spaces (https://huggingface.co/spaces)
此时演示返回了局域网URL和互联网URL,其中公共链接在一周内是免费的,优点是不需要自己搭建服务器,坏处就是速度慢,毕竟数据经过别人的服务器。对于产品级项目,也可以部署到Hugging Face并升级付费,解锁永久链接。作为共享链接的替代方案,还可以使用SSH端口转发与特定用户共享本地服务器,感兴趣的读者可参考:What Is SSH Port Forwarding, aka SSH Tunneling?🖇️链接2-8。
2.4.2 密码保护与登录退出
应用部署后,当需要密码保护验证时,如何操作登录和退出呢?
有时需要添加一个认证页面,以限制哪些用户可以打开应用,这可以通过设置参数auth实现。auth格式是一个包含用户名与密码的元组,或者一个用户名与密码的元组列表,比如:demo.launch(auth=[("Abubakar", "Abubakar"), ("Ali", "Ali")])。
还有两点需要注意:①对于更复杂的认证处理,可以传递一个函数,该函数接受用户名和密码进行验证,并返回True以允许访问,否则返回False;②当有多个用户时,可能希望根据登录的用户自定义显示内容,这可以通过直接访问网络请求组件gr.Request来检索登录的用户,然后由gr.Request的属性username设置显示内容。两者示例如代码2-3所示:
代码2-3
python
import gradio as gr
# 获取用户信息
def update_message(request: gr.Request):
return f"Welcome, {request.username}"
with gr.Blocks() as demo:
m = gr.Markdown()
logout_button = gr.Button("Logout", link="/logout")
demo.load(update_message, None, m)
# 账户和密码相同就可以通过
def same_auth(username, password):
return username == password
demo.launch(auth=same_auth,
auth_message="username and password must be the same")
用户通过认证后,由gr.Blocks的函数load()在加载页面,根据请求读取用户信息,从而显示欢迎消息。注意:为了使认证功能正常工作,浏览器中必须启用第三方Cookie。但Safari或Chrome的无痕模式(Incognito Mode)下,默认不启用此功能。
如果用户访问Gradio应用的/logout页面,将自动注销用户会话,并且会话Cookie将被删除,这可以为Gradio应用添加注销功能。定义一个退出按钮并设置其属性link为/logout,同时设置auth为元组列表,界面如图2-9所示:

图2-9
当输入正确账户密码后,会出现欢迎消息。单击按钮"Logout"将回到登录界面。默认情况下,访问/logout会将用户从多个浏览器或设备的所有会话中注销。如果只想从当前会话注销,请添加查询参数all_session=false(即/logout?all_session=false)。提示:Gradio的内置认证只提供了一个简单的基础访问控制层,对于需要严格访问控制的应用(例如多因素认证、速率限制或自动锁定策略)并不适用。
此外,launch()还有其他参数:①inline:是否在同一iframe内展示Gradio应用;②inbrowser:是否在新标签页打开Gradio应用;③debug:阻塞运行中的主线程进入调试模式,如果运行在Notebook则将错误信息打印在输出单元;④show_error:表示在控制台显示错误信息;⑤favicon_path:设置网页图标目录;⑥footer_links = ["api", "gradio", "settings"]:在应用页脚显示API帮助文档、使用Gradio构建、设置;⑦ssl_verify:是否使用自签名的证书验证。
2.5 Hugging Face Spaces与魔塔创空间托管
Hugging Face Spaces。为了便于向合作伙伴永久展示模型,可以将模型以Gradio的形式托管到Hugging Face的Spaces进行部署,虽然免费但需要定期激活。操作步骤如下:
-
首先打开Hugging Face的Spaces(🖇️链接2-9)并登录,然后单击Create new Space,如图2-10所示:

图2-10
-
创建Space界面的操作步骤如下:
① 选择创建者,然后填写Space名称简短描述后选择License,根据项目而定。
② Space SDK选为Gradio,对应的Gradio模板根据项目任选或为Blank。
③ Space hardware选择免费版即可,不过免费版在两天闲置后就会陷入休眠,如长期使用可升级为收费版硬件。
④ Space Dev Mode为开启SSH远程登录,为Pro用户特选,此处可不予理会。
⑤ 操作权限根据提示和自己需要选择,此处选为Public。
-
最后单击Create Space即可创建。如果选择为Blank,此时没有文件app.py。单击右上角的Files->+ Contribute->create a new file来添加文件,填写代码或导入项目文件即可,如图2-11所示:

图2-11
最后单击"Commit new file to main",等待启动。如果有依赖库,请创建requirements.txt文件并写入依赖库,上传文件后应用自动重启。环境变量在Settings -> Variables and secrets设置,并通过os.getenv('MODEL_REPO_ID')获取。启动完成后,单击右上角"App",就可以看到Gradio程序已部署成功。
魔塔创空间 。ModelScope(🖇️链接2-10)旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单。他提供模型、数据集、服务部署等功能,可以方便的进行模型、模型推理的部署应用。其中创空间主要就是进行模型推理和部署,类似Spaces功能。本书的Gradio应用均可部署在魔塔创空间,推荐国内优先选择。创建界面如图2-12所示:

图2-12
填写上图必要信息,并下滑选择接入SDK(Gradio、StreamLit、Static-HTML或Docker),选择关联云资源及镜像版本后,即可单击"创建创空间"完成创建。随后单击创空间页面右上角的空间文件->添加文件,添加app.py和requirements.txt等文件即可启动创空间。在设置界面可设置环境变量。
2.6 FastAPI挂载
除了自己启动Gradio程序,还可以将Gradio创建的网页挂载到FastAPI应用服务器。FastAPI是一个现代、快速的Web框架,它开箱即用,基于Python标准类型构建API,支持通过Swagger UI使用OpenAPI标准自动生成API文档。
本节将使用uvicorn运行FastAPI应用,采用Gradio创建演示Web界面,并通过gr.mount_gradio_app()挂载到FastAPI应用。如代码2-4所示:
代码2-4
python
# main.py
from fastapi import FastAPI
import uvicorn
import gradio as gr
CUSTOM_PATH = "/gradio"
FA = FastAPI()
@FA.get("/")
def read_main():
return {"message": "This is your main app"}
def greet(name):
return "Hello, " + name + "!"
io = gr.Interface(greet, "textbox", "textbox")
# Mount the Gradio interface onto the FastAPI app and set the path
app = gr.mount_gradio_app(FA, io, path=CUSTOM_PATH)
# Run this from the terminal: `uvicorn main:FA`
if __name__ == "__main__":
uvicorn.run(FA, host="127.0.0.1", port=8000)
代码中,首先定义Gradio访问路径和FastAPI应用FA,然后定义装饰器函数函数read_main、预测函数greet和界面组件io,接着通过函数mount_gradio_app()将io挂载到FA(挂载路径为CUSTOM_PATH)形成新的应用,该应用的根目录通过装饰器指向read_main。最后通过uvicorn运行FA。
注意:①新应用app中包含两个应用,一个是主应用FA,另一个是挂载在FA上的io,所以应启动主应用FA而不是app或io;②命令中main是程序文件的名称。
接下来运行它。首先打开终端,在当前环境下安装fastapi和uvicorn,在程序文件所在目录输入命令后,输出如下所示:
bash
$ uvicorn main:FA
INFO: Started server process [32710]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
此时访问提示信息中的地址即可得到主页信息,如图2-13所示:

图2-13
