Kubeflow实战系列:阿里云上小试TFJob

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: `tf-operator`是Kubeflow的第一个CRD实现,解决的是TensorFlow模型训练的问题,它提供了广泛的灵活性和可配置,可以与阿里云上的NAS,OSS无缝集成,并且提供了简单的UI查看训练的历史记录。

介绍

本系列将介绍如何在阿里云容器服务上运行Kubeflow方案, 本文介绍如何使用TfJob运行模型训练。

TFJob简介

模型训练是机器学习最主要的实践场景,尤其以使用机器学习框架TensorFlow进行模型训练最为流行,但是随着机器学习的平台由单机变成集群,这个问题变得复杂了。GPU的调度和绑定,涉及到分布式训练的编排和集群规约属性的配置(cluster spec)也成了数据科学家们巨大的负担。

为了解决这一问题,一个新的资源类型TFJob,即TensorFlow Job被定义出来了。通过这个资源类型,使用TensorFlow的数据科学家无需编写复杂的配置,只需要关注数据的输入,代码的运行和日志的输入输出。

TFJob 定义

简单介绍一下TFJob的定义, TFJob实际上遵循Kubernetes标准的API定义。本文介绍v1alpha1的版本,对于v1alpha2,Kubeflow 0.2会支持,目前仍在开发中。

TFJob 对象

属性 类型 描述
apiVersion string api版本,目前为 kubeflow.org/v1alpha1
kind string REST资源的类型. 这里是TFJob
metadata ObjectMeta 标准元数据定义.
spec TFJobSpec TensorFlow job的定义

其中spec 非常重要,以下是其定义。

TFJobSpec 对象

属性 类型 描述
ReplicaSpecs TFReplicaSpec 类型数组 定义一组参加TensorFlow模型训练的成员

具体的TFReplicaSpec定义:

TFReplicaSpec 对象

属性 类型 描述
TfReplicaType string 参加TensorFlow模型训练的成员类型, 可以是 MASTER, WORKER 或者 PS。当单机训练的时候,只需要指定Master类型。
Replicas int 当前成员类型的数量,默认为 1.
Template PodTemplateSpec 这里是完全遵循Kubernetes Pod模板的定义,具体可以参考 Pod定义

前提要求

  • Kubernetes集群包含GPU的能力
  • Kubeflow核心模块安装

可以通过以下命令确认tf-operator这个核心组件已经正常启动

kubectl get deploy -n kubeflow tf-job-operator
NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
tf-job-operator   1         1         1            1           1m

运行TFJob进行训练

其实数据科学家运行模型训练关心的是三件事:

  1. 数据从哪里来
  2. 如何运行机器学习的代码
  3. 训练结果(模型和日志)到哪里去

对于运行在桌面机上的机器学习代码来说,这是很容易的事情;但是如果您的运行时环境是多台机器的集群环境,这个工作就变得复杂了。而TFJob希望机器学习训练的工程师们在集群的控制节点上实现中心化的配置管理,并且只需要了解如何编写和配置TFJob就能够像在单机上运行机器学习代码。

本文将提供三个例子阐述如何在云上使用数据和训练结果:

1. 数据和训练结果都在容器内

以下为示例yaml:

apiVersion: kubeflow.org/v1alpha1
kind: TFJob
metadata:
  name: mnist-simple-gpu
spec:
  replicaSpecs:
    - template:
        spec:
          containers:
            - image: registry.aliyuncs.com/kubeflow-images-public/tf-mnist:gpu
              name: tensorflow
              command: ["python", "/app/main.py"]
              resources:
                limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure

其中mnist代码来自 https://github.com/cheyang/tensorflow-sample-code/tree/master/tfjob/docker/mnist

将该模板保存到mnist-simple-gpu.yaml, 并且创建TFJob:

# kubectl create -f mnist-simple-gpu.yaml

现在可以看到TFJob资源已经被创建了:

# kubectl get tfjob
NAME               AGE
mnist-simple-gpu   1m

