콘텐츠로 이동

KubeVirt VM에 NPU 연결하기

ATOM™ 또는 Rebel100™ NPU 1개를 KubeVirt VM에 연결하고 게스트에서 rbln-smi를 실행해 장치를 확인합니다.

VM 패스스루 구성을 사용하고 KubeVirt 설정을 완료합니다. Operator가 아직 설치되어 있지 않다면 먼저 NPU Operator 설치 절차를 진행합니다.

1. VM 생성하기

사용할 제품군을 선택합니다.

export NPU_PRODUCT='RBLN-CR13'
export NPU_RESOURCE='rebellions.ai/RBLN-CR13_PF'
export NPU_PRODUCT='RBLN-CA25'
export NPU_RESOURCE='rebellions.ai/RBLN-CA25_PF'

노드 이름과 PVC 이름은 사용할 환경에 맞게 변경합니다. <VM_PASSWORD>에는 ubuntu 계정의 콘솔 로그인에 사용할 비밀번호를 지정합니다.

장치 허용 설정을 완료한 뒤 hostDevices.deviceName에 선택한 $NPU_RESOURCE를 지정해 NPU를 요청합니다.

kubectl apply -f - <<EOF
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: npu-vm
  namespace: npu-tutorial
spec:
  runStrategy: Always
  template:
    metadata:
      labels:
        kubevirt.io/domain: npu-vm
    spec:
      nodeSelector:
        kubernetes.io/hostname: "<VM_NODE_NAME>"
      domain:
        cpu:
          cores: 4
        resources:
          requests:
            memory: 8Gi
        devices:
          disks:
          - name: rootdisk
            disk:
              bus: virtio
          - name: cloudinit
            disk:
              bus: virtio
          interfaces:
          - name: default
            masquerade: {}
          hostDevices:
          - name: npu
            deviceName: ${NPU_RESOURCE}
      networks:
      - name: default
        pod: {}
      volumes:
      - name: rootdisk
        persistentVolumeClaim:
          claimName: npu-vm-disk
      - name: cloudinit
        cloudInitNoCloud:
          userData: |
            #cloud-config
            users:
              - name: ubuntu
                sudo: ALL=(ALL) NOPASSWD:ALL
                shell: /bin/bash
                lock_passwd: false
                plain_text_passwd: "<VM_PASSWORD>"
            growpart:
              mode: auto
              devices: ["/"]
            resize_rootfs: true
EOF

vfio-npu.rebellions.ai DeviceClass로 선택한 제품의 NPU 1개를 요청하는 ResourceClaim을 만듭니다. VM의 resourceClaims와 hostDevices에서 이 Claim을 참조합니다.

kubectl apply -f - <<EOF
apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata:
  name: vm-npu
  namespace: npu-tutorial
spec:
  devices:
    requests:
    - name: npu
      exactly:
        deviceClassName: vfio-npu.rebellions.ai
        count: 1
        selectors:
        - cel:
            expression: 'device.attributes["npu.rebellions.ai"].productName == "${NPU_PRODUCT}"'
---
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: npu-vm
  namespace: npu-tutorial
spec:
  runStrategy: Always
  template:
    metadata:
      labels:
        kubevirt.io/domain: npu-vm
    spec:
      nodeSelector:
        kubernetes.io/hostname: "<VM_NODE_NAME>"
      resourceClaims:
      - name: npu-claim
        resourceClaimName: vm-npu
      domain:
        cpu:
          cores: 4
        resources:
          requests:
            memory: 8Gi
        devices:
          disks:
          - name: rootdisk
            disk:
              bus: virtio
          - name: cloudinit
            disk:
              bus: virtio
          interfaces:
          - name: default
            masquerade: {}
          hostDevices:
          - name: npu
            claimName: npu-claim
            requestName: npu
      networks:
      - name: default
        pod: {}
      volumes:
      - name: rootdisk
        persistentVolumeClaim:
          claimName: npu-vm-disk
      - name: cloudinit
        cloudInitNoCloud:
          userData: |
            #cloud-config
            users:
              - name: ubuntu
                sudo: ALL=(ALL) NOPASSWD:ALL
                shell: /bin/bash
                lock_passwd: false
                plain_text_passwd: "<VM_PASSWORD>"
            growpart:
              mode: auto
              devices: ["/"]
            resize_rootfs: true
