跳至内容

容器化:面向机器学习的 Docker 与 Kubernetes

释放 Docker 与 Kubernetes 的力量,助力机器学习成功
已更新 2026年10月6日  · 10分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

在广袤的技术领域中,创新是推动进步的基石,而容器化正是在其中脱颖而出的变革者。凭借将应用及其依赖封装为可移植、轻量化单元的能力,容器化彻底改变了软件开发与机器学习。

在这场容器化革命中,两大巨头 Docker 与 Kubernetes 脱颖而出,重塑了我们构建与扩展应用的方式。在复杂性与可扩展性至关重要的机器学习世界里,容器化提供了极具价值的解决方案。

本文将带您走进容器化的世界,探寻 Docker 与 Kubernetes 的奥秘,并剖析它们在机器学习背景下的重大意义与优势。

什么是容器?

容器是一种标准化的软件单元,囊括代码及其依赖,使其能够在不同计算环境中高效、可靠地运行。它由一种轻量、独立的包(即容器镜像)构成,包含运行应用所需的一切组件,如代码、运行时、系统工具、库与配置。

容器具备内置隔离性,确保各容器独立运行,并包含各自的软件、库与配置文件。它们可通过定义良好的通道彼此通信,同时由同一操作系统内核执行。与虚拟机相比,这种方式优化了资源利用率,因为它允许多个相互隔离的用户空间实例(即容器)在单个控制主机上运行。

image3.png

图片来源

容器为何对现代应用至关重要?

在机器学习领域,容器化因其诸多优势而尤为重要。以下是关键收益:

1. 可复现性与可移植性

容器封装整个软件栈,确保在不同环境中一致部署,并让 ML 模型轻松迁移。

2. 隔离与依赖管理

依赖被隔离在容器内,避免冲突、简化依赖管理,更便于使用不同版本的库。

3. 可扩展性与资源管理

Kubernetes 等容器编排平台支持高效的资源利用与 ML 工作负载扩缩容,提升性能、降低成本。

为何使用 Docker?

查看 DataCamp 的Docker 速查表。

Docker 常被誉为容器化的先驱,重塑了软件开发与部署的格局。其核心是提供一个平台,用于创建与管理轻量、隔离的容器,容器中封装了应用及其依赖。

Docker 通过容器镜像实现这一点。镜像是自包含的包,包含运行应用所需的一切,从代码到系统库与依赖。Docker 镜像可以轻松创建、共享与部署,使开发者专注于构建应用,而无需深陷繁杂的配置与部署流程。

在项目中创建 Dockerfile

对应用进行容器化,指的是将应用及其依赖封装到 Docker 容器中的过程。第一步是在项目目录中创建一个 Dockerfile。Dockerfile 是一份文本文件,包含用于构建 Docker 镜像的一系列指令。它相当于蓝图,规定了如何创建包含应用代码、依赖与配置的容器。来看一个示例 Dockerfile:

# Use the official Python base image with version 3.9
FROM python:3.9


# Set the working directory within the container
WORKDIR /app


# Copy the requirements file to the container
COPY requirements.txt .


# Install the dependencies
RUN pip install -r requirements.txt


# Copy the application code to the container
COPY . .


# Set the command to run the application
CMD ["python", "app.py"]

如需了解更多常用 Docker 命令和行业最佳实践,请参阅我们的博客《面向数据科学的 Docker:入门》并报名参加《Docker 入门》课程。

这个 Dockerfile 结构简明。首先指定基础镜像为官方的 Python 3.9 版本。容器内的工作目录设为“/app”。将“requirements.txt”复制进容器后,使用“RUN”指令安装所需依赖。随后复制应用代码至容器。最后,使用“CMD”指令定义基于该镜像运行容器时要执行的命令,通常通过 python app.py 启动应用。

从 Dockerfile 构建 Docker 镜像

有了 Dockerfile,您可以在终端运行以下命令来构建镜像。为此,您的电脑需已安装 Docker。若尚未安装,请按照这些说明进行安装。

docker build -t image-name:tag

运行该命令可能需要较长时间。构建镜像时,日志会打印在终端上。docker build 命令用于构建镜像,-t 标志为镜像指定名称与标签。名称代表镜像的标识,标签表示版本或标记。. 表示当前目录(Dockerfile 所在位置),用于告知 Docker 按此目录下的 Dockerfile 作为构建蓝图。

镜像构建完成后,您可以在终端运行 docker images 命令进行确认:

image7.png

作者示例

进一步精通 Docker,请学习 DataCamp 的《Docker 入门》课程。在这门系统课程中,您将掌握容器化基础,深入了解 Docker 的强大功能,并通过真实案例获得实践经验。

为何使用 Kubernetes?

如果说 Docker 颠覆了容器化,那么 Kubernetes 则作为编排器登场,使容器化应用的管理与扩缩容顺畅无阻。Kubernetes(常简称 K8s)可在由多个节点组成的集群上自动化容器的部署、扩缩与管理。

