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 的功能,解决部署机器学习模型的复杂性变得更加可行,从而加速从开发到生产的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【福建事业单位-综合基础知识】03行政法

【福建事业单位-综合基础知识】03行政法 1.行政法概述(原则重点)行政主体范围 行政行为总结 二.行政处罚2.1行政处罚的种类总结 行政法框架 1.行政法概述(原则重点) 行政法的首要原则是合法;自由裁量——合理行政&…

SSM——用户、角色、权限操作

1. 数据库与表结构 1.1 用户表 1.1.1 用户表信息描述 users 1.1.2 sql语句 CREATE TABLE users( id varchar2(32) default SYS_GUID() PRIMARY KEY, email VARCHAR2(50) UNIQUE NOT NULL, username VARCHAR2(50), PASSWORD VARCHAR2(50), phoneNum VARCHAR2(20), STATUS INT…

i18n 配置vue项目中英文语言包(中英文转化)

一、实现效果 二、下载插件创建文件夹 2.1 下载cookie来存储 npm install --save js-cookienpm i vue-i18n -S 2.2 封装组件多页面应用 2.3 创建配置语言包字段 三、示例代码 3.1 main.js 引用 i18n.js import i18n from ./lang// 实现语言切换:i18n处理element&#xff0c…

Unity ARFoundation 配置工程 (Android)

注意: 1、AR Core是Google的产品,因为谷歌制裁华为,所以 有些 华为机可能不支持AR Core的软件; 2、手机在设置里搜索Google Play,看看是否已经安装上了,如果没有装此服务,去商城里搜索Google Pl…

互联网发展历程:跨越远方,路由器的启示

互联网的蓬勃发展,一直在追求更广阔的连接,更遥远的距离。然而,在早期的网络中,人们面临着连接距离有限的问题。一项重要的技术应运而生,那就是“路由器”。 连接受限的问题:距离有限 早期的网络受限于直接…

【Pandas】pd.concat和pd.merge的区别

前言 最近做了一个数据挖掘的项目,里面涉及到大量dataframe拼接的操作。在这个过程中,我主要使用过两种拼接方法:pd.merge和pd.concat。其中遇到过一些坑,在这里记录一下。 简介 首先给出pandas官方文档对于这两种方法的介绍&a…

Mysql基础2-多表查询和视图

约束 完整性约束 为防止不规范数据进入数据库中,在用户对数据进行插入,修改,删除操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件 约束条件约束描述PRIMARY KEY主键约束NOT NULL非空约束,字段不…

解决oracle的em访问提示“使用不受支持的协议。”的bug

1. 设置oracle唯一名称 执行emctl时需要设置一个唯一的名称 否则提示 “Environment variable ORACLE_UNQNAME not defined. Please set ORACLE_UNQNAME to database unique name. ”中文意思为“未定义环境变量ORACLE_UNQNAME。 请将ORACLE_UNQNAME设置为数据库唯一名称/服务…

微服务-Nacos(注册中心)

Nacos是SpringCloud的一个功能非常强大的组件,想比eureka的功能更加丰富 官方的nacos简介 Nacos(全称:Naming and Configuration Service)是一个开源的动态服务发现、配置管理和服务管理平台。它由阿里巴巴集团开发并贡献给开源…

tensorflow 模型计算中,预测错误;权重参数加载

tensorflow 模型计算中,预测错误;权重参数加载 tensorflow 模型计算主要代码(正确代码) linear1_kernel_initializer tf.constant_initializer(numpy.transpose(data["linear1.weight"])) linear1_bias_initializer …

【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入传统方案实现实现分析 介绍基本介绍登场角色 案例实现案例一类图实现 案例二类图实现问答 策略模式在JDK源码中的使用总结文章说明 案例引入 有各种鸭子,比如野鸭、北京鸭、水鸭等。 鸭子有各种行为,比如走路、叫、飞行等。不同鸭子的…

设置Linux 静态IP

LInux虚拟机默认的IP地址是动态获取的 作为服务器,我们一般还需要把IP地址设置为静态的 设置静态IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno # BOOTPROTOdhcp 动态获取 BOOTPROTOstatic IPADDR"192.16…

vue 重写数组的七个方法

一、为什么要重写数组方法? Vue 为了实现响应式数据绑定,需要能够捕获到数据的变化,以便在数据发生改变时自动更新视图。JavaScript 中的数组是引用类型,所以常规的引用跟踪机制不能捕获数组内部的变化。因为Vue的响应式是通过 O…

安防监控视频云存储EasyCVR平台H.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

C++ string类详解

⭐️ string string 是表示字符串的字符串类&#xff0c;该类的接口与常规容器的接口基本一致&#xff0c;还有一些额外的操作 string 的常规操作&#xff0c;在使用 string 类时&#xff0c;需要使用 #include <string> 以及 using namespace std;。 ✨ 帮助文档&…

【HarmonyOS】服务卡片 API6 JSUI跳转不同页面

【引言】 “JS卡片支持为组件设置action&#xff0c;包括router事件和message事件&#xff0c;其中router事件用于应用跳。若设置router事件&#xff0c;则action属性值为"router"&#xff1b;abilityName为卡片提供方应用的跳转目标Ability名&#xff1b;params中的…

基于java民宿管理系统设计与实现

摘 要 伴随着我国旅游业的快速发展&#xff0c;民宿已成为最受欢迎的住宿方式之一。民宿借助互联网和移动设备的发展&#xff0c;展现出强大的生命力和市场潜力。民宿主要通过各种平台如携程、去哪儿、淘宝等在网络上销售线下住宿服务&#xff0c;同时民宿经营者也需要从网络上…

Spring Security6 最新版配置该怎么写,该如何实现动态权限管理

Spring Security 在最近几个版本中配置的写法都有一些变化&#xff0c;很多常见的方法都废弃了&#xff0c;并且将在未来的 Spring Security7 中移除&#xff0c;因此又补充了一些新的内容&#xff0c;重新发一下&#xff0c;供各位使用 Spring Security 的小伙伴们参考。 接下…

模板编程-成员特化

成员特化:类模板特化除了可以对整个类进行特化外,可以只针对某部分成员函数进行特化 全类特化和成员特化都属于全局特化 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring>template<typename T> class CMath { public:CMath(const…

文章评论以及回复评论邮件通知(Go 搭建 qiucode.cn 之八)

要说到评论。无疑是博客应用的灵魂所在了,它也正是站长与博友、博友与博友之间互相交流的桥梁,倘若少了它,博客应用将变得暗淡无关,索然无味,恍如一具躺在床榻上的植物人,终究是无法与周边人言语的。 也正是有了评论,站长在该博客应用所发表的博文,博友才得以通过评论,…