Kubeflow 노트북 생성, 이용하기

노하람·2021년 11월 18일
1

노트북 생성

  • Kubeflow 페이지에서 네비게이션 바 - Notebook Servers를 클릭합니다.

  • +NEW SERVER를 클릭합니다.

  • 노트북 name을 입력하고 Image를 지정해줍니다.
    - GPU를 사용할 예정이 아니라면 이미지 중 CPU만 지원하는 이미지를 선택하시면 됩니다!
    - kubeflow는 커스텀 이미지와 스탠다드 이미지를 지원합니다.

    • 스탠다드 이미지는 텐서플로우와 kubectl, gcp 관련 라이브러리, 쿠버플로우 라이브러리 등이 포함되어 있는 도커 이미지입니다. kubeflow 1.2버전에서는 tensorflow 1.15.2/2.1.0 버전을 지원하네요.
    • 커스텀 이미지는 사용자가 만든 이미지 입니다. 이미지를 만드려면 제공된 가이드대로 만들어야 합니다. 생성하는 방법은 다음에 포스팅할게요!
  • 노트북이 사용할 CPU, MEMORY를 입력합니다.
    - 소수점 이하의 값을 입력할 수 있으며 메모리는 Gi 단위입니다.

    • 노트북 상에서는 현재 리소스를 확인하기 어렵기 때문에 k8s 클러스터에서 현재 가용한 리소스를 확인해야 합니다.
    • kubectl get nodes "-o=custom-columns=NAME:.metadata.name, CPU:.status.allocatable.cpu, MEMORY:.status.allocatable.memory"
  • 워크스페이스 볼륨, 데이터 볼륨을 입력합니다.
    - 쥬피터 노트북에서 사용할 볼륨(PV)을 만듭니다. 사용자의 홈을 PV로 쓸건지 정할 수 있으며, 데이터 셋을 위한 볼륨도 별도로 제공합니다. 앞서 노트북 이름과 마찬가지로 볼륨명은 쿠버네티스 볼륨 네이밍 룰과 동일합니다. 유저 홈의 볼륨 이름은 workspace-{notebook-name} 형태가 기본 값입니다.

    • 볼륨명의 규칙은 소문자 알파벳, -, . 만 사용할 수 있으며, 반드시 첫글자와 마지막 글자는 영문이어야 합니다. 체크 정규식은 '[a-z0-9]([-a-z0-9]*[a-z0-9])?(₩.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*' 입니다.
    • 볼륨은 이미 만들어져 있는 것도 사용 가능하며, 신규 볼륨도 생성이 가능합니다.
  • (옵션) 추가 설정을 입력합니다.
    - 별도의 환경변수나 시크릿 같은 값들을 별도로 정의할 떄 사용합니다. 이 값은 PodDefault 라는 커스텀 리소스로 설정이 가능합니다.

  • 생성이 완료되면 이름 옆에 녹색 체크로 바뀝니다. CONNECT 버튼을 눌러서 노트북에 접속합니다.

쿠버네티스 리소스 확인하기

쥬피터 노트북은 쿠버네티스의 리소스를 사용할 수 있습니다.
노트북 터미널 창에서 kubectl get pods -A을 실행하면 현재 네임스페이스 생성되어 있는 파드의 리스트를 확인할 수 있습니다.

  • 파드에 접속하셔도 될 것 같고, 아니면 저처럼 Lancher - Other - Terminal로 GUI로 접속하셔도 됩니다.

  • 권한이 없는 다른 네임스페이스의 리소스를 확인할 수는 없습니다.

  • 노트북을 사용하기 위해 생성된 권한은 네임스페이스 내에서 아래와 같은 k8s 리소스를 사용할 수 있습니다.
    - pod

    • deployment
    • service
    • jobs
    • TFjobs
    • PyTorchJobs
    • 이 외의 리소스는 관리 권한이 없습니다.

커스텀 이미지 생성

  • 이 과정을 진행할 때 아까 노트북 생성시 마운트한 /home/jovyan 과 관련하여 쿠브플로우에 접속한 아이디와 사용자 jovyan이 달라 권한이 없다는 오류가 계속 발생합니다.
    다만 언제 만들었는지 모를 Volumes-dshm으로 노트북을 연결하면 정상적으로 파일 생성이 되더군요. 일단 진행해보고 해결방법을 알게되면 수정하겠습니다.

