您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

利用Docker简化机器学习应用程序的部署和可扩展性

时间:2023-11-10 12:31:07  来源:  作者:

译者 | 李睿

审校 | 重楼

近年来,机器学习的应用出现了爆炸式增长,导致对健壮、可扩展和高效部署方法的需求快速增长。由于训练和服务环境之间的差异或扩大规模的困难等因素,传统方法通常需要帮助运营机器学习模型。

利用Docker简化机器学习应用程序的部署和可扩展性

本文提出了一种使用Docker的技术。Docker是一个开源平台,旨在自动化应用程序的部署、扩展和管理,以此来解决这些挑战。所提出的方法将机器学习类型及其环境封装到一个标准化的Docker容器单元中。Docker容器提供了许多好处,包括开发和生产环境之间的一致性、易于扩展以及部署的简单性。

本文对Docker及其在机器学习模型部署中的作用进行了深入探讨,并对使用Docker部署机器学习模型进行实际演示,从创建Dockerfile到使用Docker Swarm扩展模型,所有这些都以相关代码片段为例。此外,还介绍Docker在持续集成(CI)/持续交付(CD)管道中的集成,最终得出使用Docker进行高效机器学习模型部署的结论和最佳实践。

Docker是什么?

作为一个平台,Docker在轻量级、可移植的容器中自动化软件应用程序的部署、扩展和运营。Docker的基础围绕着“容器化”的概念。这种虚拟化方法允许将软件及其整个运行时环境打包成一个用于软件开发的标准化单元。

Docker容器封装了应用程序运行所需的一切(包括库、系统工具、代码和运行时),并确保它在不同的计算环境中表现一致。这有助于快速可靠地构建、测试和部署应用程序,使Docker成为软件开发和运营(DevOps)的关键工具。

当谈到机器学习应用程序时,Docker带来了几个优势。Docker的容器化特性确保了机器学习模型的训练和服务环境之间的一致性,降低了由于环境差异而遇到差异的风险。Docker还简化了扩展过程,允许在多个服务器上轻松部署机器学习模型的多个实例。这些特性具有显著简化机器学习模型部署和降低相关运营复杂性的潜力。

为什么要将机器学习应用程序Docker化?

在机器学习应用程序的背景下,Docker提供了许多好处,每一个都对运营效率和模型性能做出了重大贡献。

首先,Docker容器提供的一致性环境确保了开发、测试和生产阶段之间的差异最小化。这种一致性消除了“它工作在我的机器上”的问题,使其成为部署机器学习模型的首选,机器学习模型对其运营环境的变化特别敏感。

其次,Docker擅长于促进可扩展性。机器学习应用程序通常需要运行同一模型的多个实例来处理大量数据或高请求率。Docker通过允许快速高效地部署多个容器实例来实现水平扩展,使其成为扩展机器学习模型的有效解决方案。

最后,Docker容器是独立运行的,这意味着它们有自己的运行时环境,包括系统库和配置文件。这种隔离提供了额外的安全层,确保每个机器学习模型在受控和安全的环境中运行。Docker提供的一致性、可扩展性和隔离性使其成为部署机器学习应用程序的具有吸引力的平台。

为机器学习设置Docker

以下重点介绍在机器学习应用程序中使用Docker所需的初始设置。由于操作系统不同,Docker的安装过程略有不同。对于linux发行版,Docker通常通过命令行界面安装,而对于windowsmacOS, Docker Desktop版本可用。在每种情况下,Docker网站都提供了简单易懂的详细安装说明。通过从Docker Hub(一个基于云的注册表服务,允许开发人员共享应用程序或库)中提取Docker镜像,安装成功。作为示例,可以使用以下命令提取最新的Python/ target=_blank class=infotextkey>Python图像以用于机器学习应用程序:

Shell 
docker pull python:3.8-slim-buster

随后,从提取的映像运行Docker容器涉及Docker run命令。例如,如果需要交互式Python shell,则可以使用以下命令:

Shell 
docker run -it python:3.8-slim-buster /bin/bash

该命令启动一个带有交互式终端(-it)的Docker容器,并在Python容器中提供一个shell (/bin/bash)。通过遵循这个过程,Docker可以有效地帮助部署机器学习模型。

为简单的机器学习模型创建Dockerfile

Docker操作简单性的核心是Dockerfile,它是一个文本文档,包含了组装Docker映像所需的所有命令。用户可以通过Docker命令行执行Dockerfile来自动创建镜像。

Dockerfile由一组指令和参数组成,这些指令和参数以连续的行排列。指令是Docker命令,例如FROM(指定基本镜像)、RUN(执行命令)、COPY(将文件从主机复制到Docker镜像)和CMD(为执行容器提供默认值)。

以使用Scikit learn的线性回归算法构建的一个简单的机器学习模型为例。此类应用程序的Dockerfile可能如下所示:

Dockerfile 
 # Use an official Python runtime as a parent image
 FROM python:3.8-slim-buster

 # Set the working directory in the contAIner to /App
 WORKDIR /app

 # Copy the current directory contents into the container at /app
 ADD . /app

 # Install any needed packages specified in requirements.txt
 RUN pip install --no-cache-dir -r requirements.txt

 # Make port 80 available to the world outside this container
 EXPOSE 80



 # Run app.py when the container launches

 CMD ["python", "app.py"]

这个Dockerfile中提到的requirements.txt文件列出了机器学习模型的所有Python依赖项,例如Scikit-learn、Pandas和Flask。另一方面,app.py脚本包含加载经过训练的模型并将其用作Web应用程序的代码。

通过在Dockerfile中定义配置和依赖关系,可以创建一个映像,其中包含机器学习模型及其执行所需的运行时环境,从而促进一致的部署。

构建和测试Docker镜像

在成功创建Dockerfile之后,接下来的阶段包括构建Docker映像。通过执行Docker build命令构建Docker镜像,然后执行包含Docker文件的目录。-t标志用指定的名称标记图像。这样一个命令的实例是:

Shell 
 docker build -t ml_model_image:1.0 

在这里,ml_model_image:1.0是分配给图像的名称和版本,而“.”表示Dockerfile驻留在当前目录中。

在构建Docker镜像之后,下面的任务涉及从该镜像启动Docker容器,从而允许测试机器学习模型的功能。Docker的run命令可以帮助完成这个任务:

Shell 
 docker run -p 4000:80 ml_model_image:1.0

在这个命令中,-p标志将主机的端口4000映射到容器的端口80(在Dockerfile中定义)。因此,机器学习模型可以通过主机的4000端口访问。

测试模型需要向Docker容器中的Flask应用程序公开的端点发送一个请求。例如,如果模型基于POST请求发送的数据提供预测,curl命令可以促进这一点:

Shell 
 curl -d '{"data":[1, 2, 3, 4]}' -H 'Content-Type: application/json' http://localhost:4000/predict

该方法确保了从Dockerfile创建到在Docker容器中测试机器学习模型的无缝流程。

使用Docker部署机器学习模型

机器学习模型的部署通常涉及将模型公开为可通过互联网访问的服务。实现这一目标的标准方法是使用Web框架(如Flask)将模型作为REST API提供服务。

考虑一个Flask应用程序封装机器学习模型的例子。以下的Python脚本演示了如何将模型作为REST API端点公开:

Python 
 from flask import Flask, request
 from sklearn.externals import joblib

 app = Flask(__name__)
 model = joblib.load('model.pkl')

 @app.route('/predict', methods=['POST'])

 def predict():
  data = request.get_json(force=True)
  prediction = model.predict([data['features']])
  return {'prediction': prediction.tolist()}

 if __name__ == '__main__':
 app.run(host='0.0.0.0', port=80)

在这个例子中,Flask应用程序加载了一个预训练的Scikit-learn模型(保存为model.pkl),并定义了一个API端点/predict。当POST请求与包含特性数组的JSON对象一起发送到该端点时,模型进行预测并将其作为响应返回。

一旦机器学习模型被部署并在Docker容器中运行,它就可以使用HTTP请求进行通信。例如,使用curl命令,一个POST请求可以发送到一个特征数组的模型,它将响应一个预测:

Shell 
 curl -d '{"features":[1, 2, 3, 4]}' -H 'Content-Type: application/json'
 http://localhost:4000/predict

这个实例演示了Docker如何将机器学习模型部署为可扩展和可访问的服务。

用Docker Swarm扩展器学习模型

随着机器学习应用程序的范围和用户基础的增长,扩展能力变得越来越重要。Docker Swarm为Docker提供了一个本地集群和编排解决方案,允许多个Docker主机变成一个虚拟主机。因此,Docker Swarm可以用于跨多台机器管理和扩展部署的机器学习模型。

启动Docker Swarm是一个简单的过程,通过执行“Docker Swarm init”命令开始。这个命令将当前机器初始化为Docker Swarm管理器:

Shell 
 docker swarm init --advertise-addr $(hostname -i)

在这个命令中,--advertise-addr标志指定工作节点可以到达Swarm管理器的地址。hostname-i命令检索当前机器的IP地址。

在初始化Swarm之后,机器学习模型可以使用Docker服务跨Swarm部署。该服务是用docker service create命令创建的,其中像-replicas这样的标志可以决定要运行的容器实例的数量:

Shell 
 docker service create --replicas 3 -p 4000:80 --name ml_service ml_model_image:1.0

在这个命令中,--replica 3确保容器的三个实例在Swarm中运行,-p 4000:80将Swarm的端口4000映射到容器的端口80,--name ml_service为服务分配一个名称。

