Kubeflow란?

0

kubeflow

목록 보기
1/1

kubeflow overview

https://www.kubeflow.org/docs/started/introduction/

kubeflow란

kubeflow는 opensource tool과 framework의 도움을 통해, machine learning lifecycle 상의 각 단계를 다루는 opensource project들로 이루어진 ecosystem이다. kubeflow는 kubernetes 상에서의 AI/ML을 좀 더 simple하고, available하며, scalable하게 만들어준다.

standalon kubeflow component

kubeflow ecosystem은 각기 다른 ML lifecycle을 다루는 opensource project들의 집합으로 이루어져 있다. 그렇기 때문에 각 요소들은 kubeflow에 설치하지 않고, 원하는 project로 대체할 수도 있다. 이는 kubeflow platform을 완전한 기능을 원하진 않지만, model training이나 model serving과 같은 특정 기능에 대해서는 도움을 받고 싶은 user에게 유연성을 제공해준다.

kubeflow platform이란

kubeflow platform은 ML lifecycle에 대한 전체적인 ML toolkit을 제공해주고, 이 밖에 관리적 측면에 대한 툴들을 제공해준다.

개별 kubeflow component들로 kubeflow platform은 다음을 포함한다.

  • kubeflow notebooks: data 탐구와 model 개발을 위한 인터렉티브한 툴
  • central dashboard: 접근 제어를 위해 kubeflow profiles를 사용하여 쉬운 사용과 관리를 제공
  • 추가적으로 data관리를 위한 'PVC Viewer', 시각화 툴('TensorBoards') 등을 제공

kubeflow overview 그림

다음은 kubernetes 상에서 ML 생명주기의 각 단계를 다루는 kubeflow component들을 보여준다.

https://www.kubeflow.org/docs/started/images/kubeflow-intro-diagram.drawio.svg

kubeflow의 mission

주요 목표는 Machine learning models을 스케일링하고 model들을 production환경에 가능한 simple하게 배포하고자하는 것이다. kubernetes는 다음의 것들을 가능하게 해준다.

  • 쉽게 다른 infra(cloud, local server etc)에 이식이 가능하고, 배포하기 쉽다.
  • microservice를 제공해준다.
  • 수요에 맞게 scale 조정 가능

대다수의 ML 개발자들은 각자 사용하는 tool들이 다르고, 주요 목표가 다르기 때문에 kubeflow는 customize기능을 제공하도록 한다. 주요한 기능에 대해서는 개발자의 customize가 가능하도록 하고, 지루하고 귀찮은 부분들을 kubeflow가 제공하도록 하는 것이다. 따라서, kubeflow는 어디서든 kubernetes를 통해 배포될 수 있고 custom 가능하도록 간단한 형식을 갖고 있으며, 다양한 project들을 수용할 수 있도록 구조화되었다.

kubeflow 구조

https://www.kubeflow.org/docs/started/architecture/

kubeflow Ecosystem

아래의 그림은 kubeflow ecosystem의 overview를 보여주고 어떻게 kubeflow가 다양한 kubernetes, AI/Ml project들과 연관되어 있는 지 보여준다.

https://www.kubeflow.org/docs/started/images/kubeflow-architecture.drawio.svg

kubeflow는 kubernetes 사용하여 AI/ML 인프라를 배포, 스케일링, 관리하도록 한다.

ML 생명주기 소개

AI application을 개발하고 배포할 때, ML lifecycle은 전형적으로 여러 단계들을 거치게 된다. ML system을 개발하는 것은 일종의 iterative(반복적인) process와 같다. 매 ML lifecycle 마다의 결과를 evaluate해야하고, model과 parameter들에 대해서 변화를 적용하여 model이 원하는 결과를 생성해주도록 만들어야한다.

다음은 ML lifecycle stage 순서를 보여준다.
https://www.kubeflow.org/docs/started/images/ml-lifecycle.drawio.svg

