Kubeflow , Kubernetes

Kubeflow 사용법에 대한 내가 보기 위한 정리

슬리퍼는 맨발에 2023. 7. 16. 13:38

 

이게 중간 과정을 그때그때 올려야 하는데, 너무 띄엄띄엄 올려서 마지막으로 올렸던 내용이랑 지금 내가 진행하는 거랑 거리감이 너무 커져버렸다.

(그 동안 Jira에 2명이 추가로 합류하게 되고, 처음부터 가르쳐 줘야 하는 친구들도 있고, 개인프로젝트 방향성 전환, 해야하는 작업의 난이도 상승으로 블로그 글 쓰는게 가장 뒤로 밀려나버렸다...)

 

지금 현황을 먼저 이야기 하면,

 

Terraform으로 인프라를 만들었고, Kubernetes를 직접 master, worker 설치 스크립트를 짰다가, kubernetes의 cloud native함에 정신을 못차리고 EKS로 도망왔다.

 

이 위에 뭘 올릴까 정말 열심히 고민해 보다가

(웹서버나, 그라파나를 올려서 내가 일하는 거의 연장선을 갈 수 도 있고, k8s에는 올릴 수 있는 소프트웨어가 정말 많으니까.)

 

Kubeflow를 올리고 mlops 공부를 하기로 결정했다.

 

kubeflow 올리는 과정도 참 험난 했었는데

돈 아끼려고 spot instance 올렸다가 spot instance 관련 에러가 터져서 2개 생성하라고 한 인스턴스가 8개까지 늘어나고

(내돈...)

 

kubeflow에 ec2 m5.large 타입 (2core 8GB) 2개 를 사용했더니 kubeflow 설치만 되고 리소스가 모자라서 jupyter가 실행이 안되고...

 

 

 

# Terraform : 인프라 생성

# Kubernetes : EKS로 생성 및 secondary cidr로 pod network 분리, controller들 설치 script

# Kubeflow : script로 설치, t3a.xlarge * 2개로 구성 (리소스 필요하면 terraform 쓰니까 간단히 scale-out 할 수 있음)

 

 

현재 내 목표는 :

Kaggle 등에서 100GB 이상 되는 사이즈의 데이터를 

Spark 로 처리하여 cloud storage에 저장후

TFJob으로 학습 후,

Model Deployment를 하는 과정을

 

KubeFlow를 통해 pipeline으로 만드는 것이다.

 

 

아무튼 지금은 kubeflow 사용법을 익히고 있다.

 

https://www.amazon.com/Kubeflow-Machine-Learning-Lab-Production/dp/1492050121

 

Amazon.com

Enter the characters you see below Sorry, we just need to make sure you're not a robot. For best results, please make sure your browser is accepting cookies.

www.amazon.com

Kubeflow for Machine Learning From Lab to Production 라는 책을 읽고 있는데 문제는 책에서 코드를 쓰다가 말은 부분이 많아서, 어떻게 사용하는지에 대한 이해를 하기가 너무 어려웠다는 점이다.

 

딴소리가 이만큼 길었고 아무튼 kubeflow 사용법을 조사하면서 알게 된 것들을 아래에 기록해 두겠다.

(사실 jira에 올린거 복붙한거다.)

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

그 동안 조사하면서 모인 정보 정리해서 올린다.

항목은 3종류이다.

1. Spark on Kubeflow [데이터 전처리]
2. Tensorflow on Kubeflow [학습]
3. Minio on kubeflow [1,2 과정에서의 데이터 저장]

 

1.spark on kubeflow [전처리]

어떻게 pipeline에 spark 코드를 넣는 건지 책에는 설명히 안나와있어서 찾기 너무 힘들었는데 아래 블로그가 정말 크게 도움이 되었다.

Orchestrating Spark Jobs with Kubeflow for ML Workflows 

https://sbakiu.medium.com/orchestrating-spark-jobs-with-kubeflow-for-ml-workflows-830f802a99fe

 

Orchestrating Spark Jobs with Kubeflow for ML Workflows

Using Kubeflow Pipelines to submit Spark Jobs to a Kubernetes cluster

