如何部署机器学习模型?
近年来,机器学习和人工智能大受欢迎。这可能归功于自然语言处理和推荐系统的进步。
本文将介绍机器学习及其应用、部署选项,并演示如何在Back4app 容器中部署一个简单的机器学习模型。
什么是机器学习?
机器学习是人工智能的一个子领域。其核心是利用统计算法从数据中学习,并对新的、未见过的数据进行预测。
换句话说,它赋予了计算机在没有明确编程的情况下进行学习的能力。
虽然机器学习和人工智能经常被交替使用,但它们并不相同。
机器学习侧重于算法和数据结构,而人工智能则是创造能够像人类一样思考的机器的一种普遍尝试。
典型的机器学习技术有回归(预测连续值,如房价)和分类(从有限的类别集合中预测类别,如电影类型)。
一般来说,我们可以将机器学习分为三种类型:
- 监督学习— 算法使用贴有标签的数据集进行学习。数据集中的每个示例都包含一个标签(或所谓的目标变量)。算法利用这些标签来预测未见示例的标签。监督学习算法包括 kNN、decision trees等。
- 无监督学习— 算法在没有任何明确指导的情况下进行学习。由算法来发现数据中的模式,并据此做出预测。例如,K-均值聚类算法。
- 强化学习— 算法通过试错来学习。它们通常以奖励为基础,算法的目标是使奖励最大化。例如:遗传算法。
在文章的实践部分,我们将经历一个典型的模型构建过程。我们将使用监督学习来解决分类任务。
机器学习应用
让我们来看看现实世界中的一些机器学习应用!
推荐系统
推荐系统建议用户消费哪些物品(电影、产品等)。这些系统可以是基于内容的,也可以是基于协作的。
如今,几乎每家公司都在使用重新推荐系统。它们使公司能够提高业务成功率、创造更多需求、提高用户参与度、了解客户等。
例如,Netflix 利用它们来推荐电影,Spotify 利用它们来推荐歌曲,YouTube 则根据你的兴趣推荐你应该观看的视频。
自然语言处理(NLP)
自然语言处理(NLP)使计算机能够处理和理解人类语言。自然语言生成(NLG)使计算机能够生成人类语言。
聊天机器人、语言翻译工具、情感分析工具等都在使用这项技术。ChatGPT就是利用 NLP 和 NLG 的最著名例子之一。
想了解有关 ChatGPT 的更多信息?查看我们的另一篇文章《如何使用 ChatGPT 创建应用程序?
计算机视觉与图像识别
计算机视觉赋予计算机 “看见 “和 “理解 “图像和视频的能力。它使计算机能够进行(实时)分割,识别物体、人脸甚至情绪。
这是照片应用程序用来自动标记朋友的技术。此外,它还被监控系统用来检测可疑行为。
欺诈检测
企业利用机器学习来检测交易或用户行为中的可疑活动。这些系统可以通过研究趋势和异常现象发现潜在的欺诈行为,保护企业和客户免受欺诈和网络犯罪的侵害。
自动驾驶汽车
汽车自动驾驶是较为复杂的机器学习问题之一。它结合了计算机视觉、异常检测、行为预测、路径规划等多种应用。
在撰写本报告时,我们离完全自动驾驶汽车还很遥远。目前的 “自动驾驶 “汽车只能在有限的地理区域内正常行驶。
机器学习部署选项
要部署机器学习模型,通常需要从网络应用程序中为其提供服务。因此,机器学习模型的部署选项实际上与部署网络应用程序的选项相同。让我们来看看它们!
企业内部
内部部署需要在公司的实际场所托管和管理服务器和存储设备等 IT 设备。
这种传统战略需要对硬件和软件进行大量的初始投资,并需要持续的维护和支持。
其优点包括更高水平的控制和安全性,以及更方便的定制。另一方面,其缺点是成本、可扩展性和维护。
云
相比之下,云部署采用第三方服务,通过互联网托管基础设施和应用程序。
这种模式允许用户为云计算服务提供商处理的可扩展资源和服务按需付费。
其优点包括可扩展性、易用性和无前期成本。另一方面,其缺点是控制水平较低、灵活性较差,而且可能被供应商锁定。
云平台的例子包括
- Back4app
- Amazon Web Services (AWS)
- Google Cloud Platform (GCP)
- Microsoft Azure
流行的机器学习算法
流行的机器学习算法有
- k-Nearest Neighbours (kNN)
- Decision Trees & Random Forests
- Support Vector Machines (SVM)
- Linear Regression
- Naive Bayes
- K-means
在实际例子中,我们将使用 k 近邻。
如何部署机器学习模型?
在本节文章中,我们将构建一个机器学习模型,使用 FastAPI 为其提供服务,对其进行 dockerize,最后将其部署到Back4app Containers 中。
先决条件
- 机器学习基础知识
- 具有使用 Python 和 FastAPI 的经验
- 基本了解 Docker 和容器技术
- 在本地计算机上安装 Git 和 Docker Desktop
项目概述
在演示如何部署机器学习模型之前,我们先建立一个模型。我们将使用流行的虹膜数据集创建一个简单的kNN 分类器。该模型的目的是根据不同的特征预测观察结果是 “setosa”、”versicolour “还是 “virginica”。
然后,我们将把模型保存到文件中,加载到 FastAPI 中,并通过端点提供服务。之后,我们将对应用程序进行 dockerize,将其推送到 GitHub,并部署到 Back4app Containers。
创建模型
为了创建模型,我们将使用Jupyter Notebooks。您可以在本地计算机上安装 Jupyter或免费使用Google Colab。
首先创建一个新的 Jupyter 笔记本。
本文中的每个代码块都代表一个 Jupyter 单元。您可以通过菜单或使用 “B “键绑定(在命令模式下)创建它们。
此外,别忘了运行它们(从菜单或使用 “ALT + ENTER”)。
在第一个单元格中添加以下导入内容:
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from joblib import dump
加载数据集
Scikit-learn 默认包含虹膜数据集。你只需调用load_iris()
函数,将对象转换为帧即可。
创建一个新单元格:
df = load_iris(as_frame=True)["data"]
df["target"] = load_iris(as_frame=True)["target"]
加载 Iris 数据集时,数据集会按照目标变量排序。这并不好,因为我们的机器学习模型在训练阶段可能只看到某些类型的示例。例如,只看到 “setosa “和 “versicolour”。
为了避免这个问题,我们可以进行洗牌:
df = df.sample(frac=1, random_state=42)
random_state
属性用于提高可重复性。您可以使用任何您想要的数字。
探索数据集
在创建模型之前,最好先了解一下要处理的数据。为此,您可以使用 Pandas 内置函数,如head()
、describe()
等。
# Displays the first five rows of the dataset
df.head(5)
# Generates descriptive statistics
df.describe()
此外,您还应该对数据集进行可视化处理,以找出哪些特征最能区分示例,哪些机器学习算法对您的问题有用。
上图借自《Python 数据可视化指南》一文。请务必查看,了解有关数据可视化的更多信息。
图像显示,”红 “点与其他两个点是可以线性分离的。而 “蓝 “点和 “绿 “点则不能线性分离。
分割数据集
接下来,我们来定义特征(预测因子)和目标变量:
features = [
"sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"
]
target = "target"
然后将其提取为X
(特征数据)和y
(目标变量数据),并对其进行拆分测试训练:
X = df[features].values
y = df[target].values
dev_X, test_X, dev_y, test_y = train_test_split(X, y, test_size=0.25, random_state=42)
使用test_size=0.25
时,25% 的数据集用于测试,而 75% 的数据集用于训练。
建立模型
接下来,创建一个管道,首先对数据进行缩放,然后使用 kNN 分类器:
knn = Pipeline(steps=[
("scaler", StandardScaler()),
("predictor", KNeighborsClassifier()),
])
knn.fit(dev_X, dev_y)
要了解为什么缩放至关重要,请参阅本文。
然后使用 10 倍交叉验证,检查验证误差:
cross_val_score(knn, dev_X, dev_y, cv=10, scoring="accuracy").mean()
# 0.9363636363636362
在测试集上评估模型:
accuracy_score(test_y, knn.predict(test_X))
# 0.9736842105263158
验证精度和测试精度基本相当。这表明我们的模型没有欠拟合或过拟合。
保存模型
最后,使用所有数据重新训练模型,并将其保存为model.pkl文件:
knn.fit(X, y)
dump(knn, "model.pkl")
如果您使用的是 Google Colab,请下载model.pk文件,因为下一步我们会用到它。
服务模式
如前所述,我们将使用 FastAPI 为模型提供服务。
继续创建一个新的 FastAPI 项目,然后像这样替换main.py:
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {
"name": "back4app-deploy-ml-model",
"description": "A FastAPI app serving an ML model",
"version": "1.0.0",
}
启动开发服务器
$ uvicorn app.main:app --reload
导航至http://localhost:8000/,应该会得到以下回复:
{
"name": "back4app-deploy-ml-model",
"description": "A FastAPI app serving an ML model",
"version": "1.0.0"
}
负载模式
接下来,让我们加载模型并定义model_classes
。
首先将上一步中的model.pkl复制到项目根目录。然后加载模型,并像这样在初始化 FastAPI 应用程序时定义类:
# ...
model = load("model.pkl")
model_classes = {
0: "setosa",
1: "versicolor",
2: "virginica",
}
# ...
我们将使用model_classes
将目标变量从数字转换为文本。
负载模式
然后创建/predict
端点,接收特征并使用加载的模型进行预测:
# main.py
# ...
class Observation(BaseModel):
"""
A Pydantic model for the observation data.
This is our ML model's input data.
"""
sepal_length: float
sepal_width: float
petal_length: float
petal_width: float
@app.post("/predict")
async def predict(observation: Observation):
predictions = model.predict([[
observation.sepal_length,
observation.sepal_width,
observation.petal_length,
observation.petal_width,
]])
prediction = predictions[0]
prediction_class = model_classes[prediction]
return {
"prediction": int(prediction),
"prediction_class": prediction_class,
}
端点会返回数字预测和用户友好型测试预测。
不要忘记文件顶部的导入:
from joblib import load
from pydantic import BaseModel
最终的main.py应该是这样的。
重新启动开发服务器,并在最喜欢的网络浏览器中导航至http://localhost:8000/docs。FastAPI 会自动为您的所有端点生成交互式文档。
通过提交这样的请求来测试模型:
太好了,我们的网络应用程序现在可以完全正常运行了!
Dockerize 应用程序
在本节中,我们将对网络应用程序进行 docker 化。我们将创建一个Dockerfile并配置.dockerignore文件。
Dockerfile
Dockerfile 是一个文件,其中包含 Docker 引擎构建镜像所需的说明。
这些操作通常包括传输文件、定义基本映像、配置工作目录、运行自定义命令等。
Dockerfile 命令通常以大写字母书写,后面直接跟上相应的参数。
<COMMAND> <arg1> <arg2> ... <arg_n>
# Example
WORKDIR /app
访问Dockerfile 参考资料,了解有关所有说明的更多信息。
在项目根目录下创建一个Dockerfile:
# Dockerfile
# Set the base image
FROM python:3.12.2-alpine3.19
# Install the required dependencies (gcc)
RUN apk add build-base
# Set the working directory
WORKDIR /app
# Confingure Python using environmental variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Copy the requirements file into the image and install them
COPY ./requirements.txt .
RUN pip install --no-cache-dir --upgrade pip
RUN pip install --no-cache-dir --upgrade -r ./requirements.txt
# Copy the source code into the image
COPY . .
# Expose the port
EXPOSE 8000
# Start the Uvicorn server
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
.dockerignore
使用 Docker 时,您需要创建尽可能小的映像。
减少镜像大小的一种方法是使用.dockerignore文件。这个文件的作用类似于.gitignore文件。它允许你省略不需要包含在镜像中的文件。
在项目根目录下创建.dockerignore:
.git/
.idea/
__pycache__/
venv/
create_model.ipynb
确保根据项目要求调整.dockerignore文件(例如,如果使用不同的集成开发环境)。
构建、运行、测试
在将镜像推送到云端之前,最好先在本地进行测试。
要继续学习,你需要在机器上安装Docker Desktop。
打开终端,检查当前安装的映像:
$ docker images
接下来,使用Dockerfile 构建镜像:
$ docker build -t iris-webapp:1.0 .
Docker 构建镜像需要相当长的时间。这主要是因为 Scikit-learn 并未针对 Docker 容器进行优化。请随意喝杯咖啡休息一下。
命令执行完毕后,重新检查镜像。新构建的映像应该就在那里。
最后,使用映像创建一个新容器:
$ docker run -p 8000:8000 --name iris-webapp iris-webapp:1.0
就是这样!
您的网络应用程序现在已经容器化了。它应该可以在http://localhost:8000/上访问,工作方式也和以前一样。
推送到 GitHub
首先,访问 GitHub 并创建一个新仓库。记下远程 URL,因为我们在后面的步骤中会用到它。
接下来,返回项目根目录。
在将源代码推送到云之前,先创建一个.gitignore文件。通过.gitignore文件,你可以指定哪些文件和目录应从版本控制中省略。
这类文件的操作方式与.dockerignore文件相同。
在项目根目录下创建.gitignore文件:
#.dockerignore
.idea/
__pycache__/
venv/
打开终端,运行以下命令初始化 Git:
$ git init
将所有文件添加到 VCS 并提交:
$ git add .
$ git commit -m "first commit"
最后,使用之前的 URL 添加远程 GitHub 起源,并推送源代码:
$ git remote add origin <remote_url>
$ git push origin master
确保使用上一步中的远程 URL 代替 .
就是这样。现在访问 GitHub 仓库页面,你会看到所有文件都已添加。
部署应用程序
要在 Back4app Containers 上部署应用程序,您必须先注册或登录(如果您已有账户)。
使用 Back4app 帐户进行身份验证后,您将进入应用程序控制面板。要创建新应用,请点击 “创建新应用”。
Back4app 允许后端即服务和容器即服务部署。由于我们要部署的是容器化应用程序,所以我们选择后者。
接下来,您需要将 GitHub 账户连接到 Back4app。这将允许 Back4app 从您的源代码库中提取源代码。您可以授权访问所有源代码库,也可以选择特定的源代码库。
导入存储库后,点击 “选择”。
除了提供描述性的应用程序名称外,无需配置环境。
然后点击 “创建”。
Back4app 将需要几分钟时间来构建镜像、将其推送到容器注册表并启动容器。部署完成后,应用程序的状态应更改为 “就绪”。
要访问您的应用程序,请单击下图所示的 URL。
很好,您已成功将机器学习模型部署到 Back4app Containers。网络应用程序的工作方式应与本地相同。确保再次测试应用程序。
摘要
在本文中,您已经了解了机器学习的基础知识、应用以及如何部署机器学习模型。
现在,您应该可以创建自己的简单模型,使用 FastAPI 为其提供服务,并将其部署到 Back4app 容器中。
从back4app-deploy-ml-modelGitHub repo 获取最终源代码。