【MLOPs】Docker

news2024/11/19 8:49:07

 🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

简介

Docker

Architecture(建筑学)

设置

Images

Dockerfile

构建镜像

运行容器

调试

生产


将我们的应用程序打包到可重现和可扩展的容器中。

简介

实现可重现性的最后一步是将我们的版本化代码和工件部署在可重现的环境中。这远远超出了我们为 Python 应用程序配置的虚拟环境,因为我们没有捕获系统级规范(操作系统、所需的隐式包等)。我们希望能够封装我们需要的所有需求,这样就没有外部依赖项会阻止其他人复制我们的确切应用程序。

Docker

实际上有相当多的系统级可再现性解决方案(VM、容器引擎等),但Docker容器引擎是迄今为止最受欢迎的几个关键优势:

  • 通过 Dockerfile 实现可重现性,并带有在特定系统中部署我们的应用程序的明确说明。
  • 通过容器进行隔离,以免影响也可能在同一底层操作系统上运行的其他应用程序。
  • 以及更多优势,包括大小(每个应用程序不需要单独的操作系统)、速度、Docker Hub等。

我们将使用 Docker 以隔离、可重复和可扩展的方式在本地部署我们的应用程序。一旦我们这样做了,任何安装了 Docker 引擎的机器都可以重现我们的工作。但是,Docker 还有很多其他功能,您可以在docs中进行探索,这超出了我们的需要。

Architecture(建筑学)

在我们安装 Docker 之前,让我们看看容器引擎是如何在我们的操作系统之上工作的,它可以是我们的本地硬件或在云上管理的东西。

Docker 容器引擎负责启动已配置的容器,其中包含我们的应用程序及其依赖项(二进制文件、库等)。容器引擎非常高效,因为它不需要为每个容器化应用程序创建单独的操作系统。这也意味着我们的容器可以通过 Docker 引擎共享系统的资源。

设置

现在我们已准备好根据我们的操作系统安装Docker。安装后,我们可以启动 Docker 桌面,这将允许我们创建和部署我们的容器化应用程序。

docker --version
Docker version 20.10.8, build 3967b7d

Images

第一步是构建一个包含应用程序及其所有指定依赖项的 docker 映像。我们可以使用概述一组指令的 Dockerfile 创建此映像。这些指令本质上是在彼此之上构建只读图像层来构建我们的整个图像。让我们看看我们的应用程序的Dockerfile和它创建的镜像层。

Dockerfile

我们将从创建 Dockerfile 开始:

touch Dockerfile

我们将写入的第一行Dockerfile指定了我们想要从 FROM中提取的基础镜像。在这里,我们想使用基础镜像来运行基于 Python 的应用程序,特别是用于带有 slim 变体的 Python 3.7。由于我们只部署了一个 Python 应用程序,这个带有最少包的苗条变体满足了我们的要求,同时保持了图像层的大小。

# Base image
FROM python:3.7-slim

接下来我们将安装我们的应用程序依赖项。首先,我们将从本地文件系统中复制所需的文件,以便我们可以使用它们进行安装。或者,如果我们在一些远程基础设施上运行,我们可以从远程 git 主机中提取。获得文件后,我们可以使用RUN命令安装安装应用程序依赖项所需的包。一旦我们使用完这些包,我们可以删除它们以将我们的图像层的大小保持在最小。