Kubernetes 的核心是为容器编排提供一套强大的特性。开发者可以通过 YAML 清单定义并声明应用的期望状态。随后,Kubernetes 会确保该期望状态得到维持,自动处理如调度容器、按需扩缩应用、管理容器健康与可用性等任务。

借助 Kubernetes,开发者可无缝扩展应用以应对增长的流量与负载,而无需担忧底层基础设施。它提供声明式的基础设施管理方式,使开发者能够专注于构建与改进应用,而非纠结于容器部署的细枝末节。

面向机器学习的 Kubernetes 组件:Pod、Service、Deployment

Kubernetes 提供若干关键组件,助力高效部署与管理机器学习应用,包括 Pod、Service 与 Deployment。

1. Pod

在 Kubernetes 中,Pod 是最小的部署单元,代表集群中一个正在运行进程的实例。在机器学习场景下,Pod 通常封装一个容器化的 ML 模型或 ML 工作流中的特定组件。一个 Pod 可以包含一个或多个协同工作的容器,它们共享同一网络与存储资源。

image2.png

图片来源

2. Service

Service 用于实现不同 Pod 之间的通信与网络连接。Service 定义了一个稳定的网络端点,以访问一个或多个 Pod。在机器学习场景中,Service 可用于将 ML 模型或组件暴露为数据输入或模型推理的端点。它们提供负载均衡与服务发现机制,便于其他应用或服务与 ML 组件交互。

image4.png

图片来源

3. Deployment

Deployment 提供了管理 Pod 创建与扩缩的声明式方式。它确保任意时刻都有指定数量的 Pod 副本在运行。它支持轻松扩缩、滚动更新与回滚。对于需根据负载动态扩缩或需在不停机的前提下应用更新的 ML 工作负载而言,Deployment 尤其有用。

image1.png

图片来源

为 ML 项目编写 Kubernetes 配置文件

要在 Kubernetes 中部署 ML 项目,通常需要编写一份 YAML 格式的 Kubernetes 配置文件。该文件指定应用的期望状态,包括关于 Pod、Service、Deployment 以及其他 Kubernetes 资源的信息。

配置文件描述了运行 ML 应用所需的容器、环境变量、资源需求与网络等要素。它定义了期望的副本数、端口绑定、卷挂载以及该 ML 项目特有的任何配置。

Kubernetes 设置的示例配置 yaml 文件

apiVersion: v1
kind: Pod
metadata:
  name: ml-model-pod
spec:
  containers:
    - name: ml-model-container
      image: your-image-name:tag
      ports:
        - containerPort: 8080
      env:
        - name: ENV_VAR_1
          value: value1
        - name: ENV_VAR_2
          value: value2

在此示例中,使用了多种元素来配置 Kubernetes 中的一个 Pod,包括指定 Kubernetes API 版本、将资源类型定义为 Pod、提供诸如 Pod 名称之类的元数据,并在 spec 部分概述 Pod 的详细规范。

面向机器学习的 Kubernetes

定义好 Kubernetes 配置文件后,部署 ML 模型就是一个直截了当的过程。使用 kubectl 命令行工具即可将该配置应用到 Kubernetes 集群中,从而创建相应的 Pod、Service 与 Deployment。

Kubernetes 将确保达到期望状态,自动创建并管理所需资源。这包括在合适的节点上调度 Pod、管理网络,以及为 Service 提供负载均衡。

Kubernetes 擅长扩展与管理 ML 工作负载。通过水平扩展,可以轻松创建更多 Pod 副本以应对增长的需求或并行化 ML 计算。Kubernetes 会自动管理跨 Pod 的负载分配,并确保高效的资源利用。

image6.png

图片来源

结语

在 Docker 与 Kubernetes 的加持下,容器化为机器学习领域带来了诸多优势与能力。Docker 提供了创建与管理轻量、隔离容器的平台,将应用及其依赖打包封装;它简化了部署流程,使开发者能够专注于构建应用,而非处理复杂配置。

另一方面,Kubernetes 作为编排器,自动化容器化应用的部署、扩缩与管理。它确保应用的期望状态得以维持,处理如调度容器、按需扩缩应用、管理容器健康与可用性等任务。Kubernetes 支持高效的资源利用,并让机器学习工作负载实现平滑扩展,提供一种声明式的基础设施管理方式。

Docker 与 Kubernetes 的组合为管理机器学习应用提供了强大的解决方案。Docker 带来可复现性、可移植性与易于管理的依赖;Kubernetes 则实现高效扩缩、资源管理与容器编排。二者协同,使组织能够以可扩展、可靠的方式释放机器学习的全部潜力。

准备好迈入 MLOps 的世界,革新您的机器学习工作流了吗?请查看我们的《MLOps 入门》指南与《机器学习、流水线、部署与 MLOps 教程》,将您的 MLOps 技能更进一步。您还可以获取 Docker 认证来展示您的 Docker 技能。


Moez Ali's photo
Author
Moez Ali
LinkedIn
Twitter

数据科学家,PyCaret 的创始人兼作者

主题
机器学习