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:

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


Open Problems

  1. Efficient elastic scaling without fixing non-data-parallel degrees, which the authors leave as future work because existing hybrid-parallel optimizers are time-consuming.
  2. Additional adaptation dimensions for pipeline-model-parallel jobs, explicitly deferred in Section 5.3.
  3. Principled handling of mixed-GPU-type placement rather than the most-GPUs-wins heuristic used to make Pollux comparable.
  4. 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.