PPLX Garden Expert Parallelism Benchmark
All-to-all dispatch and combine latency benchmarks for MoE expert parallelism using pplx-garden and UCCL-EP over EFA
View on GitHubOverview
This benchmark measures all-to-all dispatch and combine latency for Mixture-of-Experts (MoE) expert parallelism using Perplexity’s pplx-garden kernels. It compares expert-parallel (EP) communication performance across EFA-based and ConnectX-7 (CX7) transports, including comparisons against DeepEP and the UCCL-EP backend.
This page is filed under the communication benchmark category because it measures all-to-all
collective communication latency; the upstream material lives under the micro-benchmarks/expert-parallelism
family, which is preserved in the githubPath above.
PPLX Garden Benchmark
Clone the pplx-garden repository:
git clone https://github.com/perplexityai/pplx-garden.git
Build the images, then convert the benchmark image to an enroot squash file for Slurm. Run these
commands from the directory containing pplx-garden.Dockerfile, with the pplx-garden clone
alongside it:
docker build -t pplx-garden-dev - < ./pplx-garden/docker/dev.Dockerfile && docker build -t pplx-garden -f pplx-garden.Dockerfile .
This command is transcribed verbatim from the upstream README. Note the build context of each
stage: the first docker build passes dev.Dockerfile to Docker on stdin (- reads the
Dockerfile from standard input) to produce the pplx-garden-dev base image, and the second
builds pplx-garden from pplx-garden.Dockerfile in the current directory. Because the stdin
build has no file context, the dev.Dockerfile stage must be self-contained (no COPY/ADD
from a local context); the pplx-garden.Dockerfile stage, by contrast, uses FROM pplx-garden-dev:latest and copies the pplx-garden clone into /app from the current
directory. If your copy of dev.Dockerfile requires local files, supply an appropriate build
context instead of piping the Dockerfile on stdin.
enroot import -o pplx-garden.sqsh dockerd://pplx-garden
Run the benchmark with the upstream Slurm script:
sbatch pplx-garden.sbatch
The pplx-garden.sbatch
script runs benchmarks.bench_all_to_all across 2 nodes with 8 GPUs per node. As written, it
launches with --nets-per-gpu 2, --nvlink=8, and --max-num-tokens 128, which corresponds to
the decode (128-token) configuration. The prefill (4096-token) results in the table below are
reported upstream but are not produced by the token count hard-coded in the committed script;
reproducing them requires adjusting --max-num-tokens to 4096. Consult the upstream script and
README for the exact configuration used for each row.
All-to-all performance results
The tables below are transcribed verbatim from the upstream README. Blank cells were not
measured; crash indicates the run did not complete. Columns prefixed with My are the
benchmark author’s own runs on this setup; the remaining columns are the reference figures
reported upstream. See the UCCL-EP variant for how the UCCL-EP numbers are
produced.
Decode (128 tokens) dispatch and combine median latency (μs)
| EP size | My UCCL EP dispatch | My pplx-EFA dispatch | pplx-EFA dispatch | pplx-CX7 dispatch | DeepEP-CX7 dispatch | My UCCL EP combine | My pplx-EFA combine | pplx-EFA combine | pplx-CX7 combine | DeepEP-CX7 combine |
|---|---|---|---|---|---|---|---|---|---|---|
| EP128 | — | 424.5 | — | — | — | — | 588.5 | — | — | — |
| EP64 | crash | 268.6 | 266.7 | 187.5 | 177.9 | crash | 393.6 | 391.2 | 309.1 | 325.0 |
| EP32 | 358.0 | 230.9 | 229.1 | 153.9 | 159.1 | 689.3 | 336.9 | 335.0 | 266.3 | 285.0 |
| EP16 | 301.1 | 218.0 | 214.8 | 110.2 | 123.9 | 834.5 | 244.6 | 241.5 | 185.5 | 203.0 |
| EP8 | 66.1 | 50.6 | 49.7 | 50.5 | 42.6 | 86.6 | 64.1 | 64.2 | 65.3 | 72.0 |
Prefill (4096 tokens) dispatch and combine median latency (μs)
| EP size | My pplx-EFA dispatch | pplx-EFA dispatch | pplx-CX7 dispatch | DeepEP-CX7 dispatch | My pplx-EFA combine | pplx-EFA combine | pplx-CX7 combine | DeepEP-CX7 combine |
|---|---|---|---|---|---|---|---|---|
| EP128 | 5883.4 | — | — | — | 10785.1 | — | — | — |
| EP64 | 5395.6 | 5334.3 | 4665.2 | 5071.6 | 9854.9 | 9779.3 | 8771.1 | 5922.7 |
| EP32 | 4605.2 | 4619.0 | 4011.8 | 3680.2 | 8286.3 | 8271.5 | 7526.8 | 3565.4 |
| EP16 | 3181.4 | 3196.7 | 2734.8 | 2481.9 | 5373.6 | 5379.1 | 1062.2 | 1863.9 |
| EP8 | 1076.0 | 1052.4 | 5071.1 | 1810.3 | 1354.0 | 1396.7 | 1405.1 | 962.9 |
Anomalies preserved from the source. Two prefill cells break the otherwise-monotonic trend and appear physically implausible relative to their neighbors: the EP8
pplx-CX7 dispatchvalue of5071.1is roughly 5x the surrounding CX7 dispatch values (which trend downward: 4665.2 → 4011.8 → 2734.8) and about 5x the EP8pplx-EFA dispatchvalue of1052.4; and the EP16pplx-CX7 combinevalue of1062.2is far below its EP32 and EP64 neighbors (7526.8 and 8771.1). These values are reproduced exactly as reported in the upstream README, which does not annotate or explain them. They may reflect transcription artifacts or measurement outliers in the source; treat them with caution and verify against the current upstream README before relying on them.
UCCL-EP variant
A UCCL-EP build is provided for comparison. Clone uccl-project/uccl alongside the benchmark
directory, then build pplx-garden_uccl-ep.Dockerfile (which uses FROM pplx-garden:latest and
copies the uccl clone into /opt/uccl) and run its Slurm script:
git clone https://github.com/uccl-project/uccl.git
docker build -t pplx-garden_uccl-ep -f pplx-garden_uccl-ep.Dockerfile .
enroot import -o pplx-garden_uccl-ep.sqsh dockerd://pplx-garden_uccl-ep
sbatch uccl-pplx-garden.sbatch
The uccl-pplx-garden.sbatch
script runs the UCCL-EP variant, benchmarks.uccl_bench_all_to_all, with the --use-uccl flag.
Like the base script, it launches across 2 nodes with 8 GPUs per node and --max-num-tokens 128.
Consult the upstream script for its exact runtime flags.
Source
The clone/build/run commands, the Dockerfile and .sbatch names, and every latency figure
(including the crash cells and blank/not-measured cells) are transcribed verbatim from the
upstream
micro-benchmarks/expert-parallelism/pplx-garden-benchmark/README.md.
pplx-garden.Dockerfile,
pplx-garden_uccl-ep.Dockerfile,
and the .sbatch scripts live in that upstream benchmark directory and are the source of truth
for the exact launch configuration. Because these figures are a point-in-time snapshot, always
consult the upstream README for the latest measurements.