Kubeflow 페이지에서 네비게이션 바 - Notebook Servers를 클릭합니다.
+NEW SERVER를 클릭합니다.
노트북 name을 입력하고 Image를 지정해줍니다.
- GPU를 사용할 예정이 아니라면 이미지 중 CPU만 지원하는 이미지를 선택하시면 됩니다!
- kubeflow는 커스텀 이미지와 스탠다드 이미지를 지원합니다.
노트북이 사용할 CPU, MEMORY를 입력합니다.
- 소수점 이하의 값을 입력할 수 있으며 메모리는 Gi 단위입니다.
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
쿠베플로우에서 제공하는 이미지 대신 사용자가 이미지를 생성할 수 있습니다. 곧 사용할 쿠버플로우의 페어링과 파이프라인 라이브러리까지 포함한 이미지를 만들어 봅시다.
물론 주피터 노트북이 실행되는 이미지여야 하니까 노트북 실행시 포함되어야 하는 것부터 시작합시다.
웹에서 사용하는 터미널에서는 Ctrl+L(clear)가 안먹히네요. 터미널을 정리해야하면 clear를 입력해줍시다.
각 항목이 조합된 명령은 아래에 있습니다.
--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
쿠버플로우 노트북 컨트롤러는 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
-> 코드 복붙
저는 노드 그룹이 2개이기 때문에(마스터1 + 워커1) 파드 생성에 제한이 있었습니다.
알고보니 제가 지금 진행하는 프로젝트는 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 서비스제한이 있을 수 있습니다.
$ 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
kubectl get storageclass
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
kubectl get pod -n kube-system