MLOps极致细节:4. MLFlow Projects 案例介绍(Gitee代码链接)

2023-11-10

MLOps极致细节:4. MLFlow Projects 案例介绍(Gitee代码链接)

MLFlow Projects允许我们将代码及其依赖项打包为一个可以在其他平台上以可复制(reproducible)和可重用(reusable)的方式运行的项目。每个项目都包括自己的代码和一个MLproject文件,该文件定义了它的依赖项(例如Python环境),以及可以在项目中运行哪些命令以及它们采用的参数。

在这个案例中,我们基于MLFlow的官方GitHub文档,具体说明MLflow Projects如何被使用,以及结果。首先,我们先简单地过一遍概念,然后介绍如何把这个代码跑起来。关于此代码的详细解释,请参见我的博客:MLOps极致细节:5. MLFlow Projects 案例代码解读

  • 平台:Win10。
  • IDE:Visual Studio Code
  • 需要预装:Anaconda3。


1 MLProject Yaml文件

根本上,MLFlow Projects的作用就是让其他数据科学家更方便地运行MLFlow项目。在原本的MLFlow项目的基础上,我们需要增加一个MLProject的yaml文件,在项目的根目录下。

一个MLProject的例子如下:

name: My Project
conda_env: my_env.yaml
# Can have a docker_env instead of a conda_env, e.g.
# docker_env:
#    image:  mlflow-docker-example
entry_points:
  main:
    parameters:
      data_file: path
      regularization: {type: float, default: 0.1}
    command: "python train.py -r {regularization} {data_file}"
  validate:
    parameters:
      data_file: path
    command: "python validate.py {data_file}"

MLProject里面包含了如下几个参数/属性:

  • name: 项目名称
  • Entry Points:可以在项目中运行的命令,以及有关其参数的信息。大多数项目至少包含一个entry point,您希望其他用户调用它。有些项目还可以包含多个entry points:例如,我们可能有一个包含多个特征化算法的Git repo。你也可以以.py.sh文件作为entry points。在MLproject文件中列出entry points的同时,我们还可以为它们指定参数,包括数据类型和默认值。
  • Environment:应用于执行项目entry point的软件环境。这包括项目代码所需的所有库依赖项。目前MLFlow支持Conda environmentsDocker containers
    • Conda environments:在MLProject文件中需要添加conda_env参数的定义,比如:conda_env: conda.yaml。即,引用在<MLFLOW_PROJECT_DIRECTORY>/conda.yaml路径下的conda yaml文件。关于conda.yaml的写法,参见Anaconda 官网。一个conda.yaml的例子:

      name: tutorial
      channels:
      - conda-forge
      dependencies:
      - python=3.7
      - pip
      - pip:
          - scikit-learn==0.23.2
          - mlflow>=1.0
          - pandas
      
    • Docker container environments:和conda环境类似的,在MLProject文件中需要添加docker_env参数的定义。MLFlow支持如下几种定义的方式:

      • Image without a registry path(还是直接用英文比较合适)。由于未指定registry path,Docker会在运行MLflow项目的系统上搜索此image。如果找不到这个image,Docker会尝试从DockerHub中pull。一个例子:
      docker_env:
      image: mlflow-docker-example-environment
      
      • Mounting volumes and specifying environment variables。volumes的作用是将本地的一个路径mount到docker镜像里面的一个路径。environment可以从host的环境变量中复制,也可以指定为Docker镜像环境的新变量。环境字段应该是一个列表(list)。此列表中的元素可以是两个字符串的列表(用于定义新变量)或单个字符串(用于从host复制变量)。一个例子:
      docker_env:
      image: mlflow-docker-example-environment
      volumes: ["/local/path:/container/mount/path"]
      environment: [["NEW_ENV_VAR", "new_var_value"], "VAR_TO_COPY_FROM_HOST_ENVIRONMENT"]
      
      • Image in a remote registry。当MLflow项目运行时,Docker会尝试从指定的registry path中提取镜像。一个例子:
      docker_env:
          image: 012345678910.dkr.ecr.us-west-2.amazonaws.com/mlflow-docker-example-environment:7.0
      

2 运行代码

这个案例中,我们将使用scikit-learn来训练一个简单的线性回归模型,然后打包这个模型使之可重复使用。代码基于MLFlow官网改写。

这里,我们引用wine quality数据集。在此数据集中,我们基于一些特征,如"fixed acidity",“volatile acidity”,"citric acid"等等,来对wine的"quality"进行预测。

预测的模型我们选择sklearn.linear_model.ElasticNet,详细的说明参见官网

2.1 运行代码之前