쿠베플로우에서 제공하는 이미지 대신 사용자가 이미지를 생성할 수 있습니다. 곧 사용할 쿠버플로우의 페어링과 파이프라인 라이브러리까지 포함한 이미지를 만들어 봅시다.
물론 주피터 노트북이 실행되는 이미지여야 하니까 노트북 실행시 포함되어야 하는 것부터 시작합시다.
웹에서 사용하는 터미널에서는 Ctrl+L(clear)가 안먹히네요. 터미널을 정리해야하면 clear를 입력해줍시다.

주피터 노트북 구성 항목

각 항목이 조합된 명령은 아래에 있습니다.

  • 작업 디렉토리 설정 : --notebook-dir=/home/jovyan
  • 쥬피터 노트북이 모든 아이피에 대응하도록 설정 : --ip=0.0.0.0
  • 쥬피터 노트북을 사용자가 루트권한으로 사용 : --allow-root
  • 포트 번호 설정 : --port=8888
  • 인증 해제 : --NotebookApp.token='' --NotebookApp.password=''
  • Allow origin : --NotebookApp.allow_origin='*'
  • base URL 설정 : --NotebookApp.base_url=NB_PREFIX

쿠버플로우 노트북 컨트롤러는 NB_PREFIX라는 환경변수로 base URL을 관리합니다. 이 변수는 필히 설정되어야 합니다.

해당 항목들을 조합한 예는 아래와 같습니다.

ENV NB_PREFIX /

CMD ["sh", "-c", "jupyter notebook --notebook-dir=/home/jovyan --ip=0.0.0.0 --allow-root --port=8888 --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.allow_origin='*' --NotebookApp.base_url=${NB_PREFIX}"]

여기서는 쥬피터 랩 이미지를 쿠버플로우 쥬피터 노트북용으로 만들어 보겠습니다.

EKS 클러스터 노드 안에 도커를 어떻게 설치해야 하나 한참을 찾아봤는데..
알고보니 이미 Docker가 설치되어 있더라구요.
심지어 kubernetes 1.2 버전부터는 docker에 대한 사용은 가능하지만 지원은 끊기고, containerd가 공식적으로 지원된다고 합니다.
도커가 정상적으로 구동하는지 확인해봅시다.
docker version

아래는 쥬피터 랩 기본 이미지의 Dockerfile입니다.
코드는 여기서 확인 가능합니다.
cpu 기준의 도커파일이니 gpu를 사용하실 분은 링크에서 gpu 도커파일을 찾아주세요.

FROM tensorflow/tensorflow:2.0.0-py3

WORKDIR /home/jovyan

USER root

RUN pip install jupyter -U && pip install jupyterlab

