跳至内容

机器学习、流水线、部署与 MLOps 教程

学习基础 MLOps,并实现机器学习流水线的端到端开发与部署。
已更新 2026年10月6日  · 15分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

简介

流水线、部署与 MLOps 是当今数据科学家必须掌握的关键概念。只在 Notebook 中训练出一个模型还远远不够。将流水线部署上线,并以 MLOps 的最佳实践管理端到端流程,正成为越来越多公司的重点。本教程将讨论 Pipeline、CI/DI、API、Container、Docker、Kubernetes 等重要概念。您还将了解 Python 中的 MLOps 框架与库。最后,教程展示了如何将基于 Flask 的机器学习 Web 应用容器化,并部署到 Microsoft Azure 云端的端到端实现。

关键概念

MLOps

MLOps 是 Machine Learning Operations(机器学习运维)的缩写。MLOps 专注于简化将机器学习模型部署到生产环境、并对其进行维护与监控的流程。MLOps 是协同职能,通常由数据科学家、ML 工程师和 DevOps 工程师共同参与。MLOps 一词由两个不同领域组合而来,即机器学习和软件工程中的 DevOps。

MLOps 的范围可以从数据流水线一直覆盖到机器学习模型的生产。在一些场景中,您会看到 MLOps 的实施仅用于部署机器学习模型;但也有企业会在机器学习生命周期开发的众多环节实施 MLOps,包括探索性数据分析(EDA)、数据预处理、模型训练等。

虽然 MLOps 起初是一组最佳实践,但它正逐步演变为一种独立的 ML 生命周期管理方法。MLOps 适用于整个生命周期——从与模型生成(软件开发生命周期与持续集成/持续交付)的集成、编排与部署,到健康状况、诊断、治理与业务指标。

MLOps
图片来源

为什么需要 MLOps?

企业希望通过 MLOps 达成多种目标,常见的包括:

  • 自动化
  • 可扩展性
  • 可复现性
  • 监控
  • 治理

MLOps 与 DevOps 的区别

DevOps 是将软件应用迭代上线到生产环境的方法论。MLOps 借鉴了相同原则,将机器学习模型带入生产。不论是 DevOps 还是 MLOps,最终目标都是提升软件应用/ML 模型的质量与可控性。

CI/CD:持续集成、持续交付与持续部署

CI/CD 源自 DevOps,指的是持续发现问题、重新评估并自动更新机器学习模型的过程。与 CI/CD 相关的核心概念是持续集成、持续交付与持续部署。它将机器学习流水线(构建、测试与部署)自动化,大幅降低数据科学家手动干预的需求,使流程更高效、更快速且更不易出现人为错误。

CI/CD 流水线示例(应用开发者 vs. 数据科学家)。
CI/CD 流水线示例(应用开发者 vs. 数据科学家)。来源:Microsoft

流水线(Pipeline)

机器学习流水线是一种对生成机器学习模型所需工作流程进行控制与自动化的方式。机器学习流水线由多个顺序步骤组成,涵盖从数据提取与预处理到模型训练与部署的全过程。

机器学习流水线具有迭代性,各步骤会不断重复,以持续提升模型的准确性并实现最终目标。

O'Reilly 的 ML 流水线示例
O'Reilly 的 ML 流水线示例

Pipeline 一词通常用于描述为完成某项任务而串联起来的独立步骤序列。该任务可以是机器学习相关,也可以不是。机器学习流水线非常常见,但并非唯一的流水线类型。数据编排流水线也是另一个例子。根据 Microsoft 文档,存在三种场景:

机器学习流水线

部署

部署机器学习模型(或流水线)是将模型投产的过程,使 Web 应用、企业软件(ERP)与 API 能够向训练好的模型提供新数据点并获取预测结果。

简而言之,机器学习中的部署是将机器学习模型集成到现有生产环境中,以便基于数据做出实际业务决策的方法。它是机器学习生命周期的最后阶段。

通常,“机器学习模型部署”一词用于描述整个机器学习流水线的部署,其中模型本身只是流水线的一个组件。

使用 sklearn 构建的机器学习流水线示例
使用 sklearn 构建的机器学习流水线示例

如上例所示,该流水线包含一个逻辑回归模型。在训练开始之前,需要先执行多个步骤,例如缺失值填补、独热编码、缩放以及主成分分析(PCA)。

应用程序编程接口(API)

应用程序编程接口(API)是一种软件中介,允许两个应用相互通信。通俗地说,API 是两个应用之间的契约:如果用户的软件按预定义格式提供输入,API 就会给出结果。换句话说,API 是托管训练好机器学习模型/(流水线)的端点。在实践中,大致如下所示:

