본문으로 건너뛰기
  1. Ocp/

Openshift GPU노드 추가

·
Kubernetes Openshift GPU Ndivia
목차

Overview
#

기본적으로 Openshift는 별도의 설정을 해주지 않으면 cpu와 ram을 비롯한 기본적인 하드웨어밖에 사용하지 못합니다.
하드웨어 운용에 있어 별도의 드라이버가 필요한 GPU의 경우엔 어떻게 Openshift에서 사용할 수 있는지 알아보도록 하겠습니다.

Steps
#

테스트 환경 :

  • Openshift v4.9
  • GPU : RTX3080 8GB

1. GPU 노드 추가
#

GPU를 사용하려면 실제로 GPU가 탑재되어있는 노드를 클러스터에 추가시켜야 합니다.

image

2. NFD(Node Feature Discovery) 배포
#

NFD는 각 노드가 가지는 기능을 openshift에서 사용할수있게 하는 오퍼레이터 입니다.

이 오퍼레이터는 레드햇에서 기본적으로 제공하는 오퍼레이터이므로 Operator Hub에서 찾아서 설치해주도록 합니다.

image

image

배포하게되면 매니저 pod가 openshift-nfd라는 네임스페이스에서 돌아가고 있습니다.

image

Operator 화면에서 NodeFeatureDiscovery를 생성해줍니다.

image

기본 template으로 생성

image

그러면 각 마스터 및 워커들에 대한 nfd pod이 돌아가기 시작합니다.

$ oc get pod -n openshift-nfd

NAME                                      READY   STATUS    RESTARTS   AGE
nfd-controller-manager-788944b976-t599p   2/2     Running   0          8m5s
nfd-master-cvqjg                          1/1     Running   0          51s
nfd-master-rrlcd                          1/1     Running   0          51s
nfd-master-znjxw                          1/1     Running   0          51s
nfd-worker-fcsls                          1/1     Running   0          51s
nfd-worker-npvlh                          1/1     Running   0          51s
nfd-worker-rnf2s                          1/1     Running   0          51s
nfd-worker-zm77p                          1/1     Running   0          51s

맨 처음 노드들의 label이 아래와 같이 짧았던 반면에,

$ oc describe node worker0.ocp-cp4d.xxx.com

Name:               worker0.ocp-cp4d.xxx.com
Roles:              worker
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    cluster.ocs.openshift.io/openshift-storage=
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=worker0.ocp-cp4d.xxx.com
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/worker=
                    node.openshift.io/os_id=rhcos
...

뭔가 엄청 많아졌습니다.

$ oc describe node worker0.ocp-cp4d.xxx.com
Name:               worker0.ocp-cp4d.xxx.com
Roles:              worker
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
...
                    feature.node.kubernetes.io/kernel-version.major=4
                    feature.node.kubernetes.io/kernel-version.minor=18
                    feature.node.kubernetes.io/kernel-version.revision=0
                    feature.node.kubernetes.io/pci-10de.present=true
                    feature.node.kubernetes.io/pci-10ec.present=true
                    feature.node.kubernetes.io/pci-8086.present=true
                    feature.node.kubernetes.io/pci-8086.sriov.capable=true
                    feature.node.kubernetes.io/storage-nonrotationaldisk=true
                    feature.node.kubernetes.io/system-os_release.ID=rhcos
                    feature.node.kubernetes.io/system-os_release.OPENSHIFT_VERSION=4.9
...

feature.node.kubernetes.io라고 라벨링된 부분이 nfd가 감지해낸 부분입니다.

GPU가 있는 노드는 pci라는 prefix를 달고있습니다:

$ oc describe node worker0.ocp-cp4d.xxx.com| egrep 'Roles|pci'

Roles:              worker
...
                    feature.node.kubernetes.io/pci-10de.present=true
                    feature.node.kubernetes.io/pci-10ec.present=true
                    feature.node.kubernetes.io/pci-8086.present=true
                    feature.node.kubernetes.io/pci-8086.sriov.capable=true
...

이제 nfd가 GPU를 찾으면서 openshift scheduler도 GPU를 리소스로 사용할 수 있게되었습니다.

3. NVIDIA GPU Operator 배포
#

