首页 国际新闻正文

微博下载,像Google相同构建机器学习体系2 - 开发你的机器学习工作流,湘雅医院

依照上篇文章搭建了一套Kubeflow Pipelines之后,咱们一同小试牛刀,用一个实在的事例,学习怎么开发一套根据Kubeflow Pipelines的机器学习作业流。

预备作业

机器学习作业流是一个使命驱动的流程,一起也是数据驱动的刘桢梁甫行原文流程,这儿涉及到数据的导入和预备,模型练习Checkpoint的导出评价,到终究模型的导出。这就需求分布式存储作为传输的前言,这儿运用NAS作为分布式存储。

  • 创立分布式存储,这儿以NAS为例。这儿NFS_SERVER_IP需求替换成实在NAS服务器地址

1.创立阿里云NAS服务,能够参阅文档

2.需求在 NFS Server 中创立 /data

# mkdir -p /nfs
# mount -t nfs -o vers=4.0 NFS_SERVER_IP:/ /nfs
# mkdir -p /data
# cd /
# umount /nfs

3.创立对应的Persistent Volume.

# cat nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: user-susan
labels:
user-susan: pipelines
spec:
persistentVolumeReclaimPolicy: Retain
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: NFS_SERVER_IP
path: "/data"

# kubectl create -f nfs-pv.yaml

4.创立Persistent Volume Claim

# cat nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: user-susan
annotations:
description: "this is the mnist demo"
owner: Tom
spec:
accessModes:
- ReadWriteMany
resources:
redissappearquests:
storage: 5Gi
selector:
matchLabels:
user-susan: pipelines
# kubectl create -f nfs-pvc.yaml

开发Pipeline

因为Kubeflow Pipelines供给的比方都是依靠于Google的存储服务,这导致国内的用户无法真实体会Pipelines的才能。阿里云容器服务团队供给了练习MNIST模型的比方,便利您在阿里云上运用和学习Kubeflow Pipelines。详细过程为3步:

(1)下载数据

(2)运用TensorFlow进行模型练习

(3)模型导出

这3个过程中后一个过程都依靠与前一个过程完结。

在Kubeflow Pipelines中能够用Python代码描绘了这样一个流程, 完好代码能够检查standalone_pipeline.py。咱们在这个比方中运用了arena_op这是关于Kubeflow默许的container_op封装,能够完成关于分布式练习MPI和PS方法的无缝联接,别的也支撑运用GPU和RDMA等异构设备和分布式存储的简略接入,一起也便利从git源同步代码。是一个比较有用的东西API。而arena_op是根据开源项目Arena。

@dsl.pipeline(
name='pipeline to run jobs',
description='s梨花雨女犯hows how to run pipeline jobs.'
)
def sample_pipeline(learning_rate='0.01',
dropout='0.9',
model_version='1',
commit='f097575656f927d86d99dd64931042e1a9003cb2'):
"""A pipeline for end to end machine learning workflow."""
data=["user-susan:/training"]
gpus=1
# 1. prepare data
prepare_data = arena.standalone_job_op(
name="prepare-data",
image="byrnedo/alpine-curl",
data=data,
command="mkdir -p /training/dataset/mnist && \
cd /training/dataset/mnist && \
curl -O https://code.aliyun.com/xiaozhou/tensorflow-sample-code/raw/master/data/t10k-images-idx3-ubyte.gz && \
curl -O https://code.aliyun.com/xiaozhou/tensorflow-sample-code/raw/master/data/t10k-labels-idx1-ubyte.gz && \
curl -O https://code.aliyun.com/xiaozhou/tensorflow-sample-code/raw/master/data/train-images-idx3-ubyte.gz && \
curl -O https://code.aliyun.com/xiaozhou/tensorflow-sample-code/raw/master/data/train-label董国瑛s-idx1-ubyte.gz")
# 2. downalod source code and train the models
train = arena.standalone_job_op(
name="train",
image="tensorflow/tensorflow:1.11.0-gpu-py3",
sync_source="https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git",
env=["GIT_SYNC_REV=%s" % (commit)],
gpus=gpus,
data=data,
command='''
echo %s;python code/tensorflow-sample-code/tfjob/docker/mnist/main.py \
--max_steps 500 --data_dir /training/dataset/mnist \
--log_dir /training/output/mnist --learning_rate %s \
--dropout %s''' % (prepare_data.output, learning_rate, dropout),
metrics=["Train-accuracy:PERCENTAGE"])
# 3. export the model
export_model = arena.standalone_job_op(
name="export-model",
image="tensorflo蛮横娘子温顺相公w/tensorflow:1.微博下载,像Google相同构建机器学习系统2 - 开发你的机器学习作业流,湘雅医院11.0-py3",
sync_source="https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git",
env=["GIT_SYNC_REV=%s" % (commit)],
data=data,
command="echo %s;python code/tensorflow-sample-code/tfjob/docker/mnist/export_model.py --model_version=%s --checkpoint_path=/training/output/mnist /training/output/models" % (train.output, model_version))