应用程序编程接口(API)

容器

您是否遇到过这样的情况:您的 Python 代码(或其他代码)在您的电脑上运行良好,但朋友在其电脑上运行完全相同的代码却不奏效?如果朋友重复完全相同的步骤,理应得到相同结果,对吗?简单的答案是:您朋友的 Python 环境与您不同。

环境包含什么?

Python(或您使用的任何语言)以及构建该应用所用到的所有库与依赖。

如果我们能够以某种方式创建一个可迁移到其他机器(例如朋友的电脑或 Microsoft Azure、AWS、GCP 等云服务商)的环境,就可以在任何地方复现结果。容器是一种软件形式,它将应用及其所有依赖打包,使应用能够在不同计算环境间可靠运行。

在数据科学中理解容器最直观的方式,是联想到船舶上的集装箱。目标是将每个集装箱的内容彼此隔离,避免混淆。这正是容器在数据科学中的用途。

理解了容器背后的比喻后,让我们看看为应用创建隔离环境的替代方案。一种简单替代方式是为每个应用配备一台独立机器。

使用独立机器虽然直观,但与容器相比并无优势:为每个应用维护多台机器成本高、维护困难且难以扩展。简言之,在许多真实场景下并不现实。

另一种创建隔离环境的方式是使用虚拟机。容器在此仍更具优势,因为其资源占用更少、可移植性更强、启动更迅速。

虚拟机与容器
虚拟机与容器

您能分辨虚拟机与容器的差异吗?使用容器时,无需客体操作系统。设想在一台虚拟机上运行 10 个应用,这将需要 10 个客体操作系统;而使用容器则无需如此。

Docker

Docker 是一家提供相关软件(也称 Docker)的公司,用户可借此构建、运行与管理容器。尽管 Docker 的容器最为常见,其他知名度较低的替代方案如 LXD 与 LXC 也提供容器解决方案。

Docker 是一款通过容器来简化应用创建、部署与运行的工具。容器用于将应用及其所需的全部组件(如库与其他依赖)打包,并作为一个整体进行分发。

使用 Docker 托管多个应用的同一架构
使用 Docker 托管多个应用的同一架构

回归本质

归根结底,Docker 只是一个文件,里面包含几行指令,保存在您的项目文件夹下,文件名为 "Dockerfile"。

另一种理解 Docker 文件的方式是:它就像您在自家厨房发明的食谱。当您将这些食谱分享给他人,对方按照完全相同的步骤,也能做出同样的菜肴。类似地,您可以将 Docker 文件分享给他人,他们就能基于该 Docker 文件创建镜像并运行容器。

Kubernetes

Kubernetes 由 Google 于 2014 年开发,是一个强大的开源系统,用于管理容器化应用。通俗地说,Kubernetes 是一个在多台机器组成的集群上运行并协调容器化应用的系统。它是为全面管理容器化应用生命周期而设计的平台。

特性

  • 负载均衡:在容器间自动分配负载。
  • 伸缩:当需求变化(如高峰时段、周末与假期)时,自动通过增加或移除容器进行弹性伸缩。
  • 存储:在应用的多个实例间保持存储一致性。

已有 Docker,为什么还需要 Kubernetes?

设想这样的场景:为了支撑企业级的 ML 应用,您需要在多台机器上运行多个 Docker 容器,以应对昼夜不一的负载。听起来简单,实际手动操作却工作量巨大。

您需要在合适的时间启动合适的容器,确定它们如何通信,处理存储问题,并应对容器或硬件故障。Kubernetes 正是在解决这些问题:让大量容器协同工作,降低运维负担。

Google Kubernetes Engine 是 Google 在其云平台上对开源 Kubernetes 的实现。其他常见替代方案包括 Amazon ECS 与 Microsoft Azure Kubernetes Service。

术语快速回顾:

  • 容器是一种软件形式,将应用及其所有依赖打包,使应用能在不同计算环境间可靠运行。
  • Docker 是用于构建与管理容器的软件。
  • Kubernetes 是在集群环境中管理容器化应用的开源系统。
Docker 与 Kubernetes 部署
Docker 与 Kubernetes 部署

Python 中的 MLOps 框架与库

MLflow

MLflow 是一个用于管理 ML 生命周期的开源平台,包括实验、可复现性、部署与集中式模型注册表。MLflow 目前提供 MLflow Tracking、MLflow Projects、MLflow Models 与 Model Registry。

Metaflow

