쿠버네티스에서 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
'인공지능 > MLOps' 카테고리의 다른 글
[docker] Docker Root Dir 변경 (0) | 2022.12.18 |
---|---|
[kubernetes] 쿠버네티스 pv, pvc 바로 삭제하기 (0) | 2022.12.18 |
[kubectl] kubernetes namespace owner 변경하기 (0) | 2022.12.18 |
[docker] docker 종료된 컨테이너 한 번에 삭제하기 (Exited) (0) | 2022.12.13 |
[kubeflow, kubernetes] 디플로이먼트 재시작하는 방법 (restart deployment) (0) | 2022.10.28 |