Kubernetes 이야기

Kubeflow를 사용한 MLOps 본문

Kubernetes/MLOps

Kubeflow를 사용한 MLOps

kmaster 2023. 2. 23. 18:33
반응형

Kubeflow는 Kubernetes에서 기계 학습(ML) 워크플로에 필요한 학습부터 배포까지 모든 단계를 관리하는것을 목표로 한 플랫폼이다.

 

기계 학습 시스템을 개발하는 방법의 주요 구성 요소는 다음에 설명되어 있다.

Sculley 외. 2015. 기계 학습 시스템의 숨겨진 기술 부채. 신경 정보 처리 시스템에 관한 제28회 국제 회의의 절차, 2부(NIPS 2015).

 

ML 팀은 Kubeflow를 사용하여 선택한 ML 라이브러리(예: Tensorflow, PyTorch)로 ML 모델을 공동으로 구축하고 ML 파이프라인을 생성하여 데이터 변환, 모델 교육 및 프로덕션을 위한 모델 제공을 처리할 수 있다. Kubeflow는 Kubernetes 클러스터에서만 실행할 수 있으므로 Kubernetes 생태계에서 많은 기능을 활용하고 많은 기능을 컨테이너화 한다.  주요 Kubeflow 구성 요소에 대한 개요는 다음과 같다.

 

Kubeflow 노트북 : 사용자는 노트북 컨테이너를 생성할 수 있다. 브라우저에서 JupyterLab, RStudio 및 VS Code와 같은 웹 기반 개발 환경을 실행하는 컨테이너다. 이들은 ML 엔지니어링 팀이 ML 코드에 대해 협업할 수 있는 잘 알려진 도구이다.

Kubeflow Pipelines : Kubeflow에서 가장 많이 사용되는 구성 요소이다. 이를 통해 ML 프로젝트의 모든 단계 또는 기능에 대해 ML 파이프라인으로 함께 연결할 수 있는 재사용 가능한 컨테이너화된 파이프라인 구성 요소를 생성할 수 있다.  Python SDK를 사용하여 이러한 파이프라인 구성 요소를 생성할 수 있다. 또한 논리, 파이프라인 입력, 출력 및 기타 유용한 기능을 추가할 수 있다.

Katib : 이 구성 요소는 AutoML(Automated Machine Learning)에 사용되며 ML 모델 성능을 최대화하는 데 중요한 하이퍼파라미터 튜닝을 지원한다. 하이퍼파라미터는 모델의 학습 과정에서 사용되는 중요한 값으로, 이를 변경하면 모델의 성능에 영향을 미치기 때문이다.

Kserve (이전의 KFServing): Kserve는 모델 서비스에 사용된다. 모델이 구축되고 추론 준비가 되면 Kserve를 사용하여 컨테이너에서 모델 추론 서비스를 가동하고 필요한 경우 입력 변환기를 추가할 수 있다. (2021년 말에 Kserve는 독립 프로젝트가 되었으며 현재 외부 Kubeflow 애드온 이다 .)

 

이 외에도 Kubeflow와 연동되어 사용할 수 있는 add-on 솔루션들이 많이 존재한다.

 

아키텍처

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

 

머신러닝에 필요한 자세한 프로세스와 각 단계별 필요한 라이브러리 등은 다음을 참고하면 좋다.

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

 

Architecture

An overview of Kubeflow's architecture

www.kubeflow.org

 

설치

 

해당 문서는 Kubeflow v1.7.0 을 설치하기 위한 방법이다.  상세한 설치 절차도 git에 readme를 활용한다.

git clone https://github.com/kubeflow/manifests.git
cd manifests
git checkout v1.7.0

 

설치 전 kustomize를 K8S 클러스터에 설치한다.

wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.0.1/kustomize_v5.0.1_linux_amd64.tar.gz
tar xvfz kustomize_v5.0.1_linux_amd64.tar.gz
chmod +x kustomize
mv kustomize /usr/local/bin/.

 

설치는 다음과 같이 전체 설치와 부분 설치로 설치할 수 있다.

전체설치는 다음과 같다.

while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done

 

부분설치는 다음과 같다.

 

cert-manager

cert-manager는 많은 Kubeflow 구성요소에서 승인 웹후크에 대한 인증서를 제공하는 데 사용된다.

kustomize build common/cert-manager/cert-manager/base | kubectl apply -f -
kubectl wait --for=condition=ready pod -l 'app in (cert-manager,webhook)' --timeout=180s -n cert-manager
kustomize build common/cert-manager/kubeflow-issuer/base | kubectl apply -f -

 

Istio

Istio는 많은 Kubeflow 구성 요소에서 트래픽을 보호하고 네트워크 승인을 시행하며 라우팅 정책을 구현하는 데 사용된다.

kustomize build common/istio-1-16/istio-crds/base | kubectl apply -f -
kustomize build common/istio-1-16/istio-namespace/base | kubectl apply -f -
kustomize build common/istio-1-16/istio-install/base | kubectl apply -f -

 

Kserve 를 위해 cluster-local-gateway도 설치한다.

kustomize build common/istio-1-16/cluster-local-gateway/base | kubectl apply -f -

 

Dex

Dex는 여러 인증 백엔드가 있는 OIDC(OpenID Connect Identity)이다. 이 기본 설치에는 이메일이 있는 정적 사용자가 포함되어 있다. 기본값은

  • ID : user@example.com
  • Password : 12341234
kustomize build common/dex/overlays/istio | kubectl apply -f -

 

OIDC AuthService

OIDC AuthService는 OIDC 클라이언트로 작동할 수 있도록 Istio Ingress-Gateway 기능을 확장한다.

kustomize build common/oidc-authservice/base | kubectl apply -f -

 

Knative

Knative는 KServe 공식 Kubeflow 구성요소에서 사용된다.

kustomize build common/knative/knative-serving/overlays/gateways | kubectl apply -f -
kustomize build common/istio-1-16/cluster-local-gateway/base | kubectl apply -f -

 

설치 후 istio-init에서 CrashLoopBackOff 가 발생하는 경우가 있다.

knative-serving                 pod/activator-67849589d6-9rjqd                                    0/2     Init:CrashLoopBackOff   12 (5m11s ago)   41m     192.168.166.132   node1    <none>           <none>
knative-serving                 pod/autoscaler-6dbcdd95c7-cz8db                                   0/2     Init:CrashLoopBackOff   12 (4m34s ago)   41m     192.168.104.58    node2    <none>           <none>
knative-serving                 pod/controller-b9b8855b8-qtl7d                                    0/2     Init:CrashLoopBackOff   12 (4m50s ago)   41m     192.168.104.52    node2    <none>           <none>

init-container 로그를 보면 다음과 같이 에러가 보인다.

2023-02-23T08:50:07.582089Z     info    Running command: iptables-restore --noflush /tmp/iptables-rules-1677142207581865901.txt3475277532
2023-02-23T08:50:07.584538Z     error   Command error output: xtables parameter problem: iptables-restore: unable to initialize table 'nat'

Error occurred at line: 1
Try `iptables-restore -h' or 'iptables-restore --help' for more information.
2023-02-23T08:50:07.584572Z     error   Failed to execute: iptables-restore --noflush /tmp/iptables-rules-1677142207581865901.txt3475277532, exit status 2
조치
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.16.2 TARGET_ARCH=x86_64 sh -
cd istio-1.16.2
export PATH=$PWD/bin:$PATH

istioctl x uninstall --purge # 삭제
istioctl install --set profile=demo --set components.cni.enabled=true -y​

 

kubeflow namespace 생성

Kubeflow 구성요소가 상주할 네임스페이스를 생성한다. namespace이름은 kubeflow이다.

kustomize build common/kubeflow-namespace/base | kubectl apply -f -

 

kubeflow role 생성

Kubeflow ClusterRole, kubeflow-view 및 kubeflow-edit을 생성한다.

kustomize build common/kubeflow-roles/base | kubectl apply -f -

 

Kubeflow Istio Resource 생성

Kubeflow에 필요한 Istio 리소스를 생성한다.

kustomize build common/istio-1-16/kubeflow-istio-resources/base | kubectl apply -f -

 

kubeflow pipelines

kubeflow pipelines 를 설치한다.

kustomize build apps/pipeline/upstream/env/cert-manager/platform-agnostic-multi-user | kubectl apply -f -

설치 중간에 오류가 발생할 수 있따.

mutatingwebhookconfiguration.admissionregistration.k8s.io/cache-webhook-kubeflow created
resource mapping not found for name: "kubeflow-pipelines-profile-controller" namespace: "kubeflow" from "STDIN": no matches for kind "CompositeController" in version "metacontroller.k8s.io/v1alpha1"
ensure CRDs are installed first
Error from server (Invalid): error when applying patch:
{"2023/02/23 16:07:28 well-defined vars that were never replaced":"kfp-app-name,kfp-app-version","metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"2023/02/23 16:07:28 well-defined vars that were never replaced\":\"kfp-app-name,kfp-app-version\",\"apiVersion\":\"apiextensions.k8s.io/v1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"annotations\":{},\"labels\":{\"application-crd-id\":\"kubeflow-pipelines\"},\"name\":\"clusterworkflowtemplates.argoproj.io\"},\"spec\":{\"group\":\"argoproj.io\",\"names\":{\"kind\":\"ClusterWorkflowTemplate\",\"listKind\":\"ClusterWorkflowTemplateList\",\"plural\":\"clusterworkflowtemplates\",\"shortNames\":[\"clusterwftmpl\",\"cwft\"],\"singular\":\"clusterworkflowtemplate\"},\"scope\":\"Cluster\",\"versions\":[{\"name\":\"v1alpha1\",\"schema\":{\"openAPIV3Schema\":{\"properties\":{\"apiVersion\":{\"type\":\"string\"},\"kind\":{\"type\":\"string\"},\"metadata\":{\"type\":\"object\"},\"spec\":{\"type\":\"object\",\"x-kubernetes-map-type\":\"atomic\",\"x-kubernetes-preserve-unknown-fields\":true}},\"required\":[\"metadata\",\"spec\"],\"type\":\"object\"}},\"served\":true,\"storage\":true}]}}\n"},"labels":{"application-crd-id":"kubeflow-pipelines"}}}
to:
Resource: "apiextensions.k8s.io/v1, Resource=customresourcedefinitions", GroupVersionKind: "apiextensions.k8s.io/v1, Kind=CustomResourceDefinition"
...

이 에러는 의존성이 있는 리소스가 아직 배포가 안되어서 발생되는 것으로 보인다. 다시 설치를 진행하면 된다.

 

KServe

KFServing은 KServe로 리브랜딩되었다.

kustomize build contrib/kserve/kserve | kubectl apply -f -

위와 동일하게 오류가 발생할 수 있다. 오류 발생 시 다시 한번 실행한다.

모델 웹 앱을 설치한다.

kustomize build contrib/kserve/models-web-app/overlays/kubeflow | kubectl apply -f -

 

Katib

Katib 공식 Kubeflow 구성요소를 설치한다.

kustomize build apps/katib/upstream/installs/katib-with-kubeflow | kubectl apply -f -

 

Central Dashboard

kustomize build apps/centraldashboard/upstream/overlays/kserve | kubectl apply -f -

 

Admission Webhook

kustomize build apps/admission-webhook/upstream/overlays/cert-manager | kubectl apply -f -

 

Notebooks

노트북 컨트롤러 공식 Kubeflow 구성요소를 설치한다.

kustomize build apps/jupyter/notebook-controller/upstream/overlays/kubeflow | kubectl apply -f -

Jupyter Web App 공식 Kubeflow 구성요소를 설치한다.

kustomize build apps/jupyter/jupyter-web-app/upstream/overlays/istio | kubectl apply -f -

 

Profiles + KFAM

프로필 컨트롤러 및 KFAM(Kubeflow Access-Management) 공식 Kubeflow 구성요소를 설치한다.

kustomize build apps/profiles/upstream/overlays/kubeflow | kubectl apply -f -

 

Volumes Web App

kustomize build apps/volumes-web-app/upstream/overlays/istio | kubectl apply -f -

 

Tensorboards

kustomize build apps/tensorboard/tensorboards-web-app/upstream/overlays/istio | kubectl apply -f -
kustomize build apps/tensorboard/tensorboard-controller/upstream/overlays/kubeflow | kubectl apply -f -

 

Training Operator

kustomize build apps/training-operator/upstream/overlays/kubeflow | kubectl apply -f -

 

User Namespace 생성

kustomize build common/user-namespace/base | kubectl apply -f -

 

설치가 완료되었다. 전부 Running으로 올라오는데는 시간이 걸린다. 아래와 같이 Pod 상태를 체크한다.

kubectl get pods -n cert-manager
kubectl get pods -n istio-system
kubectl get pods -n auth
kubectl get pods -n knative-eventing
kubectl get pods -n knative-serving
kubectl get pods -n kubeflow
kubectl get pods -n kubeflow-user-example-com

 

Dashboard 접근

Istio-ingressgateway의 포트를 NodePort나 LoadBalancer로 변경한다.

k edit svc istio-ingressgateway -n istio-system
# k get svc -n istio-system
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                      AGE
authservice             ClusterIP   10.97.237.152    <none>        8080/TCP                                                                     26m
cluster-local-gateway   ClusterIP   10.101.206.42    <none>        15020/TCP,80/TCP                                                             26m
istio-ingressgateway    NodePort    10.100.194.192   <none>        15021:31215/TCP,80:30240/TCP,443:31577/TCP,31400:31300/TCP,15443:32551/TCP   29m
istiod                  ClusterIP   10.110.199.95    <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        29m
knative-local-gateway   ClusterIP   10.100.41.104    <none>        80/TCP                                                                       26m

반응형

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

Kubeflow - Pipeline  (0) 2023.03.26
MLFlow vs Kubeflow  (1) 2023.03.06
MLOps  (0) 2023.03.06
Model Serving  (0) 2023.02.24
Kubeflow - Notebook  (0) 2023.02.24
Comments