Kubeflow Pipelines会将上面的代码转化成一个有向无环图(DAG),其间的每一个节点便是Component(组件),而Component(组件)之间的连线代表它们之间的依靠联系。从Pipelines UI能够看到DAG图:

首要详细了解一下数据预备的部分,这儿咱们供给了arena.standalone_job_op的Python API, 需求指定该过程的称号:name,需求运用的容器镜像:image,要运用的数据以及其对应到容器内部的挂载目录:data,这儿的data是一个数组格局, 如data=["user-susan:/training"],表明能够挂载到多个数据。 user-susan是之前创立的Persistent Volume Claim,而/training为容器内部的挂载目录。

prepare_data = arena.standalone_job_op(
name="prepare-data",
image="byrnedo/alpine-curl",
data=data,
command="mkdir -p /training/dataset/mnist && \
cd /training/dataset/mnist && \
curl -O https://code.aliyun.com/xiaozhou/tensorflow-sample-code/raw/master/data/t10k-images-idx3-ubyte.gz && \
curl -O https://code.aliyun.com/xiaozhou/tensorflow-sample-code/raw/master/data/t10k-labels-idx1-ubyte.gz && \
curl -O https://code.aliyun.com/xiaozhou/tensorflow-sample-code/raw/master/data/train-images-idx3-ubyte.gz && \
curl -O https://code.aliyun.com/xiaozhou/tensorflow-sample-code/raw/master/data/train-labels-idx1-ubyte.gz")

而上述过程实践上是从指定地址运用curl下载数毛家超张黎山歌全集据到分布式存储对应的目录/training/dataset/mnist,请注意这儿的/training为分布式存储的根目录,相似我们了解的根mount点;而/training/dataset/mnist是子目录。其实后边的过程能够经过运用相同的根mount点,读到数据,进行运算。

第二步是运用下载到分布式存储的数据,并经过git指定固定commit id下载代码,干女并进行模型练习

train = arena.standalone_job_op(
name="train",
image="tensorflow/tensorflow:1.11.0-gpu-py3",
sync_source="https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git",
env=["GIT_SYNC_REV=%s" % (commit)],
gpus=gpus,
data=data,
comma微博下载,像Google相同构建机器学习系统2 - 开发你的机器学习作业流,湘雅医院nd='''
echo %s;python 超维大领主code/tensorflow-sample-code/tfjob/docker/mnist/main.py \
--max_steps 500 --data_dir /training/dataset/mnist \
--log_dir /training/output/mnis微博下载,像Google相同构建机器学习系统2 - 开发你的机器学习作业流,湘雅医院t --learning_rate %s \
--dropout %s''' % (prepare_data.output, learning_rate, dropout),
metrics=["Train-accuracy:PERCENTAGE"])

能够看到这个过程比数据预备要相对杂乱一点,除了和榜首过程中的name,image, data和command之外,在模型练习过程中,还需求指定:

  • 获取代码的办法: 从可重现试验的视点来看,关于运转试验代码的追根究底,是非常重要的一环。能够在API调用时指定sync_source的git代码源,一起经过设定env中GIT_SYNC_REV指定练习代码的commit id
  • gpu: 默许为0,便是不运用GPU;假如为大于0的整数值,就代表该过程需求这个数量的GPU数。
  • metrics: 相同是从可重现和可比较的试验意图动身,用户能够将需求的一系列目标导出,而且经过Pipelines UI上直观的显现和比较。详细运用办法分为两步,1.在调用API时以数组的方法指定要搜集目标的metrics name和目标的展现格局PERCENTAGE或许是RAW,比方metrics=["Train-accuracy:PERCENTAGE"]。2.因为Pipelines默许会从stdout日志中搜集目标,你需求在真实运转的模型代码中输出{metrics name}={value}或许{metrics name}:{value}, 能够参阅详细样例代码