EOF

VM이 준비되면 실행 상태를 확인합니다.

$ kubectl wait -n npu-tutorial --for=condition=Ready vm/npu-vm --timeout=300s
virtualmachine.kubevirt.io/npu-vm condition met

$ kubectl get vm -n npu-tutorial npu-vm \
  -o 'custom-columns=NAME:.metadata.name,STATUS:.status.printableStatus,READY:.status.ready'
NAME     STATUS    READY
npu-vm   Running   true

선택한 할당 방식에 따라 NPU 할당 결과를 확인합니다.

virt-launcher Pod의 compute 컨테이너가 NPU 1개를 요청하는지 확인합니다.

$ kubectl get pods -n npu-tutorial -l kubevirt.io/domain=npu-vm \
  -o json | \
  jq --arg resource "$NPU_RESOURCE" '.items[].spec.containers[] | select(.name=="compute") | .resources.limits[$resource]'
"1"

vm-npu Claim에 할당된 NPU를 확인합니다. 풀 이름과 장치 이름은 환경에 따라 달라집니다.

$ kubectl get resourceclaim -n npu-tutorial vm-npu -o json | \
  jq '.status.allocation.devices.results | map({driver, pool, device})'
[
  {
    "driver": "npu.rebellions.ai",
    "pool": "node-rebel100",
    "device": "vfio-0000-27-00-0"
  }
]
$ kubectl get resourceclaim -n npu-tutorial vm-npu -o json | \
  jq '.status.allocation.devices.results | map({driver, pool, device})'
[
  {
    "driver": "npu.rebellions.ai",
    "pool": "node-atom",
    "device": "vfio-0000-23-00-0"
  }
]

VM이 Running 상태이고 선택한 방식으로 NPU 1개가 할당되면 게스트에서 장치를 확인합니다.

2. 게스트에서 장치 확인하기

관리 컴퓨터의 터미널에서 virtctl console로 게스트 콘솔에 접속합니다.

관리 컴퓨터
virtctl console -n npu-tutorial npu-vm

로그인 프롬프트가 나타나면 ubuntu 계정과 VM 생성 시 지정한 비밀번호로 로그인합니다. 화면이 비어 있으면 Enter를 누릅니다.

이후 단계는 드라이버 설치 가이드에 따라 게스트의 지원 커널과 선택한 제품군의 RBLN Driver 설치를 마친 상태에서 진행합니다.

게스트에서 패스스루된 PCI 장치와 드라이버 버전, NPU를 확인합니다.

게스트 VM
$ lspci -nn -d 1eff:
09:00.0 Processing accelerators [1200]: Device [1eff:2130] (rev 02)
게스트 VM
$ cat /sys/module/rebellions/version
3.5.1

$ rbln-smi -L
NPU 0 : RBLN-CR13 (UUID: NPU-34428712-d887-840b-a7b9-1c9e05807fc3)
게스트 VM
$ lspci -nn -d 1eff:
09:00.0 Processing accelerators [1200]: Device [1eff:1250] (rev 03)
게스트 VM
$ cat /sys/module/rebellions/version
3.4.1

$ rbln-smi -L
NPU 0 : RBLN-CA25 (UUID: NPU-54101eb9-509c-8fe6-ab27-8dd7f67cb5a3)

게스트에서 드라이버 버전과 NPU 1개가 확인되면 성공입니다.

정리

게스트에서 로그아웃한 뒤 Ctrl+]를 눌러 콘솔을 종료합니다. 관리 컴퓨터의 터미널에서 VM을 삭제합니다.

관리 컴퓨터
1
2
3
kubectl delete vm -n npu-tutorial npu-vm
kubectl wait -n npu-tutorial --for=delete vmi/npu-vm --timeout=180s
kubectl get pods -n npu-tutorial -l kubevirt.io=virt-launcher

DRA를 사용했다면 VM에 연결했던 Claim도 삭제합니다.

kubectl delete resourceclaim -n npu-tutorial vm-npu