获得该TFJob的RUNTIME ID,这个RUNTIME ID是TFJob和其对应Pod之间的关联

# RUNTIMEID=$(kubectl get tfjob mnist-simple-gpu -o=jsonpath='{.spec.RuntimeId}')

根据RUNTIME ID查询对应执行该训练任务

# kubectl get po -lruntime_id=$RUNTIMEID
NAME                                   READY     STATUS    RESTARTS   AGE
mnist-simple-gpu-master-825k-0-23033   1/1       Running   0          1m

在Pod运行过程中,可以通过kubectl logs检查训练日志:

# kubectl logs mnist-simple-gpu-master-825k-0-23033 
[...]
2018-06-04 11:20:01.014330: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:00:08.0, compute capability: 6.0)
2018-06-04 11:20:06.612938: I tensorflow/stream_executor/dso_loader.cc:139] successfully opened CUDA library libcupti.so.8.0 locally
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Extracting /data/tensorflow/input_data/train-images-idx3-ubyte.gz
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Extracting /data/tensorflow/input_data/train-labels-idx1-ubyte.gz
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Extracting /data/tensorflow/input_data/t10k-images-idx3-ubyte.gz
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting /data/tensorflow/input_data/t10k-labels-idx1-ubyte.gz
Accuracy at step 0: 0.1446
Accuracy at step 10: 0.7515
Accuracy at step 20: 0.8397
Accuracy at step 30: 0.8606
...
Accuracy at step 980: 0.9642
Accuracy at step 990: 0.9662
Adding run metadata for 999
[...]

从日志中可以看到该训练过程需要先下载数据,再在GPU上进行训练,但是训练出来的结果只是留在了容器里,难于导出。

如果需要将模型导出,就需要借用Kubernetes的数据卷,我们来看一下第二个例子:

2. 将训练结果保存在OSS上

2.1 创建OSS数据卷kubeflow-oss,具体可以参考文档创建OSS Bucket

2.2 创建OSS的PV, 以下为示例oss-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: kubeflow-oss-mnist
  labels:
    tfjob: kubeflow-oss-mnist
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  storageClassName: oss
  flexVolume:
    driver: "alicloud/oss"
    options:
      bucket: "test-oss"
      url: "oss-cn-hangzhou.aliyuncs.com"
      akId: ***
      akSecret: ***
      otherOpts: "-o allow_other"

akId, akSecret为访问OSS 所需的 AccessKey

url为oss Bucket的访问域名,如果 BucketECS 实例位于不同地域(Region),请选择 外网域名;如果位于相同地域,需要根据集群网络类型进行选择,若是 VPC 网络,请选择 VPC域名,若是经典网络,请选择 内网域名

更多细节,请参考kubernetes配置数据卷

# kubectl create -f oss-pv.yaml
persistentvolume "kubeflow-oss-mnist" created

2.3 利用oss-pvc.yaml创建PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: kubeflow-oss-mnist
spec:
  storageClassName: oss
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      tfjob: kubeflow-oss-mnist

具体命令:

# kubectl create -f oss-pvc.yaml
persistentvolumeclaim "kubeflow-oss-mnist" created

一旦完成,就可以运行kubectl get pvc检查pvc的创建结果:

# kubectl get pvc kubeflow-oss-mnist
NAME                 STATUS    VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS   AGE
kubeflow-oss-mnist   Bound     kubeflow-oss-mnist   10Gi       RWX            oss            1d

2.4 创建TFJob

apiVersion: kubeflow.org/v1alpha1
kind: TFJob
metadata:
  name: mnist-simple-gpu-oss
spec:
  replicaSpecs:
    - template:
        spec:
          containers:
            - image: registry.aliyuncs.com/kubeflow-images-public/tf-mnist:gpu
              name: tensorflow
              env:
              - name: TEST_TMPDIR
                value: /data
              command: ["python", "/app/main.py"]
              resources:
                limits:
                  nvidia.com/gpu: 
              volumeMounts:
              - name: kubeflow-oss-mnist
                mountPath: "/data"
          volumes:
            - name: kubeflow-oss-mnist
              persistentVolumeClaim:
                claimName: kubeflow-oss-mnist
          restartPolicy: OnFailure

