Architecture & Measurement-Design Analysis

Tiresias: A GPU Cluster Manager for Distributed Deep Learning

Source: Gu, J.; Chowdhury, M.; Shin, K. G.; Zhu, Y.; Jeon, M.; Qian, J.; Liu, H.; Guo, C. 16th USENIX Symposium on Networked Systems Design and Implementation (NSDI '19), Feb. 26-28, 2019, Boston, MA, pp. 485-500. URL: https://www.usenix.org/conference/nsdi19/presentation/gu Code: https://github.com/SymbioticLab/Tiresias Authors: University of Michigan Ann Arbor + Microsoft + Bytedance + UNIST + Alibaba. Reader: Direct text extraction from PDF (canonical gemini_read.py pinned to a retired model) Analyst: Vishwakarma Date: 2026-09-01


Table of Contents

  1. System Architecture (the cluster manager)
  2. System-Under-Test Architecture (testbed, production cluster, simulator)
  3. Design-Space Diagram (axes swept, axes held fixed)
  4. Algorithm & Control Flow Diagrams (2DAS, discretization, placement, profiler)
  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 (the cluster manager)

Tiresias is a centralized GPU cluster resource manager whose entire design premise is a negative result: a distributed deep learning (DDL) job's remaining execution time cannot be predicted in production, so any scheduler that needs that number is unbuildable. Everything follows from replacing the missing prediction with two substitutes that are cheap and externally observable -- attained service (GPU-time already consumed) for scheduling, and tensor-size skew (how lopsided the job's message-size distribution is) for placement. The system has exactly three modules and one shared queue; there is no per-job model, no loss-curve reader, and no framework modification.

+------------------------------------------------------------------+
|                    Tiresias Central Master                       |
|   (1) submit job (PS_J, W_J)                                     |
|        v                                                         |
|  +--------------------+                                          |
|  | WAITQUEUE          |  <--(2b) preempt-------+                 |
|  | (all-or-nothing    |                        |                 |
|  |  gang requests)    |                        |                 |
|  +---------+----------+                        |                 |
|            | (2a) schedule                     |                 |
|            v                                   |                 |
|  +-------------------------------------+       |                 |
|  | Scheduler  (Discretized 2DAS)       |-------+                 |
|  |  - K logical priority queues        |                         |
|  |  - priority = f(W_J * t_J)          |                         |
|  |  - LAS  (no prior knowledge)        |                         |
|  |  - Gittins (duration distribution)  |                         |
|  |  - STARVELIMIT / PROMOTEKNOB        |                         |
|  +------------------+------------------+                         |
|                     | (3) allocate GPUs                          |
|                     v                                            |
|  +-------------------------------------+                         |
|  | Placement Manager                   |                         |
|  |  - compare skew S_J vs PACKLIMIT    |                         |
|  |  - S_J > PACKLIMIT -> consolidate   |                         |
|  |  - else -> defragment (spread)      |                         |
|  +------------------+------------------+                         |
|                     | (4) profile if first run                   |
|                     v                                            |
|  +-------------------------------------+                         |
|  | Profiler (central RDMA aggregator)  |                         |
|  |  - derives S_J, model size,         |                         |
|  |    iteration boundaries             |                         |
|  +------------------+------------------+                         |
+---------------------|--------------------------------------------+
        +-------------+---------------------------+
        v                                         v
+-------------------+                   +---------------------+
| GPU Cluster       |                   | Shared FS (GPFS)    |
| N servers x 4 GPU |== checkpoints ==> | 1.2 GB/s r + w      |
| ibverbs shim on   |                   | preemption state    |
| every server      |                   +---------------------+
+-------------------+
^ Fig 1: Tiresias components and the four-step job lifecycle
  (submit -> schedule/preempt -> place -> profile). The profiler runs
  only on a job's first execution; the placement decision it yields
  is then reused on every subsequent resume.

Two structural decisions dominate. First, the profiler is invoked once per job, not once per scheduling event -- a DDL job's communication volume is identical every iteration, so a handful of trial iterations characterises it for its whole lifetime, converting a per-decision measurement cost into a one-time admission cost. Second, the scheduler and placement manager are decoupled by a single scalar: the scheduler never sees skew, the placement manager never sees priority.

1.1 Where Tiresias sits in the stack

+----------------------------------------------------+
|  Users / AutoML hyperparameter sweep               |  <- job source
|  (submits (PS_J, W_J); no duration hint required)  |
+----------------------------------------------------+
|  Tiresias Central Master                           |  <- this paper
|  scheduler | placement | profiler                  |
+----------------------------------------------------+
|  TensorFlow 1.3.1 (RDMA extension), UNMODIFIED     |  <- framework
|  synchronous data parallelism, PS architecture     |
+----------------------------------------------------+
|  Tiresias ibverbs interception library             |  <- observability
|  (loadable .so on every server)                    |     insertion point
+----------------------------------------------------+
|  RDMA verbs / GPUDirect                            |  <- transport
+----------------------------------------------------+
|  100 Gbps EDR InfiniBand + 4x P100 per server      |  <- hardware
+----------------------------------------------------+
^ Fig 2: Software stack. Tiresias makes two insertions -- one above
  the framework (resource decisions) and one below it (RDMA
  observability) -- and zero inside it, which is what makes the
  design "readily deployable."

The two insertion points are the whole trick. The manager cannot ask TensorFlow what tensors it has, because the tensor-to-parameter-server mapping is a framework internal. So instead of reaching into the framework it reaches underneath and reconstructs model structure from the wire -- inference by observation rather than by instrumentation.

