你应该知道的机器学习模型部署细节和实施步骤

news2024/11/15 8:22:58

机器学习操作 (MLOps,Machine Learning Operations ) 是“机器学习”和“工程”的组合,涵盖了与生产 ML 生命周期管理有关的所有内容。

ML模型生命周期可大致分为三个阶段

文章目录

    • 技术交流
    • 设计
    • 模型开发
    • 操作
    • 步骤1:确定部署环境
      • 命令行终端
      • Conda虚拟环境
      • 编辑器与IDE
      • 深度学习框架
    • 步骤2:代码管理
      • Git
      • 代码组织
      • 良好的编程习惯
        • 代码文档
        • 编程风格
        • 类型声明 Typing
      • 数据版本管理
    • 步骤3:Docker与可复现性
    • 步骤4:调试与分析代码
      • 调试
      • 性能优化
      • 实验日志
      • Trainer模板
    • 步骤5:持续集成
    • 步骤6:部署模型
      • HTTP协议
      • 本地部署

技术交流

技术要学会分享、交流,不建议闭门造车。 本文技术由粉丝群小伙伴分享汇总。源码、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:dkl88191,备注:来自CSDN +技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

设计

初始阶段从调查问题开始,然后筛选可选的模型框架。由于机器学习需要训练数据,因此我们还会在这一步中调查我们拥有哪些数据以及是否需要以其他方式获取数据。

模型开发

开始设计一些机器学习算法来解决我们的问题,然后需要进行部分数据分析,选择特定的模型架构。最后还需要进行验证和测试,以确保我们的模型能够很好地泛化。

操作

操作是创建一个自动管道的地方,它确保每当我们对代码库进行更改时,它们都会自动合并到我们的模型中,这样我们就不会减慢生产速度。同样重要的还有对已部署模型的持续监控,以确保它们的行为与我们指定的完全一致。

需要注意的是,这三个步骤实际上是一个循环,这意味着我们已经成功部署了一个机器学习模型,这并不是它的结束。比如需求可能会发生变化,模型从新进行设计阶段。

步骤1:确定部署环境

命令行终端

终端是在您的计算机没有可以与之交互的图形界面的时候创建的,是为计算机的文本界面。

终端可以任意位置的机器进行操作,可以发送准确的命令。这里我们建议大家学习使用Linux的终端:

  • 跳转目录,运行某个程序

  • 将程序允许结果重定向到文件

  • 查看文件内容,并修改文件

Conda虚拟环境

Conda 是一个环境管理器,可以帮助不同项目的依赖项不会相互交叉污染。但是安装 conda 是一回事,实际使用它是另一回事。

首先要区分pip 和 conda:

  • pip用来安装 python 包(以 python wheels 和发行版的形式),而 conda 也可以安装用其他语言编写的包,因为它是从二进制文件安装的

  • pip 以序列化递归方式安装依赖项,这意味着它可能会导致依赖项问题,而conda 在安装任何东西之前首先检查所有依赖项以检查兼容性。

  • pip绑定了特定的python版本,而conda可以同时管理多个python版本

在开发多个项目,或者需要切换Python时,强烈建议使用 conda 环境。这里建议大家学习使用conda来管理环境:

  • 使用 conda 创建和切换环境

  • 使用 pip 在该环境中安装包

当然pip 和 conda 并不是 Python 仅有的两个环境管理器。Pipenv 是另一种经常使用的替代方案。

编辑器与IDE

Notebook非常适合开发简单代码以及解释和可视化代码库。但器学习项目需要处理多个 .py 文件,因此要真正“完成工作”,需要一个好的编辑器或IDE。

如果你还没有安装编辑器,强烈推荐 Visual studio code。当然在终端环境下,我们推荐掌握 vim。

Notebooks 允许开发人员轻松测试我们的新想法。但是当实际需要部署模型时,它们通常会导致痛点。在开完完成后,将Notebook转换为 .py 脚本很简单:

jupyter nbconvert --to=script my_notebook.ipynb  

深度学习框架