在运行起代码之前,我们还是需要在我们的主机(host machine)新建虚拟环境(比如conda create -n [your vm name] python=3.8),然后进入虚拟环境(conda activate [your vm name]),安装好MLFlow(pip3 install mlflow -i https://pypi.tuna.tsinghua.edu.cn/simple)。当然,我们也可以不用虚拟环境,而是直接在主机环境中进行MLFlow以及其他依赖的的安装,但我个人依然强烈建议不要随意在主环境中进行操作。

有下面几种方式运行起这个案例的代码:

  1. 我们把此案例相关代码克隆到本地:git clone https://gitee.com/yichaoyyds/mlflow-ex-project-basic.git。然后进入mlflow-ex-project-basic文件夹,在terminal中运行py文件,比如python main.py
  2. 我们把此案例相关代码克隆到本地:git clone https://gitee.com/yichaoyyds/mlflow-ex-project-basic.git。然后再按照下面章节的步骤运行mlrun指令(在terminal中);
  3. 不用把代码克隆到本地。mlflow也支持直接跑git上的代码。下面章节会做具体描述。

一个建议:在通过MLFlow Projects的方式运行代码前,如果我们对mlflow不了解,我们还是先按照比较原始的方式先把代码跑起来,比如python main.py。这也是为什么我们依旧在代码中包含了requirements.py的原因。和之前的案例一样,我们先进入之前创建的虚拟环境,然后激活,比如:conda activate mlFlowExmlFlowEx是我们之前创建的虚拟环境)。然后,我们在虚拟环境中下载好相关依赖:pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple。和之前一样,这个案例我们选用的IDE依然是VSCode。

文档结构:

- conda.yaml            # MLFlow Projects 所需要的conda的yaml文件
- MLproject             # MLFlow Projects 所需要的MLproject文件
- requirements.txt      # 我们测试代码的时候用到,包含了测试代码需要的依赖库
- main.py               # 展示了如何使用tensorflow2/keras进行模型的训练
- READ.md               # readme文件
- config.txt            # 我们测试代码的时候用到,设置参数的时候方便一些
- wine-quality.csv      # 训练数据集,其实不需要,我们直接从网上下载下来

2.2 第一种运行方式

  1. 在我们的主机(host machine),新建并进入虚拟环境,安装好requirements.txt里面的依赖;

  2. 在VSCode,terminal中,选择你想克隆代码的本地路径;

  3. 克隆代码:git clone https://gitee.com/yichaoyyds/mlflow-ex-project-basic.git。此时,如果你在terminal输入ls,应该可以看到mlflow-ex-project-basic文件夹;

  4. cd mlflow-ex-project-basic进入文件夹;

  5. python .\main.py。你应该能看到类似

    Mode: loop
    Test Elasticnet model with different alpha and l1_ratio values.
    Test - alpha: 0.0, l1_ratio: 0.0. Result: RMSE: 0.68, MAE: 0.54, R2: 0.35
    Test - alpha: 0.0, l1_ratio: 0.2. Result: RMSE: 0.68, MAE: 0.54, R2: 0.35
    Test - alpha: 0.0, l1_ratio: 0.4. Result: RMSE: 0.68, MAE: 0.54, R2: 0.35
    ...
    Test - alpha: 0.8, l1_ratio: 0.8. Result: RMSE: 0.83, MAE: 0.68, R2: 0.03
    Best Elasticnet model (alpha=0.800000, l1_ratio=0.800000):
    Best model - alpha: 0.8, l1_ratio: 0.8. Result: RMSE: 0.8323634286332126, MAE: 0.6841525289534505, R2: 0.026507009052647468
    

    并且你也会发现,在mlflow-ex-project-basic文件夹下面多了一个mlruns文件夹。

  6. 运行成功。注意,每次运行的时候需要改一下config.txt文件里面的experimentid值,因为我们每次不能创建相同id的experiment。

