本文我们使用 Jupyter Notebook 将开发脚本转化为生产用的应用程序。
部署机器学习模型是开发与实际应用之间的桥梁。虽然数据科学家经常在 Jupyter Notebook 等环境中构建和测试模型,但将这些模型用于生产还需要几个额外的步骤。在本文我们将介绍从 Jupyter Notebook 中获取机器学习模型并将其部署到实时生产环境的完整过程。
为什么要部署模型?
训练机器学习模型只是成功的一半。部署对以下方面至关重要:
- 实现实时预测:想想推荐引擎、欺诈检测或聊天机器人。
- 使模型可访问:允许终端用户或应用程序通过应用程序接口或用户界面与模型进行交互。
今天我们一起探讨一下将机器学习模型从 Jupyter 部署到生产中的关键步骤。
1. 在 Jupyter Notebook中开发和训练模型
Jupyter Notebook 通常是实验和开发的首选环境,因为它允许交互式代码执行、轻松可视化和基于 markdown 的文档。
示例:在 Jupyter Notebook中训练模型
下面是一个在 Jupyter Notebook中构建简单机器学习模型的示例:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# Load sample dataset
df = pd.read_csv('data.csv')
# Split into features and target
X = df.drop('target', axis=1)
y = df['target']
# Train/test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train a Logistic Regression model
model = LogisticRegression()
model.fit(X_train, y_train)
# Evaluate the model
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
至此,模型已在 Jupyter 环境中完成了训练和评估。但在实际使用中,需要采取下一步措施进行部署。
2. 保存训练好的模型
在部署模型之前,需要保存模型,以便将其加载到生产环境中。最常见的方法是使用Pickle或Joblib等库将模型持久化。
示例:保存模型
import joblib
# Save the model to a file
joblib.dump(model, 'logistic_regression_model.pkl')
这会将模型保存到一个文件 (logistic_regression_model.pkl
),以后可以加载该文件进行预测。
3. 选择部署策略
将机器学习模型部署到生产中的方法有很多种,具体取决于你的使用情况和基础设施。以下是一些常见的策略:
A. 基于 REST API 的部署
将模型作为 REST API 部署,其他应用程序或系统就可以向模型发送 HTTP 请求,并获得预测结果。这对网络应用程序、移动应用程序和其他在线系统非常有用。
B. 批量处理
在批处理中,模型会定期在大型数据集上运行(如每天或每周)并输出预测结果,这些预测结果会被存储起来以备后用。这在金融和医疗保健等行业很常见,因为这些行业不需要实时做出决策。
C. 流数据
要对连续到达的数据进行实时预测,可以使用 Apache Kafka 或 Flink 等工具将模型作为流数据管道的一部分进行部署。
4. 将模型作为 REST API 部署
最常见的方法是使用Flask或FastAPI等轻量级网络框架,将模型作为 REST API 提供。
示例:使用 Flask 部署
创建 Flask 应用程序:
首先,创建一个 Python 文件(app.py
)来定义 API 并加载训练好的模型。
from flask import Flask, request, jsonify
import joblib
# Load the trained model
model = joblib.load('logistic_regression_model.pkl')
app = Flask(__name__)
# Define the prediction endpoint
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json() # Get the data sent in the request
prediction = model.predict([data['features']])
return jsonify({'prediction': int(prediction[0])})
if __name__ == '__main__':
app.run(debug=True)
运行 Flask 应用程序:
在本地运行 Flask 应用程序
python app.py
现在,你可以向模型端点 http://localhost:5000/predict
发送请求并获取预测结果。
示例:为预测发出 POST 请求
要进行预测,你可以发送带有 JSON 格式特征的 POST 请求:
curl -X POST http://localhost:5000/predict -H “Content-Type: application/json” -d '{“features”: [5.1, 3.5, 1.4, 0.2]}'
模型将做出预测。
5. 使用 Docker 将应用程序容器化
容器是部署机器学习模型的一种流行方式,因为它们可以在不同环境(本地、暂存、生产)中保持一致。
Docker 化模型的步骤:
- 安装 Docker:确保在机器上安装了 Docker。
- 创建 Dockerfile:这将定义模型的运行环境。下面是一个简单的 “Dockerfile ”示例:
# Use an official Python runtime as a parent image
FROM python:3.9-slim
# Set the working directory
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install the required packages
RUN pip install -r requirements.txt
# Make the port 5000 available to the world outside this container
EXPOSE 5000
# Run app.py when the container launches
CMD ["python", "app.py"]
构建 Docker 映像
docker build -t ml-model-api .
运行 Docker 容器
docker run -p 5000:5000 ml-model-api
你的模型现在运行在 Docker 容器中,可以从任何支持 Docker 的环境中访问。
6. 部署到云平台
模型容器化后,下一步就是将其部署到云平台。有多种云平台可用于部署机器学习模型,例如
- AWS:使用 AWS Elastic Beanstalk、AWS Lambda 或 SageMaker。
- 谷歌云:在 Google Cloud Run 或 AI Platform 上部署。
- Microsoft Azure:使用 Azure ML 或 App Service。
例如,在AWS Elastic Beanstalk上部署容器化模型:
安装 EB CLI
AWS Elastic Beanstalk CLI 有助于创建和管理应用程序。
pip install awsebcli
初始化 EB 环境
eb init
部署应用程序
eb create ml-api-env
访问应用程序
部署完成后,AWS 将提供模型 API 所在的 URL。
7. 监控和更新模型
部署并不是旅程的终点。部署后,你需要监控模型的性能,处理扩展问题,并在新数据可用时定期更新模型。
- 监控:使用监控工具跟踪模型在生产中的性能。你可以监控延迟、错误率和准确性随时间漂移等指标。
- 扩展:如果应用程序需要处理大量请求,Kubernetes 或 AWS Auto Scaling 等自动扩展工具可帮助管理负载。
- 版本控制:保持模型的版本控制。像MLflow和DVC(数据版本控制)这样的工具可以帮助跟踪模型的不同版本,从而在必要时更容易回滚到之前的版本。
写在最后
将机器学习模型从 Jupyter Notebook 部署到生产中,涉及的不仅仅是编写代码,还要确保模型的健壮性、可扩展性和可访问性。通过保存模型、通过 API 提供服务、使用 Docker 对其进行容器化并将其部署到云中,你就可以从实验转向生产就绪的解决方案。通过适当的监控和维护,你的机器学习模型可以在实时环境中为用户提供真正的价值。