炼丹师的优雅内功三:kubeflow 如何承接机器学习任务

323 阅读4分钟

前面的文章

炼丹师的优雅内功前言:从机器学习,分布式训练到k8s云计算

炼丹师的优雅内功一:TensorFlow on kubernetes

炼丹师的优雅内功二:PyTorch on kubernetes

kubeflow是什么

kubeflow 是2017年由国内外多家公司共同开源,经历了多年的发展kubeflow 已经变成了一个庞大的项目,让我们很难的用一句话全面概括,我们可以看下官网的描述

The Kubeflow project is dedicated to making deployments of machine learning (ML) workflows on Kubernetes simple, portable and scalable. Our goal is not to recreate other services, but to provide a straightforward way to deploy best-of-breed open-source systems for ML to diverse infrastructures. Anywhere you are running Kubernetes, you should be able to run Kubeflow. 简单来说kubeflow 是kubernetes 的ML工具集

通过kubeflow 官网提供的架构图我们可以简单了解

image.png

图中可以看出kubeflow 底层依赖于kubernetes,主要功能依赖于各种控制器适配ML相关的框架,同时提供了各种各样的ML tools。

kubeflow 提供了很多的Operator 这些operator 主要是针对不同的ML提供资源调度和分布式训练能力

Kubeflow核心组件介绍

  • jupyter 多租户NoteBook服务
  • Tensorflow PyTorch MPI MXnet Chainer 当前主要支持的机器学习引擎
  • Seldon 提供在Kubernetes上对机器学习模型的部署
  • TF-Serving 提供对Tensorflow模型的在线部署,支持版本控制及无需停止线上服务,切换模型等功能
  • Argo 基于Kubernetes的工作流引擎
  • Ambassador 对外提供统一服务的网关(API Gateway)
  • Istio 提供微服务的管理,Telemetry收集
  • Ksonnet Kubeflow使用ksonnet来向kubernetes集群部署需要的k8s资源

kubeflow 安装

这个我懒得写大家自己看官网

kubeflow 下发TensorFlow 作业

tf-operator

从kubeflow 的training-operator仓库中可以看到 pkg/controller.v1/tensorflow/tfjob_controller.go代码中的主要逻辑和我们在之前的文章炼丹师的优雅内功一:TensorFlow on kubernetes中在k8s 上部署的流程一样,

  • 1 解析TFjob
func (jc *JobController) ReconcileJobs(
	job interface{},
	replicas map[apiv1.ReplicaType]*apiv1.ReplicaSpec,
	jobStatus apiv1.JobStatus,
	runPolicy *apiv1.RunPolicy) error {
        ......
        ......
        ......
        ......
}
  • 2 获取pod
......
        pods, err := jc.Controller.GetPodsForJob(job)
        if err != nil {
		log.Warnf("GetPodsForJob error %v", err)
		return err
         }
 ......

  • 3 获取service
......
	services, err := jc.Controller.GetServicesForJob(job)
	if err != nil {
		log.Warnf("GetServicesForJob error %v", err)
		return err
	}
......
  • 4 部署
......
        err := jc.Controller.ReconcilePods(metaObject, &jobStatus, pods, rtype, spec, replicas)
			if err != nil {
				log.Warnf("ReconcilePods error %v", err)
				return err
			}

	      err = jc.Controller.ReconcileServices(metaObject, services, rtype, spec)

	      if err != nil {
                  log.Warnf("ReconcileServices error %v", err)
                  return err
			}
......

TFjob

炼丹师的优雅内功一:TensorFlow on kubernetes这篇文章中有写,当时在k8s 集群中部署的方式也是job,相对于k8s原生的job TFjob 是kubernetes自定义资源,它是kubeflow 创建的资源 部署文件如下

apiVersion: kubeflow.org/v1
kind: TFJob
metadata:
  generateName: tfjob
  namespace: your-user-namespace
spec:
  tfReplicaSpecs:
    PS:
      replicas: 1
      restartPolicy: OnFailure
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          containers:
            - name: tensorflow
              image: gcr.io/your-project/your-image
              command:
                - python
                - -m
                - trainer.task
                - --batch_size=32
                - --training_steps=1000
    Worker:
      replicas: 3
      restartPolicy: OnFailure
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          containers:
            - name: tensorflow
              image: gcr.io/your-project/your-image
              command:
                - python
                - -m
                - trainer.task
                - --batch_size=32
                - --training_steps=1000

分布式TensorFlow 作业通常包含0个或者多个以下进程

  • Chief 负责协调训练和执行模型检查点
  • Ps ps是参数服务器;这些服务器为模型参数提供分部署数据
  • Worker 负责训练模型的实际工作。在某些情况下work 0 也可作为chief
  • Evaluator 在训练模型时计算评估之变

使用GPU

使用GPU 必须满足如下配置

  • 节点必须有GPU
  • Kubernetes 集群必须识别nvidia.com/gpu资源类型。
  • 集群上的节点必须安装GPU驱动
apiVersion: "kubeflow.org/v1"
kind: "TFJob"
metadata:
  name: "tf-smoke-gpu"
spec:
  tfReplicaSpecs:
    PS:
      replicas: 1
      template:
        metadata:
          creationTimestamp: null
        spec:
          containers:
            - args:
                - python
                - tf_cnn_benchmarks.py
                - --batch_size=32
                - --model=resnet50
                - --variable_update=parameter_server
                - --flush_stdout=true
                - --num_gpus=1
                - --local_parameter_device=cpu
                - --device=cpu
                - --data_format=NHWC
              image: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
              name: tensorflow
              ports:
                - containerPort: 2222
                  name: tfjob-port
              resources:
                limits:
                  cpu: "1"
              workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
          restartPolicy: OnFailure
    Worker:
      replicas: 1
      template:
        metadata:
          creationTimestamp: null
        spec:
          containers:
            - args:
                - python
                - tf_cnn_benchmarks.py
                - --batch_size=32
                - --model=resnet50
                - --variable_update=parameter_server
                - --flush_stdout=true
                - --num_gpus=1
                - --local_parameter_device=cpu
                - --device=gpu
                - --data_format=NHWC
              image: gcr.io/kubeflow/tf-benchmarks-gpu:v20171202-bdab599-dirty-284af3
              name: tensorflow
              ports:
                - containerPort: 2222
                  name: tfjob-port
              resources:
                limits:
                  nvidia.com/gpu: 1
              workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
          restartPolicy: OnFailure

其他功能

后续

欢迎大家订阅本专栏,后续会持续不断更新云原生&云计算相关的内容!! 炼丹师的优雅内功四:volcano 基础