1.2 Job state machine

                     Submit Job
                          |
                          v
                   +--------------+     enough resources
      promote /    |   WAITING    |----------------------+
      timeout      +------+-------+                      |
        |                 | not enough                   v
        |                 v                       +--------------+
        |          +--------------+   scheduled   |   RUNNING    |
        +----------|   STARVING   |-------------->|              |
        |          +--------------+               +---+------+---+
        |                                             |      |
        +---------------- preempted ------------------+      | complete
                                                             v
                                                     +--------------+
                                                     |  COMPLETED   |
                                                     +--------------+
^ Fig 3: Job state transitions (paper Fig. 9). STARVING is not a
  failure state -- it is a timer that, on expiry, resets t_J to zero
  and re-enqueues the job at Q1. Both t_J and the waiting time
  delta_J are zeroed on promotion so a promoted job is not demoted
  immediately.

STARVING exists because Discretized 2DAS is a service-based discipline: a job that has attained a lot of service sinks to Q_K and, in an oversubscribed cluster, may never be reached again. Promotion is the safety valve, exposed as a single operator knob (PROMOTEKNOB). Setting it to infinity disables promotion and optimises purely for average JCT; smaller values trade average JCT for tail JCT.

1.3 The Discretized 2DAS queue structure

  Attained service a_J = W_J x t_J   (GPU-seconds)

  +--------+   a_J >= Q1_hi   +--------+          +--------+
  |   Q1   | ---------------> |   Q2   | -- ... ->|   QK   |
  | [0,    |    demote        | [Q1_hi,|          | [.., ) |
  |  Q1_hi)|                  |  Q2_hi)|          |   inf  |
  +---^----+                  +--------+          +--------+
      |          promote (WAITING > STARVELIMIT, or               |
      +--------- delta_J >= PROMOTEKNOB * t_J) ------------------+

  Ordering WITHIN a queue:
    LAS variant     : FIFO on job START time (not submit time)
    Gittins variant : sort by G_J descending, on every event
                      (Q_K excepted: Delta_K = inf, so Gittins
                       degenerates to FIFO there)

  Deployed: testbed K = 2, threshold 3200 GPU-s
            simulation K = 2, threshold 1 h GPU-time
^ Fig 4: Multi-Level Feedback Queue realisation of Discretized 2DAS.
  Discretization is a preemption-rate limiter, not an accuracy
  improvement: it deliberately coarsens the priority signal so jobs
  cross a boundary O(K) times instead of continuously.

The FIFO-on-start-time detail is load-bearing. Because DDL jobs are all-or-nothing, a high-priority job that cannot find W_J free GPUs is skipped so the cluster does not idle. Had within-queue ordering used submission time, that skipped job would keep displacing running jobs as soon as GPUs freed up; ordering on start time makes the skip stable.