RUN apt-get update && apt-get install -yq --no-install-recommends \
  apt-transport-https \
  build-essential \
  bzip2 \
  ca-certificates \
  curl \
  g++ \
  git \
  gnupg \
  graphviz \
  locales \
  lsb-release \
  openssh-client \
  sudo \
  unzip \
  vim \
  wget \
  zip \
  emacs \
  python3-pip \
  python3-dev \
  python3-setuptools \
  && apt-get clean && \
  rm -rf /var/lib/apt/lists/*

RUN curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
RUN echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
RUN apt-get update
RUN apt-get install -y kubectl
RUN pip install kubeflow-fairing==0.7.2
RUN pip install kfp==0.5 
RUN pip install kfserving==0.2.2
RUN pip install kubeflow-kale
RUN pip install dill
RUN pip install kubeflow-katib==0.0.2


RUN pip install jupyterlab && \
    jupyter serverextension enable --py jupyterlab --sys-prefix

ARG NB_USER=jovyan

EXPOSE 8888


ENV NB_USER $NB_USER
ENV NB_UID=1000
ENV HOME /home/$NB_USER
ENV NB_PREFIX /

CMD ["sh", "-c", "jupyter lab --notebook-dir=/home/jovyan --ip=0.0.0.0 --no-browser --allow-root --port=8888 --LabApp.token='' --LabApp.password='' --LabApp.allow_origin='*' --LabApp.base_url=${NB_PREFIX}"]

해당 코드를 기반을 기반으로 Dockerfile을 만들어줍니다.
vim Dockerfile -> 코드 복붙


이슈

파드 생성 제한(Pending)

저는 노드 그룹이 2개이기 때문에(마스터1 + 워커1) 파드 생성에 제한이 있었습니다.

  • AWS EC2 사양에 따른 Pod 생성 제한 개수 확인 : https://github.com/awslabs/amazon-eks-ami/blob/master/files/eni-max-pods.txt
    - 저는 m5.xlarge 서버를 2개 이용하고 있기 때문에 총 118개의 pod을 생성할 수 있을텐데 이상하네요. 다른 문제인가 봅니다.
    • Pod 생성 제한 개수로 인한 오류가 확실하다면(제한 pod 개수를 꽉 채웠다면) 노드를 추가해야 합니다. 아니면 기존에 존재하는 파드를 삭제하셔야 합니다.

노드에 GPU가 없음

  • 알고보니 제가 지금 진행하는 프로젝트는 GPU를 사용하지 않습니다 ㅎㅎ.. GPU를 사용하는 걸로 생성한 노트북은 삭제하고 CPU로 진행하겠습니다. GPU 사용이 필요하신 분은 이 링크를 이용해주세요!

  • 제한 사항
    - 노드에서 사용 가능한 GPU 수 : kubectl get nodes "-o=custom-columns=NAME:.metadata.name, GPU:.status.allocatable.nvidia.com/gpu"
    - GPU를 오버 프로비저닝 할 수 없습니다. 컨테이너와 포드는 GPU를 공유 할 수 없습니다.
    - 포드에 스케줄링 할 수 GPU의 최대 수는 포드의 노드에서 사용 가능한 GPU의 수에 따라 제한됩니다.
    - 계정에 따라 동시에 실행할 수 있는 Amazon EC2 GPU 컴퓨팅 인스턴스 수와 유형에 대한 Amazon EC2 서비스제한이 있을 수 있습니다.

  1. 컨테이너 런타임으로 사용할 도커를 설치합니다.(Terminal에서 진행하시면 됩니다.)
    • 사용할 도커 버전은 docker-ce 18.09입니다.
    • sudo 명령에 문제가 있으면(jovyan 계정) 아래 이슈 목록을 참고하여 해결합니다.
$ sudo apt-get update
### docker-ce install , 18.09 https://docs.docker.com/install/linux/docker-ce/ubuntu/
$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install -y docker-ce=5:18.09.9~3-0~ubuntu-bionic docker-ce-cli=5:18.09.9~3-0~ubuntu-bionic containerd.io vim

$ sudo su
$ cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
$ mkdir -p /etc/systemd/system/docker.service.d
$ systemctl daemon-reload
$ systemctl restart docker
$ exit
  1. storageclass를 확인해봅니다. 여기선 2개의 스토리지 클래스가 조회되고 gp2가 default로 설정되어 있습니다.(정상 설치되어 있음)
    • storageclass를 생성하는 것은 따로 포스팅하지 않겠습니다.
    • kubectl get storageclass
  2. GPU 리소스를 사용하기 위한 nvidia-gpu-plugin을 설치합니다.
    • 물론 각 노드들마다 nvidia-docker가 설치되어 있어야 정상 작동되며, 도커 데몬 설정에 nvidia가 기본 런타임으로 잡혀있어야 합니다.
    • kubeflow 설치 시 자동으로 설치되니 파드가 있는지 확인해봅시다. 설치가 안되어 있다면 다음 명령으로 설치합니다. kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
    • nvidia-gpu-plugin 확인 : kubectl get pod -n kube-system
  3. 여기까지 진행하고, GPU를 사용하지 않는 프로젝트를 진행중이라 넘어가겠습니다. 위에 올려둔 링크를 이용해서 docker, nvidia-docker를 설정해주시면 되겠습니다.
profile
MLOps, MLE 직무로 일하고 있습니다😍

0개의 댓글