关于深度学习框架,主要由四个主导:

  • PaddlePaddle

  • Pytorch

  • JAX

  • Tensorflow

我们不会就哪种框架最好进行更长时间的讨论,因为它毫无意义。Pytorch 和 Tensorflow 存在时间最长,因此此时拥有更大的社区和功能集。但这些框架它们都非常相似,因为它们都具有针对研究和生产的特征。

步骤2:代码管理

在大型团队中工作时,将不同的人组织和编写代码的方式的差异最小化是至关重要的。

Git

与其他人的适当协作将在同一代码库上工作,这就是版本控制存在的原因。需要注意的是Github不是git!,Github是一家提供免费存储库托管的公司。

在使用git时,我们推荐掌握:

  • fork项目,修改代码

  • 提交代码,合并代码

代码组织

代码组织可以简单理解为代码目录,比如安装代码存储在什么位置,Notebook存储在什么位置。常见的项目文件组织如下:

project  
│   README.md  
|   notebook  
|   data  
└───src  
│   │   utils.py  
|   |   ...  
|   ...  

代码组织的标准化确实遵循一些特定的规则,从而使一个人能够更快地理解另一个人的代码。代码组织不仅是为了使代码更易于您维护,而且还便于其他人阅读和理解。

良好的编程习惯

要了解什么是良好的编码习惯,重要的是要了解它不是什么:

  • 确保您的代码快速运行

  • 确保您使用特定的编码范例

  • 确保只使用很少的依赖项

代码文档

大多数程序员对文档都有一种爱恨交加的关系:我们绝对讨厌自己编写文档,但喜欢别人花时间将它添加到他们的代码中。

文档比代码更容易维护,但也需要更多的时间。好的文档比编写文档节省的时间更多。

在文档下可以记录从代码中清晰可见的信息,而不是实际上难以理解的复杂部分。而写太多的文档对大多数人来说会产生与你想要的相反的效果:有太多的东西要读,所以人们会跳过它。

编程风格

当从事个人项目时,这种编码风格的差异并不那么重要,但当多个人一起从事同一项目时,考虑这一点很重要。

Pep8 是 python 的官方风格指南,包含了编写 Python 时被认为是“好的做法”和“坏的做法”。

类型声明 Typing

除了编写文档和遵循特定样式之外,在 Python 中也推荐使用Typing。Typing可以追溯到早期的编程语言,如 c、c++ 等。

Typing可以提高代码的可读性,可以直接从代码中读取输入参数和返回值的预期类型。

数据版本管理

DVC(数据版本控制)是 git 的扩展,它不仅可以获取版本控制数据,还可以获取一般的模型和实验。

DVC将只跟踪元文件,然后该元文件将指向存储原始数据的某个远程位置。图元文件本质上用作数据文件的占位符。

步骤3:Docker与可复现性

项目可重复性的非常重要,可重复性与科学方法密切相关:

观察 -> 问题 -> 假设 -> 实验 -> 结论 -> 结果 -> 观察 -> …

如果实验是不可重现的,那么我们就不指望别人能得出和我们一样的结论。由于机器学习实验与在实验室中进行化学实验基本相同,因此我们应该同样小心确保我们的环境是可重现的。

创建 MLOps 管道的一个重要部分是您能够重现它。为了获得可重复性,我们需要确定系统环境,例如:

  • 操作系统

  • 软件环境

Docker 通过创建独立的程序提供可重复性。Docker是系统级可重现的,无论在单台机器上还是在 1000 台机器上都没有关系。

Docker主要有三个概念:docker file,Docker image和docker container:

  • Docker file:是一个基本的文本文档,包含用户可以在命令行上调用以运行应用程序的所有命令。包括安装依赖项、从在线存储中提取数据、设置代码以及要运行的命令。

  • Docker image:更准确地说构建一个Docker文件将创建一个Docker镜像。镜像是一个轻量级的、独立的/容器化的、可执行的软件包,其中包括使应用程序运行所需的一切。

  • Docker container:运行创建一个 Docker 容器。这意味着可以多次启动同一个镜像,从而创建多个容器。