# Install dependencies
WORKDIR /mlops
COPY setup.py setup.py
COPY requirements.txt requirements.txt
RUN apt-get update \
    && apt-get install -y --no-install-recommends gcc build-essential \
    && rm -rf /var/lib/apt/lists/* \
    && python3 -m pip install --upgrade pip setuptools wheel \
    && python3 -m pip install -e . --no-cache-dir \
    && python3 -m pip install protobuf==3.20.1 --no-cache-dir \
    && apt-get purge -y --auto-remove gcc build-essential

接下来我们准备复制所需的文件以实际运行我们的应用程序。

# Copy
COPY tagifai tagifai
COPY app app
COPY data data
COPY config config
COPY stores stores

# Pull assets from S3
RUN dvc init --no-scm
RUN dvc remote add -d storage stores/blob
RUN dvc pull

由于我们的应用程序 (API) 需要打开 PORT 8000,因此我们需要在 Dockerfile 中指定以公开它。

# Export ports
EXPOSE 8000

构建镜像的最后一步是指定从我们的镜像构建容器时要运行的可执行文件。对于我们的应用程序,我们希望使用 gunicorn 启动我们的 API,因为这个 Dockerfile 可用于将我们的服务大规模部署到生产环境中。

# Start app
ENTRYPOINT ["gunicorn", "-c", "app/gunicorn.py", "-k", "uvicorn.workers.UvicornWorker", "app.api:app"]

在 Dockerfile 中有更多命令可供我们使用,例如使用环境变量 ( ENV ) 和参数 ( ARG )、命令参数 ( CMD )、指定卷 ( VOLUME )、设置工作目录 ( WORKDIR ) 等等,所有这些你都可以通过官方文档来探索。

构建镜像

一旦我们完成了 Dockerfile 的编写,我们就可以使用build命令构建我们的镜像了,该命令允许我们添加标签并指定要使用的 Dockerfile 的位置。

docker build -t tagifai:latest -f Dockerfile .

我们可以像这样检查所有构建的图像及其属性:

docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tagifai      latest    02c88c95dd4c   23 minutes ago   2.57GB

我们还可以根据其唯一 ID 删除任何或所有图像。

docker rmi <IMAGE_ID>              # remove an image
docker rmi $(docker images -a -q)  # remove all images

运行容器

一旦我们构建了我们的镜像,我们就可以使用该镜像运行一个容器,运行命令允许我们指定镜像、端口转发等。

docker run -p 8000:8000 --name tagifai tagifai:latest

一旦我们的容器运行起来,我们就可以使用 API,感谢我们共享的端口(8000):

curl -X 'POST' \
  'http://localhost:8000/predict' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "texts": [
    {
      "text": "Transfer learning with transformers for text classification."
    }
  ]
}'

我们可以像这样检查所有容器(运行或停止):

docker ps     # running containers
docker ps -a  # stopped containers
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS    PORTS                    NAMES
ee5f1b08abd5   tagifai:latest   "gunicorn -c config…"    19 minutes ago   

docker stop <CONTAINER_ID>      # stop a running container
docker rm <CONTAINER_ID>        # remove a container
docker stop $(docker ps -a -q)  # stop all containers
docker rm $(docker ps -a -q)    # remove all containers

如果我们的应用程序需要多个容器用于不同的服务(API、数据库等),那么我们可以使用 docker compose功能一次将它们全部启动,并使用Kubernetes (K8s)等容器编排系统来扩展和管理它们。如果我们专门部署 ML 工作流,我们可以使用KubeFlow 之类的工具包来帮助我们管理和扩展。

调试

如果我们在构建镜像层时遇到错误,调试问题的一种非常简单的方法是使用迄今为止构建的镜像层运行容器。我们可以通过Dockerfile. 然后我们需要重建镜像(因为我们改变了 Dockerfile)并运行容器:

docker build -t tagifai:latest -f Dockerfile .
docker run -p 8000:8000 -it tagifai /bin/bash

一旦我们的容器运行起来,我们就可以像在本地机器上一样使用我们的应用程序,但现在它可以在任何可以运行 Docker 容器引擎的操作系统上重现。我们已经介绍了从 Docker 部署我们的应用程序所需的内容,但 Docker 还有更多内容,您可以在docs中进行探索。

生产

Dockerfile通常是数据科学家或 ML 工程师交付给他们的 DevOps 团队以部署和扩展他们的服务的最终工件,并进行了一些更改:

  • 数据资产将从远程存储位置(例如 S3)中提取。
  • 模型工件将从远程模型注册表加载。
  • 代码将从远程存储库(例如 GitHub)通过git clone.

所有这些更改都将涉及使用正确的凭据(通过加密的秘密,甚至可以通过CI/CD 工作流自动部署。但是,当然,还有后续职责,例如监控。

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

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

相关文章

Python基础加强学习

一、python概述 1. python的应用领域 web开发大数据处理人工智能自动化运维开发云计算爬虫游戏开发 2. 安装python 要进行python开发&#xff0c;首先要安装python解释器&#xff0c;这里说的安装python说的就是安装python的解释器。 测试python是否安装成功&#xff0c;在…

基于springboot的校园二手网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

过滤器和拦截器的区别

目录 1 前言 2 区别 2.1 实现原理不同 2.2 使用范围不同 2.3 执行顺序不同 4 注入Bean的情况不同 1 前言 可能有些小伙伴们在接手公司的项目时&#xff0c;经常看到公司的项目中既有过滤器又有拦截器&#xff0c;那么它们既然都拦截的作用&#xff0c;那么各自扮演着什么…

pyinstaller打包出错记录

稍微记录一下最近在liunx上pyinstaller打包出错 目录稍微记录一下最近在liunx上pyinstaller打包出错1 号坑 Python3.7.0安装2号坑 成功打包但是执行失败小结后面代码的环境是在Windows子系统下的Ubuntu 20.04下进行的。vscode可以通过&#xff0c;配置WSL来进入环境&#xff08…

Pytorch+Python实现人体关键点检测

用PythonPytorch工程代码对人体进行关键点检测和骨架提取&#xff0c;并实现可视化。 使用背景&#xff1a; 物体检测为许多视觉任务提供动力&#xff0c;如实例分割、姿态估计、跟踪和动作识别。它在监控、自动驾驶和视觉答疑中有下游应用。当前的对象检测器通过紧密包围对象…

深度学习提高模型准确率方法

这里写目录标题深度学习数据使用更多数据更改图像大小减少颜色通道算法模型改进增加训练轮次迁移学习添加更多层调整超参数总结深度学习 我们已经收集好了一个数据集&#xff0c;建立了一个神经网络&#xff0c;并训练了模型&#xff0c;在测试和验证阶段最后得到的准确率不高…

8086通用寄存器

目录 概述 EU&#xff1a;负责执行指令完成两种操作&#xff1a;算数逻辑运算&#xff0c;计算存储器操作数的偏移地址 BIU&#xff1a;完成所有的总线操作 寄存器 AX BX CX DX SP,BP,SI,DI IP CS&#xff0c;DS&#xff0c;SS&#xff0c;ES 概述 8086和8088C…

神经网络每次结果不一样,神经网络预测问题

1、求助&#xff1a;神经网络两次训练的结果不一样 神经网络两次训练的结果不一样&#xff0c;这是因为每次训练的迭代初值不相同&#xff08;是随机的&#xff09;&#xff0c;所以得到的结果是有差异的。一般的话&#xff0c;软件开启第一次时&#xff0c;运行得到结果是比较…

Java | 学习笔记02 快速之旅

运行已经开发好的Java程序&#xff0c;只需要JRE&#xff08;Java运行时环境&#xff09;就可以。但事实上&#xff0c;要想完成一个Java程序的开发&#xff0c;我们至少需要安装好JDK 目录 一、Java环境配置 1.下载JDK 2.配置环境变量 二、Hello World&#xff01; 三、I…

关于C++、C++ CLI, Java、C# 的自定义类实现列表初始化。

1、C DList_类构造函数 /// <summary> /// 表表初始化 dList<int> idl {1,2,3,4}; /// </summary> /// <typeparam name"T"></typeparam> /// <param name"tList"></param> template<class T> inline …

一只脚踏进Java的大门

一杯热气腾腾的咖啡&#xff0c;没错&#xff0c;这就是Java的标志。学习Java&#xff0c;我们就从这杯咖啡开始。2022年10月24日&#x1f6a9; Hello Java!一、认识Java从Hello world开始二、运行Java程序1、编译运行原理2、JDK、JRE、JVM以及它们之间的关系3、运行步骤展示三…

C语言-简单的程序设计

&#x1f31e;欢迎来到C语言的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f320;本阶段属于练气阶段&#xff0c;希望各位仙友顺利完成…

docker 网络

前言 随着容器的普及&#xff0c;经常使用docker创建容器来跑应用&#xff0c;结合开源的kubernetes和istio等&#xff0c;对于无状态的服务有极好的支持能力&#xff0c;秒级调度&#xff0c;弹性伸缩等优势。实际上kube的容器仅仅是接口&#xff0c;实际的容器可以是docker&…

布隆过滤器

文章目录前导布隆过滤器特点映射方式hash 函数BloomFiltersettestreset相关问题应用示例哈希切分例子今天是1024程序员节,祝各位节日快乐啦!!!前导 我们之前使用位图bitset,只能将一个整数映射到比特位上&#xff0c;来判断某个数是否存在 但是假如我们也想把判断一个字符串是…

【Linux】yum 与 vim 的基本使用

文章目录一、yum 背景知识1、商业生态2、开源生态3、软件生态本土化二、yum 的基本使用1、查看软件包2、安装软件3、卸载软件三、vim 的基本使用1、vim 的基本概念2、vim 的基本操作2.1 模式间切换2.2 光标定位2.3 文本复制2.4 文本编辑2.5 底行模式的操作四、简单 vim 配置2、…

前端工程化<npm、cnpm、yarn、npx、pnpm等包管理工具>

平时工作中&#xff0c;像npm、cnpm、yarn等一些工具都是经常经常用的&#xff0c;但可能对里面的一些细节都没太在意&#xff0c;所以这篇就来总结一下加深印象和理解。另外还有pnpm的使用&#xff0c;以及它的优势 1. npm包管理工具 包管理工具npm Node Package Manager&a…

『Halcon与C#混合编程』011_工业相机的SDK介绍

这里以淘宝上的显微精工店铺的相机为例(支持SDK) 一、相机的SDK简单介绍 第一步:安装好驱动,并能正常打开相机 第二部:找到相机的安装目录,查看厂家提供的Demo和开发手册 在Demo中找到C#的Demo,运行Demo.sln 第三步

基于Matlab使用粒子滤波器和高斯滤波器跟踪单个对象(附源码)

此示例说明了如何使用粒子滤波器和高斯和滤波器来跟踪使用仅范围测量的单个对象。 一、介绍 只能观察范围信息的传感器无法通过单次检测提供对物体状态的完整了解。此外&#xff0c;当以笛卡尔坐标系表示时&#xff0c;仅范围测量的不确定性是非高斯的&#xff0c;并产生凹形…

python作业8

目录 1.输入一个整数判断奇数偶数 2.判断一个数是否能被7或11整除但不能同时整除 3.判断某一年是否为闰年&#xff1a;能被4整除但不能被100整除&#xff0c;或者能被400整除 4.《车辆驾驶人员血液、呼气酒精含量阈值与检验》标准中规定&#xff1a;驾驶员血液酒精小于20mg/…

基于Hi3861的听话的狗子

听话的狗子一、项目介绍二、硬件介绍&#xff08;1&#xff09;Hi3861最小系统电路&#xff08;2&#xff09;电源管理电路&#xff08;3&#xff09;USB转串口电路烧录电路&#xff08;4&#xff09;外设接口电路三、PCB设计四、软件部分简介&#xff08;1&#xff09;代码整体…