Kubernetes 이야기

Kubeflow - Pipeline 본문

Kubernetes/MLOps

Kubeflow - Pipeline

kmaster 2023. 3. 26. 21:21
반응형

MLOps 파이프라인은 AI/ML 모델을 만들고 유지 관리하는 프로세스를 자동화하는 일련의 단계이다. 즉, 데이터 과학자는 실험을 구축하는 동안 여러 개의 노트북을 만들고 자연스럽게 다음 단계는 실험에서 생산 준비가 된 코드로 전환하는 것이다.  모델을 생성할 때마다 노트북을 수동으로 실행한다면 시간이 많이 걸리고 오류가 발생하기 쉬우며 확장할 수 없다.

 

Kubeflow에서는 KTP ( Kubeflow Pipelines ), MLFlow, Seldon Core를 사용하여 고급 MLOps 파이프라인을 구축할 수 있다. MLOps 프로세스는 기본적으로 실험과 실현이라는 두 가지 주요 단계로 나누어진다. 실험 중에 데이터 과학자는 많은 아이디어를 생성하고 검증하는 데 집중한다. 반면 두 번째 실현 단계에서는 가장 유망한 아이디어의 하위 집합을 선택하여 프로덕션에 전달한다. 

 

 

KFP(Kubeflow Pipelines)는 컨테이너를 사용하여 이식 가능하고 확장 가능한 기계 학습(ML) 워크플로를 구축하고 배포하기 위한 플랫폼이다. KFP는 Kubeflow의 핵심 구성 요소 또는 독립 실행형 설치로 사용할 수 있다.

 

Kubeflow Pipelines의 주요 목표는 다음을 지원하는 것이다.

 

  • ML 워크플로의 e2e 오케스트레이션
  • 재사용 가능한 구성 요소 및 파이프라인
  • 파이프라인 정의, 파이프라인 실행, 실험 및 ML 아티팩트의 손쉬운 관리, 추적 및 시각화
  • 캐싱을 통해 중복 실행을 제거하여 컴퓨팅 리소스를 효율적으로 사용
  • 플랫폼 중립적인 IR YAML 파이프라인 정의를 통한 크로스 플랫폼 파이프라인 이식성

파이프라인은 손쉬운 작성을 위해 Python을 사용하고 이식성을 위해 YAML로 컴파일되며 확장성을 위해 Kubernetes에서 실행된다. ( 현재 v2 는 아직 beta임 )

 

파이프라인을 개발하고 나면, Kubeflow Pipelines UI  Kubeflow Pipelines SDK 를 이용해서 업로드할 수 있다. 

 

MLOps 도구

 

  • KFP(Kubeflow Pipelines) : KFP는 작업과 해당 구성, 환경 변수 및 암호를 지정할 수 있는 워크플로 엔진. 또한 KFP는 모든 작업이 적절한 실행 순서로 올바르게 예약되도록 한다.
  • Minio : 데이터를 안전하게 보호하는 개체 스토리지 시스템. Minio는 AWS S3 호환 API를 제공하며 클라우드 스토리지용 게이트웨이 또는 독립형 객체 스토리지 시스템으로 작동할 수 있다.
  • MLFLow : 모델 교육 결과를 추적하고 비교하며 배포된 모델을 추적하는 데 도움이 되는 실험 및 모델 리포지토리다. 모델 및 실험에 대한 모든 메타데이터를 한 곳에서 추적한다.
  • Seldon Core : Kubernetes에 기계 학습 모델을 마이크로 서비스로 대규모로 배포하는 플랫폼이다. REST 및 gRPC 프로토콜, 수동 및 자동 크기 조정을 지원한다.
  • Katib : 하이퍼 파라미터(Hyperparameter) 튜닝 및 신경망 아키텍처 탐색(Neural Architecture Search)을 위한 쿠버네티스 기반의 시스템이다.
  • KServe :  ML 모델을 실제로 서비스하기 위해 API를 쉽게 만들 수 있도록 도와주는 도구이다.

 

https://www.kubeflow.org/docs/components/pipelines/v1/sdk/connect-api/#multi-user-mode

 

그럼 이제 예제를 살펴보자. 

예제는 다음을 참고하였다.

https://github.com/flopach/digits-recognizer-kubeflow

 

GitHub - flopach/digits-recognizer-kubeflow: Sample MLOps Workflow: Recognizing Digits with Kubeflow

Sample MLOps Workflow: Recognizing Digits with Kubeflow - GitHub - flopach/digits-recognizer-kubeflow: Sample MLOps Workflow: Recognizing Digits with Kubeflow

github.com

딥 러닝의 Hello-World인 손으로 쓴 숫자의 MNIST 데이터베이스를 사용하여 ML 파이프라인 생성하는 예제를 실행해보자.

 

 

Jupyter Notebook Tensorflow 설치

 

설치 시 아래 옵션을 Enable해야 한다.

NoteBook에서 Python 패키지 버전을 확인한다.

 

pip 목록은 다음보다 높은 버전을 설치해야 한다.

 

kfp 1.8.12
kfp-pipeline-spec 0.1.13
kfp-server-api 1.8.2
kserve 0.8.0

 

그리고, multi user mode에서 Jupyter 노트북에서 Kubeflow Pipelines에 액세스하려면 추가 네임스페이스(프로필) 매니페스트가 필요하다.