步骤4:调试与分析代码

调试

调试非常难教,因为其是经验带来的技能之一。我们可能都熟悉在我们的代码中到处插入 print(…) 语句,这可以帮助我们缩小问题发生的范围。但处理非常大的代码库时,print就不是一种很好的调试方式。

要在 python 调试器中调用构建,可以通过调用设置跟踪:

import pdb  
pdb.set_trace()  

性能优化

分析代码是为了提高代码的性能。在优化代码之前首先需要明确两个问题:

  • 我的代码中每个方法被调用了多少次?

  • 每种方法需要多长时间?

第一个问题对优先级优化很重要。如果两个方法 A 和 B 的运行时间大致相同,但 A 的调用次数比 B 多 1000 次,如果我们想加速代码,我们可能应该花时间优化 A 而不是 B。

通过探查器可以帮助您找到代码中的瓶颈。cProfile 是 pythons 内置的分析器,可以帮助您了解程序中涉及的所有函数和方法的运行时概况。

实验日志

实验记录或模型监控是了解模型正在发生的事情,它可以帮助调试模型。最基本的日志记录是将模型生成的指标写入终端或文件以供以后检查。

在进行较小的实验或单独处理一个项目时,这种工作流程可能就足够了,但是在与他人合作进行大规模实验时,合适的实验跟踪器和可视化工具更加重要。

有许多工具可用于记录实验:

  • Tensorboard

  • Comet

  • MLFlow

  • Neptune

  • Weights and Bias

Trainer模板

模板描述了任何标准化的文本、副本、文档、方法或程序,可以在不对原始文件进行重大更改的情况下再次使用。

但这与机器学习项目有什么关系?如果你已经在机器学习领域尝试过几个项目,可能会看到一个模式:每个项目通常都包含以下三个方面的代码:

  • 模型实现

  • 模型训练代码

  • 保存模型和日志代码

虽然后两者看起来当然很重要,但在大多数情况下,实际的开发或研究往往围绕着定义模型展开。

从这个意义上说,训练代码和实用程序都变成了样板,应该从一个项目转移到另一个项目。但问题通常是我们没有概括我们的训练代码来处理未来项目中可能需要的小调整,因此我们每次开始一个新项目时都会一遍又一遍地实施它。

Pytorch 生态系统中最受欢迎的高级(训练)框架是:

  • fast.ai

  • Ignite

  • skorch

  • Catalyst

  • Composer

  • Pytorch Lightning

它们都提供许多相同的功能,因此对于大多数项目来说,选择一个而不是另一个并不重要。

步骤5:持续集成

持续集成是训练数据或数据处理,更新模型架构,基本所有任何代码更改都会对最终结果产生影响。

在讨论持续集成时,许多开发人员经常想到的是代码测试。CI 应该确保无论何时更新代码库,它都会自动进行测试,这样如果代码库中引入了错误,就会及早发现。

我们将要查看的测试类型称为单元测试。单元测试是指编写测试代码库的各个部分以测试其正确性的测试实践。Python 提供了几个不同的库来编写测试,比较常用的是pytest。

步骤6:部署模型

当我们谈论请求时,本质上是在谈论客户端-服务器类型的架构中使用的通信方法。在此架构中客户端(用户)将向服务器(我们的机器学习应用程序)发送请求,服务器将给出响应。

HTTP协议

发送请求的常用方式称为 HTTP。它本质上是对客户端和服务器之间的中间传输方式的一种规范。一个 HTTP 请求基本上由两部分组成:

  • 请求 URL:服务器的位置

  • 请求方法:执行什么操作

常见的请求方式有(区分大小写):

  • GET:从服务器获取数据

  • POST/PUT:向服务器发送数据

  • DELETE:删除服务器上的数据

本地部署

模型提供服务的第一个起点应该始终是在本地部署它。部署到云比本地部署花费的时间要长得多。因此本地应该始终是任何新应用程序的第一步。

