tf-operator 的测试
时间:2022-07-22
本文章向大家介绍tf-operator 的测试,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 Overview
近期组内掌管的资源利用效率不够高,我们正在想办法在混部集群(游戏+离线任务),多跑一些离线任务。平台之前提供过一些大规模机器学习的模块给算法同学使用,效果不错,但是因为交互以及和 K8S 的集成问题,还有就是人力问题,没有做的很好,最近调研了一些 tf-operator,准备底层进行整合,给用户提供更好的机器学习训练的体验。
关于 tf-operator,可以参考官网和 Github 仓库,简单理解,tf-operator 就是让用户在 K8S 集群上部署训练任务更加方便和简单。
2 Setups
因为 Kubeflow 安利:在 Kubernetes 上进行机器学习 内容已经比较老了,Kubeflow 有了一些模块的调整,而且官网的部署介绍是基于整个所有 component 的,但是我只想跑一个 tf-operator 的测试程序,所以从官网提供的部署方法里,抠一些脚本出来,单独部署一个 tf-opertor。
2.1 Prerequisite
- Kubernetes 集群,Mac 用户可以是 Docker for Mac,或者 Minikube
- 安装好 Ksonnet,略懂 Ksonnet 和 Jsonnet
- 有过使用 Tensorflow 的经验
2.2 Run
# 指定工作目录
APP_NAME=my-kubeflow
ks init ${APP_NAME}
cd ${APP_NAME}
# 指定 ks registry,方便安装 pkg
ks registry add kubeflow github.com/kubeflow/kubeflow/tree/master/kubeflow
# 安装需要的 pkg,官方提供的脚本 kfctl.sh 会安装所有 pkg,这里我们只装需要的
ks pkg install kubeflow/common
ks pkg install kubeflow/tf-training
# all 已经可以替代所安装的 pkg 了
ks generate all
ks apply all
按照?的程序,就可以部署好 tf-operator 了。
# 默认在 default namespace 下
# kubectl get pods
➜ my-kubeflow git:(master) ✗ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/tf-job-operator-665c879f79-6p7pj 1/1 Running 0 137m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h23m
service/tf-job-operator ClusterIP 10.99.30.170 <none> 8443/TCP 137m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/tf-job-operator 1/1 1 1 137m
NAME DESIRED CURRENT READY AGE
replicaset.apps/tf-job-operator-665c879f79 1 1 1 137m
然后再安装 example,跑一个分布式的 mnist 训练任务。
cd ./examples/v1/dist-mnist
docker build -f Dockerfile -t kubeflow/tf-dist-mnist-test:1.0 .
kubectl create -f ./tf_job_mnist.yaml
任务启动成功,可以见到?。
# kubectl get pods
NAME READY STATUS RESTARTS AGE
dist-mnist-for-e2e-test-ps-0 0/1 ContainerCreating 0 6s
dist-mnist-for-e2e-test-ps-1 0/1 ContainerCreating 0 6s
dist-mnist-for-e2e-test-worker-0 0/1 ContainerCreating 0 5s
dist-mnist-for-e2e-test-worker-1 0/1 ContainerCreating 0 5s
dist-mnist-for-e2e-test-worker-2 0/1 ContainerCreating 0 5s
dist-mnist-for-e2e-test-worker-3 0/1 ContainerCreating 0 5s
tf-job-dashboard-7b99dcff48-wq5cw 1/1 Running 0 139m
tf-job-operator-665c879f79-6p7pj 1/1 Running 0 139m
可以通过 get
来查看 status
。
# kubectl get tfjobs.kubeflow.org dist-mnist-for-e2e-test -o yaml
apiVersion: kubeflow.org/v1
kind: TFJob
metadata:
creationTimestamp: "2019-07-29T06:41:53Z"
generation: 1
name: dist-mnist-for-e2e-test
namespace: default
resourceVersion: "11825"
selfLink: /apis/kubeflow.org/v1/namespaces/default/tfjobs/dist-mnist-for-e2e-test
uid: f3c0a2c6-b1cb-11e9-9279-0800274cd279
spec:
tfReplicaSpecs:
PS:
replicas: 2
restartPolicy: Never
template:
spec:
containers:
- image: kubeflow/tf-dist-mnist-test:1.0
name: tensorflow
Worker:
replicas: 4
restartPolicy: Never
template:
spec:
containers:
- image: kubeflow/tf-dist-mnist-test:1.0
name: tensorflow
status:
completionTime: "2019-07-29T09:09:15Z"
conditions:
- lastTransitionTime: "2019-07-29T08:51:17Z"
lastUpdateTime: "2019-07-29T08:51:17Z"
message: TFJob dist-mnist-for-e2e-test is created.
reason: TFJobCreated
status: "True"
type: Created
- lastTransitionTime: "2019-07-29T09:02:50Z"
lastUpdateTime: "2019-07-29T09:09:14Z"
message: TFJob dist-mnist-for-e2e-test is running.
reason: TFJobRunning
status: "False"
type: Running
- lastTransitionTime: "2019-07-29T09:09:15Z"
lastUpdateTime: "2019-07-29T09:09:15Z"
message: TFJob dist-mnist-for-e2e-test successfully completed.
reason: TFJobSucceeded
status: "True"
type: Succeeded
replicaStatuses:
PS:
succeeded: 2
Worker:
succeeded: 4
startTime: "2019-07-29T08:51:17Z"
3 Summary
上面的例子,讲解了如何在 K8S 集群运行 tf-operator 并且提交分布式的训练任务。
Reference
- Kubeflow 安利:在 Kubernetes 上进行机器学习
- kubeflow/tf-operator
- kubeflow/kubeflow
- Distributed Tesorflow
- KubeFlow CPU/GPU Demo
- 手把手教你整合最优雅的SSM框架
- WCF后续之旅(9):通过WCF的双向通信实现Session管理[上篇]
- 周末小贴士之“什么是语法糖”?有啥意义?
- Java反射机制深入详解
- 由for V.S. for each想到的
- 日调度5万亿次,腾讯云微服务架构体系TSF深度解读
- sed的粉丝
- 在Managed Code通过Google Gmail发送邮件以及如何通过Outlook配置Gmail
- 平方根的C语言实现(一) —— 浮点数的存储
- 用awk写递归
- bc计算A股上市新股依次涨停股价
- ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式
- python访问http的GET/POST
- 用openssl库RSA加密解密
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法