本周完结第三部分:

经过Elyra完结Pipeline的图形化构建。

Elyra的构建逻辑:如何在每个环节代替原生构建办法?

组件的运行环境

论如何在KubeFlow上跑通第一个Pipeline(三)

如上图,将Pipeline分为三个部分:

  1. 下载数据
  2. 练习模型
  3. 上传模型

不再需求为每个部分组件独自构建镜像,直接将ipynb或py文件拖拽上画布即可。

论如何在KubeFlow上跑通第一个Pipeline(三)

运行时,每部分仍运行在独立的容器中,可认为各部分设置它们独立执行环境的基础镜像。

Pipeline的自界说参数

在(二)中,终究pipeline有一些自界说参数,需求咱们手动设置控制:

论如何在KubeFlow上跑通第一个Pipeline(三)

其时是经过自界说pipeline函数参数完成的:

论如何在KubeFlow上跑通第一个Pipeline(三)

在Elyra中,这点是经过设置环境变量完成的:

在脚本中,经过 os.getenv()设置参数及其默认值:

论如何在KubeFlow上跑通第一个Pipeline(三)

在该Notebook的Properties中,则能够修改其环境变量:

论如何在KubeFlow上跑通第一个Pipeline(三)

若某个环境变量仅想坚持其默认值,则直接在Properties中删去该环境变量即可。(不然它就等于”了)

环境变量在不同的Notebook中并无继承联系;某个Notebook的环境变量在上一个Notebook中已经出现,若想坚持共同,则仍需求在该Notebook中手动设置。

Pipeline的文件输出

在运行Pipeline时,某个组件可能会输出新的文件,并将作为下一个组件的输入。

在原生办法中,咱们为每个组件都挂上了同一个PV卷;因而,每个组件尽管运行在各自的独立环境中,但又享有一起的存储空间。

但在Elyra中,咱们有必要清晰界说其输出文件,该输出文件才可被下一个组件所拜访。

论如何在KubeFlow上跑通第一个Pipeline(三)