值得注意的是:

在本过程中指定了和prepare_陨落异星data相同的data参数["user-susan:/training"],就能够在练习代码中读到对应的数据,比方--data_d微博下载,像Google相同构建机器学习系统2 - 开发你的机器学习作业流,湘雅医院ir /training/dataset/mnist,

别的因为该过程依靠于prepare_data,能够在办法中经过指定prepare_data.output表明两个过程的依靠联系。

最终export_model是根据train练习发生的checkpoint,生成练习模型:

export_model = arena.standalone_job_op(
name="exp微博下载,像Google相同构建机器学习系统2 - 开发你的机器学习作业流,湘雅医院ort-model",
image="tensor掌中追剧flow/tensorflow:1.11.0-py3",
sync_source="https://code.aliyun.com/xiaozhou/tensorflow-sample-code.git",
env=["GIT_SYNC_REV=%s" % (commit)],
data=data,
command="echo %s;python code/tenso女性水rflow-sample-code/tfjob/docker/mnist/export_model.py --model_version=%s --checkpoint_path=/training/output/mnist /training/outpu周逸辞t/models" % (train.output, model_version))

export_model和第二步train相似,甚至要更为简略,它仅仅从git同步模型导出代码而且运用同享目录/training/output/mnist中的checkpoint履行模型导出。

整个作业流程看起来仍是很直观的, 下面微博下载,像Google相同构建机器学习系统2 - 开发你的机器学习作业流,湘雅医院就能够界说一个Python办法将整个流程贯穿在一同。

@dsl.pipeline(
name='pipeline to run jobs',
description='shows how to run pipeline jobs.'
)
def sample_pipeline(learning_rate='0.01',
dropout='0.9',
model_version='1',
commit='f097575656f927d86d99dd64931042e1a9003cb2'):

@dsl.pipeline是表明作业流的装修器,这个装修器中需求界说两个特点,别离是name和description

进口办法sample_pipeline中界说了4个参数learning_rate,dropout,model_version和commit,别离能够在上面的train和export_model阶段运用。这儿的参数的值实践上是 dsl.PipelineParam类型,界说成dsl.PipelineParam的意图在于能够经过Kubeflow Pipelines的原生UI能够将其转换成输入表单,表单的关键字是参数称号,而默许值为参数的值. 值得注意的是,这儿的dsl.PipelineParam对应值的实践上只能是字符串和数字型;而数组和map,以及自界说类型都是无法经过转型进行改换的。

而实践上,这些参数都能够在用户提交作业流时进行掩盖,以下便是提交作业流对应的UI:

提交Pipeline

您能够在自己的Kubernetes内将前面开发作业流的Python DSL提交到Kubeflow Pipelines服务中, 实践提交代码很简略:

 KFP_SERVICE="ml-pipeline.kubeflow.svc.cluster.local:8888"
import kfp.compiler as compiler
compiler.Compiler().compile(sample_pipeline, __file__ + '.tar.gz')
client = kfp.Client(host=KFP_SERVICE)
try:
experiment_id = client.get_experiment(experiment_name=EXP李扬达ERIMENT_NAME).id
except:
experiment_id = client.create_experiment(EXPERIMENT_NAME).id
run = client.run_pipeline(experiment_id, RUN_ID, __file__ + '.tar.gz',
params={'learning_rate':learning_rate,
'dropout':dropout,
'model_version':model_version,
'commit':commit})

运用compiler.compile将Python代码编译成履行引擎(Argo)辨认的DAG配置文件

经过Kubeflow Pipeline的客户端创立或许找到已有的试验,而且提交之前编译出的DAG配置文件

在集群内预备一个python3的环境,而且装置Kubeflow Pipelines SDK

# kubectl create job pipeline-client --namespace kubeflow --image python:3 -- sleep infinity
# kubectl exec -it -n kubeflow $(kubectl get po -l job-name=pipeline-client -n kubeflow | grep -v NAME| awk '{print $1}') bash