2.3 第二种运行方式

  1. 在我们的主机(host machine),新建并进入虚拟环境;

  2. 在VSCode,terminal中,选择你想克隆代码的本地路径;

  3. 克隆代码:git clone https://gitee.com/yichaoyyds/mlflow-ex-project-basic.git。此时,如果你在terminal输入ls,应该可以看到mlflow-ex-project-basic文件夹;

  4. 注意,我们这里没有进入mlflow-ex-project-basic文件夹。运行:

    mlflow run mlflow-ex-project-basic
    
  5. 如果你是第一次运行,那么系统会给你新建一个虚拟机,然后系统进入这个虚拟机平台,安装好依赖,再运行main.py文件。运行完后,你会发现在当前目录下,会新生成mlruns文件夹。以下为terminal代码运行后的一部分日志,详细的日志以及代码的解释请参见我的博客:

    2022/03/06 15:20:38 INFO mlflow.projects.utils: === Created directory C:\XXX\Temp\tmp4t1upjb_ for downloading remote URIs passed to arguments of type 'path' ===    
    2022/03/06 15:20:38 INFO mlflow.projects.backend.local: === Running command 'conda activate mlflow-5cbba1deec6e564616d0ebee88bd7d510b35ef53 && python main.py 0.5 0.1 loop mlflowProjectExample20' in run with ID '42a6a0faa2f1486c973fecb851193f56' ===
    Mode: loop
    Test Elasticnet model with different alpha and l1_ratio values.
    Test - alpha: 0.0, l1_ratio: 0.0. Result: RMSE: 0.64, MAE: 0.51, R2: 0.36
    Test - alpha: 0.0, l1_ratio: 0.2. Result: RMSE: 0.64, MAE: 0.51, R2: 0.36
    ...
    Test - alpha: 0.8, l1_ratio: 0.8. Result: RMSE: 0.8, MAE: 0.66, R2: 0.01
    Best Elasticnet model (alpha=0.800000, l1_ratio=0.800000):
    Best model - alpha: 0.8, l1_ratio: 0.8. Result: RMSE: 0.7980985615795877, MAE: 0.661761764937828, R2: 0.010305314500945628
    2022/03/06 15:21:57 INFO mlflow.projects: === Run (ID '42a6a0faa2f1486c973fecb851193f56') succeeded ===
    
  6. 运行成功。注意,每次运行的时候需要改一下config.txt文件里面的experimentid值,因为我们每次不能创建相同id的experiment。

2.4 第三种运行方式

这种方式最为简洁,直接调git的URI链接,连下载都免了。

  1. 在我们的主机(host machine),新建并进入虚拟环境;

  2. 在我们自己选择的某个本地路径下

    mlflow run https://gitee.com/yichaoyyds/mlflow-ex-project-basic.git
    
  3. 你会发现在当前目录下,会新生成mlruns文件夹。其实第二种和第三种是一样的,只是第二种方式,我们手动克隆了一下,而第三种方式,mlflow帮我们克隆了一下,保存到了系统的temp路径下。我们来看一下运行后的(部分)日志,就一目了然了:

2022/03/06 15:37:12 INFO mlflow.projects.utils: === Fetching project from https://gitee.com/yichaoyyds/mlflow-ex-project-basic.git into C:\XXX\Temp\tmp2my_ysex === 
2022/03/06 15:37:16 INFO mlflow.projects.utils: === Created directory C:\XXX\Temp\tmp9c6kybzr for downloading remote URIs passed to arguments of type 'path' ===    
2022/03/06 15:37:16 INFO mlflow.projects.backend.local: === Running command 'conda activate mlflow-5cbba1deec6e564616d0ebee88bd7d510b35ef53 && python main.py 0.5 0.1 loop mlflowProjectExample1' in run with ID '4cd58e551b114c60b416b41225580b17' ===
Mode: loop
Test Elasticnet model with different alpha and l1_ratio values.
Test - alpha: 0.0, l1_ratio: 0.0. Result: RMSE: 0.68, MAE: 0.52, R2: 0.27
Test - alpha: 0.0, l1_ratio: 0.2. Result: RMSE: 0.68, MAE: 0.52, R2: 0.27
...
Test - alpha: 0.8, l1_ratio: 0.8. Result: RMSE: 0.79, MAE: 0.64, R2: 0.03
Best Elasticnet model (alpha=0.800000, l1_ratio=0.800000):
 Best model - alpha: 0.8, l1_ratio: 0.8. Result: RMSE: 0.7866516565074876, MAE: 0.6435140676671445, R2: 0.03154140821475915
2022/03/06 15:38:29 INFO mlflow.projects: === Run (ID '4cd58e551b114c60b416b41225580b17') succeeded ===
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MLOps极致细节:4. MLFlow Projects 案例介绍(Gitee代码链接) 的相关文章