因此,通过实现Docker Swarm,部署的机器学习模型可以有效地跨多个Docker主机扩展,从而增强其可用性和性能。

采用Docker的持续集成(CI)/持续交付(CD)

持续集成(CI)/持续交付(CD)是现代软件开发的一个重要方面,促进自动化测试和部署,以确保软件发布周期的一致性和速度。Docker的可移植性很适合持续集成(CI)/持续交付(CD)管道,因为Docker映像可以在管道中的不同阶段进行构建、测试和部署。

一个将Docker集成到持续集成(CI)/持续交付(CD)管道中的例子可以用Jenkins管道来说明。管道在Jenkinsfile中定义,看起来像这样:

Groovy 
 pipeline {
 agent any

 stages {
 stage('Build') {
 steps {
 script {
 sh 'docker build -t ml_model_image:1.0 .'
 }
 }
 }
 stage('Test') {
 steps {
 script {
 sh 'docker run -p 4000:80 ml_model_image:1.0'
 sh 'curl -d '{"features":[1, 2, 3, 4]}' -H 'Content-Type: application/json' http://localhost:4000/predict'
 }
 }
 }
 stage('Deploy') {
 steps {
 script {
 sh 'docker service create --replicas 3 -p 4000:80 --name ml_service ml_model_image:1.0'
 }
 }
 }
 }
 }

在这个Jenkinsfile中,构建(Build)阶段构建Docker镜像,测试(Test)阶段运行Docker容器并向机器学习模型发送请求以验证其功能,部署(Deploy)阶段创建Docker服务并跨Docker Swarm进行扩展。

因此,借助Docker, 持续集成(CI)/持续交付(CD)管道可以实现可靠高效的机器学习模型部署。

结论和最佳实践

最后,本文强调了Docker在简化机器学习模型部署方面的功效。Docker能够将模型及其依赖关系封装在一个独立的、一致的、轻量级的环境中,这使得Docker成为机器学习从业者的一个强大工具。通过Docker Swarm和它与持续集成(CI)/持续交付(CD)管道的无缝集成,Docker在跨多台机器扩展机器学习模型的潜力进一步增强了它的价值。

然而,为了从Docker中获取最大的价值,推荐以下最佳实践:

  • 最小化Docker镜像大小:较小的镜像使用更少的磁盘空间,减少构建时间,并加快部署。这可以通过使用更小的基本映像、删除不必要的依赖以及有效地利用Docker的层缓存来实现。
  • 使用.dokerignore:与Git中的.gitignore类似,.dokerignORE可以防止Docker镜像中包含不必要的文件,从而减小其大小。
  • 确保Dockerfiles是可复制的:在将来构建Docker镜像时,使用特定版本的基本镜像和依赖可以防止意外的更改。

通过坚持这些指南并充分利用Docker的功能,在部署机器学习模型的复杂性中导航变得更加可行,从而加快了从开发到生产的路径。

参考文献

1.Docker Official Documentation. Docker, Inc.

2.Docker for Machine Learning. O'Reilly Media, Inc.

3. Continuous Integration with Docker. Jenkins Documentation.

4.Scikit-learn: Machine Learning in Python. Scikit-learn Developers.

5.Kalade, S., Crockett, L. H., & Stewart, R. (2018). Using Sequence to Sequence Learning for Digital BPSK and QPSK Demodulation.

6.Blog — Page 3 — Liran Tal.

7.Introduction to the Dockerfile Part II | by Hakim | Medium.

8.Spring Boot 2.2 with JAVA 13 CRUD REST API Tutorial: Using JPA Hibernate & MySQL | Techiediaries

原文标题:AI Prowess: Harnessing Docker for Streamlined Deployment and Scalability of Machine Learning Applications,作者:Rudrendu Kumar PaulBidyut Sarkar



