콘텐츠로 이동

쿠버네티스 지원

RBLN SDK는 쿠버네티스 클러스터에서 RBLN NPU를 사용할 수 있도록 쿠버네티스 장치 플러그인(Device Plugin)을 제공합니다.

1단계. NPU 노드 준비

먼저 RBLN NPU 및 RBLN 드라이버가 설치 된 쿠버네티스 노드(Kubernetes node)를 준비합니다. 보통은 사용 중인 클라우드 서버에 안정적으로 동작하는 최신 RBLN 드라이버가 이미 설치되어 있습니다. rbln-stat 명령어로 RBLN NPU를 조회할 수 있다면 RBLN 드라이버가 이미 설치되어있는 상태이므로 드라이버 설치를 생략할 수 있습니다. 드라이버 설치와 관련된 정보는 설치 가이드를 참고하시기 바랍니다.

$ rbln-stat
Mon May 27 03:28:44 2024
+-------------------------------------------------------------------------------------------------+
|                        Device Infomation KMD ver: 0.12.37-6eed3e9-release                       |
+-----+-----------+-----------+---------------+------+---------+--------------------------+-------+
| NPU |    Name   | Device    |   PCI BUS ID  | Temp |  Power  |    Memory(used/total)    |  Util |
+-----+-----------+-----------+---------------+------+---------+--------------------------+-------+
| 0   | RBLN-CA02 | rbln0     |  0000:b6:00.0 |  25C |   6.2W  |      0.0B / 15.7GiB      |   0.0 |
+-----+-----------+-----------+---------------+------+---------+--------------------------+-------+
+-------------------------------------------------------------------------------------------------+
|                                        Context Infomation                                       |
+-----+---------------------+--------------+-----+----------+------+---------------------+--------+
| NPU | Process             |     PID      | CTX | Priority | PTID |            Memalloc | Status |
+-----+---------------------+--------------+-----+----------+------+---------------------+--------+
| N/A | N/A                 |     N/A      | N/A |   N/A    | N/A  |                 N/A |  N/A   |
+-----+---------------------+--------------+-----+----------+------+---------------------+--------+

2단계. 장치 플러그인 설치

kubectl apply 명령어를 사용하여 장치 플러그인을 설치할 수 있습니다:

$ kubectl apply -f https://raw.githubusercontent.com/rebellions-sw/rebel-k8s-device-plugin/master/deployments/rebel/configmap.yaml
$ kubectl apply -f https://raw.githubusercontent.com/rebellions-sw/rebel-k8s-device-plugin/master/deployments/rebel/daemonset.yaml

장치 플러그인 설치를 완료하면 kube-system 네임스페이스에서 rebel-device-plugin 데몬셋(DaemonSet)과 데몬셋으로부터 생성된 파드(Pod)를 확인할 수 있습니다:

$ kubectl get ds -n kube-system rebel-device-plugin
NAME                  DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR              AGE
rebel-device-plugin   4         4         4       4            4           kubernetes.io/arch=amd64   26s

$ kubectl get pod -n kube-system -l name=rebel-device-plugin -o wide
NAME                        READY   STATUS    RESTARTS   AGE
rebel-device-plugin-5tj4z   1/1     Running   0          41s
rebel-device-plugin-7zqgh   1/1     Running   0          41s
rebel-device-plugin-ddtts   1/1     Running   0          41s
rebel-device-plugin-zrw8s   1/1     Running   0          41s

추가로 kubectl describe 명령어를 통해 RBLN NPU 자원(여기서는 rebellions.ai/ATOM 자원)을 확인 할 수 있습니다:

1
2
3
4
5
6
7
8
9
$ kubectl describe node <your-node-name>
...
Capacity:
  ...
  rebellions.ai/ATOM:  1
Allocatable:
  ...
  rebellions.ai/ATOM:  1
...

장치 플러그인 설정

