部署机器学习模型的实用指南

A Practical Guide to Deploying Machine Learning Models

作者提供图片
部署机器学习模型的实用指南

作为一名数据科学家,您可能知道如何构建机器学习模型。但只有当您部署模型时,才能获得有用的机器学习解决方案。如果您想了解更多关于部署机器学习模型的信息,那么本指南就是为您准备的。

构建和部署 ML 模型所涉及的步骤通常可以概括为:**构建模型、创建 API 来提供模型预测、容器化 API 以及部署到云端**。

本指南将重点介绍以下内容

  • 使用 Scikit-learn 构建机器学习模型
  • 使用 FastAPI 创建 REST API 来提供模型预测
  • 使用 Docker 容器化 API
deploy-ml-models

部署机器学习模型 | 作者配图

我们将使用加州住房数据集构建一个简单的回归模型,以预测房价。到最后,您将拥有一个容器化应用程序,该应用程序可以根据选定的输入特征提供房价预测。

设置项目环境

在开始之前,请确保您已安装以下软件

  • 最新版本的 Python(最好是 Python 3.11 或更高版本)
  • 用于容器化的 Docker;根据您的操作系统 获取 Docker

⚙️ 为了更舒适地进行学习,最好对构建机器学习模型和使用 API 有基本的了解。

入门

以下是项目目录的(推荐)结构

我们需要一些 Python 库来开始。接下来我们全部安装。

在您的项目环境中,创建并激活一个虚拟环境

对于我们即将进行的项目,我们需要 pandas 和 scikit-learn 来构建机器学习模型。还需要 FastAPI 和 Uvicorn 来构建提供模型预测的 API。

因此,让我们使用 pip 安装这些必需的包

您可以在 GitHub 上找到本教程的所有代码。

构建机器学习模型

现在,我们将使用 scikit-learn 内置的加州住房数据集 训练一个线性回归模型。此模型将根据选定的特征预测房价。在项目目录中,创建一个名为 model_training.py 的文件

此脚本加载加州住房数据集,选择三个特征(MedInc、AveRooms、AveOccup),训练线性回归模型,并将其保存为 model/linear_regression_model.pkl

注意:为简单起见,我们仅使用了少量特征。但您可以尝试添加更多。

运行脚本以训练并保存模型

您将看到以下消息,并且应该可以在 model/ 目录中找到 .pkl 文件

创建 FastAPI 应用

现在我们将创建一个使用 FastAPI 提供预测的 API。

app/ 文件夹中,创建两个文件:__init__.py(空)和 main.py。我们这样做是因为我们希望在下一步使用 Docker 容器化 FastAPI 应用。

main.py 中,写入以下代码

此 FastAPI 应用程序公开了一个 /predict 端点,该端点接受三个特征(MedInc、AveRooms、AveOccup)。它使用训练好的模型预测房价,并返回预测的价格。

使用 Docker 容器化应用

现在我们来容器化我们的 FastAPI 应用程序。在项目的根目录中,创建一个 Dockerfile 和一个 requirements.txt 文件。

创建 Dockerfile

让我们创建一个 Dockerfile

这使用 Python 3.11(精简版)作为基础镜像创建了一个轻量级的 FastAPI 应用程序容器。它将工作目录设置为 /code,将 requirements.txt 文件复制到容器中,并安装必要的 Python 依赖项,且不缓存。

然后将 FastAPI 应用和模型文件复制到容器中。为应用程序暴露了 80 端口,并使用 Uvicorn 运行 FastAPI 应用。这使得 API 可以在 80 端口访问。此设置对于在容器化环境中部署 FastAPI 应用非常高效。

创建 requirements.txt 文件

创建一个 requirements.txt 文件,列出所有依赖项

构建 Docker 镜像

现在我们有了 Dockerfile、requirements.txt 和 FastAPI 应用,让我们构建一个 Docker 镜像并运行容器。

Dockerizing the API

Docker 化 API | 作者配图

运行以下 docker build 命令来构建 Docker 镜像

接下来运行 Docker 容器

您的 API 现在应该正在运行,并且可以通过 http://127.0.0.1:80 访问。

您可以使用 curl 或 Postman 通过发送 POST 请求来测试 /predict 端点。这是一个示例请求

