콘텐츠로 이동

Pod 하나에 NPU 2개 할당하기

컨테이너 하나에 NPU 2개를 할당하고 같은 RSD 그룹인지 확인합니다.

이 튜토리얼은 Device Plugin 구성을 기준으로 합니다. Operator가 아직 설치되어 있지 않다면 먼저 NPU Operator 설치 절차를 진행합니다.

사용 가능한 NPU 수

노드의 사용 가능한 NPU 수를 확인하려면 kubectl describe node <NODE_NAME>을 실행해 Allocatable과 Allocated resources를 비교합니다. Allocatable에는 이미 할당된 NPU도 포함됩니다.

1. NPU 2개 요청하기

npu-tutorial 네임스페이스와 Pod를 생성합니다. rebellions.ai/npu: 2로 컨테이너에 NPU 2개를 요청합니다.

kubectl create namespace npu-tutorial --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -f - <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: two-npus
  namespace: npu-tutorial
spec:
  containers:
  - name: ubuntu
    image: ubuntu:22.04
    command: ["sleep", "infinity"]
    resources:
      limits:
        rebellions.ai/npu: 2
EOF

네임스페이스의 기존 상태에 따라 출력이 달라질 수 있습니다.

생성 결과
namespace/npu-tutorial configured
pod/two-npus created
$ kubectl wait -n npu-tutorial --for=condition=Ready pod/two-npus --timeout=180s
pod/two-npus condition met

Pod가 Pending 상태인 경우

kubectl describe pod -n npu-tutorial two-npus의 Events를 확인합니다. Insufficient rebellions.ai/npu는 NPU 2개를 할당할 수 있는 노드가 없다는 뜻입니다.

2. 요청한 NPU 수 확인하기

Pod가 배치된 노드와 요청한 NPU 수를 확인합니다.

$ kubectl get pod -n npu-tutorial two-npus \
  -o 'custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,NPUS:.spec.containers[0].resources.limits.rebellions\.ai/npu'
NAME       NODE            NPUS
two-npus   node-rebel100   2

$ kubectl exec -n npu-tutorial two-npus -- rbln-smi -L
NPU 0 : RBLN-CR13 (UUID: NPU-34428712-d887-840b-a7b9-1c9e05807fc3)
NPU 1 : RBLN-CR13 (UUID: NPU-9f4b0832-3c21-4d79-a62c-7816b0a27f45)
$ kubectl get pod -n npu-tutorial two-npus \
  -o 'custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,NPUS:.spec.containers[0].resources.limits.rebellions\.ai/npu'
NAME       NODE        NPUS
two-npus   node-atom   2

$ kubectl exec -n npu-tutorial two-npus -- rbln-smi -L
NPU 0 : RBLN-CA25 (UUID: NPU-c5ba8327-5b18-847e-953e-4ca4b4daeb44)
NPU 1 : RBLN-CA25 (UUID: NPU-69bd0b6c-3c88-858f-bfc1-264c5c2f17b5)

NPUS 값이 2이고 서로 다른 UUID를 가진 장치 2개가 표시되어야 합니다.

이어서 RSD 그룹과 장치 인터페이스를 확인합니다. jq는 kubectl 명령을 실행하는 컴퓨터에서 실행됩니다.

kubectl exec -n npu-tutorial two-npus -- rbln-smi -j -g | \
  jq '[.devices[] | {npu, name, group_id, status}]'
출력 예시
[
  {
    "npu": 0,
    "name": "RBLN-CR13",
    "group_id": "1",
    "status": "normal"
  },
  {
    "npu": 1,
    "name": "RBLN-CR13",
    "group_id": "1",
    "status": "normal"
  }
]
출력 예시
[
  {
    "npu": 0,
    "name": "RBLN-CA25",
    "group_id": "1",
    "status": "normal"
  },
  {
    "npu": 1,
    "name": "RBLN-CA25",
    "group_id": "1",
    "status": "normal"
  }
]
$ kubectl exec -n npu-tutorial two-npus -- sh -c \
  'test -c /dev/rsd0 && echo "/dev/rsd0: character device present"'
/dev/rsd0: character device present

다음 조건을 모두 만족하면 성공입니다.

  • 두 장치의 group_id가 같습니다.
  • 두 장치의 상태가 모두 normal입니다.
  • /dev/rsd0가 문자 장치로 표시됩니다.

이 조건을 만족하지 않으면 Pod가 실행 중인 노드의 Device Plugin 로그를 확인합니다.

정리

$ kubectl delete pod -n npu-tutorial two-npus
pod "two-npus" deleted