当前位置: 首页 > news >正文

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

        利用 Docker 的强大功能:简化部署解决方案、确保可扩展性并简化机器学习模型的 CI/CD 流程。

        近年来,机器学习 (ML) 出现了爆炸性增长,导致对健壮、可扩展且高效的部署方法的需求不断增加。由于训练和服务环境之间的差异或扩展的困难等因素,传统方法通常需要帮助来操作机器学习模型。本文提出了一种使用 Docker 的技术,Docker 是一个开源平台,旨在自动化应用程序部署、扩展和管理,作为应对这些挑战的解决方案。所提出的方法将机器学习模型及其环境封装到标准化的 Docker 容器单元中。容器提供了许多好处,包括跨开发和生产环境的一致性、易于扩展以及部署简单。以下部分深入探讨了 Docker、它在 ML 模型部署中的作用,以及使用 Docker 部署 ML 模型的实际演示,从 Dockerfile 的创建到使用 Docker Swarm 扩展模型,所有这些都通过相关代码片段。此外,还介绍了Docker 在持续集成/持续部署 ( CI/CD ) 管道中的集成,最后得出了使用 Docker 进行高效 ML 模型部署的结论和最佳实践。

什么是 Docker? 

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

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

        当谈到机器学习应用程序时,Docker 带来了几个优势。Docker 的容器化特性确保了 ML 模型的训练和服务环境之间的一致性,从而降低了因环境差异而出现差异的风险。Docker 还简化了扩展过程,允许在众多服务器上轻松部署 ML 模型的多个实例。这些功能有可能显着简化机器学习模型的部署并降低相关的操作复杂性。

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

        在机器学习应用程序中,Docker 提供了众多优势,每一项都对运营效率和模型性能做出了重大贡献。

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

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

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

为机器学习设置 Docker

        本节重点介绍将 Docker 与机器学习应用程序结合使用所需的初始设置。Docker 的安装过程根据所使用的操作系统略有不同。对于 Linux 发行版,Docker 通常通过命令行界面安装,而对于 Windows 和 MacOS,则提供 Docker Desktop 版本。在每种情况下,Docker 网站都提供了易于遵循的详细安装说明。通过从 Docker Hub 拉取 Docker 映像来成功安装,Docker Hub 是一种基于云的注册表服务,允许开发人员共享应用程序或库。作为说明,可以使用以下命令提取最新的 Python 映像以用于机器学习应用程序:

docker pull python:3.8-slim-buster

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

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

        此命令使用交互式终端 ( ) 启动 Docker 容器,并在 Python 容器内-it提供 shell ( )。/bin/bash通过遵循此流程,Docker 被有效地设置为协助部署机器学习模型。

为简单的 ML 模型创建 Dockerfile

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

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

        考虑使用 Scikit-learn 的线性回归算法构建的简单机器学习模型作为实际说明。此类应用程序的 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 launchesCMD ["python", "app.py"]

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

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

构建和测试 Docker 镜像

        成功创建 Dockerfile 后,后续阶段涉及构建 Docker 映像。Docker 镜像是通过执行docker build命令构建的,后跟包含 Docker 文件的目录。该-t标志用指定的名称标记图像。此类命令的一个实例是:

docker build -t ml_model_image:1.0 

这里,ml_model_image:1.0是分配给镜像的名称(和版本),而“ .”表示 Dockerfile 位于当前目录中。

构建 Docker 映像后,以下任务涉及从此映像启动 Docker 容器,从而测试机器学习模型的功能。该docker run命令有助于实现这一目标:

docker run -p 4000:80 ml_model_image:1.0

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

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

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

所提出的方法确保了从 Dockerfile 创建到在 Docker 容器内测试 ML 模型的无缝流程。

使用 Docker 部署 ML 模型

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

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

from flask import Flask, request
from sklearn.externals import joblibapp = 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。当使用包含一组特征的 JSON 对象将 POST 请求发送到此端点时,模型会进行预测并将其作为响应返回。

一旦 ML 模型在 Docker 容器中部署并运行,就可以使用 HTTP 请求进行通信。例如,使用该curl命令,可以将 POST 请求发送到具有一系列特征的模型,并且它将通过预测进行响应:

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

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

使用 Docker Swarm 扩展 ML 模型

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

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

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

在此命令中,该--advertise-addr标志指定工作节点可以访问 Swarm 管理器的地址。该hostname -i 命令检索当前计算机的 IP 地址。

Swarm 初始化后,可以使用 Docker 服务在 Swarm 上部署机器学习模型。该服务是使用以下docker service create命令创建的,其中类似的标志--replicas可以指示要运行的容器实例的数量:

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

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

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

使用 Docker 进行持续集成/持续部署 (CI/CD)

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

可以使用 Jenkins 管道来说明将 Docker 集成到 CI/CD 管道的示例。管道在 Jenkinsfile 中定义,可能如下所示:

pipeline {agent anystages {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 中获取最大价值,建议使用某些最佳实践:

  1. 最小化 Docker 映像大小: 较小的映像使用较少的磁盘空间、减少构建时间并加快部署速度。这可以通过使用较小的基础映像、删除不必要的依赖项并有效利用 Docker 的层缓存来实现。
  2. 使用 .dockerignore: 与 Git 中的 .gitignore 类似,.dockerignore 可以防止 Docker 镜像中包含不必要的文件,从而减小其大小。
  3. 确保 Dockerfile 是可重现的:使用特定版本的基础映像和依赖项可以防止将来构建 Docker 映像时发生意外更改。

通过遵守这些准则并充分利用 Docker 的功能,解决部署机器学习模型的复杂性变得更加可行,从而加速从开发到生产的过程。

相关文章:

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

利用 Docker 的强大功能:简化部署解决方案、确保可扩展性并简化机器学习模型的 CI/CD 流程。 近年来,机器学习 (ML) 出现了爆炸性增长,导致对健壮、可扩展且高效的部署方法的需求不断增加。由于训练和服务环境之间的差异或扩展的困难等因素&a…...

商用汽车转向系统常见故障解析

摘要: 车辆转向系统是用于改变或保持汽车行驶方向的专门机构。其作用是使汽车在行驶过程中能按照驾驶员的操纵意图而适时地改变其行驶方向,并在受到路面传来的偶然冲击及车辆意外地偏离行驶方向时,能与行驶系统配合共同保持车辆继续稳定行驶…...

Python中的MetaPathFinder

MetaPathFinder 是 Python 导入系统中的一个关键组件,它与 sys.meta_path 列表紧密相关。sys.meta_path 是一个包含 MetaPathFinder 实例的列表,这些实例用于自定义模块的查找和加载逻辑。当使用 import 语句尝试导入一个模块时,Python 会遍历…...

工控机防病毒

2月3日,作为全球最大的半导体制造设备和服务供应商,美国应用材料公司(Applied Materials)表示,有一家上游供应商遭到勒索软件攻击,由此产生的关联影响预计将给下季度造成2.5亿美元(约合人民币17…...

LangChain手记 Question Answer 问答系统

整理并翻译自DeepLearning.AILangChain的官方课程:Question Answer(源代码可见) 本节介绍使用LangChian构建文档上的问答系统,可以实现给定一个PDF文档,询问关于文档上出现过的某个信息点,LLM可以给出关于该…...

如何优化css中的一些昂贵属性

如何优化css中的一些昂贵属性 就性能而言,某些 CSS 属性比其他属性的成本更高。如果使用不当,它们可能会减慢我们的网页速度并降低对用户的响应速度。在本文中,我们将探讨一些成本最高的 CSS 属性以及如何优化它们。 box-shadow box-shado…...

基于安防监控EasyCVR视频汇聚融合技术的运输管理系统的分析

一、项目背景 近年来,随着物流行业迅速发展,物流运输费用高、运输过程不透明、货损货差率高、供应链协同能力差等问题不断涌现,严重影响了物流作业效率,市场对于运输管理数字化需求愈发迫切。当前运输行业存在的难题如下&#xf…...

在WordPress站点中展示阅读量等流量分析数据(超详细实现)

这篇文章也可以在我的博客中查看 关于本文 专业的流量统计系统能够相对真实地反应网站的访问情况。 这些数据可以在后台很好地进行分析统计,但有时我们希望在网站前端展示一些数据 最常见的情景就是:展示页面的浏览量 这简单的操作当然也可以通过简单…...

学习 Iterator 迭代器

今天看到一个面试题, 让下面解构赋值成立。 let [a,b] {a:1,b:2} 如果我们直接在浏览器输出这行代码,会直接报错,说是 {a:1,b:2} 不能迭代。 看了es6文档后,具有迭代器的就一下几种类型,没有Object类型,…...

JVM---垃圾回收算法介绍

目录 分代收集理论 三种垃圾回收算法 标记-清除算法(最基础的、基本不用) 标记-复制算法 标记-整理算法 正式因为jvm有了垃圾回收机制,作为java开发者不会去特备关注内存,不像C和C。 优点:开发门槛低、安全 缺点…...

Ubuntu一直卡死的问题(20.04)

Ubuntu一直卡死的问题(18.04)_ubuntu频繁死机_Mr.Yi的博客-CSDN博客 我自己的解决方法: 1、首先强制关机重启后,直接打开命令行查看磁盘的使用: df -h发现/dev/loop都沾满了,我们能需要做的就是把他们清理干净 sud…...

自动化测试用例设计实例

在编写用例之间,笔者再次强调几点编写自动化测试用例的原则: 1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统…...

CSS3基础

CSS3在CSS2的基础上增加了很多功能,如圆角、多背景、透明度、阴影等,以帮助开发人员解决一些实际问题。 1、初次使用CSS 与HTML5一样,CSS3也是一种标识语言,可以使用任意文本编辑器编写代码。下面简单介绍CSS3的基本用法。 1.1…...

【栈】 735. 行星碰撞

735. 行星碰撞 解题思路 如果数组元素大于0 说明向右移动 那么不管 左边元素是不是大于0 都不会碰撞 如果数组元素小于0 说明想左边移动 那么判断左边元素 如果左边元素大于0 碰撞 那么遍历数组 当前元素大于0 直接入栈 如果当前元素小于0 判断栈顶元素是不是大于0 如果大…...

水库大坝安全监测MCU,提升大坝管理效率的利器!

水库大坝作为防洪度汛的重要设施,承担着防洪抗旱,节流发电的重要作用。大坝的安全直接关系到水库的安全和人民群众的生命财产安全。但因为水库大坝的隐患不易被察觉,发现时往往为时已晚。因此,必须加强对大坝的安全管理。其安全监…...

【vue2类型助手】vue2-cli 实现为 vue2 项目中的组件添加全局类型提示

实现 vue2 全局组件提示 vue2 项目全局注册组件直接使用没有提示 由于vue2中使用volar存在很大的性能问题,所以只能继续使用vetur,但是这样全局组件会没有提示,这对于开发来说,体验十分不友好,所以开发此cli并借助ve…...

mysql 索引 区分字符大小写

mysql 建立索引,特别是unique索引,是跟字符集、字符排序规则有关的。 对于utf8mb4_0900_ai_ci来说,0900代表Unicode 9.0的规范,ai表示accent insensitivity,也就是“不区分音调”,而ci表示case insensitiv…...

Stable Diffusion Webui源码剖析

1、关键python依赖 (1)xformers:优化加速方案。它可以对模型进行适当的优化来加速图片生成并降低显存占用。缺点是输出图像不稳定,有可能比不开Xformers略差。 (2)GFPGAN:它是腾讯开源的人脸修…...

为什么kafka 需要 subscribe 的 group.id?我们是否需要使用 commitSync 手动提交偏移量?

目录 一、为什么需要带有 subscribe 的 group.id二、我们需要使用commitSync手动提交偏移量吗?三、如果我想手动提交偏移量,该怎么做? 一、为什么需要带有 subscribe 的 group.id 消费概念: Kafka 使用消费者组的概念来实现主题的…...

什么是Web应用程序防火墙,WAF与其他网络安全工具差异在哪?

一、什么是Web 应用程序防火墙 (WAF) ? WAF软件产品被广泛应用于保护Web应用程序和网站免受威胁或攻击,它通过监控用户、应用程序和其他互联网来源之间的流量,有效防御跨站点伪造、跨站点脚本(XSS攻击)、SQL注入、DDo…...

前端开发面试题总结-HTML篇

文章目录 HTML面试高频问答一、HTML 的 src 和 href 属性有什么区别?二、什么是 HTML 语义化?三、HTML的 script 标签中 defer 和 async 有什么区别?四、HTML5 相比于 HTML有哪些更新?五、HTML行内元素有哪些? 块级元素有哪些? 空(void)元素有哪些?六、iframe有哪些优点…...

go语言学习 第7章:数组

第7章:数组 数组是一种基本的数据结构,用于存储相同类型的元素集合。在Go语言中,数组的大小是固定的,一旦定义,其长度不可改变。本章将详细介绍Go语言中数组的定义、初始化、访问、遍历以及一些常见的操作。 一、数组…...

Linux安装jdk、tomcat

1、安装jdk sudo yum install -y java-1.8.0-openjdk-devel碰到的问题:/var/run/yum.pid 已被锁定 Another app is currently holding the yum lock; waiting for it to exit… https://blog.csdn.net/u013669912/article/details/131259156 参考&#…...

STM32学习之I2C(理论篇)

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...

Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析

你可能会认为:用了跨平台框架(如 Flutter 或 React Native),开发效率提高了,发布流程也该更轻松才对。 但当我第一次要将一个 Flutter 项目发布到 App Store 时,现实给了我一巴掌: “没有 Mac&…...

九、【ESP32开发全栈指南: UDP通信服务端】

一、TCP与UDP核心差异 特性TCPUDP连接方式面向连接 (需三次握手)无连接可靠性可靠传输 (重传/排序/校验)尽力交付 (不保证可靠性)实时性延迟较高低延迟,实时性强传输效率协议开销大头部开销小 (仅8字节)连接类型点对点支持广播/多播资源占用高 (需维护连接状态)极低…...

RocketMQ入门5.3.2版本(基于java、SpringBoot操作)

一、RocketMQ概述 RocketMQ是一款由阿里巴巴于2012年开源的分布式消息中间件,旨在提供高吞吐量、高可靠性的消息传递服务。主要特点有: 灵活的可扩展性 海量消息堆积能力 支持顺序消息 支持多种消息过滤方式 支持事务消息 支持回溯消费 支持延时消…...

sqlsugar WhereIF条件的大于等于和等于查出来的坑

一、如下图所示,当我用 .WhereIF(input.Plancontroltype > 0, u > u.Plancontroltype (DnjqPlancontroltype)input.Plancontroltype) 这里面用等于的时候,返回结果一条数据都没有。 上图中生成的SQL如下: SELECT id AS Id ,code AS …...

Vue在线预览excel、word、ppt等格式数据。

目录 前言 1.安装库 2.预览文件子组件代码 3、新建store/system.ts 4、父页面进行使用 总结 前言 纯前端处理文件预览,包含excel、word、ppt、txt等格式,不需要后端服务器进行部署,并且内网也可以使用。 1.安装库 npm install vue-offi…...

分页查询的实现

第一步&#xff1a;导入pom依赖 <!--配置PageHelper分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version><exclusions>…...