在AI模型部署的生命周期中,一个常见挑战是如何让业务分析师或领域专家(非技术用户)能够安全、快速地迭代和测试模型,而无需接触复杂的Python环境或命令行工具。本文将聚焦于利用轻量级Python库Streamlit,结合Scikit-learn,构建一个具备数据上传、模型训练、模型持久化(部署)和实时预测功能的简易Web界面。
Contents
1. 技术栈与环境准备
我们选择 Streamlit 作为前端框架,因为它能将数据科学脚本迅速转化为交互式应用。Scikit-learn 用于模型训练。
依赖安装
首先创建 requirements.txt 文件:
1
2
3
4 streamlit
pandas
scikit-learn
joblib
安装依赖:
1
2 # 建议在虚拟环境中操作
pip install -r requirements.txt
2. 核心后端逻辑:训练与持久化
为了保持界面整洁,我们将模型训练逻辑封装在一个独立的函数中。这个函数接收数据,训练一个分类器(以逻辑回归为例),并使用 joblib 将模型对象保存到本地,模拟“部署”过程。
我们假设用户上传的数据集包含目标变量 target 和特征 feature_1, feature_2。
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
28
29
30
31
32
33
34
35
36
37 # ml_backend.py
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import joblib
import os
MODEL_PATH = "deployed_model.joblib"
def train_and_save_model(data_df):
# 假设特征列和目标列已定义
features = ['feature_1', 'feature_2']
target = 'target'
if not all(col in data_df.columns for col in features + [target]):
return False, "数据格式不正确,缺少必要的特征或目标列。"
X = data_df[features]
y = data_df[target]
# 简单训练
model = LogisticRegression()
model.fit(X, y)
# 保存模型,即完成"部署"
joblib.dump(model, MODEL_PATH)
return True, f"模型训练成功并已保存至 {MODEL_PATH}。"
def load_model_and_predict(input_data):
if not os.path.exists(MODEL_PATH):
return None, "模型尚未训练或部署。"
model = joblib.load(MODEL_PATH)
prediction = model.predict(input_data)
return prediction[0], "预测成功。"
3. 构建Streamlit交互界面(app.py)
我们将界面分为两个主要功能区:训练部署区和实时预测区。
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 # app.py
import streamlit as st
import pandas as pd
import os
from ml_backend import train_and_save_model, load_model_and_predict, MODEL_PATH
st.title("🦜 简易AI模型管理平台")
# --- 训练与部署区域 ---
st.header("1. 模型训练与部署")
uploaded_file = st.file_uploader("请上传训练数据集 (CSV 格式)", type="csv")
if uploaded_file is not None:
try:
data = pd.read_csv(uploaded_file)
st.write("数据预览:", data.head())
if st.button("🔥 开始训练并部署模型"):
with st.spinner('正在进行模型训练和持久化...'):
# 假设用户数据已经包含所需的 feature_1, feature_2, target
# 示例:填充缺失的模拟特征列,以防用户上传的CSV格式不完整
if 'feature_1' not in data.columns: data['feature_1'] = data.iloc[:, 0]
if 'feature_2' not in data.columns: data['feature_2'] = data.iloc[:, 1]
if 'target' not in data.columns: data['target'] = (data.iloc[:, 2] > data.iloc[:, 2].mean()).astype(int)
success, message = train_and_save_model(data)
if success:
st.success(message)
else:
st.error(message)
except Exception as e:
st.error(f"处理文件时发生错误: {e}")
# --- 实时预测区域 ---
st.header("2. 实时模型预测")
if os.path.exists(MODEL_PATH):
st.success(f"✅ 已加载部署的模型 ({MODEL_PATH})")
col1, col2 = st.columns(2)
# 让非技术用户通过滑块或输入框输入特征
feature_1_input = col1.slider("输入特征 1 的值", 0.0, 10.0, 5.0)
feature_2_input = col2.number_input("输入特征 2 的值", min_value=0.0, max_value=100.0, value=50.0)
input_df = pd.DataFrame({
'feature_1': [feature_1_input],
'feature_2': [feature_2_input]
})
if st.button("🚀 进行预测"):
prediction, message = load_model_and_predict(input_df)
if prediction is not None:
result = "是 (1)" if prediction == 1 else "否 (0)"
st.metric(label="预测结果", value=result)
else:
st.warning(message)
else:
st.warning("模型尚未部署,请先在上方区域上传数据并训练模型。")
4. 运行应用
在终端中运行 Streamlit 应用:
1 streamlit run app.py
Streamlit 会自动打开浏览器窗口。现在,非技术用户可以通过以下步骤操作:
- 上传包含 target 变量的CSV文件。
- 点击“开始训练并部署模型”按钮(Streamlit处理了模型训练、序列化和持久化)。
- 在“实时模型预测”区域,通过拖动滑块或输入数值,立即测试新部署模型的性能。
总结与AI Infra思考
这种方法将复杂的模型训练和部署流程抽象成了一个简单的三步点击过程。对于非技术用户而言,他们只需要关注数据格式和预测结果,极大地降低了使用门槛。
虽然本示例使用了简单的文件持久化 (joblib) 作为“部署”,但在生产环境中,此界面可以很容易地扩展,将模型保存到S3、使用MLflow进行版本管理,或者通过调用Kubernetes上的模型服务API(如Triton Inference Server)来实现更健壮的实时预测,但核心的用户体验仍然是通过 Streamlit 提供的交互性界面来实现的。
汤不热吧