brunch

매거진 kakao cloud

You can make anything
by writing

C.S.Lewis

by Master Seo Feb 19. 2024

카카오클라우드 4탄-21.쿠버네티스 NVIDIA GPU

카카오클라우드 - 쿠버네티스 클러스터에 NVIDIA GPU 워크노드 사용


[1]Type 1. Nvidia GPU 워크노드 구축

<1> 쿠버네티스 엔진 클러스터에 NVDIA GPU 노드 풀 생성하자.

<2> NVDIA GPU 워크노드 환경 구성하기



[2]Type 2. MIG 지원 Nvidia GPU 워크노드 구축

<1> 쿠버네티스 클러스터에 GPU 워크노드 추가하기

<2> Nvidia GPU 워크노드 환경 구성하기

<3> 삭제

<4> 참고 사이트





[1]Type 1. Nvidia GPU 워크노드 구축

<1> 쿠버네티스 엔진 클러스터에 NVDIA 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









<2> NVDIA GPU 워크노드 환경 구성하기



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





[2] Nvidia GPU 워크노드 환경 구성하기

<1> 쿠버네티스 클러스터에 GPU 워크노드 추가하기



새로운 클러스터를 생성하거나 기존에 존재하는 클러스터에 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

노드풀을 생성합니다.




<2> Nvidia GPU 워크노드 환경 구성하기


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  




<3> 삭제




<4> 참고 사이트


https://docs.kakaocloud.com/tutorial/gpu/k8se-nvidia-gpu-worknode



몰아보기

https://brunch.co.kr/@topasvga/3651


감사합니다. 


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari