카카오클라우드 - 쿠버네티스 클러스터에 NVIDIA GPU 워크노드 사용
1
Kubernetes Engine으로 쿠버네티스 클러스터 구축
https://docs.kakaocloud.com/tutorial/kubernetes/k8s-engine-k8s-cluster
명령 내릴 centos vm 1개 생성 - kubeconfig 다운로드.
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
yum install wget
wget https://docs.kakaocloud.com/service/container-pack/k8se/how-to-guides/k8se-kubectl#%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%9D%B8%EC%A6%9D-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%84%A4%EC%A0%95
파일 이름을 kic-iam-auth로 이름 변경
vi kubeconfig-dgame-dev-cl.yaml
# add
users:
- name: tutorial-admin
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
args: null
command: kic-iam-auth
env:
- name: "OS_AUTH_URL"
value: "https://iam.kakaoi.io/identity/v3"
- name: "OS_AUTH_TYPE"
value: "v3applicationcredential"
- name: "OS_APPLICATION_CREDENTIAL_ID"
value: "7b363a0670c1d40"
- name: "OS_APPLICATION_CREDENTIAL_SECRET"
value: "DQsFLQzxlaXX0xLRcz-vJDbN4V6x9DBVBmt1dg"
- name: "OS_REGION_NAME"
value: "kr-central-2"
access-key, secret-key 입력
export KUBE_CONFIG="kubeconfig-dgame-dev-cl.yaml"
kubectl --kubeconfig=$KUBE_CONFIG get nodes
alias kubectl='kubectl --kubeconfig=$KUBE_CONFIG'
source ~/.bash_profile
kubectl get nodes
2
쿠버네티스 엔진 클러스터에 NVDIA GPU 노드 풀 생성하자.
https://docs.kakaocloud.com/tutorial/gpu/k8se-nvidia-gpu-worknode
kr-central-2
Kubernetes Engine
노드풀 > 노드풀 만들기
nvdia-node1
p2i.6xlarge
disk 100
Quantity 1
3
GPU 노드를 생성할 시, 단일 GPU 인스턴스로 생성되도록 사용자 스크립트에 해당 코드를 작성
sudo nvidia-smi -mig 0
nvidia-k8se-device-plugin은 클러스터 내 GPU를 자동으로 노출하고 관리, 실행 등에 필요한 기능을 제공합니다.
노드풀을 통해 GPU 워크노드를 생성하면, GPU 자원을 사용하기 위해 필요한 Driver, Container Runtime 등의 환경 구축을 기본으로 제공합니다.
1
GPU를 쿠버네티스 클러스터에 노출하기 위해 Helm을 이용하여 nvidia-k8se-device-plugin을 구성요소에 추가합니다.
helm repo add nvdp https://nvidia.github.io/k8se-device-plugin
Error: looks like "https://nvidia.github.io/k8se-device-plugin" is not a valid chart repository or cannot be reached: failed to fetch https://nvidia.github.io/k8se-device-plugin/index.yaml : 404 Not Found
# 변경됨
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
helm search repo nvdp --devel
NAME CHART VERSION APP VERSION DESCRIPTION
nvdp/nvidia-device-plugin 0.14.4 0.14.4 A Helm chart for the nvidia-device-plugin on Ku...
helm upgrade -i nvdp nvdp/nvidia-device-plugin --namespace nvidia-device-plugin --create-namespace --version 0.14.4
Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp [::1]:8080: connect: connection refused
설치 참고
https://github.com/NVIDIA/k8s-device-plugin
2
nvidia-k8se-device-plugin이 클러스터에 추가되었는지 확인
kubectl get all -A | grep nvidia
3
아래 명령어로 노드 자원의 상세 정보를 출력해, 자원 용량에 GPU가 추가된 것을 확인합니다
4
쿠버네티스 클러스터에 GPU 테스트용 파드를 추가
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: gpu-test
spec:
restartPolicy: OnFailure
containers:
- name: cuda-vector-add
image: "nvidia/samples:vectoradd-cuda10.2"
resources:
limits:
nvidia.com/gpu: 1
EOF
5
kubectl get pod/gpu-test
6
kubectl logs gpu-test
7
kubectl delete pod/gpu-test
새로운 클러스터를 생성하거나 기존에 존재하는 클러스터에 GPU 노드풀을 생성합니다.
여기선 노드풀 추가해보자.
1
콘솔
2
Kubernetes Engine > 클러스터 목록에서 작업을 진행할 클러스터 혹은 [클러스터 만들기] 버튼을 클릭
노드 풀 설정
GPU
p2i.6xlarge
quantity 1
vcpu 24
ram 192
disk 100
3
GPU 노드를 생성할 시, 노드 프로비저닝 단계에서 MIG를 허용하고 GPU 자원을 MIG로 분리하는 스크립트를 작성합니다.
GPU를 7개의 인스턴스로 분리하고 GPU 컨테이너 런타임 설정을 진행합니다.
sudo nvidia-smi -mig 1
sudo nvidia-smi mig -cgi 19,19,19,19,19,19,19 -C
4
노드풀을 생성합니다.
MIG가 설정된 GPU 노드가 클러스터에 생성되었습니다.
1
GPU 노드를 K8s 클러스터에 노출하기 위해 Helm을 이용하여 nvidia-k8s-device-plugin을 k8s 구성요소에 추가합니다.
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
2
커맨드에서 설정 flag로 migStrategy를 사용할 수 있습니다.
MIG 자원을 클러스터에서 사용할 수 있습니다.
더 많은 정보가 필요하다면 NVIDIA/k8s-device-plugin Github을 참고하시기 바랍니다.
https://github.com/NVIDIA/k8s-device-plugin
helm install \
--version=0.12.3 \
--namespace nvidia-device-plugin \
--create-namespace \
--set compatWithCPUManager=true \
--set migStrategy=mixed \
--generate-name \
nvdp/nvidia-device-plugin
3
Helm 커맨드를 실행하면 nvidia-k8se-device-plugin Pod가 gpu worknode에 올라가고 GPU를 클러스터에 노출합니다. 아래 명령어로 노드 자원의 상세 정보를 출력해 자원 용량에 mig 7개가 추가된 것을 확인합니다.
kubectl describe nodes | grep nvidia
4
현재 작업을 수행 중인 GPU 정보를 출력하는 명령어로, 워크로드 여러 개를 클러스터에 올립니다.
클러스터 자원의 스케줄링을 확인합니다.
for i in $(seq 7); do
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: mig-example-${i}
spec:
restartPolicy: Never
containers:
- name: cuda-container
image: nvidia/cuda:11.2.2-base-ubuntu20.04
command: ["nvidia-smi"]
args: ["-L"]
resources:
limits:
nvidia.com/mig-1g.10gb: 1
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
EOF
done
# pod/mig-example-1 created
# pod/mig-example-2 created
# pod/mig-example-3 created
# pod/mig-example-4 created
# pod/mig-example-5 created
# pod/mig-example-6 created
# pod/mig-example-7 created
5
생성된 pod를 확인합니다.
kubectl get pods
6
작업이 완료되면 로그를 통해 해당 Pod를 실행한 MIG의 UUID를 확인
for i in $(seq 7); do
kubectl logs mig-example-${i} | grep MIG
done
7
생성한 예제 Pod를 제거합니다
for i in $(seq 7); do
kubectl delete pod mig-example-${i}
done
https://docs.kakaocloud.com/tutorial/gpu/k8se-nvidia-gpu-worknode
https://brunch.co.kr/@topasvga/3651
감사합니다.