Skip to content

Schedule a Pod by NPU family

Select an NPU family (ATOM™ or Rebel100™) and verify that the Pod runs on a node of that family.

Use the Device Plugin configuration. If the Operator is not installed, follow Installing the NPU Operator.

1. Find the available families

Query the nodes' NPU family labels.

$ kubectl get nodes -l rebellions.ai/npu.present=true \
  -o 'custom-columns=NAME:.metadata.name,FAMILY:.metadata.labels.rebellions\.ai/npu\.family,PRODUCT:.metadata.labels.rebellions\.ai/npu\.product,ALLOCATABLE:.status.allocatable.rebellions\.ai/npu'
NAME            FAMILY     PRODUCT     ALLOCATABLE
node-rebel100   rebel100   RBLN-CR13   1
$ kubectl get nodes -l rebellions.ai/npu.present=true \
  -o 'custom-columns=NAME:.metadata.name,FAMILY:.metadata.labels.rebellions\.ai/npu\.family,PRODUCT:.metadata.labels.rebellions\.ai/npu\.product,ALLOCATABLE:.status.allocatable.rebellions\.ai/npu'
NAME        FAMILY   PRODUCT     ALLOCATABLE
node-atom   atom     RBLN-CA25   16

Choose one of the listed families.

Available NPU count

To check how many NPUs remain available on a node, run kubectl describe node <NODE_NAME> and compare Allocatable with Allocated resources. Allocatable includes NPUs that are already allocated.

2. Select the family and create a Pod

Create the npu-tutorial namespace and select Rebel100™. For ATOM™ nodes, set NPU_FAMILY=atom instead.

Use nodeSelector to select the family and resources.limits to request one NPU.

kubectl create namespace npu-tutorial --dry-run=client -o yaml | kubectl apply -f -
export NPU_FAMILY=rebel100
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: selected-npu
  namespace: npu-tutorial
spec:
  nodeSelector:
    rebellions.ai/npu.family: "$NPU_FAMILY"
  containers:
  - name: ubuntu
    image: ubuntu:22.04
    command: ["sleep", "infinity"]
    resources:
      limits:
        rebellions.ai/npu: 1
EOF

The first line of the output depends on whether the namespace already exists.

Creation result
namespace/npu-tutorial configured
pod/selected-npu created

Wait for the new Pod to become Ready.

$ kubectl wait -n npu-tutorial --for=condition=Ready pod/selected-npu --timeout=180s
pod/selected-npu condition met

3. Verify the selected family and device

Example outputs are shown for each family.

$ NODE=$(kubectl get pod -n npu-tutorial selected-npu -o jsonpath='{.spec.nodeName}')
$ kubectl get node "$NODE" \
  -o 'custom-columns=NAME:.metadata.name,FAMILY:.metadata.labels.rebellions\.ai/npu\.family,PRODUCT:.metadata.labels.rebellions\.ai/npu\.product'
NAME            FAMILY     PRODUCT
node-rebel100   rebel100   RBLN-CR13

$ kubectl exec -n npu-tutorial selected-npu -- rbln-smi -L
NPU 0 : RBLN-CR13 (UUID: NPU-34428712-d887-840b-a7b9-1c9e05807fc3)
$ NODE=$(kubectl get pod -n npu-tutorial selected-npu -o jsonpath='{.spec.nodeName}')
$ kubectl get node "$NODE" \
  -o 'custom-columns=NAME:.metadata.name,FAMILY:.metadata.labels.rebellions\.ai/npu\.family,PRODUCT:.metadata.labels.rebellions\.ai/npu\.product'
NAME        FAMILY   PRODUCT
node-atom   atom     RBLN-CA25

$ kubectl exec -n npu-tutorial selected-npu -- rbln-smi -L
NPU 0 : RBLN-CA25 (UUID: NPU-c5ba8327-5b18-847e-953e-4ca4b4daeb44)

The check passes when the node family equals $NPU_FAMILY and the device product matches the node's npu.product label.

Pod stays Pending

Run kubectl describe pod -n npu-tutorial selected-npu and check Events for a selector mismatch, insufficient NPUs or an untolerated taint.

Clean up

$ kubectl delete pod -n npu-tutorial selected-npu
pod "selected-npu" deleted