Research notebook

Gavel allocation trace analysis

Edit a Python cell and run it here. Your code runs in this browser tab; the notebook runtime and packages are served by this site.

Python starts when you choose Run.

Gavel: inspect the saved allocation trace

This notebook recomputes the two 1:2:3 policy means in How should AI jobs share different GPUs?, then lets you choose a timestep interval and a job. The inputs are the exact values saved in that article at commit 9df3f608a3e7b2e95312504f9d1cbf22e190091f.

Each score is effective throughput divided by that same job's expected rate at one-third time on each of K80, P100, and V100. The saved run used published policy code and measured throughput tables for an allocation-only numerical simulation. This notebook analyzes its outputs; it does not run GPU training or the round-based scheduler.

The source and saved outputs are visible before execution. Run all cells to check the numbers, or change the interval and job in the query cell. The article's existing charts remain directly explorable without running Python.

1. Read the three inputs

The site's runner mounts these files under /work: gavel-fresh-trace.json, gavel-weight-summary.json, and gavel-source.json. Locally, place them beside this notebook and run from that directory. The analysis uses the Python standard library; IPython.display renders the SVG outputs. There are no package installs or network calls in the notebook.

Python · cell 1
Source article commit: 9df3f608a3e7b2e95312504f9d1cbf22e190091f
Verified input hashes: 2
Saved job values: 1368

2. Define the aggregation and checks

At each timestep, sum the scores of jobs that have arrived. The published bar is the arithmetic mean of those 72 totals, so every timestep receives equal weight. Averaging all 684 job records directly would answer a different question because the number of active jobs changes.

The checks verify unique job/timestep pairs, all 18 arrivals, both policy traces, finite nonnegative scores, and the two published means to an absolute tolerance of 1e-10.

Python · cell 2
All numerical and trace-coverage assertions passed.

3. Recompute the published baseline

These are normalized progress scores, not raw tokens per second or GPU utilization. The comparison below describes one saved job sequence and one set of weights.

Python · cell 3
Weights 1:2:3; all 72 timesteps
Policy                  Steps         Mean          Min          Max
Throughput-aware           72     7.750821     1.719601    10.459325
Performance-agnostic       72     6.441240     1.000000     9.000000

Throughput-aware mean is 20.331% above the agnostic mean.
Agnostic mean is 16.896% below the throughput-aware mean.

4. Draw the checked values

Both lines use the saved 1:2:3 trace. Each plotted total is computed from its active jobs; no points are interpolated to create missing records. SVG point titles retain the timestep and value.

Python · cell 4
Saved-data aggregate trace analysis from the reviewed Gavel allocation run.

5. Query a different interval or job

Edit START_STEP, END_STEP, or JOB_ID, then run this cell. Job IDs run from 0 to 17. A job's mean includes only the selected steps after its arrival; a pre-arrival interval reports “not arrived” instead of treating an absent job as a zero-throughput job. The aggregate mean still includes every selected timestep.

Python · cell 5
All active jobs, steps 49–72:
Policy                  Steps         Mean          Min          Max
Throughput-aware           24     9.876224     9.096838    10.459325
Performance-agnostic       24     8.728238     7.856588     9.000000

Job 12, selected steps after arrival only:
Policy                  Steps         Mean          Min          Max
Throughput-aware           24     1.130766     0.581074     1.527814
Performance-agnostic       24     0.888889     0.500000     1.000000
Saved-data selected-job analysis from the reviewed Gavel allocation run.

6. Compare the two saved weight scenarios

The article also saves four means for weights 1:2:3 and 1:1:1. The 1:2:3 means were independently recomputed above. The article contains only summary values for 1:1:1, so this cell compares those saved means without claiming to rerun that trace or solve new weights.

Changing weights changes the allocation objective. These differences describe this workload response; they do not establish a general policy or fairness ranking. Target-share distances and raw GPU allocations are not inputs to this notebook.

Python · cell 6
Policy                   1:2:3 recomputed     1:1:1 saved     Change
Throughput-aware              7.750821276     7.921449236     2.201%
Performance-agnostic          6.441239771     6.601999472     2.496%

Source trail

  • Public references: Live article, Gavel paper, OSDI 2020, and Gavel source code.
  • Exact input source: script#gavel-data in the saved source/gavel-trace.html. Its Git blob SHA-1 is 572f09dc5a6399e5f80254791f0acbc1744798ba.
  • Trace coverage: 684 active-job records per policy, 1,368 total; 72 timesteps; 18 jobs. The full 1:2:3 series supports interval and job selection. The 1:1:1 series is not present in the article's embedded data.
  • Preserved reproduction: Download the original source, allocation data, and diagnostics. This small analysis package supplements that download.
  • Portable checks: analysis.py regenerates the CSV tables and SVG figures with Python's standard library. validate.py checks the exact extraction, source hashes, numerical assertions, figures, and executed notebook. manifest.json records the inputs and artifact hashes.

Python runs locally in this page. Saved results and figures are visible before execution.

Download full experiment notebook