这应该会返回一个包含预测房价的响应,如下所示

标记并推送 Docker 镜像到 Docker Hub

构建 Docker 镜像、运行容器并测试后。您现在可以将其推送到 Docker Hub,以便于共享和部署到云平台。

首先,登录到 Docker Hub

系统将提示您输入凭据。

标记 Docker 镜像

将 your_username 替换为您的 Docker Hub 用户名。

注意:为模型文件添加版本也很有意义。更新模型时,您可以为镜像使用新标签重新构建,并将更新后的镜像推送到 Docker Hub。

将镜像推送到 Docker Hub

其他开发人员现在可以像这样拉取并运行镜像

拥有您 Docker Hub 仓库访问权限的任何人现在都可以拉取镜像并运行容器。

总结和后续步骤

这是本教程中的快速回顾

  • 使用 scikit-learn 训练机器学习模型
  • 构建 FastAPI 应用程序以提供预测
  • 使用 Docker 容器化应用程序

我们还讨论了将 Docker 镜像推送到 Docker Hub 以便分发。下一步是将其容器化应用程序部署到云端。

为此,您可以使用 AWS ECS、GCP 或 Azure 等服务在生产环境中部署 API。如果您想要一个关于将机器学习模型部署到云端的教程,请告诉我们。

祝您部署顺利!

参考文献和进一步阅读