Tags:Docker   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  Search: Docker  点击:(11)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22  Search: Docker  点击:(10)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  Search: Docker  点击:(22)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  Search: Docker  点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  Search: Docker  点击:(75)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04  Search: Docker  点击:(124)  评论:(0)  加入收藏
七个杀手级Docker命令
Docker是一个容器化平台,通过操作系统级别的虚拟化技术,实现软件的打包和容器化运行。借助Docker,开发人员能够将应用程序以容器的形式进行部署,但在此之前需要构建Docker镜像。...【详细内容】
2023-12-22  Search: Docker  点击:(140)  评论:(0)  加入收藏
Docker容器如何打包应用程序的代码和依赖项?
Docker容器通过将应用程序的代码和所有依赖项打包到一个独立的软件包中,实现了应用程序的快速部署和移植。下面是Docker容器实现这一目标的步骤:打包应用程序:使用Docker工具将...【详细内容】
2023-12-20  Search: Docker  点击:(130)  评论:(0)  加入收藏
DBA视角:把数据库放入Docker是一个馊主意
对于无状态的应用服务而言,容器是一个相当完美的开发运维解决方案。然而对于带持久状态的服务 —— 数据库来说,事情就没有那么简单了。生产环境的数据库是否应当放...【详细内容】
2023-12-18  Search: Docker  点击:(197)  评论:(0)  加入收藏
Docker容器编排技术解析
一、容器编排介绍容器编排是现代云原生应用管理的核心,它涉及在大规模的环境中自动化部署、管理、扩展和网络配置容器。随着微服务架构的兴起和应用的复杂性增加,容器编排成为...【详细内容】
2023-12-15  Search: Docker  点击:(244)  评论:(0)  加入收藏
▌简易百科推荐
Docker 和传统虚拟机有什么区别?
我有一个程序员朋友,他每年情人节都要送女朋友一台服务器。他说:“谁不想在过节当天收到一台 4核8g 的服务器呢?”“万一对方不要,我还能留着自己用。” 给他一次过节的机会,他能...【详细内容】
2024-03-26  小白debug  微信公众号  Tags:Docker   点击:(11)  评论:(0)  加入收藏
掌握Docker网络驱动程序:优化容器通信
Docker为在容器内包装、交付和运行应用程序提供了一个强大的平台,从而彻底改变了容器化。网络是容器化的重要组成部分,Docker提供了各种网络驱动程序来支持容器之间的通信以...【详细内容】
2024-03-22    51CTO  Tags:Docker   点击:(10)  评论:(0)  加入收藏
Containerd容器管理
Nginx 指定容器名称 使用 ctr container create 命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。容器基本操作容器基本操作主要是 ctr image 命令,查看命令帮...【详细内容】
2024-03-20  云原生运维圈  微信公众号  Tags:容器   点击:(13)  评论:(0)  加入收藏
如何基于Docker镜像逆向生成Dockerfile
引言你是否曾经遇到过一个想要使用的 Docker 镜像,但却无法修改以适应你的特定需求?或者你可能发现了一个喜欢的 Docker 镜像,但想要了解它是如何构建的?在这两种情况下,将 Docke...【详细内容】
2024-03-07  云原生运维圈  微信公众号  Tags:Docker   点击:(22)  评论:(0)  加入收藏
Kubernetes是什么?主要特点是什么?
Kubernetes是什么?Kubernetes,也称为K8s,是一个开源的容器编排系统,由Google首次开发和维护。它允许容器化的应用程序在集群中自动部署、扩展和管理。Kubernetes提供了一种容器...【详细内容】
2024-02-01    简易百科  Tags:Kubernetes   点击:(153)  评论:(0)  加入收藏
我们一起聊聊容器资源自愈
在企业实际在使用容器这类资源的时候,除了技术本身,要考虑的其他问题也会很多。企业管理的容器有千千万万,出于效率考虑,对于有特殊需求的容器如何进行批量创建和管理呢,这就需要...【详细内容】
2024-01-30  匠心独运维妙维效  微信公众号  Tags:容器   点击:(47)  评论:(0)  加入收藏
Docker与Docker Compose入门:释放你应用部署的威力
今天给大家介绍一项强大而有趣的技能,那就是使用 Docker 和 Docker Compose 来释放你的应用部署的威力!无论你是一名开发人员还是系统管理员,掌握这个技能都将为你的工作带来巨...【详细内容】
2024-01-17  waynblog  微信公众号  Tags:Docker   点击:(65)  评论:(0)  加入收藏
Docker镜像与容器的交互及在容器内部执行代码的原理与实践
Docker作为一种流行的容器技术,已经成为现代应用程序开发和部署的重要工具。在Docker中,镜像是构建和运行容器的基础,而容器则是基于镜像创建的可执行实例。Docker镜像与容器的...【详细内容】
2024-01-10  编程技术汇  今日头条  Tags:Docker   点击:(75)  评论:(0)  加入收藏
如何在 Ubuntu 上安装 Docker
使用 Docker 意味着开启一个新的计算领域,但如果你刚刚开始使用 Docker,安装可能看起来是一项艰巨的任务。在 Ubuntu 上安装 Docker 有两种推荐的方法: 从 Ubuntu 的仓库安装 D...【详细内容】
2024-01-04    Linux中国  Tags:Docker   点击:(124)  评论:(0)  加入收藏
从Kubernetes的探针到DevOps
今天在群里又看有人问如何设置 Kubernetes 的探针,感觉要补充的话太多了,结合我们在一些 DevOps 项目中痛苦的体验,今天一劳永逸的全部说完,此外,也为大家展现一下为什么 DevOps...【详细内容】
2023-12-27  云云众生s  微信公众号  Tags:Kubernetes   点击:(113)  评论:(0)  加入收藏
站内最新
站内热门
站内头条