Architecture & Design Analysis

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

Source: Qiao, A.; Choe, S. K.; Subramanya, S. J.; Neiswanger, W.; Ho, Q.; Zhang, H.; Ganger, G. R.; Xing, E. P. 15th USENIX Symposium on Operating Systems Design and Implementation (OSDI '21), July 14-16, 2021. ISBN 978-1-939133-22-9. Affiliations: 1 = Petuum, Inc.; 2 = Carnegie Mellon University; 3 = UC Berkeley; 4 = MBZUAI. Qiao (1,2), Choe (2), Subramanya (2), Neiswanger (1,2), Ho (1), Zhang (1,3), Ganger (2), Xing (4,1,2). Code: https://github.com/petuum/adaptdl — artifact branch osdi21-artifact; raw testbed logs at https://github.com/petuum/pollux-results Reader: Direct PDF text extraction (pdftotext -layout and -raw), cross-checked page-by-page. Analyst: Vishwakarma Date: 2026-09-01

Conventions. Fig N with a ^ caption is a diagram drawn in this document; Figure N / paper Fig. N refers to the Pollux paper. Paper Figures 1, 2, 3, 5, 6, 7, 8 and 9 are plots whose numeric axis values are not recoverable from the text layer — this document reports only what the caption or body text states. No axis value has been invented and no bar label fitted against a table. Anything that is my own inference rather than a paper claim is marked [derived inference].


Table of Contents

  1. System Architecture (PolluxAgent + PolluxSched)
  2. System-Under-Test Architecture (testbed, workload, simulator)
  3. Design-Space Diagram (axes swept, axes held fixed)
  4. Algorithm & Control-Flow Diagrams (key procedures)
  5. Quantitative Results — Empirical Findings by Regime
  6. Configuration-Regime Trade-off Tables
  7. Bottlenecks & Insights Surfaced by the Measurements
  8. Limitations of the Methodology
  9. Note on NCCL Tuning
  10. Analogy

1. System Architecture (PolluxAgent + PolluxSched)

1.1 The central abstraction: goodput

Everything in Pollux is downstream of one scalar per job.

Def. 3.1 (Goodput). "The goodput of a DL training job at iteration t is the product between its system throughput and its statistical efficiency at iteration t,"

GOODPUT_t(*) = THROUGHPUT(*) x EFFICIENCY_t(M(*)) (Eqn. 4)

where * "represents any configuration parameters that jointly influence the throughput and batch size during training, and M is the total batch size summed across all allocated GPUs." Footnote 2 grounds the name: "Our notion of goodput for DL is analogous to the traditional definition of goodput in computer networks, ie. the useful portion of throughput as benchmarked by training progress per unit of wall-clock time." Pollux instantiates * = (a, m, s):

Symbol Type Paper's definition (verbatim)
a Z^N "the allocation vector, where a_n is the number of GPUs allocated from node n"
m Z "the per-GPU batch size"
s Z "number of gradient accumulation steps (§3.2)"

with M(a, m, s) = SUM(a) x m x (s + 1).

+-------------------------------------------------------------------+
|                     GOODPUT_t(a, m, s)                            |
|   +--------------------------+     +--------------------------+   |
|   |  THROUGHPUT(a, m, s)     |  x  |  EFFICIENCY_t(M(a,m,s))  |   |
|   |  (system-side factor)    |     |  (statistics-side factor)|   |
|   |  = M(a,m,s) / T_iter     |     |  = (phi_t + M0)          |   |
|   |            (Eqn. 7)      |     |    / (phi_t + M)  (Eq. 6)|   |
|   |  fitted from theta_sys   |     |  driven by PGNS phi_t    |   |
|   |  (7 params, Eqn. 12)     |     |                          |   |
|   +--------------------------+     +--------------------------+   |
|      grows with GPUs and batch size    falls with batch size      |
+-------------------------------------------------------------------+
^ Fig 1: The goodput product. The two factors pull in opposite
  directions along the batch-size axis, which is why a scalar
  maximum exists and why it moves as phi_t drifts during training.

The paper bounds it: "Pollux only considers batch sizes that are at least the initial batch size, ie. M >= M0... Therefore, goodput can be interpreted as the portion of the throughput that is useful for training progress, being equal to the throughput if and only if perfect statistical efficiency is achieved."

1.2 The efficiency model — pre-conditioned gradient noise scale

Pollux generalizes the gradient noise scale so it covers adaptive optimizers, defining the pre-conditioned gradient noise scale (PGNS):

                    tr( P Sigma P^T )
        phi_t  =   -------------------                          (Eqn. 5)
                        | P g |^2

  g      = the true gradient
  P      = the pre-conditioning matrix of the adaptive SGD algorithm
  Sigma  = the covariance matrix of per-example stochastic gradients

It is "derived by closely following the original derivation of the GNS ('simple' noise scale in [46]) starting from pre-conditioned SGD rather than vanilla SGD," and "is mathematically equivalent to the GNS for the special case of vanilla SGD." Because "it takes 1 + phi_t/M training iterations to make a similar amount of training progress across different batch sizes M":

                              phi_t + M0
        EFFICIENCY_t(M)  =  --------------                      (Eqn. 6)
                              phi_t + M

Stated properties: "If EFFICIENCY_t(M) = E, then (1) 0 < E <= 1, and (2) training using batch size M will need to process 1/E times as many training examples to make the same progress as using batch size M0."

Estimation of phi_t follows "Appendix A.1 of [46], except using the pre-conditioned gradient Pg... efficiently when there are multiple data-parallel processes by using the different values of g_k already available on each GPU k." The single-GPU, no-accumulation case (s = 0) breaks that estimator, so "Pollux switches to a differenced variance estimator [63]." Learning-rate rescaling is delegated to a plug-in, SCALE_LR(M0, M) -> lambda, "called before every model update step," implementable as "AdaScale, square-root scaling [40], linear scaling [21] and LEGW [69]."

1.3 The throughput model — a placement-aware parametric fit

  THROUGHPUT(a, m, s) = M(a, m, s) / T_iter(a, m, s)            (Eqn. 7)

  T_grad(m) = alpha_grad + beta_grad * m                        (Eqn. 8)

                 |  0                                    if K = 1
  T_sync(a,m) = <   alpha_sync^local + beta_sync^local * (K-2)  if N=1, K>=2
                 |  alpha_sync^node  + beta_sync^node  * (K-2)  otherwise
                                                                 (Eqn. 9)

  T_iter(a,m,0) = ( T_grad^gamma + T_sync^gamma )^(1/gamma)     (Eqn. 10)

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

  K = SUM(a) = number of allocated GPUs
  N = number of physical nodes occupied by at least one replica

  theta_sys = ( alpha_grad, beta_grad, alpha_sync^local,
                beta_sync^local, alpha_sync^node,
                beta_sync^node, gamma )                         (Eqn. 12)

gamma is the compute/communication overlap dial: "Eqn. 10 has the property that T_iter = T_grad + T_sync when gamma = 1, and smoothly transitions towards T_iter = max(T_grad, T_sync) as gamma -> inf" — a stand-in for partial overlap whose "degree... depends on structures in the specific DL model being trained, like the ordering and sizes of its layers." The (K - 2) slope exists "to account for performance retrogressions associated with using three or more GPUs, such as increasing likelihood of stragglers or network delays." The local/node branch is the topology hook, and "can be extended to account for rack-level locality by adding a third pair of parameters." Together, (theta_sys, phi_t, M0) "fully specify the DL job's GOODPUT function at its current training progress."

1.4 The two-component architecture

+===================================================================+
|  PolluxSched   (one per cluster; Kubernetes service)              |
|  +-------------------+   +----------------------------------+     |
|  | Goodput registry  |-->| Population-based search over     |     |
|  | (theta_sys,phi_t, |   | allocation matrices A maximizing |     |
|  |  M0) per job j    |   | FITNESS_p(A)                     |     |
|  +-------------------+   +----------------------------------+     |
|   constraints inside the search: node capacity; interference      |
|   avoidance (<= 1 distributed job per node); REALLOC_FACTOR_j     |
+---------|-------------------------------------------|-------------+
          ^ every 30s: (theta_sys, phi_t)              | every 60s:
          | reported upward                            v apply A via
+---------|-------------------------------------------|-------------+
|  PolluxAgent  (one per job; Python library imported  | Kubernetes  |
|  into the training code)                             | Pod churn   |
|  +-----------------+  +------------------+  +-----------------+    |
|  | Profiler        |  | Model fitter     |  | Tuner           |    |
|  | - T_iter per it |->| - L-BFGS-B on    |->| (m*,s*) =       |    |
|  | - tuples        |  |   RMSLE vs Eq.11 |  |  argmax GOODPUT |    |
|  |   (a,m,s,T_iter)|  | - alpha,beta >=0 |  |  (Eqn. 13)      |    |
|  | - noise phi_t   |  | - gamma in [1,10]|  +--------+--------+    |
|  +-----------------+  | - prior-driven   |           v             |
|                       |   exploration    |  +------------------+   |
|                       +------------------+  | SCALE_LR(M0,M)   |   |
|                                             | -> lambda plug-in|   |
|                                             +------------------+   |
+===================================================================+
     runtime below:  PyTorch + NCCL 2.7.8 all-reduce;
                     Kubernetes 1.18.2 + CephFS 14.2.8 checkpoints
^ Fig 2: Pollux's two-granularity control loop. The narrow waist
  between components is the triple (theta_sys, phi_t, M0) going up
  and the allocation matrix A coming down; neither side sees the
  other's internals.

Paper Figure 4 ("Co-adaptive scheduling architecture of Pollux") is schematic with no numeric labels. The contract: "While PolluxAgent adapts each training job to make efficient use of its allocated resources, PolluxSched dynamically re-allocates each job's resources, taking into account the PolluxAgent's ability to tune its job."

1.5 The cluster-wide objective

                             ( 1   J                     )^(1/p)
   FITNESS_p(A)  =           ( - SUM  SPEEDUP_j(A_j)^p   )       (Eqn. 14)
                             ( J  j=1                    )

                          max_{m,s} GOODPUT_j(A_j, m, s)
   SPEEDUP_j(A_j)  =    ----------------------------------       (Eqn. 15)
                          max_{m,s} GOODPUT_j(a_f, m, s)

A is "an allocation matrix with each row A_j being the allocation vector for a job j... and J is the total number of running and pending jobs sharing the cluster." The denominator baseline a_f is "a fair resource allocation for the job, defined to be an exclusive 1/J share of the cluster." Footnote 5 draws the boundary against Themis: "SPEEDUP is related to training performance at a moment in time, whereas finish-time fairness is related to end-to-end job completion time."

On the exponent: "When p = 1, FITNESS_p is the average of SPEEDUP values across all jobs. This causes PolluxSched to allocate more GPUs to jobs that achieve a high SPEEDUP when provided with many GPUs... However, as p -> -inf, FITNESS_p smoothly approaches the minimum of SPEEDUP values, in which case maximizing FITNESS_p promotes equal SPEEDUP between training jobs, but ignores the overall cluster goodput and resource efficiency. Thus, p can be considered a 'fairness knob', with larger negative values being more fair." Chosen operating point: "p = -1 achieves most goodput improvements and reasonable fairness."

1.6 Re-allocation penalty, interference avoidance, non-adaptive jobs

Re-allocation penalty. "Using the popular checkpoint-restart method, we measured between 15 and 120 seconds of delay depending on the size of the model being trained and other initialization tasks in the training code."

   SPEEDUP_j(A_j)  <--  SPEEDUP_j(A_j) x REALLOC_FACTOR_j(delta)

                              T_j - R_j * delta
   REALLOC_FACTOR_j(delta) = -------------------
                              T_j + delta

     T_j = age of the job;  R_j = re-allocations so far;
     delta = estimate of the re-allocation delay

"Intuitively, REALLOC_FACTOR_j(delta) scales SPEEDUP_j(A_j) according to the assumption that the historical average rate of re-allocations for job j will continue indefinitely into the future" — so a job with a higher historical re-allocation rate is penalized more.

Interference avoidance. "Xiao et al. [66] report up to 50% slowdown for DL jobs which compete with each other for network resources. PolluxSched mitigates this issue by disallowing different distributed jobs (each using GPUs across multiple nodes) from sharing the same node" — "implemented as a constraint in Pollux's search algorithm."

Non-adaptive jobs. For a job with fixed batch size (M = M0), PolluxSched "simply fixes EFFICIENCY_t for that job to 1 and can continue to adapt its resource allocations based solely on its system throughput."


2. System-Under-Test Architecture

2.1 Testbed

"We conduct experiments using a cluster consisting of 16 nodes and 64 GPUs. Each node is an AWS EC2 g4dn.12xlarge instance with 4 NVIDIA T4 GPUs, 48 vCPUs, 192GB memory, and a 900GB SSD. All instances are launched within the same placement group."

+--------- Testbed: 16 x g4dn.12xlarge = 64 NVIDIA T4 GPUs ---------+
|   Node 0            Node 1          ...           Node 15         |
| +-------------+  +-------------+              +-------------+     |
| | 48 vCPUs    |  | 48 vCPUs    |              | 48 vCPUs    |     |
| | 192 GB RAM  |  | 192 GB RAM  |              | 192 GB RAM  |     |
| | 900 GB SSD  |  | 900 GB SSD  |              | 900 GB SSD  |     |
| | 4x T4 GPU   |  | 4x T4 GPU   |              | 4x T4 GPU   |     |
| +------+------+  +------+------+              +------+------+     |
|        +================+============================+            |
|          AWS EC2 network, single placement group                  |
|          (link bandwidth NOT STATED in the paper)                 |
|  Kubernetes 1.18.2 control plane; CephFS 14.2.8 for checkpoints   |
|  Separate testbed used ONLY for HPO (§5.4.2):                     |
|    2 x NVIDIA DGX A100 nodes, 8 A100 GPUs each                    |
+-------------------------------------------------------------------+
^ Fig 3: System under test. The 4-GPU node boundary is the single
  most important structural fact: it is the discontinuity Eqn. 9's
  local/node parameter split exists to represent, and the cause of
  the "sharp increase beyond 4 GPUs" noted in paper Fig. 3.

2.2 Workload (paper Table 1, verbatim)

Task Dataset Model Optimizer LR Scaler M0 Validation Size Frac. Jobs
Image Classification ImageNet [12] ResNet-50 [24] SGD AdaScale 200 imgs 75% top1 acc. XL 2%
Object Detection PASCAL-VOC [16] YOLOv3 [55] SGD AdaScale 8 imgs 84% mAP L 6%
Speech Recognition CMU-ARCTIC [38] DeepSpeech2 [3] SGD AdaScale 20 seqs 25% word err. M 10%
Question Answering SQuAD [54] BERT (finetune) [14] AdamW Square-Root 12 seqs 88% F1 score M 10%
Image Classification Cifar10 [39] ResNet18 [24] SGD AdaScale 128 imgs 94% top1 acc. S 36%
Recommendation MovieLens [23] NeuMF [25] Adam Square-Root 256 pairs 69% hit rate S 36%

Caption: "Models and datasets used in our evaluation workload. Each training task achieves the provided validation metrics. The fraction of jobs from each category are chosen according to the public Microsoft cluster traces."

2.3 Trace construction and the "TunedJobs" baseline

"We randomly sampled 160 jobs from the busiest 8-hour range (hours 3-10) in the deep learning cluster traces published by Microsoft [31]. Each job in the original trace has information on its submission time, number of GPUs, and duration. However, no information is provided on the model architectures being trained or dataset characteristics." Substitution is by GPU-time bucket: "Small (0-1 GPU-hours), Medium (1-10 GPU-hours), Large (10-100 GPU-hours), and XLarge (100-1000 GPU-hours). For each job in the trace, we picked a training job from Table 1 that is in the same category."

The tuned-baseline construction is the methodological centrepiece, because it deliberately biases against Pollux: "We considered a number of GPUs valid if using the optimal batch size for that number of GPUs achieves 50% - 80% of the ideal (i.e., perfectly linear) scalability versus using the optimal batch size on a single GPU. For each job submitted from our synthetic workload, we selected its number of GPUs and batch size randomly from its set of valid configurations." The authors' own framing: "this assumption of uniformly sophisticated users is unrealistically biased in favor of the baseline schedulers and only serves for comparing Pollux with the ideal performance of baseline systems."

The second, realistic arm removes that bias: GPU count "exactly as specified in the Microsoft cluster trace. The batch size was chosen to be the baseline batch size M0 times the number of GPUs, which is how we expect most users to initially configure their distributed training jobs. We find that these jobs typically use fewer GPUs and smaller batch sizes than their well-configured counterparts."

2.4 Baseline configuration

Baseline How configured (paper's words)
Pollux "60s scheduling interval, and compute REALLOC_FACTOR(delta) using delta = 30s. PolluxAgent reports its most up-to-date system throughput parameters and gradient statistics every 30s. Unless otherwise specified, the default fairness knob value of p = -1 is used."
Tiresias "as described in the testbed experiments of Gu et al. [22], with two priority queues and the PromoteKnob disabled. We manually tuned the queue threshold to perform well for our synthetic workload. Whenever possible, we placed jobs onto as few different nodes as possible to promote worker locality."
Optimus+Oracle PS-specific throughput model replaced — "our implementation of Optimus uses our own throughput model as described in §3.2"; convergence prediction replaced by an oracle — "we run each job ahead of time and provide Optimus with the exact number of iterations until completion."

LR handling is equalized across all three: "for all three schedulers, we scale the learning rate using AdaScale for SGD, and the square-root scaling rule for Adam and AdamW." Authority differs: "Optimus+Oracle uses the batch size specified, but determines the number of GPUs dynamically. Each job uses gradient accumulation if they are allocated too few GPUs to support the specified batch size."

2.5 The simulator

Simulator property Value / method (verbatim)
Throughput data per model "the time per training iteration for 146 different GPU allocations+placements in our testbed cluster of 16 nodes and 64 total GPUs", over "a range of batch sizes up to the GPU memory limit"
Throughput interpolation "a multi-dimensional linear interpolation on the configurations we measured"
Efficiency data "the (pre-conditioned) gradient noise scale during training using a range of batch sizes, and across every epoch", "linearly interpolated... between the two nearest batch sizes we measured"
Re-allocation modelling "injecting a 30-second delay for each job that has its resources re-allocated"
Interference modelling "Unless stated otherwise, we do not simulate any network interference between different jobs."
Repetitions "repeated on 8 different workload traces generated using the same duration, number of jobs, and job size distributions as in §5.2, and we report the average results across all 8 traces"

Fidelity claim: "our simulator obtains similar factors of improvement, showing that Pollux reduces the average JCT by 48% and 32% over Optimus+Oracle+TunedJobs and Tiresias+TunedJobs."


3. Design-Space Diagram (axes swept, axes held fixed)

+===================== POLLUX DESIGN SPACE =========================+
|  SWEPT — evaluated experimentally                                 |
|  ---------------------------------------------------------------  |
|  A1. SCHEDULER POLICY (7 testbed configurations, Table 2):        |
|      Pollux p in {-1,+1,-10}; Optimus+Oracle+TunedJobs;           |
|      Tiresias+TunedJobs; Optimus+Oracle; Tiresias                 |
|  A2. USER-KNOWLEDGE REGIME (2): TunedJobs (50-80% of ideal        |
|      linear scalability) vs Realistic (trace GPUs, M0 x nGPU)     |
|  A3. FAIRNESS KNOB p (3):  [+1]  [-1]  [-10]                      |
|  A4. WORKLOAD INTENSITY (paper Fig. 8a; levels NOT NUMERICALLY    |
|      STATED — "increasing... rate of job submissions")            |
|  A5. SCHEDULING INTERVAL (Fig. 8b; only the qualitative           |
|      breakpoint "up to 2 minutes" is stated)                      |
|  A6. INJECTED INTERFERENCE SLOWDOWN (Fig. 8c; text names 0%, 50%) |
|  A7. INTERFERENCE AVOIDANCE  [on] [off]                           |
|  A8. PRIOR-DRIVEN EXPLORATION  [from scratch] [offline-seeded]    |
|  A9. MODEL / TASK (6 levels, Table 1)                             |
|  A10. AUTO-SCALER POLICY (2): Pollux goodput-driven vs            |
|       Or et al. throughput-driven                                 |
|                                                                   |
|  HELD FIXED — not swept anywhere in the evaluation                |
|  ---------------------------------------------------------------  |
|   - Accelerator type (T4 only; A100 only for the HPO run).        |
|     Footnote 1: "Pollux's current throughput model does not       |
|     consider accelerator heterogeneity."                          |
|   - Parallelization strategy: synchronous data parallelism only.  |
|   - Gradient synchronization library: NCCL 2.7.8, at its own      |
|     internal defaults. No algorithm / protocol / channel sweep.   |
|   - Cluster size: 16 nodes / 64 GPUs throughout.                  |
|   - Elasticity mechanism: checkpoint-restart only.                |
|   - LR scaling rule: fixed per optimizer (AdaScale for SGD,       |
|     square-root for Adam/AdamW).                                  |
|   - delta in REALLOC_FACTOR: 30s;  reporting interval: 30s.       |
|   - Compression / quantization: absent entirely.                  |
+===================================================================+
^ Fig 4: Ten swept axes, eight fixed. The fixed list is where the
  scope boundary lives: everything below the "data-parallel job with
  a batch size" abstraction is a constant in this paper.

The most consequential fixed axis is the gradient-synchronization layer, named exactly once: "Gradients are synchronized with NCCL 2.7.8, which uses either ring all-reduce or tree all-reduce depending on the detected GPUs and their placements and its own internal performance estimates." That is the paper's entire treatment of collective-algorithm selection — the decision is part of the environment being measured, absorbed into Eqn. 9's constants.


4. Algorithm & Control-Flow Diagrams

4.1 PolluxAgent's inner loop

  JOB START  (a = 1 GPU, m = M = M0, s = 0, eta = eta0)
       |
       v
  (1) [training iteration] measure T_iter; record (a,m,s,T_iter);
       |  accumulate gradient statistics for phi_t; before every
       |  model update apply lambda <- SCALE_LR(M0, M)
       v
  (2) 30s elapsed since last fit? --no--> back to (1)  --yes-->
       v
  (3) FIT theta_sys: minimize RMSLE between Eqn. 11 and all
        collected tuples via L-BFGS-B; alpha,beta >= 0;
        gamma in [1,10]; unexplored sync params pinned to 0 (4.2)
        [measured cost: avg 0.2 s]
       v
  (4) REPORT (theta_sys, phi_t) --> PolluxSched
       v
  (5) RETUNE for the *current* allocation a:
        (m*, s*) = argmax_{m,s} GOODPUT(a, m, s)        (Eqn. 13)
        procedure: sample candidate total batch sizes M; for each,
        find the smallest s such that m = ceil(M/s) fits GPU memory
        per the user-defined bound; take the highest-GOODPUT config
        [measured cost: avg 0.4 ms]
       v
  (6) adopt (m*, s*), rescale eta ------------------> back to (1)
^ Fig 5: PolluxAgent control flow. Step (5) runs against whatever
  allocation the scheduler last handed down; the agent never proposes
  one of its own. The model fit is ~500x more expensive than the
  configuration search (0.2 s vs 0.4 ms), so it sets the loop period.

4.2 Prior-driven exploration

"we impose several priors which bias theta_sys towards the belief that throughput scales perfectly with more resources, until such resource configurations are explored." Verbatim, as printed:

"In particular, we set alpha_sync^local = 0 while the job had not used more than one GPU, alpha_sync^local = beta_sync^local = 0 while the job had not used more than one node, and beta_sync^local = beta_sync^node = 0 while the job had not used more than two GPUs."

[derived inference] The clauses as printed overlap on alpha_sync^local / beta_sync^local and never pin alpha_sync^node; the structurally natural reading is one pin per not-yet-visited regime — my reading, not a paper claim.

  Regimes a job has NOT yet visited  -->  parameters pinned to 0
  +--------------------------------------------------------------+
  | never used > 1 GPU   -->  intra-node sync cost assumed 0      |
  | never used > 1 node  -->  inter-node sync cost assumed 0      |
  | never used > 2 GPUs  -->  retrogression slope assumed 0       |
  +--------------------------------------------------------------+
        |  "each job starts with a single GPU and is initially
        |   assumed to scale perfectly to more GPUs. PolluxSched
        |   is then encouraged to allocate more GPUs and/or nodes"
        v
  GUARD: "we restrict the maximum number of GPUs that can be
  allocated to at most twice the maximum number of GPUs the job has
  been allocated in its lifetime."
^ Fig 6: Optimism-under-uncertainty implemented as a parameter
  prior, with a doubling cap as rate limiter. Explicitly not a
  principled explorer: "Although other principled approaches to
  exploration can be applied (e.g., Bayesian optimization), we find
  that this simple prior-driven strategy is sufficient."

4.3 PolluxSched's outer loop

  every 60 s:
       v
  (1) collect latest (theta_sys, phi_t, M0) for all J jobs
      (running AND pending)
       v
  (2) POPULATION-BASED SEARCH over allocation matrices A, which
       |   "perturbs and combines candidate allocation matrices to
       |    produce higher-value allocation matrices, and finally
       |    modifies them to satisfy node resource constraints and
       |    interference avoidance"
       |   per candidate A, per job j:
       |     SPEEDUP_j(A_j) = maxGOODPUT_j(A_j)/maxGOODPUT_j(a_f)
       |     if job j must move: *= REALLOC_FACTOR_j(delta = 30s)
       |   FITNESS_p(A) = power-mean_p over SPEEDUP_j
       |   [measured cost: avg 1 second on 1 vCPU]
       v
  (3) "The allocation matrix with the highest fitness score is
       applied to the jobs running in the cluster."
       v
  (4) APPLY: create/terminate Kubernetes Pods; workers resume from
      CephFS checkpoints
       v
  (5) each affected PolluxAgent re-runs Eqn. 13 against its new a
      -- and its next report at (1) already reflects that ability
^ Fig 7: PolluxSched control flow. The re-allocation penalty is
  evaluated *inside* the fitness function, so churn control is part of
  the objective, not a post-hoc filter. Step (5) closing into step (1)
  is the co-adaptation loop: the scheduler optimizes over jobs that
  will re-tune themselves in response.

4.4 The auto-scaling policy (§5.4.1)

  scale UP the number of nodes whenever:

     max_{m,s} GOODPUT_t(a, m, s)
     ---------------------------- >  U * max_{m,s} GOODPUT_t(1, m, s)
              SUM(a)

  i.e. "the goodput exceeds some fraction U of the predicted ideal
  goodput assuming perfect scalability".   U = 2/3 trigger; L = 1/2
  target ("increased to a number of nodes such that the predicted
  goodput is approximately L = 1/2 of the predicted ideal goodput")

The paper labels this preliminary: "a full design of an auto-scaling system based on goodput may be the subject of future work."


5. Quantitative Results — Empirical Findings by Regime

5.1 Testbed macrobenchmark (paper Table 2, verbatim)

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

Caption: "Summary of testbed experiments."

5.2 Percentage improvements as stated in the text

Comparison Avg JCT Tail (99%) JCT Makespan Source
vs Optimus+Oracle+TunedJobs (testbed) -50% -27% -20% §5.2
vs Tiresias+TunedJobs (testbed) -37% -27% -33% §5.2
vs Optimus+Oracle (testbed, realistic cfg) -72% -50% -43% §5.2
vs Tiresias (testbed, realistic cfg) -73% -56% -48% §5.2
vs Optimus+Oracle+TunedJobs (simulator) -48% n.r. n.r. §5.3
vs Tiresias+TunedJobs (simulator) -32% n.r. n.r. §5.3

The abstract's headline — "reduces average job completion times by 37-50% relative to state-of-the-art DL schedulers, even when they are provided with ideal resource and training configurations for every job" — is the first two rows; the introduction's "up to 73%" is the fourth. Why the realistic arm hurts Optimus specifically: "Even though Optimus+Oracle can dynamically increase the GPU allocation of each job, it still only slightly outperforms Tiresias because it does not also increase the batch size to better utilize those additional GPUs."

5.3 Model-fit accuracy and batch-size headroom

Model component Reported accuracy Regime of validity
THROUGHPUT (Eqn. 11) "the average error of the fitted model was at most 10%" "a diverse set of GPU placements and batch sizes in a 64-GPU cluster", all 6 tasks
EFFICIENCY_t (Eqn. 6) "±1% relative difference" in best validation value all tasks except DeepSpeech2
EFFICIENCY_t (Eqn. 6) "±4%" DeepSpeech2

The transfer claim that makes prediction possible without probing: "phi_t measured using batch size M can be used by Pollux to predict the value of EFFICIENCY_t at a different batch size M' without needing to train using M' ahead of time."

Headroom: the GNS "is non-constant and tends to gradually increase during training, by up to 10x or more [46]"; "a job in a later stage of training can potentially tolerate 10x or larger batch sizes without degrading statistical efficiency [46]"; "a batch size up to 32x larger works well in most cases."

5.4 System overheads (§5.2, verbatim)

Overhead component Measured value
PolluxSched fitness optimization "an average of 1 second on 1 vCPU" per 60 s interval
Re-allocation frequency "each job was re-allocated resources once every 7 minutes"
Run-time cost of re-allocation "an average 8% run-time overhead due to checkpoint-restarts"
PolluxAgent throughput-model fit "every 30 seconds, taking an average of 0.2 seconds each time"
PolluxAgent goodput optimization (Eqn. 13) "an average of 0.4 milliseconds"
Checkpoint-restart delay "between 15 and 120 seconds... depending on the size of the model"

5.5 Scheduling fairness (§5.3.1)

Finish-time fairness rho is "the ratio of a job's JCT running on shared resources to that of the job running in an isolated and equally-partitioned cluster"; rho < 1 is better-than-fair. Paper Fig. 7 is a CDF with no recoverable axis values.

Policy Fairness outcome (verbatim)
Pollux p = +1 "results in poor fairness, similar to Tiresias+TunedJobs, which is apparent as a long tail of jobs with rho > 4"
Tiresias+TunedJobs as above — long tail of rho > 4
Optimus+Oracle+TunedJobs "obtains better fairness due to its allocation algorithm which attempts to equalize the JCT improvement for each job"
Pollux p = -1 "provides the best fairness, with 99% of jobs achieving rho < 2, and does so while still providing significant performance increases (Table 2)"
Pollux p = -10 "slightly worse fairness overall, caused by PolluxSched incurring a larger number of re-allocations due to ignoring the cost in favor of equalizing speedups at all times"

The abstract's "1.5x-5.4x" is located by the text: "The max-rho improvements (1.5x and 5.4x) over Tiresias and Optimus are also similar" — framed as consistent with the ranges reported for Themis, since "their Themis system is not available for direct comparison."

5.6 Sensitivity analyses (§5.3.2)

Paper Fig. 8's three panels have "error bars and bands represent 95% confidence intervals." Sweep levels for panels (a) and (b) are not stated numerically in the text; only the findings below are.

(a) Job load. "As expected, all three scheduling policies suffer longer average JCT and makespan as the load is increased. Across all job loads, Pollux maintains similar relative improvements over the baselines."

(b) Scheduling interval. "Pollux performs similarly well in terms of average JCT for intervals up to 2 minutes, while longer intervals result in performance degradation... queuing contributed to roughly half of the performance degradation observed."

(c) Interference.

Interference slowdown Avoidance ON Avoidance OFF
0% (ideal) "performs similarly whether or not interference avoidance is enabled" same
50% "the average JCT is unaffected by even severe slowdowns, because network contention is completely mitigated" "the average JCT is 1.4x longer"

Prior-driven exploration ablation. "We observed minor (2-5%) reduction in JCT for short jobs like CIFAR10, but no significant change for longer running jobs." §4.1 restates the bound: it "performs close (within 2-5%) to an idealized scenario in which the model is fitted offline for each job before being submitted to the cluster."

5.7 Cloud auto-scaling (§5.4.1)

Auto-scaler Node-count behaviour (verbatim) Cost Completion time
Or et al. (throughput-based) "quickly scales out to more nodes and a larger batch size (Fig. 9a), which remains constant thereafter" baseline baseline
Pollux (goodput-based) "starts with a small number of nodes, and gradually increases the number of nodes as the effectiveness of larger batch sizes improves over time" -25% +6%

"Overall, compared to Or et al.'s throughput-based auto-scaling, Pollux trains ImageNet with 25% cheaper cost, with only a 6% longer completion time." Paper Fig. 9's panels carry no numeric labels; the only qualitative claim is "Pollux maintains a high statistical efficiency throughout training."

5.8 Hyper-parameter optimization (paper Table 3, verbatim)

Policy Accuracy (Top 5 trials) Avg JCT Makespan
Pollux 95.4 ± 0.2 25 min 10h
Baseline 95.5 ± 0.3 34 min 14h

Setup: ResNet18 on CIFAR10 under the Tree-structured Parzen Estimator (TPE) [5]; "the search space covers the learning rate and annealing, momentum, weight decay, and network width hyper-parameters... 4 trials run concurrently with each other, and 100 trials are run in total. The testbed consists of two NVIDIA DGX A100 nodes, each with 8 A100 GPUs. The baseline scheduler assigns a static allocation of 4 GPUs (all on the same node) to each trial and uses a fixed per-GPU batch size for every trial." Conclusion: "similar accuracy values are achieved, but Pollux completes HPO 30% faster."

5.9 The co-adaptation trace (paper Figs. 5 and 6)

Paper Fig. 6 is a four-row time series for one ImageNet job (LEFT) and two YOLOv3 jobs (RIGHT): "ROW 1: number of jobs actively sharing the cluster. ROW 2: number of GPUs allocated to the job. ROW 3: batch size (images) used. ROW 4: statistical efficiency (%)." No axis values are recoverable. The narrated behaviour, in the paper's words:

  (A) low contention   more GPUs --> larger batch --> LOWER efficiency
                       (accepted: higher goodput overall)
        |
  (B) high contention  fewer GPUs --> smaller batch --> HIGHER efficiency
        |
  (C) contention drops more GPUs, larger batch, BUT "the batch size per
                       GPU is much higher than in the first low-contention
                       period, since the job is now in its final,
                       high-statistical-efficiency phase of training"
^ Fig 8: The three-phase narrative of paper Fig. 6 (LEFT). Phase (C)
  is the load-bearing observation: the same cluster state produces a
  different optimum than it did earlier, because phi_t has drifted.
  A time-invariant policy cannot produce this trace.

Paper Fig. 5 shows "TOP: average cluster-wide allocated GPUs over time. BOTTOM: average cluster-wide statistical efficiency over time," with the same (A)/(B) annotations, plus one baseline artifact: "Tiresias+TunedJobs dips between hours 16 and 20 due to a 24-GPU job blocking a 48-GPU job."


6. Configuration-Regime Trade-off Tables

6.1 Fairness knob p (testbed, Table 2 + §5.3.1)

Dimension p = +1 (arithmetic) p = -1 (harmonic) p = -10 (near-min)
Avg JCT 0.83h 0.76h 0.84h
99%tile JCT 10h 11h 12h
Makespan 16h 16h 18h
Finish-time fairness long tail of rho > 4 99% of jobs rho < 2 "slightly worse fairness overall"
Stated failure mechanism scalable long jobs "take a large number of GPUs away from other jobs" "a larger number of re-allocations due to ignoring the cost in favor of equalizing speedups at all times"

The paper's reconciliation: "introducing a moderate degree of fairness (p = -1) improved the average job completion time (JCT) but degraded the tail JCT. This is because, in our synthetic workload, the tail JCT comprises of long but scalable jobs (i.e. ImageNet), which take a large number of GPUs away from other jobs in the absence of fairness (p = 1). However, further increasing fairness (p = -10) degraded performance in average JCT, tail JCT, and makespan." Footnote 6 adds: "p = -1 (harmonic mean over speedups) may be more suitable than p = 1 (arithmetic mean) when optimizing for the average JCT."

Regime rule: p = -1 is a genuine interior optimum for average JCT and makespan; only the tail favours p = +1.

6.2 Adaptation authority granted to the scheduler

Dimension Tiresias Optimus(+Oracle) Pollux
Chooses GPU count No — "requires users to specify the number of GPUs at the time of job submission, which will be fixed for the lifetime of the job" Yes Yes
Chooses batch size No No Yes
Chooses gradient accumulation s No No Yes
Rescales learning rate equalized in this study equalized Yes, via SCALE_LR plug-in
Models statistical efficiency No No Yes (phi_t, Eqn. 6)
Convergence-point knowledge not required supplied by oracle here not required
Testbed avg JCT (tuned jobs) 1.2h 1.5h 0.76h
Testbed avg JCT (realistic jobs) 2.8h 2.7h 0.76h

[derived inference] The swing between Tiresias's tuned (1.2h) and realistic (2.8h) columns — 2.3x, from user configuration quality alone — is larger than the gap between Tiresias-tuned and Pollux (1.6x). The dominant term here is whether the configuration is good, not which scheduler assigns it; Pollux's contribution is removing the user from that path.

6.3 Throughput-only vs goodput-driven adaptation

Dimension Throughput-driven Goodput-driven (Pollux)
Objective examples/second examples/second x EFFICIENCY_t
Time dependence "the system throughput does not change with training progress" phi_t drifts, so the optimum moves during a run
Cluster-scheduling consequence Optimus "only slightly outperforms Tiresias because it does not also increase the batch size" co-adapts GPUs and batch size together
Auto-scaling behaviour scales out early, "remains constant thereafter" "gradually increases the number of nodes as the effectiveness of larger batch sizes improves over time"
ImageNet cloud cost / time baseline -25% cost, +6% time

Regime rule: goodput and throughput agree whenever EFFICIENCY_t is flat and diverge exactly where phi_t drifts — which is why the auto-scaling result, a single long job observed over its full lifetime, shows the largest qualitative behavioural difference in the paper.

6.4 Elasticity mechanism cost and scheduling interval

Dimension Value / consequence
Mechanism checkpoint-restart via CephFS
Measured delay 15-120 s, model-size dependent
delta used in REALLOC_FACTOR 30 s (testbed and simulator)
Observed re-allocation rate once per job per 7 minutes
Observed aggregate cost 8% run-time overhead
Churn control REALLOC_FACTOR_j applied inside the fitness function
Failure mode when churn control is weakened p = -10: more re-allocations, worse on all three metrics
Scheduling interval, safe range "up to 2 minutes"; default 60 s
Scheduling interval, beyond range degradation, "roughly half" attributable to queuing

Regime rule: the 8% overhead is the standing tax for elasticity, and the 37-50% improvements are net of it. The interval sits an order of magnitude above the re-allocation delay and three orders above the scheduler's own compute cost — the binding constraint is the restart, not the search.


7. Bottlenecks & Insights Surfaced by the Measurements

7.1 The system rests on one product of two curves. SPEEDUP is a ratio of goodputs; FITNESS_p a power mean of speedups; the auto-scaler a threshold on goodput per GPU; the agent's retune an argmax of goodput. So either factor can be replaced without touching the rest — "we designed GOODPUT_t (Eqn. 4) to be modular so that different equations for THROUGHPUT may be easily plugged in."

7.2 T_sync encodes exactly one topology boundary. On a 16-node / 4-GPU-per-node testbed, Eqn. 9's three branches capture the dominant discontinuity — paper Fig. 3's caption confirms placement "in as few 4-GPU nodes as possible... causes a sharp increase beyond 4 GPUs." Who cares: "all models we measured except ImageNet exhibited high sensitivity to inter-node synchronization."

7.3 Gradient accumulation is the decoupling operator. Without it, total batch size is pinned to SUM(a) x m and m is capped by GPU memory: "many DL models hit this limit before the batch size is large enough for T_grad to overcome T_sync (or experience diminishing statistical efficiency), resulting in suboptimal scalability."

With s = 0 the total batch size is f(GPU count), so returning GPUs forces a smaller batch and leaves the Amdahl floor: "no matter how many GPUs are used, the run-time of each training iteration is lower bounded by T_sync." With s >= 1 it becomes f(GPU count, s), so PolluxSched can shrink an allocation without disturbing the batch size or LR schedule — at a cost of s extra T_grad terms per iteration (Eqn. 11). Empirically: "YOLOv3 and BERT benefit from using gradient accumulation to increase their total batch sizes."

7.4 Interference is eliminated by constraint, not by modelling. PolluxSched does not predict interference slowdown; it forbids the configuration that causes it. §5.3.2 justifies this: at 50% injected slowdown, avg JCT is unaffected with the constraint on and 1.4x longer with it off, and at 0% slowdown it costs nothing measurable. Free in the good case and worth 1.4x in the bad case dominates a model needing calibration in both.

7.5 The scheduler's compute is not the bottleneck; the restart is. One second of vCPU per 60-second interval is a 1.7% duty cycle on one core, while the 8% run-time overhead comes entirely from checkpoint-restarts. Pollux is bounded by its mechanism, not its policy: a better elasticity mechanism (in-place resize, migration) converts directly into headroom, while a faster search buys nothing.

7.6 Optimism-under-uncertainty is a parameter prior, not an explorer. Pollux zeroes the not-yet-identifiable synchronization parameters so the fit claims perfect scaling, lets PolluxSched act on the claim, and lets the resulting measurements correct it, with a doubling cap as rate limiter. The 2-5% gap to an offline-fitted oracle — short jobs only — is the measured price of that simplicity.

7.7 The p = -1 sweet spot is a real interior optimum with two distinct failure modes on either side. Both neighbours are worse on average JCT (0.83h, 0.84h vs 0.76h) and worse on fairness, but by different mechanisms: at p = +1 a scalable job monopolizes GPUs; at p = -10 the scheduler churns. One scalar exponent controls both.

7.8 Pollux is evaluated partly on an axis it introduced. [derived inference] Paper Fig. 5's bottom panel plots "average cluster-wide statistical efficiency over time" — a quantity that exists only once EFFICIENCY_t is defined. Tiresias and Optimus have no such observable, so they can be scored on it only retroactively, through the simulator's replayed PGNS measurements.


8. Limitations of the Methodology

Limitation Where it is acknowledged Consequence
No accelerator heterogeneity Footnote 1: "Pollux's current throughput model does not consider accelerator heterogeneity. We believe that extending with Gavel's metric would allow Pollux to co-adapt for goodput in heterogeneous DL clusters." Results hold for a homogeneous T4 fleet only
Throughput model's linear assumptions §3.2: "may diverge from reality for specialized hardware [33], sophisticated synchronization algorithms [7,65,72], different parallelization strategies [28,47,58,59], at larger scales [6,68], or hidden resource contention not related to network used for gradient synchronization" Eqn. 11 is calibrated, not general
Data parallelism only §2, §3.2 throughout No pipeline / tensor / hybrid parallelism
Two-level locality only §3.2: rack locality "can be extended... by adding a third pair of parameters" Rack topology unmodelled as evaluated
LR-scaling rule breakdown §3.1: "the chosen LR scaling rule may break down before the statistical efficiency decreases, which degrades the final model quality" Requires a user-supplied max batch size
Large-batch quality effects not understood §2.2: "the reasons behind this effect are not completely understood at the time of this paper" Goodput does not model final-quality loss
Baselines are re-implementations §5.1: Optimus's throughput model replaced by Pollux's own; convergence supplied by oracle "Optimus+Oracle" is a strengthened but non-native Optimus
Models are stand-ins for trace jobs §5.1: "no information is provided on the model architectures being trained or dataset characteristics" Model mix assigned by GPU-time bucket, not observed
Single 8-hour window, 160 jobs §5.1 Testbed macrobenchmark is one workload realization
Simulator is interpolation-based §5.3: linear interpolation over 146 measured allocations; PGNS interpolated between nearest measured batch sizes Cannot surface effects outside the measured grid
Interference not simulated by default §5.3: "we do not simulate any network interference between different jobs" Simulator results are interference-free except Fig. 8c
Auto-scaling is preliminary and simulated §5.4.1: "We present some preliminary evidence using our cluster simulator" The 25% / 6% cloud numbers are simulator results
HPO: one algorithm, one model §5.4.2: "A full evaluation on how Pollux affects different HPO algorithm types is future work" TPE + ResNet18/CIFAR10 only
Themis comparison is indirect §5.3.1: "their Themis system is not available for direct comparison" Fairness parity claim rests on reported ranges
Elasticity via checkpoint-restart only §4.2, §5.2 The 8% overhead is mechanism-specific
Collective library treated as environment §3.2 mentions NCCL 2.7.8 selecting ring or tree "depending on... its own internal performance estimates" Sub-collective configuration never varied or instrumented
Fig. 8a/8b sweep levels not stated numerically §5.3.2 Trends are reportable; magnitudes are not

9. Note on NCCL Tuning

Pollux's T_sync model (Eqn. 9) is a two-branch linear function fitted per job, and the thing being fitted includes a decision Pollux does not control: "Gradients are synchronized with NCCL 2.7.8, which uses either ring all-reduce or tree all-reduce depending on the detected GPUs and their placements and its own internal performance estimates." So the four alpha_sync / beta_sync constants are not properties of the network — they are properties of the network as filtered through whatever collective algorithm was selected for that shape, and they shift if that selection shifts, with nothing in the model able to notice. The paper's limitations paragraph anticipates this by listing "sophisticated synchronization algorithms" among the regimes where the linear form "may diverge from reality." A job-level performance model and a collective-level configuration policy are therefore stacked estimators of the same quantity: whichever adapts faster silently absorbs the other's variance, and the "at most 10%" average fit error in §3.2 is the observed size of that residual on this testbed and library version.


10. Analogy

Pollux is a freight railway that lets each train renegotiate its own car count and load-per-car every time the dispatcher re-cuts the schedule.

Conventional DL schedulers assign track slots to trains of fixed length: the shipper declares "eight cars" at booking time, and the dispatcher's only lever is when and where those cars run. That is Tiresias. Optimus may add or remove cars but cannot change how much each carries — lengthening the train past a point adds coupling slack without moving more freight, which is exactly the observation that Optimus "only slightly outperforms Tiresias because it does not also increase the batch size to better utilize those additional GPUs."

Pollux changes the contract. Each train carries its own loadmaster (PolluxAgent) measuring two things: how fast the train moves given its length (THROUGHPUT, from theta_sys) and how much of each car's cargo is genuinely useful rather than packing material (EFFICIENCY_t, from phi_t). Their product — useful tonnage per hour — is goodput. Critically, the packing-material fraction changes over the journey: early on, stuffing more into each car dilutes what arrives; later the cargo has consolidated and the same car carries far more useful weight. That is the PGNS rising "by up to 10x or more" during training, and why paper Fig. 6's phase (C) shows the same train taking a bigger per-car load than in phase (A) under comparable yard congestion.

The dispatcher (PolluxSched) no longer optimizes track occupancy but a power mean of every train's useful-tonnage-per-hour relative to that train's fair share of the yardFITNESS_p over SPEEDUP_j — with p as the dial between "run whatever moves the most freight" (p = +1) and "do not starve the slowest shipper" (p = -10), measured best at p = -1. Two rules round it out: no two long-haul trains may share a siding, and re-cutting a train already re-cut many times costs more than re-cutting a stable one, because every re-cut costs 15 to 120 seconds in the yard.

The analogy makes obvious why the improvement is larger against realistically-configured baselines (72-73%) than expertly-configured ones (37-50%): a dispatcher who cannot change train composition is at the mercy of how well the shipper guessed at booking time, and most shippers guess by multiplying their single-car load by the number of cars they asked for. Pollux's real claim is not that it dispatches better — it is that it removes the shipper's guess from the critical path, and keeps re-making that guess as the cargo changes character mid-journey.