|
| 1 | +# Clusters |
| 2 | + |
| 3 | +Reference for the clusters operatorx targets: hardware, how the runner is |
| 4 | +launched per platform, and the per-platform quirks. Access details |
| 5 | +(hostnames, credentials, checkout paths) are deployment-specific and are not |
| 6 | +included here — fill them in for your own environment. |
| 7 | + |
| 8 | +Platform → cluster routing lives in `operatorx/clusters.py` (`CLUSTER_PLATFORMS`); |
| 9 | +SLURM/env defaults live in `scripts/submit_run.py` (`DEFAULT_CLUSTER`). |
| 10 | + |
| 11 | +## Conventions |
| 12 | + |
| 13 | +- `submit_run.py` is **SLURM-only** — it submits `sbatch`/`srun` jobs and is |
| 14 | + used on the NVIDIA and AMD clusters. On TPU / Trainium hosts there is no |
| 15 | + SLURM; run `python -m operatorx` directly inside the appropriate venv/image. |
| 16 | +- Point `OPERATORX_SQUASH_DIR` at your container squash directory, and set |
| 17 | + `OPERATORX_PARTITION` / `OPERATORX_ACCOUNT` / `OPERATORX_QOS` to your |
| 18 | + cluster's SLURM values (see the env-var table at the bottom). |
| 19 | +- Set `OPERATORX_JOB_NAME` to a recognizable SLURM job name for your runs. |
| 20 | + |
| 21 | +## At a glance |
| 22 | + |
| 23 | +| Cluster id | Platform | Hardware | Scheduler | |
| 24 | +|---------------|----------|---------------------------------|------------| |
| 25 | +| `b200_dgx_8x` | nvidia | 8× B200 SXM (DGX-style) | SLURM | |
| 26 | +| `b300_hgx_8x` | nvidia | 8× B300 (HGX-style) | SLURM | |
| 27 | +| `b200_nvl72` | nvidia | B200 NVL72 (routing only) | SLURM | |
| 28 | +| `mi355x_8x` | amd | 8× MI355 OAM per node | SLURM | |
| 29 | +| `v6e_1x` | tpu | 1× TPU v6e (1×1) | run direct | |
| 30 | +| `v6e_4x` | tpu | 4× TPU v6e (2×2) | run direct | |
| 31 | +| `v6e_pod` | tpu | TPU v6e pod slice | run direct | |
| 32 | +| `trn3_1x` | trainium | 1 LNC of a trn3 host | run direct | |
| 33 | +| `trn3_8x` | trainium | trn3 subset | run direct | |
| 34 | +| `trn3_16x` | trainium | full trn3 host (16 devices) | run direct | |
| 35 | + |
| 36 | +## NVIDIA |
| 37 | + |
| 38 | +### b200 — DGX-style, 8× B200 SXM (`b200_dgx_8x`) |
| 39 | + |
| 40 | +| Setting | Value | |
| 41 | +|----------|----------------------------------------------------------| |
| 42 | +| Hardware | 8× B200 SXM per node | |
| 43 | +| GRES | e.g. `gpu:nvidia_b200:8` | |
| 44 | +| Defaults | `submit_run.py` defaults target this cluster (`OPERATORX_CLUSTER=b200_dgx_8x`, partition/squash dir from the script/env) | |
| 45 | + |
| 46 | +```bash |
| 47 | +OPERATORX_JOB_NAME=<job-name> python3 scripts/submit_run.py nvidia |
| 48 | +``` |
| 49 | + |
| 50 | +### b300 — HGX-style, 8× B300 (`b300_hgx_8x`) |
| 51 | + |
| 52 | +| Setting | Value | |
| 53 | +|-------------------|--------------------------------------------------------------| |
| 54 | +| Hardware | 8× B300 per node | |
| 55 | +| OS note | If the login node runs Python 3.10, `submit_run.py` falls back to `tomli` for TOML parsing | |
| 56 | +| Excluded backends | DeepEP — known IBGDA hangs on this fabric, so exclude it | |
| 57 | + |
| 58 | +Override the SLURM knobs for your cluster and drop DeepEP: |
| 59 | + |
| 60 | +```bash |
| 61 | +OPERATORX_CLUSTER=b300_hgx_8x \ |
| 62 | +OPERATORX_PARTITION=<partition> \ |
| 63 | +OPERATORX_ACCOUNT=<account> \ |
| 64 | +OPERATORX_QOS=<qos> \ |
| 65 | +OPERATORX_SQUASH_DIR=<squash-dir> \ |
| 66 | +OPERATORX_BACKENDS=torch,deepgemm,flashinfer,sglang \ |
| 67 | +OPERATORX_JOB_NAME=<job-name> \ |
| 68 | +python3 scripts/submit_run.py nvidia |
| 69 | +``` |
| 70 | + |
| 71 | +### `b200_nvl72` |
| 72 | + |
| 73 | +Present in `CLUSTER_PLATFORMS` (routes to nvidia) as a placeholder; no |
| 74 | +hardware-specific guidance yet. |
| 75 | + |
| 76 | +## AMD — `mi355x_8x` |
| 77 | + |
| 78 | +| Setting | Value | |
| 79 | +|-----------|--------------------------------------------------------------| |
| 80 | +| Hardware | 8× MI355 OAM per node | |
| 81 | +| GRES | e.g. `gpu:amd_instinct_mi355_oam:8` | |
| 82 | +| Backends | `containers.toml` `amd.torch` / `amd.aiter` → `vllm-openai-rocm` | |
| 83 | + |
| 84 | +```bash |
| 85 | +OPERATORX_CLUSTER=mi355x_8x \ |
| 86 | +OPERATORX_PARTITION=<partition> \ |
| 87 | +OPERATORX_SQUASH_DIR=<squash-dir> \ |
| 88 | +OPERATORX_JOB_NAME=<job-name> \ |
| 89 | +python3 scripts/submit_run.py amd |
| 90 | +``` |
| 91 | + |
| 92 | +## TPU |
| 93 | + |
| 94 | +No SLURM — run `python -m operatorx` directly on the TPU VM. Access a VM with |
| 95 | +`gcloud compute tpus tpu-vm ssh <vm-name> --zone=<zone>`. |
| 96 | + |
| 97 | +| Cluster id | Topology | Chips | ws range | Use for | |
| 98 | +|------------|----------|-------|----------|-----------------------------------------------------| |
| 99 | +| `v6e_1x` | 1×1 | 1 | 1 | Single-chip tests (gemm, moe_gemm). No collectives. | |
| 100 | +| `v6e_4x` | 2×2 | 4 | 1–4 | Collectives + MoE-EP up to ws=4. | |
| 101 | +| `v6e_pod` | pod | pod | — | Multi-host v6e pod slice. | |
| 102 | + |
| 103 | +```bash |
| 104 | +OPERATORX_CLUSTER=v6e_4x python -m operatorx |
| 105 | +``` |
| 106 | + |
| 107 | +`moe_forward` on TPU emits `unsupported` unless Google's MaxText is installed |
| 108 | +on the VM (the `jax` backend works without it): |
| 109 | + |
| 110 | +```bash |
| 111 | +git clone https://github.com/AI-Hypercomputer/maxtext ~/maxtext |
| 112 | +pip install -e ~/maxtext |
| 113 | +``` |
| 114 | + |
| 115 | +## Trainium — `trn3_16x` |
| 116 | + |
| 117 | +No SLURM — run `python -m operatorx` directly on the instance. |
| 118 | + |
| 119 | +| Setting | Value | |
| 120 | +|---------------------|-------------------------------------------------------------------| |
| 121 | +| Hardware | 16 Neuron devices × 4 cores (64 physical NCs, 8 LNC=2 logical units) | |
| 122 | +| Per-device HBM | 144 GiB | |
| 123 | +| Cluster ids | `trn3_16x` (full host); `trn3_8x`, `trn3_1x` are subset configs | |
| 124 | +| Device topology cmd | `/opt/aws/neuron/bin/neuron-ls` (may not be on `PATH`) | |
| 125 | + |
| 126 | +Neuron venvs (standard AWS Neuron paths under `/opt/`): |
| 127 | + |
| 128 | +- `aws_neuronx_venv_pytorch_2_9` — base PyTorch + NeuronX |
| 129 | +- `aws_neuronx_venv_pytorch_2_9_nxd_inference` — adds NeuronX Distributed Inference |
| 130 | +- `aws_neuronx_venv_pytorch_2_9_nxd_training` — adds NXD training |
| 131 | +- `aws_neuronx_venv_pytorch_inference_vllm_0_16` — vLLM build |
| 132 | +- `aws_neuronx_venv_jax_0_7` — Jax (not used by operatorx) |
| 133 | + |
| 134 | +```bash |
| 135 | +source /opt/aws_neuronx_venv_pytorch_2_9/bin/activate |
| 136 | +OPERATORX_CLUSTER=trn3_16x python -m operatorx |
| 137 | +``` |
| 138 | + |
| 139 | +The Trainium runner forces `NEURON_LOGICAL_NC_CONFIG=2` and appends |
| 140 | +`--logical-nc-config=2` to `NEURON_CC_FLAGS` |
| 141 | +(`operatorx/runners/trainium/runner.py`). `world_size=1` on this platform = |
| 142 | +one LNC=2 unit (1 HBM bank + 2 paired NC-v4 cores). |
| 143 | + |
| 144 | +## Cluster id → platform (`operatorx/clusters.py`) |
| 145 | + |
| 146 | +```python |
| 147 | +CLUSTER_PLATFORMS = { |
| 148 | + "b200_dgx_8x": "nvidia", |
| 149 | + "b300_hgx_8x": "nvidia", |
| 150 | + "b200_nvl72": "nvidia", |
| 151 | + "mi355x_8x": "amd", |
| 152 | + "v6e_1x": "tpu", |
| 153 | + "v6e_4x": "tpu", |
| 154 | + "v6e_pod": "tpu", |
| 155 | + "trn3_1x": "trainium", |
| 156 | + "trn3_8x": "trainium", |
| 157 | + "trn3_16x": "trainium", |
| 158 | +} |
| 159 | +``` |
| 160 | + |
| 161 | +## `submit_run.py` env vars |
| 162 | + |
| 163 | +| Var | Default | Notes | |
| 164 | +|------------------------|-------------------------------|---------------------------------------------------------------------| |
| 165 | +| `OPERATORX_CLUSTER` | per-platform (see script) | Routes the runner via `CLUSTER_PLATFORMS` | |
| 166 | +| `OPERATORX_PARTITION` | site default | SLURM partition | |
| 167 | +| `OPERATORX_ACCOUNT` | (omitted) | SLURM `--account` | |
| 168 | +| `OPERATORX_QOS` | (omitted) | SLURM `--qos` | |
| 169 | +| `OPERATORX_SQUASH_DIR` | site default | Where `<safe_image>.sqsh` lives (used by `srun --container-image=`) | |
| 170 | +| `OPERATORX_BACKENDS` | all backends for the platform | CSV allowlist | |
| 171 | +| `OPERATORX_JOB_NAME` | `benchmark` | SLURM job name | |
| 172 | +| `OPERATORX_TESTLISTS` | all under `testlists/` | CSV of testlist stems to run | |
| 173 | +| `OPERATORX_TIME_MIN` | `30` | `--time` (minutes) | |
| 174 | + |
| 175 | +`WORLD_SIZES = [1, 2, 4, 8]` — single-node only; multi-node NCCL IB bring-up |
| 176 | +currently hangs on the B200/B300 fabrics. `MASTER_ADDR` is derived by parsing |
| 177 | +`SLURM_NODELIST`. |
0 commit comments