각 stage들에 대해서 자세히 알아보도록 하자.

  • Data Preparation: raw data를 가져오고 feature engineering을 사용하여 offline feature store에 대한 ML feature들을 추출한다. 이러한 과정을 통해 model 개발을 위한 training data를 준비하는 것이다. 대게 이 단계는 Spark, Dask, Flink, Ray`와 같은 data processing tool들과 관련되어 있다.

  • Model Development: ML framework를 선택하고 model 구조를 개발한다. 또한 fine-tuning을 하기위해서 BERTLlama와 같은 pre-trained model을 찾아본다.

  • Model Optimization: model hyperparameter들을 최적화하고 여러 AutoML 알고리즘들을 통해서 model을 최적화한다. model 최적화 단계에서는 ML metadata를 Model Registry에 저장할 수 있다.

  • Model Trainning: large-scale compute 환경에서 우리의 model을 학습한다. 만약, 단일 GPU가 우리의 model 사이즈를 감당하지 못하면, 분산 학습을 실행하도록 한다. model training의 결과는 trained model artifact로 Model Registry에 저장할 수 있다.

  • Model Serving: model artifact를 online 또는 barch inference에 제공할 수 있다. model serving step에서는 online feature store를 사용하여 feature들을 추출할 수 있다. 또한, model 성능을 모니터링 할 수 있으며, ML lifecycle 상에서 이전 step에 결과를 피드백 줄 수 있다.

production과 development phase에서의 ML lifecycle

ML application에 대한 ML 생명주기는 두 단계로 나누어 생각할 수 있다. 하나는 'development'이고 하나는 'production'이다.

https://www.kubeflow.org/docs/started/images/ml-lifecycle-dev-prod.drawio.svg

ML lifecycle에서 kubeflow component들

https://www.kubeflow.org/docs/started/images/ml-lifecycle-kubeflow.drawio.svg

다음은 각 kubeflow component들에 대한 자세한 설명이 담긴 link이다.

  1. Kubeflow Spark Operator: data 준비와 feature 엔지니어링을 위해 사용된다. https://github.com/kubeflow/spark-operator

  2. Kubeflow Notebooks: ML workflow에서 interactive한 data science와 model 개발을 위해 사용된다. https://www.kubeflow.org/docs/components/notebooks/

  3. Kubeflow Katib: 여러 AutoML 알고리즘들을 사용하여 model 최적화와 하이퍼파라미터 튜닝을 하기위해 사용한다. https://www.kubeflow.org/docs/components/katib/

  4. Kubeflow Training Operator: 대규모 분산 training 또는 fine-tuning에 사용된다. https://www.kubeflow.org/docs/components/training/

  5. Kubeflow Model Registry: production 환경에서의 제공을 위해 ML metadata, model artifacts, model을 저장하는 공간이다. https://www.kubeflow.org/docs/components/model-registry/

  6. KServe: model 제공 단계에서 online, batch inference를 위해 사용된다. 가령, model의 container이미지만 있으면 kserve를 통해서 model 명과 uri를 통해서 쉽게 제공이 가능하다. https://kserve.github.io/website/master/

  7. Feast: feature store로 사용되며, offline, online feature들을 관리한다. https://feast.dev/

  8. Kubeflow Pipelines: ML 생명주기에서 각 step을 빌드, 배포, 관리하기 위해서 사용된다. https://www.kubeflow.org/docs/components/pipelines/

kubeflow 설치

공식 문서에서 제대로 설명이 없다...

https://github.com/kubeflow/manifests

다음의 페이지에 들어가면 yaml파일들이 존재하고 kustomize를 사용하는 것을 볼 수 있다.

설치를 위해 먼저 github repo를 다운받도록 하자.

git clone https://github.com/kubeflow/manifests.git
cd manifests

다음으로 kustomize를 사용해 kubernetes resource들을 빌드해보도록 하자.

kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources";

와다다다 거리면서 pod들이 올라올 것이다.

watch kubectl get po -A

마지막으로 pod들을 내리는 방법은 다음과 같다.

kustomize build example | kubectl delete -f -; do echo "Retrying to delete resources";

사실 kubeflow를 설치해보면 알겠지만, 너무 불필요한 것들이 많이 설치된다. 가령 istio나 OAtuh2 proxy의 경우 특정 business logic에서는 필요없는 상황일 수 있다. 따라서, 각자가 원하는 요소를 따로 가져와 설치하는 것이 좋다.

필자의 경우 kubeflow pipeline만 필요로 하기 때문에 다음과 같이 설치하도록 한다.
https://github.com/kubeflow/pipelines/releases

해당 링크에 들어가면 각 kfp(kubeflow pipeline)의 release들이 나온다. 원하는 version을 선택하여 설치해주면 된다.

wget https://github.com/kubeflow/pipelines/archive/refs/tags/2.2.0.tar.gz

tar -xvzf 2.2.0.tar.gz
cd ./pipelines-2.2.0/

해당 directory에서 manifests 부분을 확인하면 kubeflow pipeline kustomize들을 볼 수 있다.

ls ./manifests/kustomize/
base                      cluster-scoped-resources-tekton  gcp-workload-identity-setup.sh  Makefile  README.md  third-party
cluster-scoped-resources  env                              hack                            OWNERS    sample     wi-utils.sh

다음으로 설치 이전에 pvc에 pv를 추가해주어야 할 부분들이 있다. 이를 위해서, local provisioner를 설치하여 동적 프로바인딩이 가능하도록 해주자.
https://github.com/rancher/local-path-provisioner

kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.28/deploy/local-path-storage.yaml

다음으로 third-party인 minio와 mysql의 pvc를 추가해주도록 하자.

  • manifests/kustomize/third-party/minio/base/minio-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-pvc
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 20Gi
  • manifests/kustomize/third-party/mysql/base/mysql-pv-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 20Gi

이제 배포해보도록 하자.

kustomize build ./manifests/kustomize/cluster-scoped-resources | kubectl apply -f -
kustomize build ./manifests/kustomize/env/plain | kubectl apply -f -

몇 분 후에 kubectl get pod로 확인해보면 다음과 같이 결과가 나온다.

kubeflow               cache-deployer-deployment-cf9646b9c-wcgfv            1/1     Running   0              2m26s
kubeflow               cache-server-56d4959c9-tfc2k                         1/1     Running   0              2m26s
kubeflow               metadata-envoy-deployment-9c7db86d8-sjphh            1/1     Running   0              2m26s
kubeflow               metadata-grpc-deployment-d94cc8676-57r9x             1/1     Running   4 (97s ago)    2m26s
kubeflow               metadata-writer-cd5dd8f7-pgm94                       1/1     Running   0              2m26s
kubeflow               minio-5dc6ff5b96-vcflq                               1/1     Running   0              2m26s
kubeflow               ml-pipeline-64d6db5897-b5qrh                         1/1     Running   1 (56s ago)    2m26s
kubeflow               ml-pipeline-persistenceagent-fc7c944d4-sdqdv         1/1     Running   0              2m26s
kubeflow               ml-pipeline-scheduledworkflow-676478b778-z52rd       1/1     Running   0              2m26s
kubeflow               ml-pipeline-ui-87b9d4fb6-csj7l                       1/1     Running   0              2m26s
kubeflow               ml-pipeline-viewer-crd-8574556b89-596ch              1/1     Running   0              2m26s
kubeflow               ml-pipeline-visualizationserver-5d7c54f495-v5f6m     1/1     Running   0              2m25s
kubeflow               mysql-5b446b5744-tdhk6                               1/1     Running   0              2m25s

UI에 접근하기 위해 다음과 같이 nodeport를 만들어주도록 하자.

  • ml-pipeline-ui-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: ml-pipeline-ui
  name: ml-pipeline-ui-nodeport
  namespace: kubeflow
spec:
  ports:
  - name: port
    nodePort: 32007
    port: 8080
    protocol: TCP
    targetPort: 3000
  selector:
    app: ml-pipeline-ui
  type: NodePort
status:
  loadBalancer: {}

배포해주도록 하자.

kubectl appy -f ./ml-pipeline-ui-nodeport.yaml

이제 localhost:32007에 접속하면 UI page에 접속 할 수 있을 것이다. 접속했다면 설치에 성공한 것이다.

kubeflow의 pipeline에 대해서 더 알아보기 위해서는 다음의 링크를 참조하도록 하자. https://www.kubeflow.org/docs/components/pipelines/overview/

만약 cluster에서 삭제하고 싶다면 다음과 같이 가능하다.

kubectl delete -f ./ml-pipeline-ui-nodeport.yaml
kustomize build ./manifests/kustomize/env/plain | kubectl delete -f -

0개의 댓글