1.4 Profiler data flow

  Server 0            Server 1            ...      Server n-1
 +-----------+       +-----------+              +-----------+
 | TF worker |       | TF PS_0   |              | TF PS_j   |
 +-----+-----+       +-----+-----+              +-----+-----+
       | ibverbs           | ibverbs                  | ibverbs
 +-----v-----+       +-----v-----+              +-----v-----+
 | intercept |       | intercept |              | intercept |
 | shim (.so)|       | shim (.so)|              | shim (.so)|
 +-----+-----+       +-----+-----+              +-----+-----+
       |                   |                          |
       +== {msg size, src, dst, timestamp, conn} =====+
                           |
                           v
               +---------------------------+
               |  Central Profiler         |
               |   group by iteration      |
               |   per-PS byte totals s_j  |
               |   skew S_J = f(max s_j)   |
               +-------------+-------------+
                    S_J  vs  PACKLIMIT
                 +-----------+-----------+
                 v                       v
          S_J > PACKLIMIT          S_J <= PACKLIMIT
         CONSOLIDATE job          SPREAD to defragment
         (min # machines)         (fill partial servers)
^ Fig 5: Profiler data flow. Note the direction of inference: the
  system observes *messages on the wire*, reconstructs *model
  structure*, and converts that structure into a binary placement
  policy. Nothing about the model is ever declared by the user.

The profiler is the paper's most transferable artifact: a loadable library intercepting RDMA ibverbs calls, working with or without GPUDirect, and extensible to TCP/IP by intercepting socket APIs instead. Because DDL iterations are byte-for-byte periodic, a few of them suffice to recover message-size distribution, model size, and iteration boundaries -- quantities that normally require framework cooperation.


2. System-Under-Test Architecture

The paper evaluates on three distinct vehicles, and keeping them apart is essential to reading the numbers: a 60-GPU physical testbed running real TensorFlow jobs, a discrete-event simulator, and a 10-week Microsoft production trace that supplies the job-arrival and job-size distributions for both.

2.1 The physical testbed (Michigan ConFlux)

+------- Testbed: 15 servers x 4 GPUs = 60 NVIDIA Tesla P100 --------+
|   Server 0            Server 1          ...        Server 14       |
| +--------------+   +--------------+            +--------------+    |
| | IBM PowerNV 8335-GTB                                        |    |
| | 2x 10-core POWER8 (8 threads/core) | 256 GB DDR4            |    |
| | 4x Tesla P100, 16 GB HBM each, NVLink intra-server          |    |
| +------+-------+   +------+-------+            +------+-------+    |
|        |                  |                           |            |
|        +==================+===========================+            |
|              100 Gbps EDR InfiniBand (Mellanox, RDMA)              |
|                              |                                     |
|                    +---------+---------+                           |
|                    | GPFS shared FS    |                           |
|                    | 1.2 GB/s r + w    |                           |
|                    | (checkpoint path) |                           |
|                    +-------------------+                           |
+--------------------------------------------------------------------+
^ Fig 6: The 60-GPU ConFlux testbed. GPFS sits on the critical path
  of every preemption -- the checkpoint/restore cost measured later
  is a function of this 1.2 GB/s figure and of the number of tensors
  the framework must serialise.

NVLink is present within a server and 100 Gbps IB between servers. That hierarchy is what makes the consolidation question meaningful: consolidating keeps a job's parameter-server traffic on the intra-server path, spreading pushes it onto InfiniBand.

2.2 The production cluster the trace comes from (Microsoft "P")

+-------------- Microsoft Project Philly cluster P ------------------+
|  2016: ~100 servers x 4 GPUs  --> 2017: + >250 servers x 8 GPUs    |
|            total GPU count grew 5x year-over-year                  |
|                                                                    |
|  Interconnect 100 Gbps RDMA (IB) | Frameworks TF / Caffe / CNTK    |
|  Manager Apache-YARN-like        | Monitoring Ganglia, per-minute  |
|  Trace window 10 weeks, Oct.-Dec. 2017, jobs running >= 1 min      |
|                                                                    |
|  Observed workload facts:                                          |
|    DDL jobs (>=2 GPU)        : 10.5x growth YoY                    |
|    Large jobs   (>8 GPU)     :  9.4x growth YoY                    |
|    Largest job               : 128 GPUs (2017) vs 32 GPUs (2016)   |
|    Average queueing delay    : 4102 s                              |
|    Model sizes               : ~100s of MB to a few GB, max 7.5 GB |
|    Job arrival intervals     : mostly < 1 h; many < 1 s (AutoML)   |
|    Cost per 8-GPU server     : ~USD 100,000                        |
+--------------------------------------------------------------------+
^ Fig 7: The production cluster whose trace drives the study. The
  4102 s average queueing delay is the problem statement; sub-second
  arrival intervals are the fingerprint of automated hyperparameter
  sweeps, which is why so many jobs are short-lived and killed early.

The $100K-per-server figure is quoted deliberately: it is the argument against solving queueing delay by buying GPUs. The 10.5x year-over-year growth in DDL job count against 5x growth in GPU count is the scissor that produces the 4102 s delay.

2.3 The three evaluation vehicles

Vehicle Measures faithfully Cannot see
Testbed (60 GPU) preemption cost, placement effect, GPU util, makespan scale beyond 60 GPUs; the 128-GPU tail of the real workload
Simulator arrivals, queueing, demotion/promotion event order preemption overhead, placement effect, cluster dynamics
Microsoft trace real arrivals, durations, GPU counts over 10 weeks model identity (proprietary), so 10 public models stand in

The simulator replays actual job completion times rather than modelling them, so its numbers isolate the scheduling contribution and act as an upper bound on it. The fidelity check is honest: replaying the testbed workload in simulation gives 5.11x average improvement over YARN-CS versus 5.5x measured on hardware, and 1.50x at the 95th percentile; against SRTF it reports 0.74x average and 0.55x at the 95th percentile, and against Tiresias-G 1.01x average / 1.13x at the 95th percentile.

2.4 Workload construction

Property Value
Total jobs 480
Single-GPU jobs 240 (half)
Multi-GPU jobs 40 x 2-GPU, 80 x 4-GPU, 90 x 8-GPU, 25 x 16-GPU, 5 x 32-GPU
Parameter servers per job equal to the job's GPU/worker count
Models 10 (Table 6), 48 jobs per model
Training time range 2 minutes to 2 hours
Iterations per job fixed count
Arrival process Poisson, mean inter-arrival 30 s
Framework TensorFlow 1.3.1 + RDMA extension
Parallelism mode synchronous data parallelism

Job bins used throughout the results:

Bin Definition (scaled testbed) % of jobs in trace
1 (SS) <= 4 GPUs and < 800 s training 63.5%
2 (SL) <= 4 GPUs and >= 800 s 12.5%
3 (LS) > 4 GPUs and < 800 s 16.5%
4 (LL) > 4 GPUs and >= 800 s 7.5%

In the unscaled trace the thresholds are 8 GPUs and 4 hours, matching P's 8-GPU servers. The 63.5% concentration in Bin 1 is the single most important workload fact in the paper: two thirds of all jobs are both small and short, precisely the population that FIFO head-of-line blocking destroys.

2.5 The 10 benchmark models and their structural skew

Model Size (MB) #Tensors #Large tensors (>=1MB) Largest tensor (MB) Largest tensor ratio
VGG19 548.1 39 15 392.0 71.5%
VGG16 527.8 33 12 392.0 74.3%
VGG11 506.8 23 9 392.0 77.3%
AlexNet 235.9 17 7 144.0 61.0%
ResNet152 230.2 778 48 9.0 3.9%
ResNet101 170.4 523 35 9.0 5.3%
ResNet50 97.7 268 18 9.0 9.2%
Inception4 162.9 599 81 5.9 3.6%
Inception3 91.0 397 21 7.8 8.6%
GoogleNet 26.7 117 7 3.9 14.6%

This table is the empirical basis for the placement design. The motivating measurement (paper Fig. 3) ran four concurrent 8-worker, 8-PS jobs on eight 4-GPU servers under random versus consolidated placement -- medians of 20 and 10 runs respectively -- and found only the VGG family and AlexNet materially affected.


3. Design-Space Diagram

             DESIGN SPACE OF THE TIRESIAS EVALUATION
+------------------------------------------------------------------+
|  Axis 1: SCHEDULER (6 levels)                                    |
|    [YARN-CS]      FIFO, non-preemptive, production baseline      |
|    [Best-effort]  YARN-CS minus HOL blocking (sim only)          |
|    [Gandiva]      time-sharing (sim only)                        |
|    [SRTF]         oracle: exact remaining time                   |
|    [Tiresias-L]   Discretized 2D-LAS, zero prior knowledge       |
|    [Tiresias-G]   Discretized 2D-Gittins, duration distribution  |
|    (+ SF and SRSF appear in the motivating sim, Table 1)         |
|  Axis 2: K, NUMBER OF PRIORITY QUEUES -- [2] [3] [4]             |
|  Axis 3: QUEUE THRESHOLD / SERVICE QUANTUM                       |
|    [0.5 h] [1 h] [2 h] [4 h] GPU time (testbed: 3200 GPU-s)      |
|  Axis 4: PROMOTEKNOB -- [inf] [8] [4] [2] [1]                    |
|  Axis 5: PLACEMENT                                               |
|    [always consolidate] [random] [profile-based (Tiresias)]      |
|    (+ an ILP formulation, Appendix D, evaluated and rejected)    |
|  Axis 6: JOB BIN (reporting axis) -- [SS] [SL] [LS] [LL]         |
|                                                                  |
|  Held FIXED (no sweep):                                          |
|    - Parallelism: synchronous data parallelism only              |
|    - Aggregation architecture: parameter server only             |
|      (no all-reduce / collective path is evaluated anywhere)     |
|    - #PS per job == #workers per job                             |
|    - Framework: TensorFlow 1.3.1 + RDMA extension                |
|    - Transport: 100 Gbps InfiniBand RDMA                         |
|    - Preemption mechanism: full model checkpoint to GPFS         |
|    - Resource request: user-specified, never resized             |
|    - Model set: the 10 TF-benchmark models in Table 6            |
|    - PACKLIMIT: set by a "simple linear classifier" on job       |
|      history; its numeric value is never published               |
|    - Cluster scale: 60 GPUs (testbed); trace scale in simulation |
+------------------------------------------------------------------+
^ Fig 8: Six swept axes and the fixed frame. The most consequential
  fixed choice is the parameter-server architecture: every placement
  finding here is a statement about PS-to-worker point-to-point
  message patterns, not about collective communication.

Three absences shape how far the results generalise. No all-reduce baseline is measured -- the skew rule is derived entirely from PS traffic, where one huge tensor lands on one parameter server and creates a hotspot. The job's resource request is never modified, unlike Optimus which resizes jobs. And PACKLIMIT's value is never reported, only its determination method.


4. Algorithm & Control Flow Diagrams

4.1 The priority function (Pseudocode 1)

  PRIORITY(Job J, Distribution D):
      if D is empty:                       # information-agnostic
          R_J = - W_J * t_J                # LAS: less service = higher
      else:                                # partial information
          R_J = GITTINS_INDEX(J, D)

  GITTINS_INDEX(Job J, Distribution D):
      a_J = W_J * t_J                      # 2D attained service
                    P( S - a_J <= Delta | S > a_J )
      G_J = sup   -----------------------------------------
           Delta>0  E[ min{S - a_J, Delta} | S > a_J ]

  S ~ D is the job-duration random variable; Delta is the service
  quantum. Numerator  = probability the job finishes within the next
  quantum (the reward). Denominator = expected service it will
  actually consume (the cost). G_J is a reward-per-unit-cost ratio
  maximised over quantum size.
^ Fig 9: The 2DAS priority function. The single move that makes both
  branches "two-dimensional" is the product W_J * t_J -- GPU-seconds
  rather than seconds. Everything else is classical.

The product rather than either factor alone is justified empirically in Table 1 (Sec. 5.1): a purely spatial scheduler (smallest-first) and a purely temporal one (SRTF) both lose to the two-dimensional SRSF, which orders by remaining GPU-seconds.

4.2 The scheduler main loop (Pseudocode 2)

  START of a scheduling event (arrival / completion / resource change)
        |
        v
  (1) For every RUNNING job J: r_J = PRIORITY(J, D)
        |
        v
  (2) For every job WAITING longer than STARVELIMIT:
          reset t_J ; enqueue J into Q1          <- starvation valve
        |
        v
  (3) while cluster has available GPUs:
        for i = 1 .. K:                          <- strict queue order
             if D nonempty and i < K:
                  sort Q_i by Gittins index
             for each job J in Q_i (queue order):
                  if available GPUs >= W_J:
                       reserve W_J GPUs          <- job will run
                  else:
                       add J to preempt-set P
                       preempt J if RUNNING      <- all-or-nothing
        |
        v
  (4) For every job J not in P and not already RUNNING:
          if J was never profiled:  PROFILE(J)   <- trial iterations
          record J's start time                  <- FIFO key for LAS
          place J by comparing S_J to PACKLIMIT
        |
        v
  END
^ Fig 10: The 2DAS scheduler loop. Step (3) is where all-or-nothing
  gang semantics bite: a job that cannot get all W_J GPUs is not
  partially started, it is skipped and its resources offered to the
  next job in queue order -- keeping utilisation high at the cost of
  some priority inversion.

The loop is O(jobs) per event, plus a sort in the Gittins variant, and that sort is the direct cause of Tiresias-G's higher preemption count (297 versus 221 on the testbed): re-sorting on every event reshuffles within-queue order, and every reshuffle is a potential preemption. The LAS variant's FIFO order is stable by construction.

4.3 Placement decision flow and the rejected ILP

  Job J needs W_J workers and PS_J parameter servers
        |
        v
  Has J been profiled before?
        +-- No --> run J in a trial environment for a few iterations
        |            -> profiler aggregates per-server RDMA metadata
        |            -> compute skew S_J from per-PS byte totals s_j
        +-- Yes ----+
                    v
             S_J > PACKLIMIT ?
                /            \
             Yes              No
              v                v
   +--------------------+  +---------------------------+
   | CONSOLIDATE        |  | SPREAD to defragment      |
   | minimum # machines |  | fill partially-used       |
   | keeps the huge     |  | servers; reduces          |
   | tensor's traffic   |  | fragmentation and thus    |
   | off the network    |  | future queueing delay     |
   +--------------------+  +---------------------------+
^ Fig 11: Placement control flow. The branch is binary and the
  predicate is a single scalar comparison -- deliberately simpler
  than the Appendix-D ILP, and reported to perform *better* than it.

The rejected ILP is a clean example of optimising the wrong objective. It minimises the maximum per-machine network load:

  T_i = t_i + w_i * ( M - sum_j p_ji * s_j )
              + sum_j p_ji * s_j * ( W - w_i )

  minimize   max_{i in N}  T_i
  subject to w_i <= g_i                (free GPUs per node)
             sum_i w_i = W             (all workers placed)
             sum_i p_ji = 1  for all j (each PS on exactly one node)

with t_i node i's existing traffic, g_i its free GPUs, M the model size, s_j the bytes hosted by parameter server j, w_i the workers on node i, and p_ji a binary PS-placement indicator. The paper reports two failures: it is too slow at cluster scale, and minimising balanced network load "does not necessarily improve DL training performance" -- the objective has no term for the fact that VGG's single 392 MB tensor is qualitatively worse than ResNet152's 778 small ones at the same aggregate byte count.

4.4 Preemption sequence (what a demotion actually costs)

  Scheduler        Chief Worker      Other Workers        GPFS
      |                 |                  |                |
  (1) |-- pause ------->|-- halt --------->|                |
  (2) |                 |== checkpoint model bytes =========>|
      |<-- paused ------|  (serialise every tensor)          |
      |  ... GPUs reassigned to a higher-priority job ...    |
  (3) |-- resume ------>|-- build model -->|                |
      |                 |<== load checkpoint ================|
      |                 |-- warm up ------>|                |
      |<-- running -----|                  |                |
      v                 v                  v                v
^ Fig 12: One preemption round trip. Resume is strictly more
  expensive than pause because it has three phases (build model,
  load checkpoint, warm up) executed on *every* worker, whereas only
  the chief worker checkpoints -- which is why the paper measures
  pause and resume separately.

5. Quantitative Results -- Empirical Findings by Regime

5.1 Why two dimensions (motivating simulation, Table 1)

Normalised performance of single-dimensional schedulers with respect to SRSF (shortest-remaining-service-first = remaining time x GPUs). All schedulers are given exact durations for this comparison.

Scheduler Avg. JCT Med. JCT 95th JCT
Smallest-First (SF) 1.52 1.20 3.45
SRTF 1.03 1.01 1.55
SRSF (baseline) 1.00 1.00 1.00

The tail is where the two-dimensional discipline earns its keep: SF is 3.45x and SRTF 1.55x worse than SRSF at the 95th percentile, versus only 1.52x and 1.03x on the average.

5.2 Testbed JCT improvements

Comparison Average JCT Median JCT
Tiresias-L vs YARN-CS 5.5x 27x
Tiresias-L vs Tiresias-G 1.06x 1.05x

The 27x median versus 5.5x average gap is the signature of a head-of-line-blocking fix. Averages are dominated by long jobs, whose JCT Tiresias barely changes; medians are dominated by the 63.5% of jobs in Bin 1, exactly the population previously stuck behind large jobs.

Bin Tiresias-L avg JCT Tiresias-G avg JCT vs YARN-CS (L / G)
1 (SS) 300 s 330 s 27.6x / 25.2x
4 (LL) comparable to YARN-CS -- essentially unchanged

Inverting the Bin-1 ratios implies a YARN-CS Bin-1 average JCT of roughly 8,300 s: a small, short job that should finish in five minutes was taking well over two hours, almost all of it queueing. Paper Fig. 10b carries two off-axis annotations, 27.7 and 23.4, for the Bin-1 YARN-CS bars, which exceed the plotted 0-8 range.

5.3 Source of improvement I -- queueing delay (Table 4)

Solution Average Median 95th
YARN-CS 8146 s 7464 s 15327 s
SRTF 593 s 32 s 3133 s
Tiresias-G 1005 s 39 s 7933 s
Tiresias-L 963 s 13 s 7755 s

Read the median column first. YARN-CS's median queueing delay is 7464 s; Tiresias-L's is 13 s -- a 574x reduction. The average falls only 8.5x and the 95th percentile just 2.0x. Tiresias's average delay is worse than the SRTF oracle's (963 vs 593) but its median is better (13 vs 32): the information-agnostic policy protects the common case at least as well as the oracle and pays for it in the tail.

5.4 Source of improvement II -- placement, utilisation, makespan

Re-running the testbed workload with the profiler disabled (random placement) isolates the placement contribution: up to 1.67x training-time improvement, with fewer than 30% of DDL jobs showing limited loss. The authors state plainly that placement is the smaller effect -- "the major improvement comes from the job scheduling by avoiding HOL blocking."

Solution Makespan vs YARN-CS
YARN-CS 33270 s 1.00x
SRTF 28070 s 1.19x
Tiresias-G 27510 s 1.21x
Tiresias-L 27400 s 1.21x

Cluster-wide 10-s-averaged GPU utilisation distributions "look similar" across all four solutions. This is the important null result: Tiresias does not win by raising utilisation, it wins by reordering. The same GPU-seconds are delivered; they are simply delivered to short jobs first.

5.5 Preemption overhead

Solution Preemptions Total overhead Implied cost/event
Tiresias-L 221 13724 s ~62.1 s
Tiresias-G 297 17425 s ~58.7 s
SRTF 316 18057 s ~57.1 s

The ordering is what the design predicts. SRTF uses continuous priorities and preempts most; Tiresias-G discretizes but re-sorts within a queue on every event; Tiresias-L is FIFO-stable within a queue. Discretization buys a 30% reduction in preemption count (316 -> 221) relative to the continuous-priority oracle.

5.6 Preemption cost is governed by tensor count, not model bytes

Pause (checkpoint) times measured on the testbed, aligned against the structural data of Table 6:

Model #Tensors Model size (MB) Checkpoint time (s)
VGG19 39 548.1 2.7
VGG16 33 527.8 2.3
VGG11 23 506.8 1.9
AlexNet 17 235.9 1.3
ResNet152 778 230.2 26.3
ResNet101 523 170.4 17.8
ResNet50 268 97.7 9.4
Inception4 599 162.9 22.2
Inception3 397 91.0 14.1
GoogleNet 117 26.7 5.7
  checkpoint time (s)
   30 |                                          * ResNet152
      |                              * Inception4
   20 |                    * ResNet101
      |             * Inception3
   10 |        * ResNet50
      |   * GoogleNet
    0 | * VGG11/16/19 and AlexNet all cluster here (1.3 - 2.7 s)
      +----+-----+-----+-----+-----+-----+-----+-----+---
      0   100   200   300   400   500   600   700   800
                     number of tensors
^ Fig 13: Checkpoint cost against tensor count is monotone and close
  to linear at roughly 33 ms per tensor. Against model size the same
  relationship is not merely weak, it is *inverted*: the four largest
  models (VGG19 at 548 MB down to AlexNet at 236 MB) are the four
  fastest to checkpoint.

VGG19 is 548 MB and checkpoints in 2.7 s; ResNet152 is 230 MB and checkpoints in 26.3 s -- 2.4x less data takes 9.7x longer because it is spread across 778 tensors instead of 39. At GPFS's 1.2 GB/s, VGG19's 548 MB should take about 0.46 s of pure I/O, so even the fast case is serialisation-bound, not bandwidth-bound. Resume is measured separately across 1-, 2-, and 8-worker runs and decomposes into build model / load checkpoint / warm up, reaching roughly 60-70 s at the top of the range.

5.7 Large-scale trace-driven simulation (Table 5)

All values normalised by Tiresias-L; > 1 means Tiresias-L is better.

Solution Average Median 95th
YARN-CS 2.41x 30.85x 1.25x
Best-effort 1.50x 9.03x 1.08x
SRTF 1.00x 1.00x 0.84x
Gandiva 2.00x 2.59x 2.08x
Tiresias-G 0.97x 1.00x 0.85x

Four readings matter. (a) Tiresias-L matches the SRTF oracle on average and median and loses only in the tail (0.84x) -- an information-agnostic policy reaching parity with perfect knowledge. (b) Best-effort captures a large share of the gain: removing HOL blocking alone moves 2.41x down to 1.50x, so roughly 40% of the improvement is "let small jobs jump the queue" and the remaining 60% is genuine 2DAS prioritisation. (c) Gandiva's time-sharing loses on all three statistics, confirming that fair sharing is not an average-JCT policy. (d) Tiresias-G is marginally better than Tiresias-L at scale -- the reverse of the testbed result, because the simulator does not charge Gittins for its extra preemptions.

5.8 Sensitivity analysis

Normalised average JCT, each variant against its own (K=2, 1 h) configuration:

Knob setting 0.5 h 1 h 2 h 4 h K=2 K=3 K=4
Tiresias-L 1.03 1.00 1.00 1.00 1.00 0.99 0.99
Tiresias-G 1.00 1.00 1.00 1.00 1.00 1.00 1.00
PROMOTEKNOB inf 8 4 2 1
Tiresias-L, norm. 95th JCT 1.000 0.952 0.947 0.943 0.936
Tiresias-G, norm. max JCT 1.00 0.65 0.65 0.65 0.65

The configuration surface is remarkably flat. Going from 2 queues to 4 buys 1%; going from a 1 h threshold to 4 h buys nothing. The authors explain the threshold insensitivity directly: 1 h of GPU time already covers more than 60% of all jobs, so the boundary sits past the mass of the distribution. PROMOTEKNOB is the only knob with visible effect, and it is a pure tail knob -- it cuts Tiresias-G's maximum JCT by 35% and Tiresias-L's 95th percentile by 6.4%, with essentially no dependence on the value once promotion is enabled at all.


6. Configuration-Regime Trade-off Tables

6.1 Scheduling discipline

Dimension FIFO (YARN-CS) Time-sharing (Gandiva) SRTF (oracle) Discretized 2D-LAS Discretized 2D-Gittins
Prior knowledge required none none exact duration none duration distribution
Schedule dimensions temporal none temporal spatial + temporal spatial + temporal
Scheduling input arrival time n/a remaining time attained service attained service
Priority representation continuous continuous continuous discretized queues discretized queues
Minimises average JCT no no yes yes yes
Starvation avoidance n/a n/a n/a promote to Q1 promote to Q1
Preemptions (testbed) 0 context switch 316 221 297
Sim. avg JCT (norm. to L) 2.41x 2.00x 1.00x 1.00x 0.97x

For a deployment with no reliable duration logs, prefer Discretized 2D-LAS: it matches the oracle on average and median JCT in simulation, needs nothing from the user, and preempts 30% less than the oracle. Gittins earns its extra complexity only when the duration distribution is both available and stable -- and even then the testbed shows its extra preemptions eat the analytical advantage, leaving Tiresias-G 1.06x worse than Tiresias-L on real hardware.

6.2 Placement policy

Dimension Always consolidate Random / spread ILP (Appendix D) Profile-based (Tiresias)
Queueing delay induced high (blocks on free servers) none moderate low
Training speed, high-skew models best up to 1.67x slower not model-aware best (consolidates them)
Training speed, low-skew models no benefit no penalty not model-aware no penalty
Fragmentation worst best moderate good
Decision cost O(1) O(1) infeasible at scale O(1) after one profile
Model-structure aware no no no yes

Prefer profile-based placement: it is the only policy that spends the scarce resource -- whole free servers -- exclusively on the jobs that can convert it into speed. It beats the ILP because the ILP's objective, balanced network load, cannot represent that one 392 MB tensor and 778 small tensors damage a job differently at equal aggregate bytes.

6.3 Discretization depth and the fairness knob

Dimension K=1 (pure FIFO) K=2 K=3/K=4 continuous
Avg JCT (norm., Tiresias-L) HOL blocking 1.00 0.99 ~oracle
Preemption events 0 221 more 316
Ignoring preemption cost worst good good best
Including preemption cost poor best good poor
PROMOTEKNOB inf 8 -- 1
Semantics never promote promote when delta_J >= k*t_J
Average JCT best slightly worse
95th JCT (L) 1.000 0.952 -> 0.936
Max JCT (G) 1.00 0.65 (flat across k)
Starvation risk present bounded

Prefer K=2 and any finite PROMOTEKNOB. Larger K performs close to K=2 when preemption overhead is ignored and worse once it is charged, because K bounds how many times a job can be demoted and therefore preempted -- a genuine case of a coarser signal producing a better system. The Tiresias-G max-JCT row is equally decisive: enabling promotion at all cuts worst-case JCT by 35%, and the specific value from 8 down to 1 changes nothing further. That is a knob with a cliff at "on" and a plateau afterwards, the best possible shape for an operator-facing parameter.


7. Bottlenecks & Insights Surfaced by the Measurements

7.1 The bottleneck was never the network -- it was the queue

The decomposition is unambiguous: scheduling delivers 5.5x, placement up to 1.67x on the subset of jobs it affects. The average job in the Microsoft trace waits 4102 s before it starts computing. Every network optimisation in the DDL literature attacks the fraction of iteration time spent in aggregation; Tiresias points out that for two thirds of jobs the dominant term is time spent doing nothing at all.

The core epistemic move that fixes it is replacing an unobservable (remaining time) with an observable that is monotone in it under a heavy-tailed distribution (attained service). Under heavy tails a job that has already run a long time is expected to run even longer, which inverts the usual intuition and makes least-attained-service a good proxy for shortest-remaining-time. Tiresias-L matching SRTF at 1.00x average and median confirms the proxy is nearly lossless here.

7.2 Skew, not size, predicts placement sensitivity

              PLACEMENT SENSITIVITY vs LARGEST-TENSOR RATIO

  sensitive  |  VGG11(77.3) VGG16(74.3) VGG19(71.5) AlexNet(61.0)
             |                                                |
             |                                          PACKLIMIT
             |                                       must lie here
             |                                                |
insensitive  |  GoogleNet(14.6) ResNet50(9.2) Incep3(8.6)
             |  ResNet101(5.3) ResNet152(3.9) Incep4(3.6)
             +--------------------------------------------------
              0%        20%        40%        60%        80%
                        largest tensor / model size

  Control pair:  AlexNet   235.9 MB, ratio 61.0%  -> SENSITIVE
                 ResNet152 230.2 MB, ratio  3.9%  -> INSENSITIVE
^ Fig 14: The separating statistic. Two models of nearly identical
  total size fall on opposite sides of the sensitivity boundary, and
  the gap between the clusters (61.0% vs 14.6%) is a factor of 4.2 --
  wide enough that a single scalar threshold is robust.

The mechanism the paper gives is that message size determines susceptibility to network contention: one huge tensor cannot interleave with anything, whereas many small tensors "tend to interleave better with each other." Model size is a non-predictor; skew is the predictor.

7.3 Two structural signals pull in opposite directions

            +----------------------------------------+
            |  Tensor size distribution of the model  |
            +---------+--------------------+----------+
        few, huge tensors            many, small tensors
                      |                    |
          +-----------v------+    +--------v----------+
          | HIGH SKEW        |    | LOW SKEW          |
          | VGG*, AlexNet    |    | ResNet*, Incep*   |
          +--------+---------+    +---------+---------+
                   |                        |
   placement : CONSOLIDATE          placement : SPREAD
               (needs whole                   (fits anywhere,
                servers, raises                cheap to schedule)
                queueing delay)
   preempt   : CHEAP, 1.3 - 2.7 s   preempt   : EXPENSIVE,
                                                5.7 - 26.3 s
                   v                        v
     "hard to place, easy to move"  "easy to place, hard to move"
^ Fig 15: The skew duality. Consolidation-sensitivity and preemption
  cost are anti-correlated because both derive from the same
  tensor-count property, in opposite directions.

Tiresias exploits the first signal and measures the second, but never joins them. A scheduler that did would demote high-skew jobs freely -- they resume in 1-3 s -- and protect low-skew jobs, since ResNet152 pays 26.3 s of checkpoint on every priority change. The profiler already collects everything needed to make that join.

7.4 Discretization is cost control; utilisation is a poor metric

The usual reason to discretize a priority is tractability. Here the reason is that each priority change costs 57-62 s of GPU time, so the number of changes is itself the quantity to minimise. This reframes MLFQ from "an approximation to SRPT" into "a rate limiter on reconfiguration," and explains why the analytically stronger Gittins variant loses on real hardware: its within-queue re-sorting reintroduces exactly the churn discretization was installed to suppress. The corollary is that cluster-wide GPU utilisation -- statistically indistinguishable across all four solutions while average JCT differs by 5.5x -- would have been blind to the entire improvement. Only the distribution of completion times resolves it.

7.5 Observing the wire is enough to recover the model

The profiler recovers model size, tensor-size distribution, skew, and iteration boundaries purely from intercepted ibverbs metadata. This works because synchronous DDL is byte-for-byte periodic: the same property that makes iteration time predictable makes a few iterations a sufficient sample. It is a strong argument for placing observability below a system rather than inside it whenever the system's traffic is periodic.


8. Limitations of the Methodology

Limitation Consequence
Parameter-server architecture only No all-reduce path measured; the skew rule is derived from PS hotspotting and may not transfer to collectives
PACKLIMIT value never published; classifier features, training data, and update cadence unspecified Placement result reproducible in shape, not numerically
60-GPU testbed vs 128-GPU largest production job; only 5 jobs at 32 GPUs Large-job statistics rest on a very small sample
Simulator omits preemption overhead and placement effects, and replays actual completion times Table 5 favours preemption-heavy policies; Tiresias-G's 0.97x edge is likely an artefact
#PS forced equal to #workers A real degree of freedom is collapsed; PS-count sensitivity unmeasured
Job resource request never resized Cannot compare against elastic schedulers on equal terms
Preemption via full checkpoint to GPFS Overhead is filesystem- and framework-specific; a faster mechanism would change every K and PROMOTEKNOB conclusion
Single 100 Gbps IB fabric No Ethernet / RoCE / lower-bandwidth regime, where placement would matter far more
10 public models substituted for proprietary ones Trace skew distribution is assumed, not measured
No error bars or variance on JCT results Cannot bound measurement noise
STARVELIMIT never given; PROMOTEKNOB disabled in all testbed runs Both starvation parameters validated only in simulation
No formal analysis of Discretized 2DAS Explicitly listed as future work; applicability bounds unknown
Intra-server interference not modelled Acknowledged: PCIe contention among collocated workers and PS is out of scope
TensorFlow 1.3.1, 2017-era stack Predates most modern gradient-fusion and collective backends

The two limitations that most constrain generalisation are the PS-only scope and the checkpoint-based preemption mechanism. The first means the placement insight is about point-to-point hotspots, not about collective algorithm behaviour. The second means every conclusion about K, discretization depth, and Gittins-versus-LAS is conditional on preemption costing tens of seconds -- as the authors say, with lightweight preemption "many classic and efficient algorithms in network flow and CPU scheduling can be applied."


9. Note on NCCL Tuning

The transferable idea here is the profiler, not the scheduler. Tiresias shows that a loadable shim intercepting ibverbs can recover a job's message-size distribution from the wire in a few iterations, with no framework cooperation, and that a single scalar summarising that distribution's skew is enough to flip a binary configuration decision correctly across ten very different models. A collective-library tuner faces the structurally identical problem: message-size distribution is the primary determinant of the right algorithm and protocol, and it is observable at the transport layer long before any model metadata is available. Two further lessons carry over. First, skew beats aggregate size -- the AlexNet/ResNet152 pair shows two workloads with the same total bytes needing opposite configurations, which argues against tuning on total message volume alone. Second, discretize the decision to limit churn: Tiresias uses K=2 queues because reconfiguration costs 57-62 s, and its Gittins variant, the analytically better policy, loses on real hardware purely because it re-evaluates too often.


10. Analogy

Tiresias is an emergency-department triage desk that has no diagnostic equipment. It cannot run a scan to learn how long any patient will take -- the DL equivalent of a loss curve is unreliable, and most patients leave before treatment finishes anyway. So the triage nurse uses the only two things visible from the waiting room. The first is how long you have already been treated, weighted by how many staff you are occupying (attained service, W_J x t_J): under a heavy-tailed case mix, the patient who has already tied up six nurses for three hours is statistically the one who will tie them up for six more, so newcomers go first. That single substitution turns a two-hour wait for a five-minute case into a thirteen-second one.

The second visible signal is the shape of the case, not its size. Two patients may need the same total volume of care, but one needs a single uninterruptible four-hour procedure while the other needs seven hundred short independent checks. The first must be given a whole operating theatre -- splitting it across rooms is catastrophic. The second can be done anywhere, in any spare corner, and should be, so the theatres stay free. Tiresias learns which kind of case it is by listening at the door rather than reading the chart: it intercepts the traffic between workers and parameter servers and reconstructs the model's tensor structure from message sizes alone. This is why AlexNet and ResNet152, at 235.9 MB and 230.2 MB, get opposite treatment -- the byte count is the same, the shape is not.

The design's final discipline is knowing that moving a patient between rooms costs a minute of everyone's time. A perfectly responsive triage policy that re-ranked the queue continuously would spend the whole shift wheeling gurneys. So the desk keeps only two priority levels and moves a patient at most once. The paper's most instructive result is that this deliberately coarse policy, which knows nothing about how long anyone will take, finishes the day's caseload as fast as an oracle that knew every duration in advance.