随机推荐

  • VS2008, MFC 文件的操作3 - Win32 API 方式 文本方式打开

    接上一节笔记 VS2008 MFC 文件的操作2 C 语言方式 文本方式打开 1 代码 void Cvs2008 SX jiaocheng12View OnFileWritefile TODO 在此添加命令处理程序代码 Win32 API
  • cuda编程学习笔记 第二章 cuda memory management

    应用的性能可能有 75 都花费在内存相关问题上 NVPROF and NVVP 这俩是调试工具 不知道是不是基于CUPTI CUDA Profiler Tools Interface NVPROF是命令行工具 nvvp是可视化工具 nvvp
  • 12、适配器

    文章目录 package com example demo designpattern 又叫包装模式 Wrapper 各种 wrapper bridge 就是适配器模式 jbdc odbc bridge io 字节流字符流转换 角色 tar
  • STM32-ESP8266-12F与PC通信

    1 默认ESP8266的波特率是115200 2 指令及其返回值 3 使用PC的网络调试助手 协议类型选择TCP Server 端口号以80开头 表示TCP协议 如8080 8040等等 IP地址填PC的WI F网口的IP地址 配置完成后点
  • 解决浏览器设置代理IP无法上网的问题

    大家都知道 在当今信息时代 互联网已经成为了我们生活必不可少的一部分 而浏览器作为我们上网的窗口 更是被广泛使用 有时候 我们会遇到一些问题 例如设置了代理IP后无法正常上网 那么该如何解决这个问题呢 别担心 本文将为您一一解答 首先 让我
  • 易优cms:guestbookform 留言表单标签

    guestbookform 留言表单标签 基础用法 名称 guestbookform 功能 留言表单提交 语法 eyou guestbookform type default
  • 计算机组成中的阶符是什么意思,计算机中阶符,阶码,数符,尾数是什么?

    一般地 任一个二进制N 可表示为N 2j S 其中J为二进制数 叫阶码 J如果有正负号的话 正负号就叫阶符 S为纯小数 叫做尾数 数符 指的是N整个数的符号 二进制的 00101000 直接可以转换成16进制的 28 字节是电脑中的基本存储
  • 详解 Android 是如何启动的

    详解 Android 是如何启动的 2016 08 12 唐琪森 安卓开发 javascript void 0 来自 石头铺 微信号 Android Programmer 网站 www woaitqs cc 本文是 Android 系统学习
  • xilinx平台下DDR3映射为VFIFO

    FPGA开发中 数据采集 数据分析场景下需要用对高速ADC数据缓存 FPGA片内RAM无法做到大的容量 基于MIG IP做了个DDR3映射成FIFO的模块 以完成高速 量大的数据缓存应用 背景和选择 part1 官方也提供了类似功能的IP
  • makefile学习

    基本介绍 makefile编写的关键在于解决源文件的 文件依赖性 编译链接过程 源文件首先会生成中间目标文件 再由中间目标文件生成执行文件 在编译时 编译器只检测程序语法 和函数 变量是否被声明 如果函数未声明 编译器会给出一个警告 但可以
  • VS Code 打开时黑屏的恢复处理

    VS Code安装后一直黑屏的情况 一 兼容模式 Win10版本以下系统 右击VS Code打开属性窗口并在兼容性标签页内勾上以兼容模式运行这个程序 二 自动选择显卡 VS Code的渲染跟显卡设定有一定关系 打开NVIDIA控制面板 调整
  • shell脚本对硬盘进行分区——fdisk、blkid、mke2fs、mount、lsblk

    1 前言 本文介绍的是嵌入式设备烧录系统时 如何用shell脚本对硬盘进行分区 文章主要介绍的是制作烧录U盘的分区思路和关键的shell脚本语句 代码并不能直接拷贝使用 2 总体思路 1 用U盘进行系统的烧录 就是在U盘上制作一个可以运行的
  • (必备技能)使用Python实现屏幕截图

    必备技能 使用Python实现屏幕截图 文章目录 必备技能 使用Python实现屏幕截图 一 序言 二 环境配置 1 下载pyautogui包 2 下载opencv python包 3 下载PyQt5包 4 下载pypiwin32包 三 屏
  • CIFAR10数据集使用笔记

    CIFAR10数据集 1 数据集下载并转换为张量 train set torchvision datasets CIFAR10 root data path train True download True transform transf
  • JAVA语言强制类型转换要求

    JAVA语言强制类型转换要求 数据类型具有高低性的 顺序由低到高为 byte gt short gt char gt int gt long gt float gt double 1 由低到高需要强制类型转换 转换方式如下 public c
  • SIP中继对接

    freeswitch与各种设备对接的成功配置 需要的请参考 有错误的地方请指导 1 对接华为softco 中继配置 sip profiles external
  • 初探设计模式之Adapter模式

    文章目录 设计模式之Adapter模式 一 什么是Adapter模式 二 具体实例 1 使用Banner来表示高电压插座 2 使用Print来表示低电压电器 3 使用PrintBanner来表示适配器 使用的是继承 4 总体结构如下图所示
  • vivado.2019.1 安装教程

    vivado 2019 1 安装教程 下载链接 VIVADIO 2019 1 链接 https pan baidu com s 17 cPUahNzHmm 3xKsKQ7GQ 提取码 rop0 来自百度网盘超级会员V4的分享 1 解压所有文
  • JS实现随机抽奖功能

    点击开始按钮开始抽奖 div依次变红 下面是js代码 需要的自取
  • MLOps极致细节:4. MLFlow Projects 案例介绍(Gitee代码链接)

    MLOps极致细节 4 MLFlow Projects 案例介绍 Gitee代码链接 MLFlow Projects允许我们将代码及其依赖项打包为一个可以在其他平台上以可复制 reproducible 和可重用 reusable 的方式运行