Kubeflow

Kubeflow?

Kubeflow란 Kubernetes 환경에서 간단하게 머신 러닝 워크플로우를 배포할 수 있게 도와주는 시스템이다. 다양한 환경에서 실행하는 머신 러닝 워크플로우를 단일 환경에서 손쉽고 직관적으로 배포하게 하는 것이 Kubeflow의 목적이다.

  • 다양한 인프라 환경에 쉽고 재사용 가능하고 포터블한 배포 가능
  • loosely-coupled 마이크로서비스 배포 및 관리
  • 요구에 따라 가능한 스케일링

Kubernetes?

Kubernetes는 디플로이 자동화, 스케일링, 컨테이너화된 애플리케이션의 관리를 위한 오픈 소스 시스템으로서 원래 구글에 의해 설계되었고 현재 리눅스 재단에 의해 관리되고 있다. 목적은 여러 클러스터의 호스트 간에 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 플랫폼을 제공하기 위함이다. 도커를 포함하여 일련의 컨테이너 도구들과 함께 동작한다.

출처: 위키백과 - 쿠버네티스

Kubeflow 주요 기능

Ksonnet

참고 - Ksonnet
Kubeflow는 기본적으로 Ksonnet을 이용해서 서비스를 배포한다. Ksonnet은 kubectl 위에서 작동하며 Kubernetes 환경으로의 배포를 추상화하여 여러 환경으로 배포할 수 있도록 한다. Kubernetes가 배포 정보를 정적인 yaml 파일로 관리하는데, Ksonnet은 프로토타입과 컴포넌트를 이용해서 이 yaml 파일을 동적으로 생성한다. 프로토타입은 Kubernetes에 배포될 자원 명세로 설정 가능한 파라메터를 제외한 형식이다. 컴포넌트는 프로토 타입에 파라메터를 주입한 구현체로 이를 이용해서 다양한 yaml 파일을 생성해서 다양한 환경에 배포를 할 수 있다.
출처 - https://ksonnet.io/docs/concepts/
출처 - https://ksonnet.io/docs/concepts/

TensorFlow Training Controller

Kubeflow에서 TensorFlow 트레이닝 잡을 돌리는 기능으로 TFJob으로 정의한다. TFJob은 쿠버네티스의 custom resource로 만들어져있다. 아래의 예시와 같이 YAML 파일로 정의해서 실행시키며 Distributed Tensorflow의 형태로 배포된다.

apiVersion: kubeflow.org/v1alpha2
kind: TFJob
metadata:
  labels:
    experiment: experiment10
  name: tfjob
  namespace: kubeflow
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: {}
            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=cpu
            - --data_format=NHWC
            image: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
            name: tensorflow
            ports:
            - containerPort: 2222
              name: tfjob-port
            resources: {}
            workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
          restartPolicy: OnFailure
status:
  conditions:
  - lastTransitionTime: 2018-07-29T00:31:48Z
    lastUpdateTime: 2018-07-29T00:31:48Z
    message: TFJob tfjob is running.
    reason: TFJobRunning
    status: "True"
    type: Running
  startTime: 2018-07-29T21:40:13Z
  tfReplicaStatuses:
    PS:
      active: 1
    Worker:
      active: 1

출처 - Kuberflow 홈페이지

TensorFlow Serving

Kubeflow를 이용해서 TensorFlow Serving을 하기 위해서는 먼저 Http-proxy 컨테이너를 배포해야한다. (이 부분은 더 쉽게 할 수 있도록 지원한다고 한다.)
또한 사용할 수 있는 모델은 Google cloud, Amazon S3, NFS에서 가져올 수 있도록 지원한다.
GPU 설정과 같은 파라메터 설정을 한 후 앱을 배포하면 설정한 URL로 텐서플로우 모델을 서빙할 수 있다.

Jupyter Notebooks

Kubeflow를 설치하면 Kubeflow Dashboard가 생성된다. 이곳에서는 텐서플로우 Job에 대한 모니터링 등 간단하게 현재 Kubeflow의 상황을 모니터링 할 수 있다. 또한 Jupyter Hub 가 제공되어 적절한 크기의 컨테이너를 할당받은 Jupyter notebook을 사용할 수 있다.

참고

Kubeflow
위키백과 - 쿠버네티스
Slideshare - Kubeflow on GKE