본문 바로가기
인공지능/MLOps

[kubernetes] 쿠버네티스 GPU 설정

by judy@ 2022. 12. 18.

쿠버네티스에서 GPU를 사용하기 위해서는 다음을 수행해야 함. 아래 내용을 구분선 아래에서 자세히 작성함.

 

1. nvidia driver 설치

2. nvidia container toolkit 설치 (재부팅 필요)

4. nvidia-device-plugin 기동


환경 참고

 - gpu: 4개
 - docker version
   - client: 1.19.21
   - server: 1.19.17
 - k3s 기반 싱글 노드 클러스터

 

1. nvidia-driver 설치

그래픽 카드 정보 확인

$ sudo lshw -C display
$ ubuntu-drivers devices

설치 (470을 선택하여 설치함, 다른 버전으로 설치해도 됨)

레포지토리 추가

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update

패키지가 있는지 확인

$ apt-cache search nvidia | grep nvidia-driver-470

apt로 드라이버 설치

$ sudo apt-get install nvidia-driver-470

 

 

설치 후 재부팅 필수

(공용 서버나 컴퓨터라면 재부팅해도 되는지 꼭 확인해야 함!! 재부팅을 안하면 도커나 쿠버네티스에서 gpu가 인식된다는 보장이 없음..)

$ sudo reboot

nvidia-smi 인식되는지 확인

$ nvidia-smi
Thu Dec  1 10:11:36 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.141.10   Driver Version: 470.141.10   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:3B:00.0 Off |                  N/A |
|  0%   41C    P0    69W / 260W |      0MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce ...  Off  | 00000000:5E:00.0 Off |                  N/A |
|  0%   38C    P0    53W / 260W |      0MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  NVIDIA GeForce ...  Off  | 00000000:86:00.0 Off |                  N/A |
|  0%   38C    P0    59W / 260W |      0MiB / 11019MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   3  NVIDIA GeForce ...  Off  | 00000000:AF:00.0 Off |                  N/A |
|  0%   38C    P0    52W / 260W |      0MiB / 11011MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

2. NVIDIA Container Toolkit 설치

왜인지 모르겠지만, 블로그 등에서 이 부분에 대해서 설명이 없어서 GPU 인식시키는 데에 어려움을 많이 겪음..

nvidia 쿠버네티스 공식 document를 참고하여 nvidia-docker2를 설치함

$ sudo apt-get update \
   && sudo apt-get install -y nvidia-docker2

아래와 같이 /etc/docker/daemon.json 파일을 열어 default-runtime을 nvidia로 변경

{
   "default-runtime": "nvidia",
   "runtimes": {
      "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
      }
   }
}

도커 데몬 재시작

$ sudo systemctl restart docker

cuda 컨테이너를 생성하여 nvidia-smi가 잘 실행되는지 테스트
(cuda 이미지가 없다고 하는 경우, nvidia/cuda hub에서 적절한 최신 이미지를 찾아 테스트해보면 됨)

 

3. nvidia-device-plugin 기동

기동이라는 단어를 통해 눈치챘겠지만, 이는 k8s 클러스터를 구축한 이후에 필요한 세팅임. 위에서는 도커에서 gpu 를 인식하도록 설치, 설정하였다면 여기서는 연결한 gpu가 클러스터에서도 인식되도록 하는 설정임. 

먼저 nvidia-device-plugin이 기동되어 있는지 확인함

$ kubectl get po -A
NAMESPACE            NAME                                      READY   STATUS      RESTARTS   AGE
default              gpu-pod                                   0/1     Completed   0          16d
local-path-storage   local-path-provisioner-556d4466c8-f2dhr   1/1     Running     3          16d
kube-system          metrics-server-558788f96c-8l5n6           1/1     Running     2          2d15h
kube-system          coredns-56d4646544-ch298                  1/1     Running     3          2d15h

 

위와 같은 경우, 기동되어 있지 않으므로 다음 명령어를 통해 plugin 을 기동한다.

$ kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.11.0/nvidia-device-plugin.yml
daemonset.apps/nvidia-device-plugin-daemonset created

$ kubectl get po -A
NAMESPACE            NAME                                      READY   STATUS              RESTARTS   AGE
default              gpu-pod                                   0/1     Completed           0          16d
local-path-storage   local-path-provisioner-556d4466c8-f2dhr   1/1     Running             3          16d
kube-system          metrics-server-558788f96c-8l5n6           1/1     Running             2          2d15h
kube-system          coredns-56d4646544-ch298                  1/1     Running             3          2d15h
kube-system          nvidia-device-plugin-daemonset-ml7s4      0/1     ContainerCreating   0          3s

$ kubectl get po -A
NAMESPACE            NAME                                      READY   STATUS      RESTARTS   AGE
default              gpu-pod                                   0/1     Completed   0          16d
local-path-storage   local-path-provisioner-556d4466c8-f2dhr   1/1     Running     3          16d
kube-system          metrics-server-558788f96c-8l5n6           1/1     Running     2          2d15h
kube-system          coredns-56d4646544-ch298                  1/1     Running     3          2d15h
kube-system          nvidia-device-plugin-daemonset-ml7s4      1/1     Running     0          44s

위와 같이 처음에는 plugin이 ContainerCreating 상태이다가 시간이 조금 지나면 바뀜.  이로써 쿠버네티스에서도 gpu 를 사용할 수 있게 됨.
사용 가능한지 확인하려면 아래 명령어를 입력하였을 시 <none>이 아닌 숫자가 나오면 됨.

$ kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
NAME      GPU
<NODE-NAME>   4
반응형