일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Model Serving
- Kubernetes
- opentelemetry
- CI/CD
- mlops
- argocd
- opensearch
- Kubernetes 인증
- serving
- blue/green
- MLflow
- seldon core
- Litmus
- Continuous Deployment
- nginx ingress
- 오퍼레이터
- kubernetes operator
- Kopf
- gitops
- Kubeflow
- operator
- knative
- xdp
- tekton
- eBPF
- Pulumi
- keda
- 카오스 엔지니어링
- Argo
- CANARY
- Today
- Total
Kubernetes 이야기
Kubeflow를 사용한 MLOps 본문
Kubeflow는 Kubernetes에서 기계 학습(ML) 워크플로에 필요한 학습부터 배포까지 모든 단계를 관리하는것을 목표로 한 플랫폼이다.
기계 학습 시스템을 개발하는 방법의 주요 구성 요소는 다음에 설명되어 있다.
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/
설치
해당 문서는 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 |