编译是将用一种语言编写的计算机程序翻译成另一种语言的任务。在大多数情况下,这意味着采用您使用首选编程语言编写的任何内容,并将其翻译成计算机可以执行的机器代码。Pytorch 自带编译器,可以帮你优化模型。它可以在子模块 torch.jit 中找到。

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

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

相关文章

Arduino开发ESP8266网页服务器控制LED灯

根据板卡原理RGB三色LED对应引脚&#xff1a;int LEDR12、int LEDG14、int LEDB13;设置串口波特率为115200Serial.begin(115200);源代码如下所示&#xff1a;3.1添加头文件#include <ESP8266WiFi.h> // 提供 Wi-Fi 功能的库#include <ESP8266WebServer.h> // 提供网…

Solidity 中的数学(第 3 部分:百分比和比例)

本文是关于在 Solidity 中进行数学运算的系列文章中的第三篇 。 这次的主题是&#xff1a;百分比和比例。 介绍 金融数学从百分比开始。y的x百分比是多少&#xff1f;y占x的多少百分比&#xff1f;我们都知道答案&#xff1a;y的x百分比是x y 100&#xff0c;y是y 10…

GPIO 应用

应用层如何控制 GPIO&#xff0c; 譬如控制 GPIO 输出高电平、或输出低电平。应用层如何操控 GPIO与 LED 设备一样&#xff0c; GPIO 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/gpio 目录下。可以看到该目录下包含两个文件 export、 unexport 以及 5 个 gp…

面试 | 百度测试开发岗位面试题目回顾

一面题目 二面题目 面试经历详情 在招聘网站投递简历后&#xff0c;收到面试通知信息&#xff08;如下图&#xff0c;为保护个人隐私&#xff0c;面试岗位、地点、时间等隐去&#xff09;。虽然写的是高级测试开发工程师&#xff0c;但是面试官说他们部门的测试不一定都要写框架…

【年更分享】带你看看前端生态圈的技术趋势 state-of-css 2022 state-of-js 2022详细解读

各位前端开发者们大家好&#xff0c;我又来给大家解读最新一年的 state-of-css & state-of-js 技术调查了&#xff01; 往年的 state-of-css 和 state-of-js 的解读&#xff1a; state-of-js 2020 详细解读 state-of-js 2021 详细解读 state-of-css 2021 详细解读 一、写…

php 断点调试 PHPStorm Xdebug helper

安装与使用php的xdebug扩展 浏览器访问只包含<?php phpinfo();的php文件&#xff0c;查看php详情。页面搜索是否安装了xdebug扩展。 如未安装&#xff0c;则访问&#xff1a;xdebug安装向导&#xff0c;将phpinfo()的输出页面复制到此文本框中&#xff0c;点击页面下方的“…

Ubuntu18.04安装Anaconda

Ubuntu18.04安装Anaconda 文章目录Ubuntu18.04安装Anaconda1 下载Anaconda2 安装annaconda3 创建新环境conda环境配置指令pip环境&#xff0c;阿里源切换虚拟环境pytorch 安装不成功pycharm切换python版本4 国内conda源5 卸载anacondaReference1 下载Anaconda 下载Anaconda3-2…

Zerotier免费的虚拟局域网

Zerotier介绍 Zerotier是一款用于构建异地虚拟局域网的工具。 通过网页后台创建虚拟网络并进行管理。 通过电脑上的Zerotier客户端连接各个异地电脑到虚拟局域网&#xff0c;从而实现组网。 由后台分配虚拟ip&#xff0c;并且各个异地电脑可以通过虚拟IP对同一虚拟局域网下的其…

零基础学SQL(九、分组 GROUP BY)

