我用 Gradio 给模型做界面的一点经验,顺带聊聊和 Streamlit、Dash 怎么选
训完模型之后最尴尬的一刻,是别人问你"能给我看看效果吗",而你只能让他去看一坨命令行输出。Gradio 就是用来填这个坑的:它是个开源的 Python 库,几行代码就能给机器学习模型、API 或者任意一个 Python 函数套上界面,还不用写一句 HTML / CSS / JS。
它是 Hugging Face 出的,跟 HF 生态贴得特别近------这也是后面选型的一个关键考量。

装好、跑起来
Python 3.10 以上,pip 安装:
bash
pip install gradio
最小例子:
python
import gradio as gr
def greet(name):
return f"Hello {name}!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()
跑起来终端会给一个本地地址,默认 http://127.0.0.1:7860。
但只这么 launch 其实不够用,几个参数值得一开始就记住:
server_name="0.0.0.0":默认只绑定本机,别人访问不了你的局域网地址。你在一台服务器上跑,同事想从自己机器打开,必须加这个。server_port=xxxx:7860 被占了就换。inbrowser=True:启动后自动弹浏览器,省得手动复制地址。share=True:生成一个公网临时链接,后面单独说它的坑。
Interface 够用就用 Interface
gr.Interface 是我用得最多的:一个函数配一组输入输出,完事。它内部其实是 Blocks 的封装,你只关心"进什么、出什么"就行。
多个输入也简单:
python
demo = gr.Interface(
fn=greet,
inputs=[gr.Textbox(label="你的名字"), gr.Slider(label="热情程度", minimum=1, maximum=5)],
outputs="text"
)
什么时候该从 Interface 换到 Blocks?我的判断标准是:一旦你发现"一个函数、一组进出"表达不了你的需求------比如要多个按钮触发不同逻辑、要分栏布局、要做多步状态------就上 Blocks。日常 80% 的情况 Interface 能扛住,别一开始就上 Blocks 搞复杂了。
python
with gr.Blocks() as demo:
gr.Markdown("# 我的第一个 Blocks 应用")
with gr.Row():
with gr.Column():
text_input = gr.Textbox(label="输入文本")
btn = gr.Button("提交")
with gr.Column():
text_output = gr.Textbox(label="输出结果")
btn.click(fn=greet, inputs=text_input, outputs=text_output)
慢推理一定要加 queue,否则会被并发拖垮
这是我最开始踩的坑。模型推理要几秒钟,界面看起来"没反应",而且多个人同时点,后端直接乱套。解法是在 launch() 之前加一行:
python
demo.queue()
demo.launch()
queue() 开启之后,请求会排队处理,状态条会显示"排队中",不会再出现"点了没反应、连点几次"的体验问题;concurrency_count 参数还能控制同时处理几个请求。如果你的模型推理明显耗时,这行千万别省。
顺带一提:如果你的模型是逐字生成的(比如 LLM 流式输出),把处理函数写成 generator、配合合适组件就能边生成边出字,这块儿 Gradio 的聊天组件支持得不错。真要往聊天机器人方向做,直接看 gr.ChatInterface,比手动拿 Blocks 拼省事得多。
常见组件
列张表,用到再回来查:
| 类型 | 组件 |
|---|---|
| 输入 | Textbox(文本)、Number(数字)、Slider(滑块)、File(文件)、Image(图像)、Audio(音频)、Video(视频)、Checkbox(复选框)、Radio(单选) |
| 输出 | Textbox(文本)、Label(标签/分类结果)、Number(数字)、Image(图像)、Audio(音频)、Video(视频) |
| 布局与展示 | Markdown(渲染Markdown)、HTML(渲染HTML)、Row(水平布局)、Column(垂直布局)、Button(按钮) |
再进阶一点的话:继承基类自定义组件、重写 preprocess / postprocess 控制数据进出;或者塞自己的 CSS / JS 改样式加动画。日常用不太到,知道有这回事就行。
share=True 的坑
share=True 的原理是搞一个反向隧道,把本地的 7860 暴露到公网,链接 72 小时有效。很方便,但有三个实际情况要知道:
- 它依赖外部 frpc 隧道服务,公司内网、防火墙严的环境可能直接连不上------这时候别死磕,直接用内网
server_name或者干脆部署到 Spaces。 - 链接是临时的,每次启动都变,不适合当正式地址发人。
- 要长期给团队或客户用,老实推到 Hugging Face Spaces,免费、一直在线,这是 Gradio 最顺手的归宿。

三件套到底怎么选
Streamlit、Gradio、Dash 经常被放一起比,但它们的初心根本不是一回事。Streamlit 面向数据分析师"脚本即应用",Gradio 面向"给模型做个能分享的 demo",Dash 面向"正经生产级分析应用"。
| Streamlit | Gradio | Dash | |
|---|---|---|---|
| 定位 | 数据应用快速开发 | 模型演示、快速原型 | 企业级分析 Web 应用 |
| 上手难度 | 很低 | 很低 | 中到高 |
| 开发速度 | 快(1--3 天) | 快(1--2 天) | 慢(1--2 周) |
| 交互方式 | 脚本自上而下重跑 | 事件驱动 | 显式回调 |
| 可视化与定制 | 组件生态还不错 | 偏 AI 输入输出 | 强,基于 Plotly |
| 规模 | 中小型 | 单模型演示 | 大型、复杂 |
| 部署 | Community Cloud 一键 | Hugging Face Spaces 免费 | 自己搭服务器 |
我实际做的判断通常是这样的:
- 要快速把一个数据分析脚本变成仪表盘、或者团队全是数据背景不想碰前端,用 Streamlit。它的心智模型是"从头跑一遍",简单,但复杂交互和性能上会有上限。
- 要给别人看模型效果、尤其大模型,还要一键发公网链接,用 Gradio。这基本是它的甜点区,跟 HF 生态是绑定的。
- 只有当应用要交付客户、要长期维护、要对布局交互有完全控制,或者数据量大到百万行级的时候,才轮到 Dash。为了一个 demo 上 Dash,纯属杀鸡用牛刀。
一句话:图快用 Streamlit,给模型做 demo 用 Gradio,交付生产用 Dash。只想让人玩一下你的模型,Gradio 就够了,而且它大概率比你想的更省事。
参考
- Gradio 文档:https://www.gradio.app/docs
- Streamlit:https://streamlit.io
- Dash:https://dash.plotly.com
- Hugging Face Spaces:https://huggingface.co/spaces