Metaflow 是一个对人类友好的 Python 库,帮助科学家与工程师构建并管理真实的数据科学项目。Metaflow 最初由 Netflix 开发,用于提升数据科学家在各类项目(从经典统计到前沿的深度学习)中的生产力。Metaflow 为执行数据科学项目所需的基础设施栈提供统一 API,覆盖从原型到生产的全过程。

Kubeflow

Kubeflow 是一个开源的机器学习平台,旨在让机器学习流水线在 Kubernetes 上编排复杂的工作流。Kubeflow 基于 Google 内部用于部署 TensorFlow 模型的方法 TensorFlow Extended。

Kedro

Kedro 是一个用于创建可复现、可维护、模块化数据科学代码的开源 Python 框架。它借鉴软件工程最佳实践,并将其应用于机器学习代码;包括模块化、关注点分离与版本控制等概念。

FastAPI

FastAPI 是一个用于在 Python 中开发 RESTful API 的 Web 框架。FastAPI 基于 Pydantic 和类型提示来校验、序列化与反序列化数据,并自动生成 OpenAPI 文档。

ZenML

ZenML 是一个可扩展的开源 MLOps 框架,用于创建可用于生产的机器学习流水线。它面向数据科学家,语法简洁灵活,兼容各类云与工具,并提供贴合 ML 工作流的接口/抽象。

示例:端到端的流水线开发、部署与 MLOps

问题设定

某保险公司希望通过在住院时利用人口统计与基础健康风险指标,更准确地预测患者费用,从而改进现金流预测。

数据来源
数据来源

我们的目标是构建并部署一个 Web 应用:在 Web 表单中输入患者的人口统计与健康信息后,输出预测的费用。为此我们将:

  • 训练并开发一个可用于部署的机器学习流水线(简单线性回归模型)。
  • 使用 Flask 框架构建一个 Web 应用。它将使用已训练的 ML 流水线对新数据点进行实时预测(前端代码不是本教程重点)。
  • 创建 Docker 镜像与容器。
  • 将容器发布到 Azure Container Registry(ACR)。
  • 通过发布到 ACR,将容器中的 Web 应用部署上线。部署完成后,应用将公开可用,并可通过 Web URL 访问。

机器学习流水线

我将使用 Python 中的 PyCaret 来训练并开发作为我们 Web 应用一部分的机器学习流水线。您也可以使用任意框架,后续步骤不依赖于此。

# load dataset
from pycaret.datasets import get_data
insurance = get_data('insurance')

# init environment
from pycaret.regression import *
r1 = setup(insurance, target = 'charges', session_id = 123,
           normalize = True,
           polynomial_features = True, trigonometry_features = True,
           feature_interaction=True,
           bin_numeric_features= ['age', 'bmi'])

# train a model
lr = create_model('lr')

# save pipeline/model
save_model(lr, model_name = 'c:/username/pycaret-deployment-azure/deployment_28042020')

在 PyCaret 中保存模型时,会基于 setup 函数中的配置创建完整的变换流水线,所有相互依赖将自动编排。请查看存储在变量 “deployment_28042020” 中的流水线与模型:

PyCaret 中的模型

前端 Web 应用

本教程不聚焦于构建 Flask 应用,这里仅为完整性而讨论。现在我们的机器学习流水线已经就绪,需要一个能够读取该已训练流水线并对新数据点进行预测的 Web 应用。该应用包含两部分:

  • 前端(使用 HTML 设计)
  • 后端(使用 Flask 开发)

前端大致如下:

前端 Web 应用

该应用的前端只是一些带有 CSS 样式的简单 HTML。若要查看代码,请参见 此仓库。现在我们已有完整可用的 Web 应用,可以开始使用 Docker 将应用容器化。

应用的后端

应用的后端是一个名为 app.py 的 Python 文件。它基于 Flask 框架 构建。

from flask import Flask,request, url_for, redirect, render_template, jsonify
from pycaret.regression import *
import pandas as pd
import pickle
import numpy as np

app = Flask(__name__)

model = load_model('deployment_28042020')
cols = ['age', 'sex', 'bmi', 'children', 'smoker', 'region']

@app.route('/')
def home():
    return render_template("home.html")

@app.route('/predict',methods=['POST'])
def predict():
    int_features = [x for x in request.form.values()]
    final = np.array(int_features)
    data_unseen = pd.DataFrame([final], columns = cols)
    prediction = predict_model(model, data=data_unseen, round = 0)
    prediction = int(prediction.Label[0])
    return render_template('home.html',pred='Expected Bill will be {}'.format(prediction))