apiVersion: kubeflow.org/v1alpha1
kind: PodDefault
metadata:
  name: access-ml-pipeline
  namespace: "<YOUR_USER_PROFILE_NAMESPACE>"
spec:
  desc: Allow access to Kubeflow Pipelines
  selector:
    matchLabels:
      access-ml-pipeline: "true"
  volumes:
    - name: volume-kf-pipeline-token
      projected:
        sources:
          - serviceAccountToken:
              path: token
              expirationSeconds: 7200
              audience: pipelines.kubeflow.org      
  volumeMounts:
    - mountPath: /var/run/secrets/kubeflow/pipelines
      name: volume-kf-pipeline-token
      readOnly: true
  env:
    - name: KF_PIPELINES_SA_TOKEN_PATH
      value: /var/run/secrets/kubeflow/pipelines/token

 

개체 저장소용 MinIO 설정

 

모든 작업 데이터(학습 및 테스트 데이터, 저장된 ML 모델 등)를 모든 구성 요소에서 사용할 수 있는 단일 정보 소스를 제공하려면 객체 스토리지를 사용하는 것이 좋다. Kubeflow를 설치하게 되면 MinIO라는 Object Storage 가 기본적으로 설치된다.

 

MinIO에서 자격 증명 가져오기

 

[access key]

# kubectl get secret mlpipeline-minio-artifact -n kubeflow -o jsonpath="{.data.accesskey}" | base64 --decode

[secret key]

kubectl get secret mlpipeline-minio-artifact -n kubeflow -o jsonpath="{.data.secretkey}" | base64 --decode

 

Jupyter Notebook에서 실행 후

 

MinIO에 모델이 저장되었는지 확인한다.

 

Kserver 설정

 

kserve에 대한 minIO 암호 설정

minIO에 저장된 생성된 모델을 Kserve에서 액세스할 수 있도록 이 yaml 파일을 적용해야 한다.

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Secret
metadata:
  name: minio-kserve-secret
  namespace: kubeflow-user-example-com
  annotations:
     serving.kserve.io/s3-endpoint: "minio-service.kubeflow:9000"
     serving.kserve.io/s3-usehttps: "0"
     serving.kserve.io/s3-useanoncredential: "false"
type: Opaque
stringData:
  AWS_ACCESS_KEY_ID: "minio"
  AWS_SECRET_ACCESS_KEY: "minio123"
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa-minio-kserve
  namespace: kubeflow-user-example-com
secrets:
- name: minio-kserve-secret
EOF

 

Kubeflow Pipelines로 ML 파이프라인 생성

 

KFP(Kubeflow Pipelines)는 Kubeflow에서 가장 많이 사용되는 구성 요소이다. 이를 통해 ML 프로젝트의 모든 단계 또는 기능에 대해 ML 파이프라인으로 함께 연결할 수 있는 재사용 가능한 컨테이너화된 파이프라인 구성 요소를 생성할 수 있다.

 

파이프라인 실행 시 다음과 같이 Unauthenticated 에러가 발생하는 경우

 

다음과 같이 kfp client를 수정한다.

...
	#client = kfp.Client()

    token_file = os.getenv("KF_PIPELINES_SA_TOKEN_PATH")
    print(token_file)
    with open(token_file) as f:
        token = f.readline()
    print(token)
    
    client = kfp.Client(host='http://ml-pipeline.kubeflow:8888',existing_token=token, namespace='kubeflow-user-example-com')
...

수정 후 파이프라인을 실행한다. 파이프라인에서 사용하는 mnist.npz (https://s3.amazonaws.com/img-datasets/mnist.npz)

를 다운로드 하여 minio 에 사전에 올려놓는다.

 

파이프라인 실행결과

 

Kserve endpoint

 

endpoint 삭제 시 "Could not find CSRF cookie XSRF-TOKEN in the request." 오류가 발생하는 경우
k edit cm -n kubeflow kserve-models-web-app-config
apiVersion: v1
data:
  ...
  APP_SECURE_COOKIES: "false"  <--- 추가
  ...
kind: ConfigMap​


추가 후 k delete pod -n kubeflow kserve-models-web-app-xxx 를 재기동한다.

 

테스트를 실행하면 다음과 같이 결과를 조회할 수 있다.

 

참고

https://www.kubeflow.org/docs/components/pipelines/v1/overview/quickstart/

https://ubuntu.com/blog/mlops-pipeline-with-mlflow-seldon-core-and-kubeflow-pipelines

https://github.com/kubeflow/pipelines/blob/master/samples/contrib/kubeflow-e2e-mnist/

https://blogs.cisco.com/developer/machinelearningops03

https://v1-5-branch.kubeflow.org/docs/components/pipelines/sdk/connect-api/#how-multi-user-mode-in-cluster-authentication-works

https://github.com/kubeflow/pipelines/issues/4440

반응형

'Kubernetes > MLOps' 카테고리의 다른 글

dvc  (0) 2023.09.08
KServe, Seldon Core, BentoML 비교  (0) 2023.04.03
MLFlow vs Kubeflow  (0) 2023.03.06
MLOps  (0) 2023.03.06
Model Serving  (0) 2023.02.24
Comments