sbakiu.medium.com

 

 

처음엔 kubeflow 안에 spark가 설치되어 있는 건 줄 알고 설렜는데, 전혀 아니었다. 기본적으로 Kubernetes용 Spark를 설치한 후

1-1. Spark Driver를 이용해 Kubeflow의 Jupyter에 연결해서 쓴다. 연결만 되면 그 이후는 EMR 클러스터를 쓸 때와 유사할 것으로 보인다.

1-2. Spark Job을 Yaml 파일로 짜면 거기에 job 목록에 .scala나 .py 파일을 넣을 수 있는 부분이 있다. 이 상태로 그냥 kubectl apply -f 를 하면 kubeflow와는 상관없이 kubernetes 가 사용해서 spark가 돌아간다.

1-3. 1-2를 만들고 난 후 kubeflow에서 yaml파일을 (spark-apply-component.yaml) 을 load_component_from_file로 읽어 들이면 jupyter에서 pipeline을 만들 수 잇다.

이렇게 처리가 끝난 데이터를 s3에 넣어둘 수도, pv에 넣어 둘 수 도 있다. 3. minio를 통해서.
 


2.tensorflow on kubeflow

이거도 알기 힘들었지만 책에 있는 정도면 충분한거 같다.

2-1. jupyter를 만들때, cpu, gpu를 크게 할당하고 Jupyter에서 학습을 돌린다. jupyter hub이기 때문에 여러 클러스터에서 학습이 된다고 이해했지만 확실하지는 않다.

2-2. Tensorflow Job을 만든다. jupyter에서 학습하는건 결국 사람이 손으로 일일이 실행시켜야 한다.

예를 들어 새 데이터가 들어올때 마다 지속적으로 학습을 시켜야 하거나, 특정 하드웨어 안에서만 돌려야 하거나, 하면 학습을 pipeline을 통해 진행하는 수요가 생길 수 있다.
GPU, CPU를 각각 어느 정도 써야 하는지, 메모리는 어느정도를 써야 하는지 등등을 정 할 수 도 있다.
TFJob의 yaml 파일을 만들고 kubectl apply  -f 를 하면 끝난다. 책에서는 여기에 command로 컨테이너 안에 미리 넣은 학습 코드.py를 실행시켰다. 코드를 어떻게 넣었는지는 전혀 설명이 없기 때문에
코드는 컨테이너 만들때 넣어놓던지 (dockerfile에 COPY ./ /workdir / 같이 코드를 복사해 넣던가)
container 생성할때 넣을 PV에 넣어 두던지
CI/CD 툴로 해결하던지 해야 될 거 같다.

 

2-3. 2-2의 작업을 single node가 아니라 분산 딥러닝으로 돌리도록 설정 할 수 있다. Tensorflow에서 지원하는 Mirrored Strategy를 써서 all-reduce나, ring all-reduce 같은 걸 쓸 수 도 있을 거고, 유명한 기법인 Parameter server를 쓸 수 도 있다. (Yaml 파일에 PS 부분이 있다.)

다만 실행하기 전에 꼭 해당 구현물의 논문을 읽고 실행하길 바란다.

예를 들면 Parameter Server는 worker의 숫자가 상승할 때 마다 속도의 증가량이 log 함수처럼 점점 줄어들어 scale out의 한계가 있다는 논문을 읽은 적이 있었다. (지금은 개선됐는진 모르겠다.) => 이렇게 되면 통상적으로 쿠버네티스 컨테이너를 다루듯이 최대한 작은 컨테이너를 구성하는 것이 악영향을 줄 수가 있다.

 

2-4. TFJob 을 pipeline으로.

책에서는 코드를 Dockerfile로 containerize 시켜서 (코드도 넣고, command에 python -m trainer.task --batch_size=32 – training_steps=1000) dsl.ContainerOp를 사용해서 pipeline으로 만들라고 적혀 있다.

TensorFlow Training (TFJob) 

https://www.kubeflow.org/docs/components/training/tftraining/

 

TensorFlow Training (TFJob)

Using TFJob to train a model with TensorFlow

www.kubeflow.org

 

