개요

도커에서 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.jsondefault-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 디바이스 플러그인 깃허브

댓글남기기