RoCE Workload Image#

The RoCE workload image bundles all components needed for running distributed RCCL performance tests across AMD GPU clusters with AMD AINIC (Pollara) NICs.

What’s Included#

Component

Description

ROCm

AMD GPU compute runtime

RCCL

ROCm Collective Communications Library

RCCL Tests

Performance benchmarks (all_reduce_perf, broadcast_perf, etc.)

AMD ANP

AMD Network Plugin for RCCL

UCX

Unified Communication X transport layer

OpenMPI

MPI implementation for multi-node communication

AINIC drivers

User-space libraries for AMD AINIC (Pollara) NICs

Getting the Image#

Pre-built Images#

Pre-built images are available on Docker Hub.

Important: The workload image must be compatible with the AINIC driver version installed on the host nodes. The image bundles user-space AINIC libraries (libionic) that must match the host kernel driver. Use an image tagged with the same AINIC version as your deployed drivers (e.g., ainic-1.117.5-a-77 in the image tag should match the firmware/driver version on the nodes).

Building a Custom Image#

To build a custom image with specific component versions, see the build instructions at docker/roce-workload/.

cd docker/roce-workload
./docker-build.sh <ainic_version>

Using the Image#

The image can be used in two ways: manually for ad-hoc testing, or with CVF for automated fleet-wide validation.

Both workflows require the cluster prerequisites described in the Cluster Validation Framework requirements.

Manual Quick Start#

Deploy two workload pods and run an RCCL test to validate GPU-to-GPU communication over AINIC NICs:

1. Deploy workload pods#

kubectl apply -f - <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: rccl-worker-0
  labels:
    app: rccl-test
  annotations:
    k8s.v1.cni.cncf.io/networks: amd-host-device-nad,amd-host-device-nad  # one entry per NIC
spec:
  restartPolicy: Never
  containers:
  - name: worker
    image: rocm/roce-workload:ubuntu24_rocm-7.2_rccl-ainic-oob-fb67e5b_anp-v1.3.0_ainic-1.117.5-a-77
    securityContext:
      capabilities:
        add: [IPC_LOCK]
    resources:
      requests:
        amd.com/gpu: 8   # adjust to match your hardware
        amd.com/nic: 2
      limits:
        amd.com/gpu: 8
        amd.com/nic: 2
    volumeMounts:
    - name: shm
      mountPath: /dev/shm
  volumes:
  - name: shm
    emptyDir:
      medium: Memory
      sizeLimit: 4Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: rccl-worker-1
  labels:
    app: rccl-test
  annotations:
    k8s.v1.cni.cncf.io/networks: amd-host-device-nad,amd-host-device-nad
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: rccl-test
        topologyKey: kubernetes.io/hostname
  restartPolicy: Never
  containers:
  - name: worker
    image: rocm/roce-workload:ubuntu24_rocm-7.2_rccl-ainic-oob-fb67e5b_anp-v1.3.0_ainic-1.117.5-a-77
    securityContext:
      capabilities:
        add: [IPC_LOCK]
    resources:
      requests:
        amd.com/gpu: 8
        amd.com/nic: 2
      limits:
        amd.com/gpu: 8
        amd.com/nic: 2
    volumeMounts:
    - name: shm
      mountPath: /dev/shm
  volumes:
  - name: shm
    emptyDir:
      medium: Memory
      sizeLimit: 4Gi
EOF

Adjust amd.com/gpu and amd.com/nic counts to match your hardware. The anti-affinity rule ensures pods land on different nodes automatically.

For VMs with VNICs (SR-IOV VFs): replace amd.com/nic with amd.com/vnic and amd-host-device-nad with vf-amd-host-device-nad in the pod spec above.

2. Exchange SSH keys#

W0_KEY=$(kubectl exec rccl-worker-0 -- cat /root/.ssh/id_rsa.pub)
W1_KEY=$(kubectl exec rccl-worker-1 -- cat /root/.ssh/id_rsa.pub)
kubectl exec rccl-worker-0 -- bash -c "echo '$W1_KEY' >> /root/.ssh/authorized_keys"
kubectl exec rccl-worker-1 -- bash -c "echo '$W0_KEY' >> /root/.ssh/authorized_keys"

3. Run RCCL test#

# Get pod IPs
W0_IP=$(kubectl get pod rccl-worker-0 -o jsonpath='{.status.podIP}')
W1_IP=$(kubectl get pod rccl-worker-1 -o jsonpath='{.status.podIP}')

# Run (GPUS_PER_NODE must match amd.com/gpu in the pod spec above)
kubectl exec rccl-worker-0 -- env GPUS_PER_NODE=8 run_rccl.sh $W0_IP $W1_IP all_reduce_perf

Available collectives: all_reduce_perf, broadcast_perf, reduce_scatter_perf, all_gather_perf, alltoall_perf, reduce_perf, scatter_perf, gather_perf, sendrecv_perf

A successful run ends with:

# Avg bus bandwidth    : 6.66557

4. Cleanup#

kubectl delete pod rccl-worker-0 rccl-worker-1

Automated Validation with CVF#

For automated, fleet-wide cluster validation, use the Cluster Validation Framework instead of deploying pods manually. Set the image in the CVF config.yaml:

RCCL_WORKLOAD_IMAGE: "rocm/roce-workload:<tag>"

See the CVF deployment steps for the full setup.