Pollux: Co-adaptive Cluster Scheduling for Goodput-Optimized Deep Learning

Aurick Qiao, Sang Keun Choe, Suhas Jayaram Subramanya, Willie Neiswanger, Qirong Ho, Hao Zhang, Gregory R. Ganger, Eric P. Xing | Petuum, Inc. / Carnegie Mellon University / UC Berkeley / MBZUAI | OSDI '21, July 14–16, 2021


Problem

DL cluster schedulers make users specify how many GPUs each job gets. Allocating too many causes long queuing times and inefficient resource use; allocating too few causes long runtimes and unused resources. The decision is especially hard in a shared cluster because the optimal choice is dynamic and depends on cluster load while the job is running. Recent elastic schedulers can pick the resource amount for the user, but do so blindly with respect to training-related configurations that matter just as much — batch size and learning rate influence how much computation is needed to train the model, their optimal values vary by task and architecture, and they depend strongly on the allocation. Because resource count, batch size, and learning rate are inter-dependent they must be configured jointly, and because clusters are dynamic their optimal values change over time. Existing schedulers are agnostic to the statistical efficiency of DL training and to this inter-dependence entirely.


Core Insight

A properly-configured DL job balances system throughput (examples processed per wall-clock second) against statistical efficiency (training progress per example processed) — raising the batch size increases the first and decreases the second, and how fast the second falls depends on training progress, since a job late in training can tolerate 10× or larger batch sizes without degrading statistical efficiency. Defining goodput as the product of the two makes both axes optimizable by a single scheduler, and both factors can be learned online from a running job and then used predictively for allocations and batch sizes never actually tried.


Method

Goodput (Definition 3.1) is the product of throughput and statistical efficiency at iteration t:

GOODPUT_t(⋆) = THROUGHPUT(⋆) × EFFICIENCY_t(M(⋆)) ... (Eqn. 4)

Pollux controls ⋆ = (a, m, s): the allocation vector a (GPUs per node), the per-GPU batch size m, and the number of gradient accumulation steps s, giving total batch size M(a,m,s) = SUM(a) × m × (s+1).

Statistical efficiency is modeled from the pre-conditioned gradient noise scale (PGNS) ϕ_t = tr(PΣPᵀ)/|Pg|² (Eqn. 5), a generalization of the gradient noise scale derived from pre-conditioned SGD so that Adam/AdaGrad are supported. Since it takes 1 + ϕ_t/M iterations to make equal progress across batch sizes:

EFFICIENCY_t(M) = (ϕ_t + M_0) / (ϕ_t + M) ... (Eqn. 6)

System throughput is THROUGHPUT = M / T_iter, with T_grad linear in per-GPU batch size (Eqn. 8) and T_sync linear in GPU count using separate parameter pairs for intra-node vs. inter-node placement (Eqn. 9). Compute/communication overlap is captured by a learnable exponent γ ≥ 1, and gradient accumulation adds s extra local passes:

T_iter(a,m,s) = s × T_grad(a,m) + ( T_grad(a,m)^γ + T_sync(a)^γ )^(1/γ) ... (Eqn. 11)

γ = 1 means no overlap (T_grad + T_sync); γ → ∞ means perfect overlap (max(T_grad, T_sync)).

Two-component architecture:

                    +-------------------------------------+
                    |            PolluxSched              |
                    | (Kubernetes service, cluster-wide)  |
                    |  maximize FITNESS_p(A) over J jobs  |
                    |  + re-allocation penalty            |
                    |  + interference avoidance           |
                    +-------------------------------------+
                       ^  (theta_sys, phi_t)   |  allocation
                       |  reported every 30s   |  matrix A
                       |                       v  (every 60s)
     +-----------------+-----------+   +-------+-------------------+
     |     PolluxAgent (job 1)     |   |    PolluxAgent (job J)    |
     | fit EFFICIENCY_t, THROUGHPUT|   |     ... one per job ...   |
     | tune (m*, s*) + LR scaling  |   |                           |
     +-----------------------------+   +---------------------------+
             |                                       |
             v                                       v
        PyTorch training workers (all-reduce via NCCL 2.7.8)