将该模板保存到mnist-simple-gpu-oss.yaml, 并且创建TFJob:

# kubectl create -f mnist-simple-gpu-oss.yaml
tfjob "mnist-simple-gpu-oss" created

一旦TFJob运行, 就能从OSS的客户端看到保存的模型文件,这些文件就会永远保存到OSS Bucket中。

oss_tfjobs

3. 利用NAS上的训练数据进行模型训练

3.1 创建NAS数据卷,并且设置与当前Kubernetes集群的同一个具体vpc的挂载点。操作详见文档

3.2 在NAS上创建 /tfdata/tensorflow/input_data的数据文件夹, 下载mnist训练所需要的数据

mkdir /nfs
mount -t nfs -o vers=4.0 xxxxxxx-rqx39.cn-hangzhou.nas.aliyuncs.com:/ /nfs
mkdir -p /nfs/tfdata/tensorflow/input_data
cd /nfs/tfdata/tensorflow/input_data
wget https://raw.githubusercontent.com/cheyang/tensorflow-sample-code/master/data/t10k-images-idx3-ubyte.gz
wget https://raw.githubusercontent.com/cheyang/tensorflow-sample-code/master/data/t10k-labels-idx1-ubyte.gz
wget https://raw.githubusercontent.com/cheyang/tensorflow-sample-code/master/data/train-images-idx3-ubyte.gz
wget https://raw.githubusercontent.com/cheyang/tensorflow-sample-code/master/data/train-labels-idx1-ubyte.gz
cd /
umount /nfs

3.3 创建NAS的PV, 以下为示例nas-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: kubeflow-nas-mnist
  labels:
    tfjob: kubeflow-nas-mnist
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nas
  flexVolume:
    driver: "alicloud/nas"
    options:
      mode: "755"
      path: /tfdata
      server: xxxxxxx-rqx39.cn-hangzhou.nas.aliyuncs.com
      vers: "4.0"

3.4 利用nas-pvc.yaml创建PVC

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: kubeflow-nas-mnist
spec:
  storageClassName: nas
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      tfjob: kubeflow-nas-mnist

具体命令:

# kubectl create -f nas-pvc.yaml
persistentvolumeclaim "kubeflow-nas-mnist" created

3.5 创建TFJob

apiVersion: kubeflow.org/v1alpha1
kind: TFJob
metadata:
  name: mnist-simple-gpu-nas
spec:
  replicaSpecs:
    - template:
        spec:
          containers:
            - image: registry.aliyuncs.com/kubeflow-images-public/tf-mnist:gpu
              name: tensorflow
              env:
              - name: TEST_TMPDIR
                value: /tfdata
              command: ["python", "/app/main.py"]
              resources:
                limits:
                  nvidia.com/gpu: 
              volumeMounts:
              - name: kubeflow-nas-mnist
                mountPath: "/tfdata"
          volumes:
            - name: kubeflow-nas-mnist
              persistentVolumeClaim:
                claimName: kubeflow-nas-mnist
          restartPolicy: OnFailure

将该模板保存到mnist-simple-gpu-nas.yaml, 并且创建TFJob:

# kubectl create -f mnist-simple-gpu-nas.yaml
tfjob "mnist-simple-gpu-nas" created

通过kubectl logs检查训练日志, 可以看到这里的数据无需下载,直接解包就可以开始训练:

# kubectl logs mnist-simple-gpu-master-825k-0-23033 
[...]
2018-06-06 11:12:55.968267: I tensorflow/stream_executor/dso_loader.cc:139] successfully opened CUDA library libcupti.so.8.0 locally
Extracting /tfdata/tensorflow/input_data/train-images-idx3-ubyte.gz
Extracting /tfdata/tensorflow/input_data/train-labels-idx1-ubyte.gz
Extracting /tfdata/tensorflow/input_data/t10k-images-idx3-ubyte.gz
Extracting /tfdata/tensorflow/input_data/t10k-labels-idx1-ubyte.gz
Accuracy at step 0: 0.1446
Accuracy at step 10: 0.7515
Accuracy at step 20: 0.8397
Accuracy at step 30: 0.8606
...
Accuracy at step 980: 0.9642
Accuracy at step 990: 0.9662
Adding run metadata for 999
[...]

通过TFJob UI查看训练状态

1. 可以通过kubectl命令查看Tensorboard的外网访问ip, 在本例子里,外网ip为120.0.0.1

#  kubectl get svc -n kubeflow tf-job-dashboard
NAME               TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
tf-job-dashboard   LoadBalancer   172.19.9.247   120.0.0.1   80:30911/TCP   2d

注意由于Kubeflow的TFJob目前仅仅提供http访问,并不推荐在生产环境使用LoadBalancer模式的Service,建议在生产环境,可以使用kubectl proxy的模式访问

2. 查看TFJob的UI界面

tf-job-ui.jpg

总结

