개요
도커에서 Nvidia GPU 기능을 사용하기 위해 nvidia-docker
를 설치하여 사용한다. 해당 설치 방식은 블로그 내 포스팅을 참고.
하지만 쿠버네티스 클러스터에서 실행하는 오브젝트는 기본적으로 GPU 리소스가 할당되지는 않는다. limits
필드를 통해 CPU나 MEMORY와 같이 GPU를 할당하기 위한 작업을 알아본다. AMD
GPU에서도 설정하는 방법이 있지만 일단 NVIDIA
만 기술한다.
조건
- K8S는
1.10
버전보다 높아야한다. - GPU를 할당하여 오브젝트를 실행할 노드에 NVIDIA 드라이버 설치가 되어있어야한다.
nvidia-docker 2.0
이 설치되어있어야한다.nvidia-container-runtime
이 기본 런타임으로 설정되어야한다. 컨테이너를docker
,containerd
로 돌리는 것에 따라 준비 방식이 다르다.docker
/etc/docker/daemon.json
에default-runtime
에 대한 정보가 포함되어야한다.{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } } 해당 내용이 이미 작성되어 있으면 상관없지만, 기본적으로는 빠져있으므로 넣어주고 서비스를 재시작한다. ```shell $ docker systmectl restart docker
contianerd
/etc/containerd.config.toml
파일 내용에 다음내용을 추가해준다. 마지막줄 이후에 추가해주면 된다.
version = 2
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "nvidia"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
privileged_without_host_devices = false
runtime_engine = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
저장을 하고 난 후 containerd
서비스도 재시작해준다.
$ sudo systemctl restart containerd
다운로드 및 실행
실행은 간단하다. GPU 디바이스 플러그인을 실행하면 되는 것이고 이 또한 쿠버네티스에서 실행하기 용이하게 yaml
로 구성되어있다.
본인은 링크로 실행하는 것보다 파일로 실행하는 것을 선호하므로 yaml 파일을 내려받아서 실행한다.
$ wget https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.12.3/nvidia-device-plugin.yml
$ sudo kubectl apply -f nvidia-device-plugin.yml
확인
sudo kubectl get pods -n kube-system -o wide
명령어를 통해 각 워커노드에 nvidia-device-plugin
으로 시작하는 파드가 생성되고 잘 돌아가고 있는지 확인한다.
혹은 다음명령어로 데몬셋을 확인하여 해당 플러그인의 작동 상태를 볼 수 있다.
$ sudo kubectl get daemonset -n kube-system
>>>
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-proxy 5 5 5 5 5 kubernetes.io/os=linux 5m56s
kube-system nvidia-device-plugin-daemonset 4 4 4 4 4 <none> 38s
워커노드의 개수 4개와 AVAILABLE
개수가 4개로 동일하여 해당 플러그인이 정상적으로 돌아감을 알 수 있다.
테스트
간단하게 ubuntu 18.04
os 이미지를 POD로 실행시켜 리소스에 gpu를 줄때와 안줄때의 nvidia-smi
명령어 실행결과를 살펴본다.
GPU 할당 X
- pod-ubuntu.yaml
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-18.04
spec:
containers:
- name: os-ubuntu
image: ubuntu:18.04
imagePullPolicy: IfNotPresent
command:
- "/bin/sleep"
- "3650d"
resources:
limits:
cpu: "5"
memory: "8G"
#nvidia.com/gpu: "1"
파드를 생성하고 내부로 붙어 nvidia-smi
명령어를 확인해보자
$ sudo kubectl get pod
>>>
NAME READY STATUS RESTARTS AGE
ubuntu-18.04 1/1 Running 0 4m11s
$ sudo kubectl exec -it ubuntu-18.04 -- /bin/bash
>>>
root@ubuntu-18:/# nvidia-smi
bash: nvidia-smi: command not found
GPU 할당 O
- pod-ubuntu-gpu.yaml
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-18.04
spec:
nodeName: 20-101
containers:
- name: os-ubuntu
image: ubuntu:18.04
imagePullPolicy: IfNotPresent
command:
- "/bin/sleep"
- "3650d"
resources:
limits:
cpu: "5"
memory: "8G"
nvidia.com/gpu: "1"
위와 동일하게 파드 내부로 붙어 nvidia-smi
명령어를 사용해보면 할당한 GPU가 인식됨을 알 수 있다.
$ sudo kubectl exec -it ubuntu-18.04 -- /bin/bash
root@ubuntu-18:/# nvidia-smi
Fri Oct 28 08:59:00 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.65.01 Driver Version: 515.65.01 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| 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:65:00.0 Off | N/A |
| 31% 40C P8 18W / 250W | 0MiB / 11264MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
참고링크: 쿠버네티스 GPU 스케쥴링 문서 참고링크: NVIDIA 디바이스 플러그인 깃허브
댓글남기기