콘텐츠로 이동

RBLN 쿠버네티스 디바이스 플러그인

BREAKING CHANGE

디바이스 플러그인의 v0.4.0 버전부터는 useGenericResourceName 옵션이 기본적으로 true로 설정됩니다. 이는 기존 리소스 이름인 rebellions.ai/ATOM이 아닌 rebellions.ai/npu로 변경된다는 것을 의미합니다. 기존 리소스 이름을 사용하고 싶다면, useGenericResourceName 옵션을 false로 설정하여 사용할 수 있습니다.

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

1단계. NPU 노드 준비

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

$ rbln-smi
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   |
+-----+---------------------+--------------+-----+----------+------+---------------------+--------+

CDI 설정 (필수)

디바이스 플러그인은 컨테이너 런타임에서 CDI가 활성화되어 있어야 동작합니다. containerd를 직접 설정하고 재시작하거나, Container Toolkit이 CDI 설정을 수행하도록 할 수 있습니다.

containerd v1.7.x (/etc/containerd/config.toml)

1
2
3
4
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    enable_cdi = true
    cdi_spec_dirs = ["/etc/cdi", "/var/run/cdi"]

containerd v2.x.x (/etc/containerd/config.toml)

1
2
3
4
[plugins]
  [plugins."io.containerd.cri.v1.runtime"]
    enable_cdi = true
    cdi_spec_dirs = ["/etc/cdi", "/var/run/cdi"]

CDI가 활성화되면 디바이스 플러그인은 rebellions.ai/npu=runtime CDI 어노테이션을 추가합니다. 이를 통해 워크로드가 NPU 리소스(예: rebellions.ai/npu)를 요청할 때 필요한 라이브러리와 rbln-smi 같은 도구가 자동으로 마운트됩니다.

2단계. 디바이스 플러그인 설치

디바이스 플러그인은 NPU Operator를 사용하여 설치하는 것을 권장합니다. 다만, 단독 설치가 필요한 경우에는 다음 명령어를 사용하여 설치할 수 있습니다.

1
2
3
4
$ git clone https://github.com/RBLN-SW/k8s-device-plugin
$ cd k8s-device-plugin/deployments/helm/rbln-device-plugin

$ helm install rbln-device-plugin . -n kube-system

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

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

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

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

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

3단계. NPU 파드 생성

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

apiVersion: v1
kind: Pod
metadata:
  name: rbln-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/npu: 1
      limits:
        rebellions.ai/npu: 1

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

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

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

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

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

$ kubectl exec -it rbln-device-plugin-testpod -- bash
root@rbln-device-plugin-testpod:/# rbln-smi
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   |
+-----+---------------------+--------------+-----+----------+------+---------------------+--------+