@app.route('/predict_api',methods=['POST'])
def predict_api():
    data = request.get_json(force=True)
    data_unseen = pd.DataFrame([data])
    prediction = predict_model(model, data=data_unseen)
    output = prediction.Label[0]
    return jsonify(output)

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

Docker 容器

如果您使用 Windows,需要先为 Windows 安装 Docker。如果您使用 Ubuntu,Docker 通常已预装,无需额外安装。

将应用容器化的第一步,是在应用所在的同一文件夹/目录中编写一个 Dockerfile。Dockerfile 只是一个包含一组指令的文件。本项目的 Dockerfile 如下:

FROM python:3.7

RUN pip install virtualenv
ENV VIRTUAL_ENV=/venv
RUN virtualenv venv -p python3
ENV PATH="VIRTUAL_ENV/bin:$PATH"

WORKDIR /app
ADD . /app

# install dependencies
RUN pip install -r requirements.txt

# expose port
EXPOSE 5000

# run application
CMD ["python", "app.py"]

Dockerfile 区分大小写,且必须与其他项目文件在同一项目文件夹内。Dockerfile 没有扩展名,可用任意编辑器创建。我们使用了 Visual Studio Code 来创建它。

云端部署

在正确配置 Dockerfile 后,我们将通过一些命令从该文件创建 Docker 镜像,但首先需要一个托管该镜像的服务。在本示例中,我们将使用 Microsoft Azure 来托管我们的应用。

Azure 容器注册表

如果您没有 Microsoft Azure 账户或从未使用过,可以免费注册。首次注册时,您将获得前 30 天的免费额度。您可以利用该额度在 Azure 上构建并部署 Web 应用。注册完成后,请按以下步骤操作:

  • 登录 https://portal.azure.com
  • 单击“创建资源”
  • 搜索 Container Registry 并单击“创建”
  • 选择订阅、资源组与注册表名称(本例中:pycaret.azurecr.io 为我们的注册表名称)
Azure 容器注册表

注册表创建完成后,第一步是使用命令行构建 Docker 镜像。进入项目文件夹,执行如下命令:

docker build -t pycaret.azurecr.io/pycaret-insurance:latest .
构建 Docker 镜像
  • pycaret.azurecr.io 是您在 Azure 门户创建资源时获得的注册表名称
  • pycaret-insurance 是镜像名称,latest 是标签;两者都可按需自定义

从 Docker 镜像运行容器

镜像创建后,我们将在本地运行容器并测试应用,再将其推送到 Azure 容器注册表。要在本地运行容器,执行以下命令:

docker run -d -p 5000:5000 pycaret.azurecr.io/pycaret-insurance

在浏览器中访问 localhost:5000,您即可看到应用运行,页面应会打开一个 Web 应用。

从 Docker 镜像运行容器

如果您能看到该页面,说明应用已在本地机器上启动并运行,接下来只需将其推送到云端。有关在 Azure 上部署的步骤,请继续阅读:

Azure 凭据认证

在将容器上传到 ACR 之前,最后一步是在本地机器上完成 Azure 凭据认证。在命令行中执行以下命令:

docker login pycaret.azurecr.io

系统会提示输入用户名与密码。用户名即您的注册表名称(本例中用户名为 “pycaret”)。密码可在您创建的 Azure 容器注册表资源的访问密钥中找到。

Azure 容器注册表资源

将容器推送到 Azure 容器注册表

完成对 ACR 的认证后,执行以下命令即可将您创建的容器推送到 ACR:

docker push pycaret.azurecr.io/pycaret-insurance:latest

根据容器大小不同,push 命令可能需要一些时间将容器传输到云端。

Web 应用

在 Azure 上创建 Web 应用,请按以下步骤操作:

  • 登录 Azure 门户
  • 单击“创建资源”
  • 搜索 Web 应用并单击“创建”
  • 将您的 ACR 镜像关联至应用
将容器推送到 Azure 容器注册表
Web 应用

应用现已在 Azure Web Services 上线运行。

运行于 Azure Web Services。

结语

MLOps 有助于确保已部署的模型得到妥善维护、按预期表现,并不会对业务产生不利影响。该职能对于防范模型随时间漂移、或模型已部署但未维护/未监控而带来的业务风险至关重要。

MLOps 登上了LinkedIn 新兴岗位排行榜榜首,五年增长 9.8 倍。

您可以查看 DataCamp 的新技能路径 MLOps Fundamentals,涵盖机器学习应用的完整生命周期,从业务需求收集到设计、开发、部署、运维与维护。Datacamp 还提供优秀的 Understanding Data Engineering 课程。立即报名,了解数据工程师如何在无代码的前提下为数据科学奠定基础。

主题
机器学习
数据科学