Experimental Setup

Component Value
Nodes 16
GPUs per node 4 × NVIDIA T4
Total GPUs 64
Instance type AWS EC2 g4dn.12xlarge
vCPUs / memory per node 48 vCPUs, 192 GB
Local storage 900 GB SSD
Placement all instances in the same placement group
Orchestration Kubernetes 1.18.2
Shared storage CephFS 14.2.8 (checkpoint-restart elasticity)
Framework / collective PyTorch, gradients synchronized with NCCL 2.7.8
Workload 160 jobs sampled from hours 3–10 (busiest 8h) of the Microsoft DL cluster traces
Workload models ResNet-50/ImageNet, YOLOv3/PASCAL-VOC, DeepSpeech2/CMU-ARCTIC, BERT-finetune/SQuAD, ResNet18/Cifar10, NeuMF/MovieLens
Baselines Tiresias+TunedJobs, Optimus+Oracle+TunedJobs, and untuned variants
Pollux config 60 s scheduling interval; δ = 30 s; agent reports every 30 s; default p = −1
Simulator discrete-time, 8 traces per experiment, 146 measured GPU allocations+placements
HPO testbed 2 × NVIDIA DGX A100 nodes, 8 A100 GPUs each; TPE, 4 concurrent trials, 100 total

Baseline job configurations were manually tuned: a GPU count was deemed valid only if the optimal batch size for that count achieves 50%–80% of ideal linear scalability. The authors state this assumption of uniformly sophisticated users is unrealistically biased in favor of the baselines.


Headline Quantitative Results

Table 2 — testbed macrobenchmark:

Policy Avg JCT 99%tile JCT Makespan
Pollux (p = −1) 0.76 h 11 h 16 h
Optimus+Oracle+TunedJobs 1.5 h 15 h 20 h
Tiresias+TunedJobs 1.2 h 15 h 24 h
Optimus+Oracle 2.7 h 22 h 28 h
Tiresias 2.8 h 25 h 31 h
Pollux (p = +1) 0.83 h 10 h 16 h
Pollux (p = −10) 0.84 h 12 h 18 h

Limitations


Open Problems Called Out

  1. Heterogeneous-accelerator goodput — extend the throughput model with a Gavel-style cross-accelerator metric.
  2. Alternative THROUGHPUT models for specialized hardware, sophisticated synchronization algorithms, alternative parallelization strategies, and larger scales, exploiting GOODPUT_t's modularity.
  3. A full goodput-driven cloud auto-scaling system — the paper's auto-scaler is preliminary evidence only.
  4. Pollux × HPO — a full evaluation across HPO algorithm types (Bayesian-optimization vs. bandit-based trial schedulers).
  5. Better LR scaling rules incorporated via the SCALE_LR plug-in interface, potentially raising the usable batch-size ceiling.
  6. Richer adaptation tooling — KungFu's mechanisms are suggested for implementing PolluxAgent's adaptive policies.

Note on NCCL Tuning

Pollux names the collective library explicitly: gradients are synchronized with NCCL 2.7.8, which per the paper "uses either ring all-reduce or tree all-reduce depending on the detected GPUs and their placements and its own internal performance estimates." Pollux does not touch that decision — it abstracts the whole collective into two fitted parameter pairs, (α_sync^local, β_sync^local) for intra-node and (α_sync^node, β_sync^node) for inter-node placements (Eqn. 9), plus the overlap exponent γ. The cost of that abstraction shows up in the sharp per-iteration-time jump beyond 4 GPUs when inter-node synchronization becomes required, and in the finding that every measured model except ImageNet is highly sensitive to inter-node synchronization. The authors flag the limit themselves, noting the linear assumptions "may diverge from reality for ... sophisticated synchronization algorithms" — which places NCCL-level algorithm selection squarely in the gap Pollux's fitted T_sync leaves open.