目录 前置建表 ​编辑 一、分组的概念 二、分组案例 三、分组的过滤HAVING子句 前置建表 CREATE TABLE student (id int NOT NULL AUTO_INCREMENT COMMENT 主键,code varchar(255) NOT NULL COMMENT 学号,name varchar(255) DEFAULT NULL COMMENT 姓名,sex enum(男,女) DEF…

HTML知识梳理

文本格式化标签 标签语义加粗 <strong></strong>或者<b></b>更推荐使用<strong>标签加粗语义更强烈倾斜 <em></em>或者<i></i>更推荐使用<em>标签倾斜语义更强烈删除线 <del></del>或者<s><…

MySQL8源代码安装(CentOS8版本)

目标 在CentOS8上面源代码编译安装MySQL8. 下载源代码 打开MySQL下载页面&#xff1a; https://www.mysql.com/downloads/ 找到MySQL社区版本页面&#xff1a; 选择下载MySQL社区版服务器进行下载&#xff1a; 最后选择&#xff0c;MySQL源代码进行下载&#xff0c;如下图…

以element ui为例分析前端各种弹窗和对话框的使用场景与区别

文章目录摘要Dialog 对话框Drawer 抽屉Notice 通知MessageBox 弹框Popconfirm 气泡确认框Message 消息提示Notification 通知Dialog 对话框与Drawer 抽屉的区别MessageBox和Dialog的区别Message消息提示与Notification通知的区别摘要 本文研究分析element ui 中的各种弹窗和对…

【机器学习 吴恩达】2022课程笔记(持续更新)

一、机器学习 1.1 机器学习定义 计算机程序从经验E中学习&#xff0c;解决某一任务T&#xff0c;进行某一性能P&#xff0c;通过P测定在T上的表现因经验E而提高 eg&#xff1a;跳棋程序 E&#xff1a; 程序自身下的上万盘棋局 T&#xff1a; 下跳棋 P&#xff1a; 与新对手下…

Python离线下载whl文件,xxx.wh1 is not a supported wheel on this platform

0、问题 今天在安装 whl 文件的时候&#xff0c;由于电脑处于没有网络的情况&#xff0c;只能在有网络的电脑上下载好 whl 文件&#xff0c;导入之后进行离线安装 但是由于版本不匹配的问题。导致报如下的错误&#xff1a; ERROR&#xff1a;xxx.wh1 is not a supported whe…

创建成功的风格指南

作者&#xff1a;Sean Watson&#xff0c;ServiceNow 创建风格指南是一项艰巨的任务。风格指南包含语法标准、语音和语调指南、要使用和避免的词、复制模式以及产品品牌的基础知识。这些文档很容易变得非常乏味以至于难以使用&#xff0c;或者非常简单以至于无法满足需求。它们…

DDOS和CC如何区分

DDOS 的全称&#xff1a;Distributed Denial of Service中文意思是分布式拒绝服务。该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源。使得该目标系统无法提供正常的服务。还有&#xff0c;为什么说 DDoS 攻击很泛滥&#xff1f;因为便宜啊&#xff0c;可是效果…

buuctf-web-[RoarCTF 2019]Easy Calc1

打开环境发现一个类似计算器的东西尝试一些常规的测试参数尝试单引号发现提示&#xff0c;但是并未报错&#xff0c;非sql注入查看源代码找到一段JavaScript脚本<script>$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#c…

业务-研发一体化管理平台,存在吗?

伴随着互联网在中国进程的发展&#xff0c;线上研发效能及业务应用软件也不落后于时代进步的脚步&#xff0c;中国软件行业从未停止过持续的创新。 2022年&#xff0c;业务应用开发正在简化&#xff0c;研发效能也在提升&#xff0c;其中不得不提软件在协同促进、研发一体化管…

Java 23种设计模式的分类和使用场景

听说过GoF吧&#xff1f; GoF是设计模式的经典名著Design Patterns: Elements of Reusable Object-Oriented Software&#xff08;中译本名为《设计模式——可复用面向对象软件的基础》&#xff09;的四位作者&#xff0c;他们分为是&#xff1a;Elich Gamma、Richard Helm、R…

MyBatis Plus

概述MyBatis-Plus MyBatis-Plus简称 MP是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开 发、提高效率而生 官方文档&#xff1a;https://baomidou.com/ Hello MP 添加依赖 <!-- 如果没有整合SpringBoot&#xff0c;则需要…