在机器学习领域,针对已经训练好的模型创建一个快速的 Demo 通常是必要的,本文针对快速创建机器学习应用的几个框架:gradiostreamitdash 进行简单的对比。

综合比较

gradio streamit dash
主要使用场景 可交互小 Demo 工作流、DashBoard DashBoard、生产环境的复杂演示应用
上手难度 简单 简单 中等
组件丰富度
综合扩展性
Jupyter Notebook 内支持
是否完全开源 部分企业级功能未开源
github stars 13.4k 23.1k 18.2k
案例列表 demos streamit gallery dash gallery

接下来,我们分别结合一定的示例,讲解这三个框架的使用以及各自更加具体的特点。

Gradio

使用

gradio 基于 svelte,它的初步使用非常简单,同时它的自封装组件的功能也相对比较完整,因此可以让开发者专注于编写基于 python 代码的业务处理逻辑,无需关注更多 web 前端页面的实现细节。

例如,我们实现一个简单的图片分类器:

1
2
3
4
5
6
7
8
import gradio as gr

def image_classifier(inp):
# 这里可以写一写实际实现的逻辑
return {'cat': 0.3, 'dog': 0.7}

demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label")
demo.launch()

它的一个演示效果:

这里对于开发者来说,只需要实现 image_classifier 这个 python 函数即可,无需关注图片上传处理、UI 展示等工作。

特点

优点:

  • 组件的封装程度高,并且尤其适合机器学习模型相关的应用,比如 NLP、CV 领域的模型,最近比较火的 stable-diffusion-webui 就是基于 gradio 搭建的,也可以方便地做一个 ChatGPT 的简单对话框。
  • 可以快速创建可共享的链接,从而方便将链接分享给用户。
  • 可以直接在 Jupyter Notebook 中展示。

缺点:

  • 组件的扩展性比较差,如果你想定制一个组件,需要 fork 它的代码,修改源代码从而添加组件,并不支持独立的自定义组件。
  • 使用场景较为简单,如果你有复杂的数据图表展示等需求,使用 gradio 会难以满足。

简单来说,如果你想快速制作一个演示 demo,并且你需要的功能正好 gradio 的官方组件列表中也有现成的组件可用,那么你就可以使用 gradio,否则就不建议使用了。

Streamit

streamit 基于 React ,它的上手使用也非常之简单,也是可以在前后端开发知识为 0 的情况下就可以轻松上手,例如我们通过以下几行代码:

1
2
3
import streamlit as st
x = st.slider("aaappp")
st.write(x, "squared is", x * x)

就可以快速制作一个可交互的滚动条:

特点

优点:

  • 默认组件库更为精细化,并且组件的类型比较多,例如支持更多的可视化展示例如 Matplotlib、Vega Lite (2D charts) 和 deck.gl (maps and 3D charts);数据集本地上传等功能
  • 支持自定义组件以及异步加载,也因此社区组件比较丰富。

缺点:

  • streamit 更加独立,没有办法较好地直接展示在 Notebook 中。
  • streamit 由于更加灵活,并且内置功能较多,完全熟练使用需要一定的时间上手,不如 gradio 简单。

Dash

dash 基于 Plotly.jsReactFlask,因此相对于前两者,它的启动和编码方式更“像”一个 python 后端,也因此代码会稍微多一些。

我们这里依旧展示一个官方提供的最小的 demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from dash import Dash, html, dcc
import plotly.express as px
import pandas as pd

app = Dash(__name__)

df = pd.DataFrame({
"Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"],
"Amount": [4, 1, 2, 2, 4, 5],
"City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"]
})

fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group")

app.layout = html.Div(children=[
html.H1(children='Hello Dash'),
html.Div(children='''
Dash: A web application framework for your data.
'''),
dcc.Graph(
id='example-graph',
figure=fig
)
])

if __name__ == '__main__':
app.run_server(debug=True)

它的一个展示效果:

)

特点

优点:

  • 除了 Python,可以支持、R、Julia 来编写程序。
  • 后端基于 flask,也意味着后端的扩展能力非常强大。
  • 可视化相关的图表支持非常丰富。
  • 可以通过一定的适配,支持在 Jupyter Notebook 中使用。

缺点:

  • 实际上,使用 dash 相当于使用 python 编写 html + 后端,因此代码会比较冗长,同时也不适合网站开发者,和现代的主流前后端开发理念有所违和。
  • 不适合大型项目,通常来说用户响应速度没有 JS 快(因为是纯 python 编写前端)

其他补充

除了以上三种方案,对于更加复杂的企业级应用,一般建议采用前后端分离的应用开发方案,这部分相对来说建议专人负责,本篇就不进行过多介绍了。