Sia: Heterogeneity-aware, goodput-optimized ML-cluster scheduling
Suhas Jayaram Subramanya, Daiyaan Arfeen, Shouxu Lin, Aurick Qiao, Zhihao Jia, Gregory R. Ganger | Carnegie Mellon University / Cornell University / Petuum Inc. | SOSP '23, Koblenz, Germany, October 23–26, 2023 | DOI: 10.1145/3600006.3613175
Problem
Shared DL clusters increasingly contain a mix of GPU types, because
clusters are grown incrementally and the most cost-effective hardware is
bought at each purchase. Existing schedulers cover only one of the two
relevant degrees of freedom. Heterogeneity-aware schedulers (Gavel being
the state of the art) explicitly model GPU-type differences but only
accommodate rigid jobs — jobs that must run with a
user-specified GPU count, cannot scale elastically, and do not adapt to
the resources they receive. Adaptivity-aware schedulers (Pollux being
the state of the art) model how non-rigid jobs adapt their batch size
and GPU count, but assume every GPU in the cluster is identical. When
both degrees of freedom are present, the paper reports 40–70% lower
average JCTs are left on the table, and the gap grows with load because
Gavel scales poorly with contention and Pollux scales poorly with
cluster size. Naively extending either system does not work: expanding
Gavel's (job_id, GPU_type) throughput matrix to
(job_id, GPU_type, num_GPUs, minibatch_size) requires
extensive per-job profiling and yields an optimization program too large
to solve quickly, while Pollux enumerates every placement for each
(job, GPU_count) pair, making its search space exponential
in nodes and GPUs-per-node — its genetic algorithm takes tens of minutes
to terminate on 1000+ GPU clusters.
Core Insight
Restricting the allocation search to a small, structurally-constrained configuration set — powers of two within a node, whole nodes across nodes — shrinks the per-job space from Pollux's O(N^R) to (N + log₂ R) without measurably hurting job runtimes, which makes the combined heterogeneity-plus-adaptivity problem expressible as a single ILP over a row-normalized goodput matrix, and per-job per-GPU-type throughput models can be bootstrapped from one-GPU profiles alone rather than profiled exhaustively.
Method
Sia is a pre-emptive, round-based scheduler that each round considers every possible assignment of GPU number and type to current jobs, estimates aggregate goodput including resizing costs, and picks the best cluster-wide assignment. Goodput, borrowed from Pollux, combines sample-processing throughput with statistical efficiency.
(1) submit ──► Profiler ──(2) profile 1 GPU of each type, ~10 batchsizes──┐
│
(3) bootstrap models
▼
Queue (4) ──────────────► Policy ──(5) allocation: (n, m, type)──► Placer
▲ │
│ (8) refreshed goodput estimates │ (6) physical GPUs
│ ▼
Goodput Estimator ◄──(7) grad + xput stats── Adaptive
(Sia throughput model Executors
+ Pollux stat-efficiency model) (30 s reporting)
Key mechanisms:
- Decoupled allocation and placement. Allocation decides number and type; Placement decides exact physical GPUs. Placer rules: partial-node allocations must not straddle nodes; whole-node allocations take whole nodes; otherwise evict and retry (rare, usually fewer than 3 evictions at once). Combined with the restricted configuration set, the Submesh Shape Covering theorem guarantees a placement in which no two distributed jobs share a node, which eliminates NIC contention.
- Configuration set.
C = {(1,2⁰,X) … (1,R,X)} ∪ {(2,2R,X) … (N,N·R,X)}, of size (N + log₂ R) versus Pollux's O(N^R). - Normalized goodput matrix.
G_ij ← N_i^min · G_ij / min_j G_ij, making utilities comparable across jobs as well as within a job. - ILP objective.
max_A Σ_i Σ_j A_ij·G_ij + λ(1 − ‖A_i‖₁), subject to at most one configuration per job and per-GPU-type capacity. With the fairness exponent:max_A Σ_i Σ_j A_ij·(r_i·G_ij)^p + λ(1 − ‖A_i‖₁). Solved as a MILP with GLPK_MI via CVXPY. - Restart factor.
r_i = (T_i − N_i·S_i)/(T_i + S_i)discounts only those entries requiring a restart, so Sia restarts a job only when not doing so causes a big objective loss. Restart cost is 25–250 s for the evaluated models. - Bootstrapped throughput models. Profile one GPU of
each type over ~10 batchsizes (< 20 GPU-seconds per GPU type).
Compute time is independent of GPU count under data-parallel all-reduce,
so only communication time must be predicted. Two-GPU throughput is
initially assumed to be exactly 2× one-GPU throughput; once a job runs
multi-GPU on type A, throughput on an unprofiled type B is estimated as
est-xput_B(N) = (xput_B(1)/xput_A(1)) · xput_A(N), and this crude model is discarded once the job actually runs multi-GPU on B. - Scaling policy. Start each job at 1 GPU; scale up
by at most 2× per round; scale down no lower than
min_ngpus. - Limited adaptivity. Strong-scaling jobs fix batch size (Sia substitutes throughput for goodput); rigid jobs fix batch size and GPU count, optimized over GPU type only via a separate objective term.
- Hybrid parallelism. A PMP job on P GPUs with N data-parallel replicas uses N × P GPUs and is scaled by replicating the submitter-fixed configuration.
Implementation replaces the scheduler and data-loader of the open-source AdaptDL framework; Sia Policy runs as a Kubernetes service. Preemption checkpoints weights, data-loader state, and optimizer state only after the current minibatch completes, so no communication is in flight.
Experimental Setup
| Component | Value |
|---|---|
| Node type t4 | AWS g4dn.12xlarge, 4× NVIDIA T4 (16 GB) |
| Node type rtx | on-prem, 8× RTX 2080Ti (11 GB), 50 Gb/s Ethernet |
| Node type a100 | NVIDIA DGX-A100, 8× A100 (40 GB), 1.6 Tb/s InfiniBand |
| Node type quad | on-prem, 4× Quadro RTX6000 (24 GB), 200 Gb/s InfiniBand |
| Physical setting | 3 rtx + 2 a100 + 1 quad = 44 GPUs, 3 GPU types |
| Homogeneous setting | 16 t4 nodes = 64 GPUs (simulated) |
| Heterogeneous setting | 6 t4 + 3 rtx + 2 a100 = 64 GPUs (simulated) |
| Scalability sweep | up to 2048 GPUs, proportionally scaled Helios traces |
| Simulator | Pollux's open-sourced discrete-time simulator, extended with Gavel, Shockwave, and heterogeneity support; per-model checkpoint-restore delays replace the original constant delay |
| Traces | Philly (100k jobs / 2 months, Microsoft), Helios/Saturn (3.3M jobs / 6 months, 6k+ GPUs), newTrace (48 h production, 5–100 jobs/hr) |
| Trace sampling | Philly & Helios: 8 busiest hrs, 20 jobs/hr, 160 jobs, 10 traces each; newTrace: 48 h, 20 jobs/hr, 960 jobs, 10 traces |
| Models | ResNet18/CIFAR-10 (S), BERT/SQuAD (M), DeepSpeech2/CMU-ARCTIC (M), YOLOv3/PASCAL-VOC (L), ResNet50/ImageNet-1k (XL), 2.8B GPT/SQuAD (XXL) |
| Baselines | Pollux, Gavel, Shockwave, Themis (+TunedJobs where auto-tuning is unsupported) |
| Defaults | Sia p = −0.5, λ = 1.1, 60 s round; Pollux p = −1, 60 s round; Gavel/Themis/Shockwave 360 s round; Gavel policy = max-sum-throughput |
| Metrics | avg JCT, p99 JCT, makespan, GPU-hours/job, contention, restarts/job, finish-time fairness |
Headline Quantitative Results
Physical 44-GPU cluster (3-hour, 30-job trace, 4 runs): Sia gave lower average JCT than Gavel by 50% and than Pollux by 35–50%. The simulator showed less than 5% error in average JCT and makespan for both Sia and Gavel.
Heterogeneous 64-GPU setting (Table 3):
| Trace | Policy | Avg JCT | p99 JCT | Makespan | GPU-hrs/job | Avg. restarts |
|---|---|---|---|---|---|---|
| Philly | Sia | 0.6h ± 0.1 | 9.5h | 14.2 ± 1.9h | 4.0 ± 0.7 | 2.9 |
| Philly | Pollux | 1.0 ± 0.1h | 14.9h | 24.5 ± 7.9h | 5.6 ± 1.1 | 5.8 |
| Philly | Gavel+TJ | 1.9 ± 0.3h | 30.0h | 33.8 ± 8.6h | 9.0 ± 6.3 | 5.7 |
| Helios | Sia | 0.7 ± 0.1h | 10.9h | 14.9 ± 1.7h | 4.8 ± 0.7 | 3.4 |
| Helios | Pollux | 1.0 ± 0.2h | 15.0h | 25.5 ± 8.0h | 5.9 ± 0.7 | 5.3 |
| Helios | Gavel+TJ | 2.5 ± 0.9h | 38.7h | 43.0 ± 10.9h | 12.1 ± 3.7 | 7.5 |
| newTrace | Sia | 0.7 ± 0.1h | 4.6h | 52.2 ± 1.3h | 3.0 ± 0.1 | 5.0 |
| newTrace | Pollux | 1.5 ± 0.2h | 10.3h | 62.3 ± 4.6h | 3.4 ± 0.2 | 5.4 |
| newTrace | Gavel+TJ | 11.3 ± 3.0h | 98.1h | 110 ± 21.5h | 6.4 ± 1.1 | 4.5 |
Aggregate: 30–93% lower average JCT, 28–95% lower p99 JCT, 12–60% fewer GPU hours per job. (The abstract states 12–55% for GPU hours; the Introduction and Section 5.2 state 12–60%. The Introduction additionally states 38–65% lower makespan, 64% lower worst-case FTF, and 99% lower unfair job fraction; the Conclusion states 22–31% reductions in unfair job fraction.)
Homogeneous 64-GPU setting, Philly traces (Table 4):
| Policy | Avg JCT | p99 JCT | Makespan | GPU-hrs/job |
|---|---|---|---|---|
| Sia | 1.9h | 18.1h | 21.4h | 8.4h |
| Pollux | 2.0h | 19.3h | 21.7h | 8.6h |
| Shockwave+TJ | 3.6h | 32.8h | 35.0h | 12.5h |
| Themis+TJ | 5.4h | 44.7h | 49.7h | 17.2h |
| Gavel+TJ | 4.3h | 37.1h | 44.3h | 15.3h |
Sia matches Pollux in Pollux's own target domain and slightly exceeds it because its ILP guarantees a global optimum where Pollux's genetic algorithm does not. Sia averaged 2.6 restarts/job vs. Pollux's 5.1. Sia and Pollux both show a 50–70% improvement over the inelastic baselines on all metrics.
Rigid-jobs-only setting: with adaptivity disabled for everyone, Sia still beats Gavel by about 25%, because Sia maximizes goodput while Gavel maximizes cluster throughput.
Isolating the two axes (Figure 11): optimizing GPU count in addition to GPU type improves average JCT by 56%; additionally optimizing batch size improves it by a further 13%.
Contention and workload intensity: Sia consistently outperforms Pollux by 50–65% across arrival rates on Helios. On the 48-hour newTrace, Gavel sees about 7× more contention than Sia, versus under 2× on the 8-hour traces.
Finish-time fairness (Helios, heterogeneous):
| Scheduler | Worst FTF ratio | Unfair job fraction |
|---|---|---|
| Sia | 1.2 | < 0.3% |
| Pollux | 4.6 | 28% |
| Gavel | 27.8 | 15% |
| Shockwave | 3.3 | 14% |
Policy runtime (64 GPUs, Helios): Sia median 96 ms / p95 426 ms; Pollux 2.2 s / 4.8 s; Gavel 13 ms / 28 ms. Scaling to 2048 GPUs, Sia stays at single-second policy optimization while Pollux's genetic algorithm runs about 100× slower than Sia's ILP.
Profiling overhead: Bootstrap costs ≈ 0.1 GPU hrs per job and performs 30% better than no profiling and only 8% worse than an Oracle that would require 1–10 GPU hrs/job. With 20 GPU types, bootstrapping adds < 5% overhead to a job's execution.
Parameter sensitivity: raising the round duration from 60 s to 300 s increased Sia's average JCT by 333 s (12%); a 30 s round worsened it via excess re-allocation. p = −0.5 performed best across avg JCT, makespan, and fairness.
Hybrid parallel (2.8B GPT, GPipe, 2 stages on a100 / 8 on rtx, 48 microbatches of size 1 per replica): throughput scales linearly with GPU count because computation dominates communication; Sia scaled the job down around the 1-hour mark and back up around the 4-hour mark in response to congestion.
Limitations
- Most results come from the Pollux discrete-time simulator rather than hardware; the physical evaluation covers only a 44-GPU, 3-GPU-type cluster with a single 3-hour, 30-job trace run four times.
- Pollux performed significantly worse on the physical cluster than the simulator predicted, which the authors attribute in part to their own simulator modifications advantaging Pollux for single-job heterogeneous scheduling.
- The heuristic collapsing Pollux's mixed-GPU placements to a single type (most-GPUs-wins, tie broken by a100 > quad > rtx > t4) is acknowledged as imperfect; designing a better one is explicitly out of scope.
- The configuration set admits only power-of-two within-node and whole-node multi-node allocations; nodes whose GPU count is not a power of two must be modeled as several virtual nodes.
- Hybrid-parallel jobs are scaled only by replicating a submitter-fixed PMP/TMP configuration data-parallel-style; the non-data-parallel degrees stay fixed.
- The GPU-hours result is not uniformly favorable: YOLOv3 and DeepSpeech2 consume about 5% more GPU hours under Sia than under heterogeneity-unaware Pollux on Helios traces.
- The bootstrap estimator rests on stated simplifying assumptions — perfect 2× scaling with zero communication time, and equal compute:communication scaling across GPU types — justified only empirically by the 8% Bootstrap-vs-Oracle gap.
- Applicability beyond DL training (batch inference, latency-sensitive inference) is sketched as a belief with proposed goodput estimators, not evaluated.
Open Problems
- Efficient elastic scaling without fixing non-data-parallel degrees, which the authors leave as future work because existing hybrid-parallel optimizers are time-consuming.
- Additional adaptation dimensions for pipeline-model-parallel jobs, explicitly deferred in Section 5.3.
- Principled handling of mixed-GPU-type placement rather than the most-GPUs-wins heuristic used to make Pollux comparable.
- Goodput estimators for non-training workloads — the paper proposes throughput-as-goodput for batch inference and a 0/1 latency-feasibility goodput for latency-sensitive inference, but does not evaluate either.