실제로 특수한 하드웨어 리소스(GPU, Infiniband, nic등)를 사용하려면 각 벤더의 드라이버나 다른 라이브러리들이 필요합니다.

NVIDIA GPU Operator는 GPU쓰는데 있어서 필요한 드라이버나 플러그인들, 그리고 nvidia container runtime을 가지고있습니다.

즉, nfd는 각 노드가 가지는 기능을 openshift에서 감지할 수 있게 하는거고, 실제로 하드웨어단의 기능을 사용하기 위해서는 맞는 드라이버/플러그인이 필요 -> GPU의 경우 “NVIDIA GPU Operator

설치는 다양한 방법으로 할 수 있습니다.

  1. Helm chart
  2. Operator

이 문서에서는 Operator방식으로 설치해보도록 하겠습니다.

image

image

아주 쉽게 원클릭으로 설치 성공!

기본적으로 모니터링에 대한 라벨링이 붙지 않으므로 프로메테우스 메트릭을 수집하게 하려면, 다음 라벨을 namespace에 붙여주자

$ oc label ns/nvidia-gpu-operator openshift.io/cluster-monitoring=true

namespace/nvidia-gpu-operator labeled

Operator에 대한 ClusterPolicy 생성

image

image

한 10분20분기다리면 Ready가 됩니다.

vGPU의 경우, 다른 option을 줘야합니다.
->참고 : Create the ClusterPolicy instance with NVIDIA vGPU¶

$ oc get pod -n nvidia-gpu-operator
NAME                                                 READY   STATUS      RESTARTS   AGE
gpu-feature-discovery-8xdmk                          1/1     Running     0          23m
gpu-feature-discovery-jkdgb                          1/1     Running     0          23m
gpu-feature-discovery-lnb98                          1/1     Running     0          23m
...
nvidia-operator-validator-29jx4                      1/1     Running     0          3m46s
nvidia-operator-validator-72k66                      1/1     Running     0          23m
nvidia-operator-validator-9ccdq                      1/1     Running     0          23m
nvidia-operator-validator-9g6zc                      1/1     Running     0          23m

nvidia-driver-daemonset-*pod에 nvidia-smi 명령어를 치면 해당 daemonset이 올라가있는 node의 GPU현황을 볼 수 있습니다.

$ oc exec -it nvidia-driver-daemonset-49.84.202111231504-0-2dcxf -- nvidia-smi

Defaulted container "nvidia-driver-ctr" out of: nvidia-driver-ctr, openshift-driver-toolkit-ctr, k8s-driver-manager (init)
Thu Feb 17 07:20:08 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.82.01    Driver Version: 470.82.01    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 ...  On   | 00000000:01:00.0 Off |                  N/A |
| N/A   53C    P0    35W /  N/A |      1MiB /  7982MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

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

4. TEST!
#

GPU를 사용하는 pod을 테스트로 돌려서 제대로 GPU 리소스를 사용하는지 확인해보겠습니다.

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vectoradd
spec:
 restartPolicy: OnFailure
 containers:
 - name: cuda-vectoradd
   image: "nvidia/samples:vectoradd-cuda11.2.1"
   resources:
     limits:
       nvidia.com/gpu: 1

배포하고 로그를 보면 다음과 같이 잘 동작하는 것을 확인할 수 있습니다.

$ oc logs cuda-vectoradd

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

관련 글

Openshift Custom Domain 설정
Kubernetes Openshift
Overview # Kubernetes같은 경우는 클러스터 생성시, 도메인이 필요하지 않기 때문에 원하는 도메인을 사용하고 싶다면 별도로 ingress를 통해 세팅해줘야하는데요,
Openshift4.3 Baremetal 설치 - Restricted Network
Kubernetes RHCOS VMware Openshift
Overview # 약 5개월 전에는 베어메탈에 UPI방식으로 openshift 4.3을 설치해보는 문서를 포스팅했었습니다.
Openshift Ingress Certificate 구성
Kubernetes Openshift
Overview # 이번 문서에서는 Openshift클러스터의 Ingress에 Certificate를 구성하여 탭 상단의 “Not Secure” 경고를 없애보도록 하겠습니다.