IT_Study/Ops

[MLOps] Kubeflow Notebook 핸들링 방법, custom notebook 생성

__Vivacé__ 2023. 11. 2. 17:47

Kubeflow Notebook

Kubeflow Notebook은 k8s cluster 내에 pod를 생성해 웹 기반 개발 환경을 제공하고 있다.

 

Notebook 생성 시 화면 일부

1. 제공 환경

 크게 JupyterLab, Code server, Rstudio 3가지 환경을 제공하고 있다.

 ※ 노트북 생성 시 namespace의 resource에 접근 가능하도록 권한이 부여되기 때문에, kubectl을 이용해서 namespace의 내부 자원을 관리할 수 있음 ->  Notebook을 이용해 다른 componenet의 resource를 생성 가능

ex) Notebook에서 model serving이 가능, Notebook에서 pipeline 생성이 가능

 

2. Docker Image

Notebook은 container image를 미리 생성한 후, 이를 호출하는 방식으로 생성되고 있다.

Docker Image는 크게 custom imagestandard image 2가지로 나뉘게 된다.

 - Custom image : registry/image:tag 방식으로 custom image를 호출하고,
 - Standard image : 기본적으로 kubeflow에서 제공된 이미지를 호출하는 방식

 

standard image 종류 / v1.6.0은 kubeflow version을 의미

-full과 -cuda-full의 차이점은,

cuda가 있다면 GPU를 사용한다는 것이고, cuda가 없다면 CPU를 사용한다는 것이다.

 

3. CPU / GPU 할당

 

CPU는 소수점 단위로 할당 가능하고, GPU는 정수 단위(1, 2, 4, 8)로 할당 가능하다.

 

얼마나 할당할 지는 본인의 할당 가능한 자원을 살펴보면 된다.

할당을 잘 못할 경우, 0/[n] nodes available: insufficient [resource] 와 같은 오류를 볼 수 있다.

# node의 자원 사용 정보를 확인할 수 있다.
$ kubectl describe nodes

위의 명령어를 통해 현재 요청한 CPU 양과, 제한된 CPU를 알 수 있다. / Core 1개는 1000m을 의미한다.

 

다른 곳에서 GPU 등 자원을 사용하고 있다면, GPU가 할당이 되지 않음을 기억할 것

 

4. Volume

 

Workspace Volume의 경우, Notebook은 기본적으로 PV가 생성된다.

Data Volume에서 [Attach existing volume] 을 통해 기존에 만들어두었던 PV를 bounding시킬 수 있다.

 

 

Mount path는 Notebook에 mount될 volume의 위치를 나타내고 있다.

 

# 원하는 namespace에 있는 pod 확인
$ kubectl get pod -n {namespace}

# 원하는 pod의 정보 확인
$ kubectl describe pod -n {namespace} {pod name}

get pod 명령어 실행 시 나타나는 화면

 

 

Notebook 생성 후 Volume의 status를 보면,

workspace의 volume이 pending 상태에서 binding 상태로 바뀐 것을 확인할 수 있다.

 

 

 본인은 testcpu에서 workspace volume을 mount했는데, testcpu notebook으로 connect 시 다음과 같이 vol-1이 존재하는 것을 볼 수 있다.

 

 

vol-1 폴더 안에 test.txt 파일을 만들고, local path의 mount된 위치를 확인해보자

$ cd /opt/local-path-provisioner/
$ ls

 

내가 데이터를 저장했던 경로(workspace)로 들어가면, test.txt가 있는 걸 확인할 수 있다.

 


Custom Notebook으로 sudo 권한 부여받기

JupyterLab에서 terminal에 들어가서 "sudo" 명령어를 쳐보면, command not found 에러 메세지가 출력된다.

그렇기 때문에 사용 중에 package를 설치하는 게 좀 어렵다.

 

따라서, custom notebook을 만들어서 jovyan 사용자를 sudo group에 추가하는 방법을 해보도록 한다.

 

Kubeflow notebook의 Image Dependency Chart

 

Custom하게 Jupyter Tensorflow notebook 만들기

다음 Dockerfile을 작성하여 진행한다.

FROM kubeflownotebookswg/jupyter-tensorflow-cuda-full:v1.6.0

USER root 

# Nvidia GPG Public Key 교체
RUN rm /etc/apt/sources.list.d/cuda.list \
  && rm /etc/apt/sources.list.d/nvidia-ml.list

# jovyan 사용자를 sudo group에 추가하는 코드
RUN apt-get update && apt-get install -y --no-install-recommends \
	  sudo \
	  apt-utils \
  && usermod -aG sudo ${NB_USER} \
  && echo ${NB_USER}:${NB_USER} | chpasswd \
  && echo "${NB_USER} ALL=(root) NOPASSWD:SETENV: /init" >> /etc/sudoers

# install - requirements.txt
# COPY requirements.txt requirements.txt
# RUN pip3 install -r requirements.txt

# 사용자를 jovyan으로 교체
USER jovyan
# Dockerfile 기반으로 이름과 태그를 붙여 도커 이미지 빌드 진행
$ docker build -t lg960214/jupyter_nb_gpu:1.6.0 .

 

 

이후 build 작업이 끝나면, notebook을 custom image로 생성해주고, data volume을 workspace로 설정한다.

GPU는 이전에 실행시킨 testgpu를 중지시켜야 Runnung state로 변경이 된다.

 

이후 custom notebook에 들어가 다음 명령어를 실행하면(비밀번호 jovyan), sudo를 쓸 수 있을 것이다.

sudo를 사용할 수 있고, volume에 접근도 가능하다

 

현재 v1.6.0 버전인데, v1.5.0 버전을 깔아서 했는데 다행히 잘 되는 듯 하다.

 

그러나 custom image를 생성할 시 주의사항이 있으므로(kubeflow 깃허브 참고), 잘 확인해야 할 것이다.