如上图,咱们在load_data的Properties中界说了该ipynb文件的输出文件为: dataset/objectname(object_name(object_name为需求咱们手动设置的环境变量),则之后的组件都能够拜访该文件。

注:

感觉,Output Files 得这样界说才是对的…:

论如何在KubeFlow上跑通第一个Pipeline(三)

不然,其他组件连dataset/都没看到,应该更看不到dataset/$object_name了。

Pipeline的文件输入(文件依靠)

在原生办法中,组件在封装成镜像时,除了主要的逻辑代码外,咱们可能还会在镜像中额定打包一些辅佐脚本?如utils.py等;

而这在Elyra中,是经过File Dependencies完成的。

论如何在KubeFlow上跑通第一个Pipeline(三)

论如何在KubeFlow上跑通第一个Pipeline(三)

与原生办法共同的是,所依靠的文件需求放在脚本的文件目录或子目录下。

编写脚本并运用Elyra代替原生办法

环境变量的设置

在上文中,咱们处理了自界说参数、文件输出同享、文件依靠的问题,而脚本的代码逻辑是不变的;

因而,咱们能够运用Elyra代替原生办法了。

在load_data.ipynb(load_data.py)中,咱们运用os.getenv代替argparse的自界说参数办法:

原生:

论如何在KubeFlow上跑通第一个Pipeline(三)

Elyra:

论如何在KubeFlow上跑通第一个Pipeline(三)

在train_model.ipynb,load_model.ipynb中相同进行该操作。

各组件中Pipeline的文件输入输出联系

在原生办法中,咱们在组织Pipeline时,界说了同享PV卷,并在PV卷中新建了dataset,model文件夹,各组件能够经过拜访所需文件夹获取相应文件:

论如何在KubeFlow上跑通第一个Pipeline(三)

论如何在KubeFlow上跑通第一个Pipeline(三)

但是,在Elyra办法中,咱们需求经过显式界说以同享不同组件的输出文件。

在load_data的Properties中,设置数据集保存途径:

论如何在KubeFlow上跑通第一个Pipeline(三)

之后,在train_model将拜访途径为dataset/$object_name的数据集以用于模型练习;

在train_model中,设置练习模型的保存途径:

论如何在KubeFlow上跑通第一个Pipeline(三)

之后,在upload_model中,该模型将被上传至MinIO中。

在Jupyterlab本地环境中,跑通该Pipeline:

论如何在KubeFlow上跑通第一个Pipeline(三)

成功将模型上传至MinIO。

Elyra的不足

Elyra的运行环境问题

留意,方才咱们跑通时,挑选的Runtime Platform为:

Run in-place locally

这样做有什么问题呢?这样的跑通其实不是真正的导通;由于它其实仅仅按你的Pipeline编排次序将Pipeline中的一切ipynb文件顺次跑通了一遍,只能证明其代码逻辑,环境变量等设置是对的;

但是,首先是ipynb节点的Runtime Image:

论如何在KubeFlow上跑通第一个Pipeline(三)

你即便选了Pytorch的Image,

定心,待会儿import torch肯定是会报错的,由于它的Runtime环境仍是Jupyter lab。

是的,如果挑选Run in-place locally,你的一切节点Runtime环境都是在这个Jupyter lab内的,不受Runtime Image影响;

相同的,还有一个问题:即便你的节点没有显式指定的Output Files,你的下一个节点仍能拜访该文件;由于一切节点的Runtime环境都是在这个Jupyter lab内的,ipynb文件直接在自己运行环境的当时文件目录下找需求的文件就好了,底子不需求你显式指定。

所以,咱们仍是得将Runtime Platform改为Kubeflow Pipelines。

Elyra的文件存储、办理问题

若要使Elyra能在Kubeflow中跑通,还要进行如下设置:

论如何在KubeFlow上跑通第一个Pipeline(三)

论如何在KubeFlow上跑通第一个Pipeline(三)

分别装备Kubeflow Pipelines和Cloud Object Storage;

这就涉及到一个很有趣的问题:装备Kubeflow Pipelines是很正常的;但为什么要装备Cloud Object Storage?

由于:

Elyra 使用对象存储在管道处理期间耐久化工件。

notebook(或py)处理完结后,对文件系统的一切更改(例如新文件或修改的文件)都将被丢弃。若要保留这些文件,有必要在其节点特点中将这些文件声明为OutFiles,将这些文件存储在云存储中。

咱们先装备完一下:

这边还有个有意思的点,就是Cloud Object Storage Endpoint也是有要求的:

咱们在本地装备了一个MinIO,但它目前只能经过IP地址拜访,即: xx.xx.xxx.xx:xxxx/

这样装备是不能经过的,

论如何在KubeFlow上跑通第一个Pipeline(三)

它说,这个endpoint不是一个”uri”.

所以只好用咱们的腾讯云MinIO来装备,至少这样endpoint是个”uri”: cos.ap-shanghai.myqcloud.com

装备完后,咱们就能够将Runtime Platform改为Kubeflow Pipelines了。

噩梦就来了: 这是我提交后的结果:

论如何在KubeFlow上跑通第一个Pipeline(三)

发现了两个大问题:

  1. 相比于原生的镜像构建Pipeline组件办法,这个办法明显要慢了许多;

  2. 网络问题

先说第一个问题:为什么会慢许多?

检查一下已成功的load-data的log:

论如何在KubeFlow上跑通第一个Pipeline(三)

能够看到,不仅是需求耐久化存储的输出文件,组件运行时,部分必要文件相同要存放在MinIO中;

上图我用绿色所圈的部分,Pipeline进行了如下操作:

  1. 对MinIO建议Connect连接
  2. 发送Head恳求
  3. 经过Get恳求得到load_data.xxx.tar.gz
  4. 解压,得到load_data.ipynb

很多时刻花在了网络通信上。

论如何在KubeFlow上跑通第一个Pipeline(三)

上图我用绿色所圈的部分,则经过PUT和POST恳求将需求耐久化存储的输出文件dataset/$obeject_name,渐渐提交至MinIO的bucket内。

登录腾讯云MinIO检查,相同能验证咱们的想法:

论如何在KubeFlow上跑通第一个Pipeline(三)

除了显式界说的输出文件外,以load_data部分为例,该MinIo除了存储了load_data的ipynb文件外,还存储了html,及tar.gz。

再来看第二个问题:

论如何在KubeFlow上跑通第一个Pipeline(三)

这里为什么报错?留意我用绿色所圈的部分: 在Pipeline执行:

Command '['/opt/conda/bin/python3', '-m', 'pip', 'install', 'minio==7.1.2', 'nbclient==0.4.1', 'papermill==2.1.2', 'urllib3==1.26.5']'

最终发生了ReadTimeoutError错误。估量网络也不大行?我感觉可能是由于腾讯云MinIO在墙内,Kubeflow或Elyra服务在墙外的原因?

顺带一提第三个问题:

论如何在KubeFlow上跑通第一个Pipeline(三)

在挑选镜像时,依然遇到了网络问题:由于镜像也是Pipeline提交后Run实时拉取的;因而常常出现在镜像拉取时就报错的问题。除了第一个镜像能够拉取下来,后面几个镜像都会报网络问题的错。