공식 홈페이지 가면 training operator의 설치가 있음 (근데 기본 설치에 이미 들어가 있을껄?)

근데 공홈에는 jupyter를 통해 pipeline을 만드는 부분은 없어보인다.

  


How to define component/step using training operators such as TFJob in kubeflow pipeline 

https://stackoverflow.com/questions/71585082/how-to-define-component-step-using-training-operators-such-as-tfjob-in-kubeflow

 

How to define component/step using training operators such as TFJob in kubeflow pipeline

I know there is a way to use tfjob operator via kubectl, like the example at here (https://www.kubeflow.org/docs/components/training/tftraining/): kubectl create -f https://raw.githubusercontent.com/

stackoverflow.com

 



들어가면 있는 링크를 보는데 container를 불러와서 chief로 설정 부분만 집어 넣는 식이라는 거 같은데?

일단은… 제일 쉬운건 코드를 짜서 containerize하고 jupyter에서 쓰는 거 일거 같다.

 

3. minio on kubeflow

이거 때문에 참 멘탈이 많이 터졌었다.

 

기본적으로 kubeflow가 스토리지에 접근하는 방법은

- object storage에 직접 접근 s3(boto3), GCS
- minio를 통해 접근 (s3, GCS, pv 등)

 

3-1. MinIO pv

kubernetes의 cloud native 함 덕분에 각 pod에서 storage를 떼었다 붙였다 할 수 있다.

이걸 pipeline에 적용해서 task 1에 pv를 하나 붙이고, task1이 끝나면 task2에 해당 pv를 붙이라고 하면, aws console에 볼륨 부분에 pv가 하나 생겼다가 => task1 종료시 떨어져나가고(사용중 → 사용가능) 잠시후 task2에 붙는걸 볼 수 있다.

 

3-2. minio object storage

kubeflow 아티팩트 저장소 minio, s3 자유자재로 변경해서 사용하기 

https://velog.io/@moey920/kubeflow-%EC%95%84%ED%8B%B0%ED%8C%A9%ED%8A%B8-%EC%A0%80%EC%9E%A5%EC%86%8C-minio-s3-%EC%9E%90%EC%9C%A0%EC%9E%90%EC%9E%AC%EB%A1%9C-%EB%B3%80%EA%B2%BD%ED%95%B4%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

kubeflow 아티팩트 저장소 minio, s3 자유자재로 변경해서 사용하기

kubeflow pipeline을 구축하다보면 전처리가 되지 않은 원시 데이터 파일을 어딘가에서 받아오거나,원시 데이터 파일을 전처리 후 어딘가에 저장한 후, 훈련에 사용하기 위해 해당 파일을 다시 불러

velog.io

상당히 잘 정리 해둔 블로그다. (어짜피 검색해도 여기 밖에 안나오고…)

s3 secret을 생성해 둔 뒤
minio → s3 의 과정을 거쳐 사용

s3를 바로 연결해서 사용 하는법이 정리되어 있다.

 

공식 홈페이지 설명
Pipeline Root 

https://www.kubeflow.org/docs/components/pipelines/v1/overview/pipeline-root/

 

Pipeline Root

Getting started with Kubeflow Pipelines pipeline root

www.kubeflow.org

 


이건 아예 pipeline의 root를 object storage로 바꿔버리는 설정이라 pv, object storage를 그때그때 필요에 따라 쓰기에는 좋지 않아 보인다.

 

3-3. object storage를 그냥 평소에 쓰던 방식으로 사용.

사실 minio  써본적 없으면 이게 제일 쉽긴 하다. minio를 쓰는 이유 중 특정 벤더사에 종속되지 않은 코드를 쓸 수 있다가 장점으로 나와있는데, 인터넷에 파이프라인을 공유하거나, 멀티 클라우드 환경을 쓰지 않는 이상, 벤더사에 독립된 코드를 쓰는거보다 종속된 코드를 쓰는게 더 쉽긴 하다.

 

어떤 방식을 쓸진 자유기 때문에 나도 지금부터 어떤 선택지를 어떻게 조합하냐를 계속 고민해봐야 할 것 같다.