This repository contains the artifact for the OSDI'26 paper:
GraCE: Unlocking CUDA Graphs with Compiler Support for ML Workloads
The artifact is designed around a Docker-based workflow. The recommended path for artifact evaluation is to use the prebuilt Docker image, run the smoke test, and then run the provided experiment and analysis scripts to regenerate the figures and tables in the paper.
GraCE evaluates CUDA Graph execution behavior. Since CUDA Graph replay reduces CPU-side kernel launch overhead, measured speedups are sensitive to host CPU frequency scaling, idle states, GPU clocks, NUMA placement, and background system noise. The artifact therefore includes optional host-tuning scripts for paper-quality performance reproduction.
- Artifact contents
- Hardware requirements
- Host software requirements
- Getting started: 30-minute validation
- Detailed instructions
- Subdirectory documentation
- Artifact claims supported by this repository
- TL;DR full flow
grace-osdi26-artifact/
├── benchmark_runner/ # Lower-level benchmark launcher
├── configs/ # Workload lists used by experiments
├── docker/ # Dockerfiles and Docker run/build scripts
├── figures/ # Generated paper figures
├── host_tuning/ # Optional host-side low-noise benchmarking scripts
├── results/ # Raw and processed experiment outputs
├── scripts/ # Build, experiment, and analysis wrappers
├── tables/ # Generated paper tables
└── third_party/ # Source submodules: PyTorch, Triton, TorchBench, etc.
Detailed READMEs are provided in the subdirectories and explain each component in more detail.
The paper uses two hardware setups.
Single-GPU experiments. The single-GPU results were collected on:
GPU: NVIDIA H100 NVL
GPU memory: 94 GB HBM3
CPU: 64-core Intel Xeon Platinum 8462Y+
128 logical CPUs with hyperthreading enabled
Memory: 512 GB DDR5
Software: PyTorch 2.4, CUDA 12.8, cuDNN 8.9.2
Driver: NVIDIA 575.57.08
Multi-GPU tensor-parallel experiments. The tensor-parallel results were collected on a separate multi-GPU system:
GPUs: 4x NVIDIA H100
GPU memory: 80 GB per GPU
Interconnect: high-bandwidth NVLink
CUDA: 12.4
The artifact does not require these exact machines to run. Any recent x86-64 Linux machine with a CUDA-capable NVIDIA GPU, a compatible NVIDIA driver, Docker, and NVIDIA Container Toolkit should be able to run the functional checks and many of the experiments. However, the exact performance numbers in the paper are hardware- and system-dependent. For closest reproduction, use H100-class GPUs, a recent NVIDIA driver compatible with the CUDA version of the selected Docker image, and the optional host-tuning workflow described later in this README.
Tensor-parallel experiments require at least as many visible GPUs as the chosen tensor-parallel degree.
The artifact keeps Python, PyTorch, Triton, CUDA user-space libraries, and benchmark dependencies inside Docker. The host only needs the software required to run GPU-enabled Docker containers:
- Git
- Docker Engine
- NVIDIA GPU driver
- NVIDIA Container Toolkit
A full CUDA Toolkit installation on the host is not required for the prebuilt Docker workflow. The important requirement is that the host NVIDIA driver is new enough for the CUDA runtime used inside the selected Docker image.
Plan for at least 150 GB of free host disk space for one prebuilt Docker image, and more if keeping both CUDA 12.8 and CUDA 12.4 images locally. Building the prebuilt Docker image from source can take about 2--3 hours on an H100-class host. The full experiment workflow should be treated as a long-running run; a safe end-to-end allocation is about 24 hours, depending on GPU count, repeat count, Nsight Systems collection.
Install Docker Engine using the official Docker documentation:
- Docker Engine for Ubuntu: https://docs.docker.com/engine/install/ubuntu/
Verify Docker:
docker --version
docker run --rm hello-worldInstall the NVIDIA driver using your cluster/system administrator's preferred method or the official NVIDIA/Ubuntu documentation:
- Ubuntu NVIDIA driver installation: https://ubuntu.com/server/docs/how-to/graphics/install-nvidia-drivers/
- NVIDIA CUDA Installation Guide for Linux: https://docs.nvidia.com/cuda/cuda-installation-guide-linux/
Verify the driver:
nvidia-smiInstall NVIDIA Container Toolkit using the official NVIDIA documentation:
- NVIDIA Container Toolkit: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
Verify that Docker can access the GPU:
docker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smiIf this command prints the GPU list, the host is ready to run the GraCE Docker image.
This path validates that the artifact works. It uses the prebuilt Docker image and runs a small smoke test.
git clone https://github.com/csl-iisc/GraCE-OSDI26-Artifact grace-osdi26-artifact
cd grace-osdi26-artifactSynchronize and initialize submodules:
git submodule sync --recursive
git submodule update --init --recursiveThe main source submodules are:
third_party/pytorch
third_party/triton
third_party/torchbenchmark
If a submodule checkout is inconsistent, reset it to the artifact-recorded commit:
git submodule update --init --recursive --forceThe GraCE implementation is contained in the source submodules. In particular,
third_party/pytorch contains the modified PyTorch implementation, with
separate osdi26/grace-* branches corresponding to the incremental GraCE
optimizations used in the artifact. third_party/triton contains the Triton
changes needed by GraCE, primarily on the osdi26/grace-indirection branch.
third_party/torchbenchmark contains the benchmark-suite used by the evaluation.
Building the docker container from the source takes 2+ hours. We provide a prebuilt image that avoids the long source build, and can be quickly pulled and used for the smoke test (and running the experiments).
docker pull abhishekghosh1998/grace-osdi26:cuda128-prebuiltTag it with the local name expected by the run scripts:
docker tag abhishekghosh1998/grace-osdi26:cuda128-prebuilt \
grace-osdi26:cuda128-prebuiltA CUDA 12.4 image is also available:
docker pull abhishekghosh1998/grace-osdi26:cuda124-prebuilt
docker tag abhishekghosh1998/grace-osdi26:cuda124-prebuilt \
grace-osdi26:cuda124-prebuiltThe CUDA 12.8 image is the default artifact path. The CUDA 12.4 image is provided as an additional prebuilt environment.
For the CUDA 12.8 image:
docker/run_cuda128.shFor CUDA 12.4:
docker/run_cuda124.shThe run scripts bind-mount output directories from the host:
results/
figures/
tables/
Therefore, experiment outputs produced inside Docker remain available on the host.
For development, use the full-repository bind mount:
docker/run_cuda128_developer.shInside the Docker container:
bash scripts/smoke_test.shThe smoke test checks:
- CUDA visibility
- PyTorch CUDA allocation
- GraCE conda environment activation
- Benchmark runner functionality
- Result-file writing
Expected final output:
[OK] Workload run completed.
Smoke-test results are written under:
results/raw/smoke/<run_id>/
At this point, the artifact is functionally validated.
For the complete end-to-end command sequence, jump to TL;DR full flow.
Docker containers often write bind-mounted outputs as root. If the generated
files are not editable on the host, run:
sudo chown -R "$USER:$USER" results figures tablesThe getting-started path above validates that the artifact is functional. This section describes the full workflow for Docker images, optional source builds, low-noise host tuning, complete experiment execution, and regeneration of the paper figures and tables.
The artifact uses two classes of Docker images.
Recommended for artifact evaluation:
grace-osdi26:cuda128-prebuilt
This image already contains:
- Conda environments
- Built PyTorch/GraCE variants
- Built Triton variants
- TorchBench/model dependencies
- Benchmark scripts
- Analysis dependencies
- Nsight Systems, if included in the build
Run it with:
docker/run_cuda128.shUseful for source rebuilds and development:
grace-osdi26:cuda128-base
Run it with:
docker/run_cuda128_developer.shThe base image contains the only system-level build environment needed to compile and install the artifact stack, but it does not contain the fully built GraCE variants. In particular, it includes CUDA development environment, Conda, Compilers and build tools, Git and source-control utilities, Python build dependencies, Common system libraries required by PyTorch/Triton/TorchBench builds.
Inside the base image, use the scripts under scripts/ to create conda
environments and build the variants.
See docker/README.md for Docker-specific details.
Building from source is optional for artifact evaluation. It can take about 2 hours depending on CPU count, network speed, and storage performance.
To build the CUDA 12.8 prebuilt image:
docker/build_cuda128.sh --prebuiltTo build the CUDA 12.8 base image:
docker/build_cuda128.sh --baseFor CUDA 12.4:
docker/build_cuda124.sh --prebuilt
docker/build_cuda124.sh --baseThe generic build helper is:
docker/build_image.shIf using the base/developer image, build the software stack inside Docker:
bash scripts/setup_conda_envs.sh
bash scripts/build_all_variants.sh
bash scripts/install_workloads.shThe prebuilt image already performs these steps.
See docker/README.md for Docker-specific details.
Host tuning is optional for functional validation but recommended for paper-quality performance reproduction.
GraCE evaluates CUDA Graph execution. CUDA Graph replay reduces CPU-side launch overhead, so host-side variability can affect measurements. Important sources of noise include, CPU frequency scaling, deep CPU idle states such as C6, hyperthread sibling interference, NUMA mismatch, GPU clock variation, background host processes
To tune the host before launching Docker:
sudo host_tuning/tune_host_intel_h100.shThe tuning script configures CPU/GPU stability settings and Docker-aware cpuset isolation. It also writes Docker launch metadata that the Docker run scripts can read automatically:
docker/.generated/docker_cpuset.env
After tuning, launch Docker normally:
docker/run_cuda128.shor use the explicit Docker command printed by the tuning script.
After all experiments finish, restore the host:
sudo host_tuning/restore_host_intel_h100.shSee host_tuning/README.md for details and safety notes.
All commands in this section are run inside the Docker container unless stated otherwise.
bash scripts/smoke_test.shRun the experiments:
bash scripts/run_single_gpu_experiments.shActivate a conda environment in the container:
conda activate grace-fullGenerate Figures 9 and 10:
bash scripts/generate_figure9.sh
bash scripts/generate_figure10.shor:
bash scripts/generate_single_gpu_figures.shExpected outputs:
figures/figure9.pdf
figures/figure10.pdf
Run:
bash scripts/run_tp_experiments.shGenerate the TP scaling figure:
conda activate grace-full
bash scripts/generate_tp_figure.shExpected output:
figures/figure11.pdf
You can control TP sizes with:
TP_LIST="1 2 4" bash scripts/run_tp_experiments.shCollect Nsight Systems traces:
bash scripts/run_table2_cgct_coverage_nsys.shGenerate the table:
conda activate grace-full
bash scripts/generate_table2_cgct_coverage.shExpected output:
tables/table2_cgct_coverage.csv
This step requires nsys inside the Docker image.
Run the debug-copy experiment:
bash scripts/run_table3_pi_copy_debug.shGenerate the table:
conda activate grace-full
bash scripts/generate_table3_pi_copy_debug.shExpected output:
tables/table3_pi_copy_debug.csv
Raw results are timestamped:
results/raw/<experiment>/<run_id>/
Examples:
results/raw/single_gpu/20260502-201906/
results/raw/tp/20260502-223735/
results/raw/table2_cgct_coverage/20260502-095126/
results/raw/table3_pi_copy_debug/20260502-100909/
Each experiment root maintains:
latest.txt
Analysis wrappers use latest.txt by default.
Processed outputs are written under:
results/processed/
Paper-facing outputs are written under:
figures/
tables/
Typical outputs:
figures/figure9.pdf
figures/figure10.pdf
figures/figure11.pdf
tables/table2_cgct_coverage.csv
tables/table3_pi_copy_debug.csv
Most experiment scripts support environment-variable overrides.
| Variable | Meaning |
|---|---|
RUN_ID |
Use a fixed run ID instead of a timestamp |
REPEAT |
Number of benchmark repetitions |
WORKLOADS |
Override workload list |
RESULTS_ROOT |
Override raw output root |
TIMEOUT_SECS |
Add per-run timeout |
TP_LIST |
TP sizes for tensor-parallel experiments |
CUDA_VISIBLE_DEVICES |
Select GPU IDs |
USE_NUMACTL |
Enable/disable container-side numactl |
Examples:
RUN_ID=test REPEAT=3 bash scripts/run_single_gpu_experiments.sh
TP_LIST="1 2" REPEAT=10 bash scripts/run_tp_experiments.shSee scripts/README.md for details.
Workloads are listed under:
configs/
Important files:
workloads_smoke.txt
workloads_single_gpu_25_with_acronym.txt
workloads_tp.txt
workloads_table2_cgct_coverage.txt
workloads_table3_pi_copy_debug.txt
Each line has either:
<Model> <Suite> <Mode> <BatchSize>
or:
<Acronym> <Model> <Suite> <Mode> <BatchSize>
See configs/README.md for details.
The lower-level benchmark launcher is:
benchmark_runner/run_workloads.sh
The higher-level scripts in scripts/ call it automatically. Most users should
not need to invoke it directly.
See benchmark_runner/README.md for details.
More detailed documentation is available in:
benchmark_runner/README.md
configs/README.md
docker/README.md
host_tuning/README.md
scripts/README.md
scripts/analysis/README.md
This artifact supports the following claims:
- GraCE improves CUDA Graph coverage over the baseline PyTorch CUDA Graph path on selected deep learning workloads.
- GraCE reduces data-copy movement required by CUDA Graph execution.
- GraCE improves performance on selected single-GPU workloads.
- GraCE improves performance under selected tensor-parallel workloads.
- The reported figures and tables can be regenerated using the provided workload lists, scripts, Docker images, and analysis pipeline.
Exact numerical values may vary with GPU model, CPU topology, driver version, host noise, and clock/power settings.
# ---------------------------------------------------------------------------
# Host: clone source.
# ---------------------------------------------------------------------------
git clone https://github.com/csl-iisc/GraCE-OSDI26-Artifact grace-osdi26-artifact
cd grace-osdi26-artifact
git submodule sync --recursive
git submodule update --init --recursive
# ---------------------------------------------------------------------------
# Host: pull prebuilt image.
# ---------------------------------------------------------------------------
docker pull abhishekghosh1998/grace-osdi26:cuda128-prebuilt
docker tag abhishekghosh1998/grace-osdi26:cuda128-prebuilt \
grace-osdi26:cuda128-prebuilt
# ---------------------------------------------------------------------------
# Host: optional, for paper-quality performance reproduction.
# ---------------------------------------------------------------------------
sudo host_tuning/tune_host_intel_h100.sh
# ---------------------------------------------------------------------------
# Host: start Docker.
# ---------------------------------------------------------------------------
docker/run_cuda128.sh
# ---------------------------------------------------------------------------
# Inside Docker: validate artifact.
# ---------------------------------------------------------------------------
bash scripts/smoke_test.sh
# ---------------------------------------------------------------------------
# Inside Docker: run experiments and generate outputs.
# ---------------------------------------------------------------------------
bash scripts/run_single_gpu_experiments.sh
bash scripts/generate_figure9.sh # in a conda environment provided with the docker container
bash scripts/generate_figure10.sh # in a conda environment provided with the docker container
bash scripts/run_tp_experiments.sh
bash scripts/generate_tp_figure.sh # in a conda environment provided with the docker container
bash scripts/run_table2_cgct_coverage_nsys.sh
bash scripts/generate_table2_cgct_coverage.sh # in a conda environment provided with the docker container
bash scripts/run_table3_pi_copy_debug.sh
bash scripts/generate_table3_pi_copy_debug.sh # in a conda environment provided with the docker container
# ---------------------------------------------------------------------------
# Host: restore after experiments.
# ---------------------------------------------------------------------------
sudo host_tuning/restore_host_intel_h100.sh
# Optional: fix bind-mounted output ownership on host.
sudo chown -R "$USER:$USER" results figures tables