tf-operator是Kubeflow的第一个CRD实现,解决的是TensorFlow模型训练的问题,它提供了广泛的灵活性和可配置,可以与阿里云上的NAS,OSS无缝集成,并且提供了简单的UI查看训练的历史记录。可以称得上是数据科学家用于TensorFlow模型训练的利器,与此同时Kubeflow社区还提供了包括pytorch-operator等其他机器学习框架的支持。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
28天前
|
弹性计算 缓存 负载均衡
【阿里云弹性计算】游戏服务器部署实战:利用阿里云ECS打造低延迟游戏环境
【5月更文挑战第24天】使用阿里云ECS打造低延迟游戏环境的实战指南,包括选择高性能处理器和SSD存储的实例,规划架构,选择近玩家的地域和可用区,部署软件,优化性能及监控。通过负载均衡、自动扩展和数据缓存提升体验,同时关注数据安全与网络安全。
207 4
|
29天前
|
SQL 关系型数据库 数据库
阿里云数据库 RDS SQL Server版实战【性能优化实践、优点探析】
本文探讨了Amazon RDS SQL Server版在云数据库中的优势,包括高可用性、可扩展性、管理便捷、安全性和成本效益。通过多可用区部署和自动备份,RDS确保数据安全和持久性,并支持自动扩展以适应流量波动。可视化管理界面简化了监控和操作,而数据加密和访问控制等功能保障了安全性。此外,弹性计费模式降低了运维成本。实战应用显示,RDS SQL Server版能有效助力企业在促销高峰期稳定系统并保障数据安全。阿里云的RDS SQL Server版还提供了弹性伸缩、自动备份恢复、安全性和高可用性功能,进一步优化性能和成本控制,并与AWS生态系统无缝集成,支持多种开发语言和框架。
170 2
|
1月前
|
弹性计算 监控 开发工具
【阿里云弹性计算】实战教程:如何高效利用阿里云ECS弹性伸缩应对业务高峰
【5月更文挑战第20天】本文介绍了如何使用阿里云ECS弹性伸缩服务应对业务高峰。通过自动调整云资源规模,弹性伸缩在流量增加时扩展实例,流量减少时收缩实例,实现成本与性能的优化。步骤包括开通服务、创建伸缩组、设定规则和监控指标。文中还提供了一个Python脚本示例,并强调了优化策略,如应用无状态设计、考虑冷却时间和结合云监控。通过实践和调整,企业可以有效应对业务波动。
78 5
|
30天前
|
弹性计算 监控 负载均衡
【阿里云弹性计算】ECS实例迁移实战:无缝迁移到阿里云的步骤与技巧
【5月更文挑战第22天】阿里云ECS实例迁移实战详解,涵盖无缝迁移步骤与技巧:选择合适迁移方案,如VPC或使用阿里云工具;创建目标环境,数据迁移及配置同步;测试验证功能正常,流量切换;选择低峰期,保证数据一致,实时监控,提升迁移成功率。本文为云平台迁移提供实用指南。
63 2
|
1月前
|
存储 弹性计算 监控
【阿里云弹性计算】成本优化实战:利用阿里云 ECS 抢占式实例节省云支出
【5月更文挑战第21天】阿里云ECS的抢占式实例提供了一种成本优化策略,适合对中断容忍度较高的业务。通过创建和管理抢占式实例,结合API查询价格信息,企业能节省大量成本。使用时注意业务容错性,设置监控系统应对中断,结合其他成本优化措施,如存储类型选择和网络配置优化。确保业务可恢复性,关注阿里云政策,并根据业务变化调整策略,以实现成本与效益的最佳平衡。
68 3
|
26天前
|
弹性计算 监控 数据库
【阿里云弹性计算】企业级应用上云实战:基于阿里云 ECS 的 ERP 系统迁移案例
【5月更文挑战第25天】制造企业将面临资源不足、维护成本高和数据安全问题的ERP系统迁移到阿里云ECS,实现业务上云。通过数据迁移、应用部署、网络配置和性能优化等步骤,企业享受到弹性计算资源、高可靠性和数据安全优势,降低维护成本。阿里云提供24小时支持,助力企业数字化转型。此案例展示企业级应用上云的可行性,鼓励更多企业借助云计算实现创新发展。
40 0
|
28天前
|
运维 Cloud Native 持续交付
【阿里云云原生专栏】从零到一搭建云原生应用:阿里云云原生应用平台实战教程
【5月更文挑战第24天】本文档是一份阿里云云原生应用平台的实战教程,介绍了如何从零开始搭建云原生应用。内容涵盖云原生应用的特点(容器化、微服务、CI/CD和自动化运维)以及阿里云提供的服务,如容器服务、服务网格和CI/CD工具。教程详细讲解了创建容器集群、编写Dockerfile、构建镜像、部署应用、配置服务网格和设置CI/CD的步骤。通过本文,读者将学会利用阿里云平台开发和管理云原生应用。
295 0
|
23天前
|
存储 固态存储 安全
阿里云4核CPU云服务器价格参考,最新收费标准和活动价格
阿里云4核CPU云服务器多少钱?阿里云服务器核数是指虚拟出来的CPU处理器的核心数量,准确来讲应该是vCPU。CPU核心数的大小代表了云服务器的运算能力,CPU越高,云服务器的性能越好。阿里云服务器1核CPU就是一个超线程,2核CPU2个超线程,4核CPU4个超线程,这样云服务器可以同时处理多个任务,计算性能更强。如果网站流程较小,少量图片展示的企业网站,建议选择2核及以上CPU;如果网站流量较大,动态页面比较多,有视频等,建议选择4核、8核以上CPU。
阿里云4核CPU云服务器价格参考,最新收费标准和活动价格
|
20天前
|
存储 固态存储 安全
租用阿里云企业级云服务器最新收费标准与活动价格参考
租用阿里云企业级云服务器多少钱?阿里云服务器有多种实例分类,其中通用型、计算型、内存型、通用算力型、大数据型、本地SSD、高主频型和增强型均属于企业级云服务器,目前在阿里云的活动中,通用型、计算型、内存型和通用算力型均有优惠,下面是阿里云企业级云服务器价格表,包含最新收费标准与活动价格,以表格形式展示给大家,以供参考和了解。
租用阿里云企业级云服务器最新收费标准与活动价格参考
|
4天前
|
弹性计算
2024年阿里云免费云服务器及学生三百通用额度申请教程参考
阿里云2024年继续提供免费学生云服务器,最长可享7个月(1+6个月);还有300元无门槛抵用金,适用于全量公共云产品(特殊商品除外)。学生需完成身份认证和任务以领取和续费。此外,有3个月免费的飞天试用云服务器,分为个人和企业版。详细申请教程包括学生认证、试用产品选择等步骤,可访问指定阿里云链接进行操作。
113 2