Spaces:
Runtime error
Runtime error
# 「streamlit」快速搭建你的算法demo | |
在搭建demo之前,首先得做好这些准备工作: | |
- 模型训练完毕 | |
- 模型的入参确定 | |
- 安装streamlit库,`pip install streamlit` 就可以安装。 | |
streamlit脚本的启动方式是 `streamlit run demo.py`,很简单就启动了一个demo页面,页面会随着脚本代码的改变实时刷新的。所以在没有经验的时候,可以创建一个demo.py的文件,照着下面的教程一步一步添加代码,看页面的展示情况。下面开始上干货,具体细节在代码注释中有说明! | |
### 第一步 导包 | |
```python | |
import streamlit as st | |
# 其他包更具你的需要导入 | |
``` | |
[streamlit](https://streamlit.io)是一个用于构建机器学习、深度学习、数据可视化demo的python框架。它不需要你有web开发的经验,会写python就可以高效的开发你的demo。 | |
### 第二步 页面导航信息以及布局配置 | |
```python | |
st.set_page_config( | |
page_title="余元医疗问答", # 页面标签标题 | |
page_icon=":shark:", # 页面标签图标 | |
layout="wide", # 页面的布局 | |
initial_sidebar_state="expanded", # 左侧的sidebar的布局方式 | |
# 配置菜单按钮的信息 | |
menu_items={ | |
'Get Help': 'https://www.extremelycoolapp.com/help', | |
'Report a bug': "https://www.extremelycoolapp.com/bug", | |
'About': "# This is a header. This is an *extremely* cool app!" | |
} | |
) | |
``` | |
这一步可以省略,如果想让app更加个性化,可以添加这些设置。 | |
### 第三步 设置demo标题 | |
```python | |
st.title('Demo for MedicalQA') | |
``` | |
streamlit的每一个小组件对应于页面都有一个默认的样式展示。 | |
### 第四步 配置demo的参数 | |
```python | |
# 此处是用的sidebar,侧边栏作为参数配置模块 | |
st.sidebar.header("参数配置") | |
# 这里是在sidebar里面创建了表单,每个表单一定有一个标题和提交按钮 | |
sbform = st.sidebar.form("固定参数设置") | |
# slider是滑动条组建,可以配置数值型参数 | |
n_sample = sbform.slider("设置返回条数",min_value=1,max_value=10,value=3) | |
text_length = sbform.slider('生成长度:',min_value=32,max_value=512,value=64,step=32) | |
text_level = sbform.slider('文本多样性:',min_value=0.1,max_value=1.0,value=0.9,step=0.1) | |
# number_input也可以配置数值型参数 | |
model_id = sbform.number_input('选择模型号:',min_value=0,max_value=13,value=13,step=1) | |
# selectbox选择组建,只能选择配置的选项 | |
trans = sbform.selectbox('选择翻译内核',['百度通用','医疗生物']) | |
# 提交表单的配置,这些参数的赋值才生效 | |
sbform.form_submit_button("提交配置") | |
# 这里是页面中的参数配置,也是demo的主体之一 | |
form = st.form("参数设置") | |
# 本demo是qa demo,所以要录入用户的文本输入,text_input组建可以实现 | |
input_text = form.text_input('请输入你的问题:',value='',placeholder='例如:糖尿病的症状有哪些?') | |
form.form_submit_button("提交") | |
``` | |
以上就把demo的参数基本配置完成了。 | |
### 第五步 模型预测 | |
```python | |
# 定义一个前向预测的方法 | |
# @st.cache(suppress_st_warning=True) | |
def generate_qa(input_text,n_sample,model_id='7',length=64,translator='baidu',level=0.7): | |
# 这里我们是把模型用fastapi搭建了一个api服务 | |
URL = 'http://192.168.190.63:6605/qa' | |
data = { | |
"text":input_text,"n_sample":n_sample, | |
"model_id":model_id,"length":length, | |
'translator':translator,'level':level | |
} | |
r = requests.get(URL,params=data) | |
return r.text | |
# 模型预测结果 | |
results = generate_qa(input_text,n_sample,model_id=str(model_id), | |
translator=translator,length=text_length,level=text_level) | |
``` | |
这里说明一下,由于demo展示机器没有GPU,所以模型部署采用的是Fastapi部署在后台的。如果demo展示的机器可以直接部署模型,这里可以直接把模型预测的方法写在这里,不需要另外部署模型,再用api的方式调用。这样做有一个值得注意的地方,因为streamlit的代码每一次运行,都是从头到尾执行一遍,就导致模型可能会重复加载,所以这里需要用到st.cache组建,当内容没有更新的时候,会把这一步的结果缓存,而不会重新执行。保证了效率不会因此而下降。 | |
### 第六步 结果展示 | |
```python | |
with st.spinner('老夫正在思考中🤔...'): | |
if input_text: | |
results = generate_qa(input_text,n_sample,model_id=str(model_id), | |
translator=translator,length=text_length,level=text_level) | |
for idx,item in enumerate(eval(results),start=1): | |
st.markdown(f""" | |
**候选回答「{idx}」:**\n | |
""") | |
st.info('中文:%s'%item['fy_next_sentence']) | |
st.info('英文:%s'%item['next_sentence']) | |
``` | |
streamlit对不同格式的内容展示,有丰富的组建,对于文本可以用`st.markdown`组建以及`st.text`和`st.write`展示。更多组建和功能可以参考官方文档:https://docs.streamlit.io | |
至此,一个完整的demo展示就完成了。效果图如下: | |
 | |
完整的代码可以参考:`Fengshenbang-LM/fengshen/examples/FastDemo/YuyuanQA.py` | |