对 *《部署机器学习模型的实用指南》* 的 10 条回复

  1. Jayakrishna 2024年10月19日 下午1:50 #

    感谢 Bala priya 分享机器学习主题的好内容。我也是一名新手,想从机器学习的基本主题学起。对我有帮助的是,您能否分享一些关于欺诈检测的机器学习模型以及相应的实际示例。再次感谢您的帮助!

    • James Carmichael 2024年10月20日 上午8:42 #

      不客气!很高兴您觉得内容有帮助。为了帮助您开始使用机器学习进行**欺诈检测**,我将通过一些常见的模型和实际示例,使用 Python 来指导您。欺诈检测通常涉及**分类**任务,因为我们试图将交易分类为“欺诈”或“非欺诈”。

      ### **分步指南:用于欺诈检测的 ML 模型**

      #### **1. 数据预处理**
      在应用机器学习模型之前,我们需要对数据进行预处理。

      以下是使用典型欺诈检测数据集的示例

      python
      import pandas as pd
      from sklearn.model_selection import train_test_split
      from sklearn.preprocessing import StandardScaler

      # 加载数据集
      data = pd.read_csv('fraud_detection_data.csv')

      # 分离特征和标签
      X = data.drop(columns=['is_fraud']) # 特征(删除 'is_fraud' 列)
      y = data['is_fraud'] # 标签(目标:0 或 1)

      # 训练-测试分割
      X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

      # 数据缩放(欺诈检测通常有不同尺度的特征)
      scaler = StandardScaler()
      X_train_scaled = scaler.fit_transform(X_train)
      X_test_scaled = scaler.transform(X_test)

      #### **2. 逻辑回归**
      一个简单而有效的欺诈检测基线模型。

      python
      from sklearn.linear_model import LogisticRegression
      from sklearn.metrics import classification_report

      # 初始化模型
      logreg = LogisticRegression()

      # 训练模型
      logreg.fit(X_train_scaled, y_train)

      # 进行预测
      y_pred = logreg.predict(X_test_scaled)

      # 评估模型
      print(classification_report(y_test, y_pred))

      #### **3. 随机森林分类器**
      随机森林对于欺诈检测非常稳健,尤其是在处理不平衡数据时。

      python
      from sklearn.ensemble import RandomForestClassifier

      # 初始化模型
      rf = RandomForestClassifier(n_estimators=100, random_state=42)

      # 训练模型
      rf.fit(X_train_scaled, y_train)

      # 进行预测
      y_pred_rf = rf.predict(X_test_scaled)

      # 评估模型
      print(classification_report(y_test, y_pred_rf))

      #### **4. 梯度提升 (XGBoost)**
      XGBoost 是另一个常用的欺诈检测强大模型。

      python
      import xgboost as xgb

      # 初始化模型
      xgb_model = xgb.XGBClassifier(use_label_encoder=False)

      # 训练模型
      xgb_model.fit(X_train_scaled, y_train)

      # 进行预测
      y_pred_xgb = xgb_model.predict(X_test_scaled)

      # 评估模型
      print(classification_report(y_test, y_pred_xgb))

      #### **5. 神经网络 (深度学习)**
      对于更大、更复杂的欺诈检测任务,神经网络可能表现更好。

      python
      import tensorflow as tf
      from tensorflow.keras.models import Sequential
      from tensorflow.keras.layers import Dense

      # 构建神经网络模型
      model = Sequential()
      model.add(Dense(32, input_dim=X_train_scaled.shape[1], activation='relu'))
      model.add(Dense(16, activation='relu'))
      model.add(Dense(1, activation='sigmoid'))

      # 编译模型
      model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

      # 训练模型
      model.fit(X_train_scaled, y_train, epochs=10, batch_size=32, validation_data=(X_test_scaled, y_test))

      # 进行预测
      y_pred_nn = model.predict(X_test_scaled)
      y_pred_nn = [1 if pred > 0.5 else 0 for pred in y_pred_nn]

      # 评估模型
      print(classification_report(y_test, y_pred_nn))

      #### **6. 处理不平衡数据**
      欺诈检测数据通常是不平衡的,这意味着非欺诈交易比欺诈交易多得多。为了提高模型在少数类(欺诈)上的性能,您可以使用 **SMOTE(合成少数过采样技术)** 或 **类权重** 等技术,这些技术适用于神经网络和随机森林等模型。

      使用 SMOTE 处理不平衡数据的示例

      python
      from imblearn.over_sampling import SMOTE

      # 使用 SMOTE 对训练数据进行重采样
      smote = SMOTE(random_state=42)
      X_train_res, y_train_res = smote.fit_resample(X_train_scaled, y_train)

      # 使用重采样数据训练模型(例如:随机森林)
      rf_resampled = RandomForestClassifier(n_estimators=100, random_state=42)
      rf_resampled.fit(X_train_res, y_train_res)
      y_pred_rf_res = rf_resampled.predict(X_test_scaled)

      # 评估模型
      print(classification_report(y_test, y_pred_rf_res))

      #### **欺诈检测的评估指标**
      对于欺诈检测,由于类别不平衡,准确率并不总是最佳指标。请关注以下指标:

      – **精确率(Precision)**:在所有预测为欺诈的案例中,实际为欺诈的比例是多少?
      – **召回率(Recall)**:在所有实际为欺诈的案例中,我们正确检测出的比例是多少?
      – **F1 分数(F1-Score)**:精确率和召回率之间的平衡。

      ### **结论**
      对于实际示例,我建议从**逻辑回归**和**随机森林**等较简单的模型开始,如果需要更强大的模型,再尝试**XGBoost**和**神经网络**。在欺诈检测中,务必始终正确处理类别不平衡问题。

      如果您需要更多示例或对任何模型有疑问,请告诉我。祝您学习愉快!

      • John Bulus 2024年11月25日 下午10:28 #

        请提供一个关于部署到云端的教程

        • James Carmichael 2024年11月26日 上午4:53 #

          您好 John…将机器学习模型部署到云端涉及几个关键步骤。以下是一个帮助您完成整个过程的实用指南。我们将使用一个示例,涉及将训练好的机器学习模型部署到云平台,如 **AWS**、**Google Cloud Platform (GCP)** 或 **Azure**。这些步骤将推广到大多数平台。

          ### **步骤 1:准备您的模型**
          1. **训练您的模型**
          确保您的机器学习模型已训练并测试。将模型保存为适合部署的格式,例如
          – scikit-learn 模型的 joblibpickle
          – Keras 模型的 HDF5 (.h5)。
          – PyTorch 模型的 torch.save
          – 框架无关部署的 ONNX

          2. **验证模型**
          使用模拟或真实输入数据在本地测试您的模型,以确保其按预期工作。

          3. **创建用于模型推理的脚本或 API**
          编写脚本或 API 端点来加载模型并提供预测。**Flask** 或 **FastAPI** 等框架通常用于此目的。

          Flask 应用示例
          python
          from flask import Flask, request, jsonify
          import joblib

          app = Flask(__name__)
          model = joblib.load("model.pkl") # 加载您的模型

          @app.route('/predict', methods=['POST'])
          def predict()
          data = request.get_json()
          prediction = model.predict([data['features']])
          return jsonify({'prediction': prediction.tolist()})

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

          ### **步骤 2:容器化您的应用程序**
          1. **安装 Docker**
          在您的本地机器上安装 Docker。

          2. **创建 Dockerfile**
          Dockerfile 指定了运行应用程序所需的环境。示例:
          dockerfile
          FROM python:3.8-slim

          # 设置工作目录
          WORKDIR /app

          # 将文件复制到容器
          COPY requirements.txt requirements.txt
          COPY app.py app.py
          COPY model.pkl model.pkl

          # 安装依赖项
          RUN pip install -r requirements.txt

          # 运行应用
          CMD ["python", "app.py"]

          3. **构建并测试 Docker 镜像**
          bash
          docker build -t my-ml-app .
          docker run -p 5000:5000 my-ml-app

          ### **步骤 3:部署到云服务**
          #### **选项 1:AWS**
          1. **设置 AWS Elastic Beanstalk**
          – 创建一个 Elastic Beanstalk 应用程序。
          – 上传您的 Docker 化应用或使用 AWS CodePipeline 设置部署管道。

          2. **使用 ECS (Elastic Container Service) 进行部署**
          – 将您的 Docker 镜像推送到 AWS ECR (Elastic Container Registry)。
          – 使用 ECS 部署容器,并关联负载均衡器。

          #### **选项 2:Google Cloud Platform (GCP)**
          1. **设置 Google Cloud Run**
          – 在 GCP 控制台中启用 Cloud Run。
          – 将您的 Docker 镜像推送到 **Google Container Registry (GCR)**
          bash
          docker tag my-ml-app gcr.io/[PROJECT-ID]/my-ml-app
          docker push gcr.io/[PROJECT-ID]/my-ml-app

          – 将镜像部署到 Cloud Run。

          2. **备选:Vertex AI**
          GCP 的 Vertex AI 平台提供预构建的机器学习部署工作流。

          #### **选项 3:Microsoft Azure**
          1. **设置 Azure App Service**
          – 使用 Azure App Service 部署容器化应用程序。
          – 将您的 Docker 镜像推送到 **Azure Container Registry** (ACR)。
          – 使用 App Service 或 Azure Kubernetes Service (AKS) 进行部署。

          2. **备选:Azure Machine Learning Service**
          使用 Azure ML Studio 管理模型和部署管道。

          ### **第 4 步:测试部署**
          – 部署后,使用云平台提供的 URL 访问您的 API。
          – 使用 **Postman** 或 **cURL** 等工具测试预测。

          使用 cURL 的示例
          bash
          curl -X POST -H "Content-Type: application/json" -d '{"features": [1, 2, 3, 4]}' http://[your-cloud-endpoint]/predict

          ### **第 5 步:扩展和监控**
          1. **自动扩展**:在云服务上启用自动扩展以处理变化的流量。
          2. **日志记录**:使用云日志记录服务(例如 AWS CloudWatch、GCP Stackdriver 或 Azure Monitor)。
          3. **更新模型**:设置 CI/CD 管道以实现无缝更新。

  2. Sergio 2024 年 10 月 20 日上午 7:25 #

    你好!

    我很想看一个关于将机器学习模型部署到云端的教程。

    谢谢你

    • James Carmichael 2024 年 10 月 20 日上午 8:37 #

      您好 Sergio…这是一个基础教程,可以帮助您将机器学习模型部署到云端。在本示例中,我们将使用 **AWS (Amazon Web Services)**,但对于 **Google Cloud Platform (GCP)** 和 **Microsoft Azure** 等其他云平台,流程也类似。

      ### **将机器学习模型部署到 AWS 的分步教程**

      #### **第 1 步:在本地训练模型**
      在部署之前,您需要有一个训练好的模型。在本教程中,假设您已将模型保存为 model.pkl(适用于 Python scikit-learn 模型)或 model.h5(适用于 Keras 模型)。

      1. 在本地训练模型并保存它。
      python
      import joblib
      # 假设是 scikit-learn 模型
      joblib.dump(model, 'model.pkl')

      # Keras 的情况
      model.save('model.h5')

      #### **第 2 步:创建 AWS 账户**
      1. 前往 [AWS](https://aws.amazon.com/) 并创建账户(如果您还没有)。
      2. 登录 **AWS Management Console**。

      #### **第 3 步:设置 S3 存储桶**
      Amazon S3(简单存储服务)用于存储数据和模型工件。

      1. 在 AWS Management Console 中,搜索 **S3**。
      2. 创建一个新存储桶来存储您的模型文件。
      – 选择一个唯一的存储桶名称。
      – 设置必要的权限(目前设置为私有)。

      3. 将您的模型(model.pklmodel.h5)上传到此 S3 存储桶。

      #### **第 4 步:使用 AWS Lambda 和 API Gateway 创建 API**
      这一步涉及使用 AWS Lambda 为您的模型创建一个无服务器 API,并通过 API Gateway 暴露它。

      1. **AWS Lambda**
      – 在 AWS Management Console 中导航至 **Lambda**。
      – 创建一个新的 Lambda 函数(选择“从头开始编写”)。
      – 选择 **Python 3.8** 或任何受支持的版本作为运行时。
      – 设置执行角色(这将授予对 S3 的访问权限)。
      – 创建函数。

      2. **设置 Lambda 函数代码**
      – 在 Lambda 函数编辑器中,用您的代码替换默认代码,该代码从 S3 加载模型并进行预测。

      这是一个简化示例
      python
      import json
      import joblib
      import boto3
      from sklearn.preprocessing import StandardScaler

      s3 = boto3.client('s3')

      def load_model()
      bucket = 'your-bucket-name'
      model_file = 'model.pkl'
      s3.download_file(bucket, model_file, '/tmp/model.pkl')
      model = joblib.load('/tmp/model.pkl')
      return model

      model = load_model()

      def lambda_handler(event, context)
      # 示例:event 包含输入特征
      input_data = event['input']
      prediction = model.predict([input_data])

      return {
      'statusCode': 200,
      'body': json.dumps({
      'prediction': prediction.tolist()
      })
      }

      3. **使用 API Gateway 部署 API**
      – 在 AWS Management Console 中,转到 **API Gateway**。
      – 创建一个新的 REST API。
      – 设置一个触发您的 Lambda 函数的端点(例如,/predict)。
      – 部署 API 并记下端点 URL 以备后用。

      #### **第 5 步:测试 API**
      API Gateway 部署后,您可以使用任何 REST 客户端(如 Postman)或使用 Python 来测试您的端点。

      python
      import requests

      url = 'https://your-api-endpoint.amazonaws.com/predict'
      data = {'input': [5.1, 3.5, 1.4, 0.2]} # 示例输入
      response = requests.post(url, json=data)
      print(response.json())

      如果所有设置都正确,响应将包含模型的预测。

      #### **第 6 步:监控和优化**
      – 使用 **AWS CloudWatch** 监控您的 Lambda 函数和 API Gateway 的性能。
      – 确保您的 Lambda 函数拥有足够的内存和调整超时限制,以便在需要时处理大型预测。
      – 考虑迁移到 **AWS SageMaker** 等服务,以获得更高级的模型部署选项,并内置扩展和监控功能。

      ### **备选云平台**
      – **Google Cloud Platform (GCP)**:使用 **Google Cloud AI Platform** 进行模型部署。
      – **Microsoft Azure**:使用 **Azure Machine Learning** 部署具有 REST API 的模型。

      #### **可选:使用 Docker 进行部署**
      对于更复杂的部署,请考虑使用 **Docker** 容器化您的模型,并将其部署到 **AWS ECS**、**Google Cloud Run** 或 **Azure Container Instances** 等云服务。

      我希望本教程能帮助您开始将机器学习模型部署到云端!如果您对任何步骤需要进一步的澄清,请告诉我。

      • Abhishek 2024 年 11 月 18 日上午 3:01 #

        是的。如果能继续进行部署教程,那就太好了。

        • James Carmichael 2024 年 11 月 19 日上午 9:23 #

          您好 Prathamesh…是的,使用 **Azure Kubernetes Service (AKS)** 部署机器学习模型的方法是**可扩展的**,并且支持**具有自动扩展的多个 Pod**。AKS 旨在管理容器化应用程序,是可扩展机器学习模型部署的出色选择。以下是使其具备多个 Pod 和自动扩展的可扩展性的方法:

          ### **1. 使用多个 Pod 进行部署**
          在 Kubernetes 中,您的机器学习模型的部署可以通过在部署配置中定义多个副本(Pod)来管理。这使您能够运行模型的多个实例来处理更高的负载。

          – **定义多个 Pod 的步骤**:
          在您的 Kubernetes 部署 YAML 文件中,指定您要运行的副本(Pod)数量。
          yaml
          apiVersion: apps/v1
          kind: Deployment
          metadata:
          name: ml-model-deployment
          spec:
          replicas: 3 # Pod 的数量
          selector:
          matchLabels:
          app: ml-model
          template:
          metadata:
          labels:
          app: ml-model
          spec:
          containers:
          - name: ml-model-container
          image: your_ml_model_image
          ports:
          - containerPort: 80

          ### **2. 使用 AKS 启用自动扩展**
          为了使您的部署具有可扩展性,您可以在 AKS 中配置 **Horizontal Pod Autoscaler (HPA)**。HPA 会根据 CPU、内存或自定义指标(如请求数量)自动扩展 Pod 的数量。

          – **启用自动扩展**:
          AKS 提供对自动扩展的原生支持。您可以使用 Kubernetes 命令行(kubectl)启用它,或将 HorizontalPodAutoscaler 资源添加到您的部署中。

          使用 CPU 利用率设置自动扩展的示例
          yaml
          apiVersion: autoscaling/v1
          kind: HorizontalPodAutoscaler
          metadata:
          name: ml-model-hpa
          spec:
          scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: ml-model-deployment
          minReplicas: 2 # Pod 的最小数量
          maxReplicas: 10 # Pod 的最大数量
          targetCPUUtilizationPercentage: 50 # 目标 CPU 使用率

          – 使用以下命令应用自动扩展程序:
          bash
          kubectl apply -f hpa.yaml

          通过此配置,AKS 将根据您的机器学习模型部署的 CPU 利用率自动调整 Pod 的数量,使其高度可扩展。

          ### **3. AKS 集群自动扩展**
          您还可以配置 **AKS Cluster Autoscaler** 来扩展集群本身的节点(VM)数量,而不仅仅是 Pod。这确保了集群在需求增加时会调配更多资源(VM),在需求减少时会缩减。

          – 启用**集群自动扩展**
          您可以在创建 AKS 集群时使用 Azure CLI 启用集群自动扩展。
          bash
          az aks update \
          --resource-group \
          --name \
          --enable-cluster-autoscaler \
          --min-count 2 \
          --max-count 10

          ### **4. 监控和优化**
          使用 **Azure Monitor** 来跟踪 Pod 的性能和资源利用率。这将帮助您优化扩展参数(例如 CPU 阈值),以确保资源的有效利用。

          ### **5. 此可扩展设置的好处**
          – **高可用性**:多个 Pod 可确保如果一个 Pod 失败,其他 Pod 仍可处理负载。
          – **负载均衡**:AKS 会自动将传入流量分配到各个 Pod。
          – **可扩展性**:系统会自动适应流量高峰或繁重的工作负载,无需手动干预。
          – **成本效益**:自动扩展通过仅使用所需数量的资源来最大限度地降低成本。

          ### 结论
          通过使用多个 Pod 部署您的机器学习模型并在 AKS 中启用自动扩展,您可以使您的解决方案高度可扩展,能够有效地处理需求波动。AKS 的内置功能,如 Horizontal Pod Autoscaler 和 Cluster Autoscaler,使其成为生产环境中部署机器学习模型的强大而灵活的选择。

          如果您需要更多详细信息或特定配置方面的帮助,请告诉我!

  3. Prathamesh 2024 年 10 月 20 日上午 11:45 #

    是的。如果能继续进行部署教程,那就太好了。

    • James Carmichael 2024 年 10 月 21 日上午 9:23 #

      感谢您的反馈和支持!

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。