登录到Python3的环境后,履行如下指令,接连提交两个不同参数的使命

# pip3 install http://微博下载,像Google相同构建机器学习系统2 - 开发你的机器学习作业流,湘雅医院kubeflow.oss-cn-beijing.aliyuncs.com/kfp/0.1.14/kfp.tar.gz --upgrade
# pip3 install http://kubeflow.oss-cn-beijing.aliyuncs.com/kfp-arena/kfp-arena-0.4.tar.gz --upgrade申港3路
# curl -O https://raw.githubusercontent.com/cheyang/pipelines/update_standalone_sample/sa单男mples/arena-samples/standalonejob/standalone_pipeline.py
# python3 standalone_pipeline.py --learning_rate 0.0001 --dropout 0.8 --model_version 2
# python3 standalone_pipeline.py --learning_rate 0.0005 --dr小玲建军opout 0.8 --model_version 3

检查运转成果

登录到Kubeflow Pipelines的UI: https://{pipeline地址}/pipeline/#/experiments, 比方

https://11.124.285.171/pipeline/#/experiments

点击Compare runs按钮,能够比较两个试验的输入,花费的时刻和精度等一系列目标。让试验可追溯是让试验可重现的榜首步;而运用Kubeflow Pipeline黄嘉千女儿s本身的试验办理才能则是敞开试验可重现的榜首步。

总结

完成一个能够运转的Kubeflow Pipeline需求的过程是:

1.构建Pipeline(流水线)台妹中文中需求的最小履行单元Compo苏意严尊nent(组件),假如是运用原生界说的dsl.container_ops,需求构建两部分代码:

  • 构建运转时代码:通常是为每个过程构建容器镜像,作为Pipelines和真实履行事务逻辑代码之间的适配器。它所做的作业为获取Pipelines上下文的输入参数,调用事务逻辑代码,而且将需求传递到下个过程的输出依照Pipelines的规矩放到容器内的指定方位,由底层作业流组件担任传递。 这样发生的成果是运转时代码与事务逻辑代码会耦合在一同。能够参阅Kubeflow Pipelines的比方
  • 构建客户端代码:这个过程通常是长成下面的姿态, 了解Kubernetes的朋友会发现这个过程实践上便是在编写Pod Spec:
container_op = dsl.ContainerOp(
name=name,
image='',
arguments=[
'--input_dir', input_dir,
'--output_dir', output_dir,
'--model_name', model_name,
'--model_version', model_version,
'--epochs', epochs
],
file_outputs={'output': '/output.txt'}
)
container_op.add_volume(k8s_client.V1Volume(
host_path=k8s_client.V1HostPathVolumeSource(
path=persistent_volume_path),
name=persistent_volume_name))
container_op.add_volume_mount(k8s_client.V1VolumeMount(
mount_path=persistent_volume_path,
name=persistent_volume_name))

运用原生界说的dsl.container_ops的优点在于灵敏,因为敞开了和Pipelines的交互接口,用户能够在container_ops这个层面做许多作业。可是它的问题在于:

  • 复费用低,每个Component都需求构建镜像和开发运转时代码
  • 杂乱度高,运用者需求了解Kubernetes的概念,比方resource limit, PVC, node selector等一系列概念
  • 支撑分布式练习困难,因为container_op为单容器操作,假如需求支撑分布式练习就需求在container_ops中提交和办理相似TFJob的使命。这儿会带来杂乱度和安全性的两层应战,杂乱度比较好了解,安全性是说提交TFJob这类使命的权限会需求敞开额定的权限给Pipeline的开发者。

另一种办法是运用arena_op这种能够重用的Component API,它运用通用运转时代码,能够免除重复构建运转时代码的作业;一起运用通用一套的arena_op API简化用户的运用;也支撑Parameter Server和MPI等场景。建议您运用这种办法编译Pipelines

2.将构建好的Component(组件)拼接成Pipeline(流水线)

3.将Pipeline(流水线)编译后Argo的履行引擎(Argo)辨认的DAG配置文件, 并提交的DAG配置文件到Kubeflow Pipelines, 并运用Kubeflow Pipelines本身的UI检查流程成果。

作者:必嘫

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。