译者 | 李睿
审校 | 重楼
近年来,机器学习的应用出现了爆炸式增长,导致对健壮、可扩展和高效部署方法的需求快速增长。由于训练和服务环境之间的差异或扩大规模的困难等因素,传统方法通常需要帮助运营机器学习模型。
本文提出了一种使用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通常通过命令行界面安装,而对于Windows和MacOS, Docker Desktop版本可用。在每种情况下,Docker网站都提供了简单易懂的详细安装说明。通过从Docker Hub(一个基于云的注册表服务,允许开发人员共享应用程序或库)中提取Docker镜像,安装成功。作为示例,可以使用以下命令提取最新的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