장치 플러그인의 자원 설정(여기서는 rebellions.ai/ATOM 자원)을 위해 ConfigMap이 필요합니다. 다음은 기본 설정 된 ConfigMap 입니다:

apiVersion: v1
kind: ConfigMap
metadata:
  name: rebel-device-plugin-config
  namespace: kube-system
data:
  config.json: |
    {
        "resourceList": [
            {
                "resourceName": "ATOM",
                "resourcePrefix": "rebellions.ai",
                "deviceType": "accelerator",
                "selectors": {
                    "vendors": ["1eff"],
                    "devices": [
                        "0010",
                        "0011",
                        "1020",
                        "1021",
                        "1120",
                        "1121",
                        "1220",
                        "1221"
                    ],
                    "drivers": ["rebellions"]
                }
            }
        ]
    }

장치 플러그인은 ConfigMap 설정을 기반으로 모든 노드에서 해당 자원을 탐색 합니다. 만일 heterogeneous 클러스터 환경에서 노드 단위로 다른 설정을 구성하고 싶다면, ConfigMapDaemonSet을 수정해야 합니다. 이와 관련된 자세한 내용은 링크를 참고하시기 바랍니다.

3단계. NPU 파드 생성

파드스펙(Pod sepc)에 spec.containers[].resources.limits을 추가하여 NPU 자원을 포함하는 파드를 생성할 수 있도록 합니다:

apiVersion: v1
kind: Pod
metadata:
  name: rebel-device-plugin-testpod
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    imagePullPolicy: IfNotPresent
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 300000; done;"]
    resources:
      requests:
        rebellions.ai/ATOM: 1
      limits:
        rebellions.ai/ATOM: 1

정의된 파드스펙을 기반으로 kubectl create 명령어를 사용하여 파드를 생성할 수 있습니다:

$ kubectl create -f https://raw.githubusercontent.com/rebellions-sw/rebel-k8s-device-plugin/master/deployments/rebel/pod-tc.yaml

kubectl describe 명령어를 통해 1개의 rebellions.ai/ATOM 자원이 할당 된 파드를 확인할 수 있습니다:

$ kubectl describe pod rebel-device-plugin-testpod
Name:             rebel-device-plugin-testpod
Namespace:        default
...
Containers:
  ubuntu:
    ...
    Limits:
      rebellions.ai/ATOM:  1
    Requests:
      rebellions.ai/ATOM:  1
    ...

장치 플러그인은 호스트 머신의 rbln-stat 유틸리티를 파드 컨테이너로 자동으로 마운트하기 때문에, 생성된 컨테이너에서 아래와 같이 rbln-stat 유틸리티를 사용할 수 있습니다:

$ kubectl exec -it rebel-device-plugin-testpod -- bash
root@rebel-device-plugin-testpod:/# rbln-stat
Mon May 27 08:44:05 2024
+-------------------------------------------------------------------------------------------------+
|                        Device Infomation KMD ver: 0.12.37-6eed3e9-release                       |
+-----+-----------+-----------+---------------+------+---------+--------------------------+-------+
| NPU |    Name   | Device    |   PCI BUS ID  | Temp |  Power  |    Memory(used/total)    |  Util |
+-----+-----------+-----------+---------------+------+---------+--------------------------+-------+
| 0   | RBLN-CA02 | rbln0     |  0000:b6:00.0 |  25C |   6.2W  |      0.0B / 15.7GiB      |   0.0 |
+-----+-----------+-----------+---------------+------+---------+--------------------------+-------+
+-------------------------------------------------------------------------------------------------+
|                                        Context Infomation                                       |
+-----+---------------------+--------------+-----+----------+------+---------------------+--------+
| NPU | Process             |     PID      | CTX | Priority | PTID |            Memalloc | Status |
+-----+---------------------+--------------+-----+----------+------+---------------------+--------+
| N/A | N/A                 |     N/A      | N/A |   N/A    | N/A  |                 N/A |  N/A   |
+-----+---------------------+--------------+-----+----------+------+---------------------+--------+