Artifact Description (AD): Drava¶
This Artifact Description follows the SC reproducibility-initiative structure. It describes how to obtain, build, run, and reproduce the results in the paper “Drava: An Event-Driven Runtime for Scientific Pipelines” (XLOOP @ SC26).
Double-blind note: this AD is anonymized. Repository and dataset links are given as anonymized artifact links; do not add the de-anonymizing GitHub or institutional URLs until the paper is de-anonymized.
1. Abstract¶
Drava is an event-driven runtime for scientific streaming pipelines at the edge. The artifact contains the Drava runtime (C/C++ on top of XKRT with Python bindings), two representative applications (PtychoNN two-stage ptychography and TomoGAN tomographic denoising), a pvaPy baseline for the PtychoNN pipeline, and the benchmark/plot scripts that regenerate every figure and table in the paper. Experiments run on a single GPU node (representative edge / near-facility inference node) and measure throughput, end-to-end latency, GPU + CPU energy, and an agentic (ytopt) configuration search.
2. Artifact check-list (meta-information)¶
Program: Drava runtime; PtychoNN and TomoGAN inference pipelines; pvaPy baseline.
Compilation: LLVM/Clang >= 20 (C++20), CMake.
Runtime environment: Linux; CUDA 12.3; free-threaded CPython 3.13; NATS server (JetStream).
Hardware: 1 GPU node. Paper used a JLSE node: dual-socket AMD EPYC 7532, 256 GB DDR4, 1x NVIDIA A100-PCIE-40GB.
Metrics: frames/s (throughput), end-to-end latency (s), GPU energy (J and frames/J), CPU package energy (J), GPU+CPU total energy (frames/J).
Output: per-run CSV summaries, power-vs-time traces, and PDF/PNG figures.
Experiments: runtime message-rate ceiling; PvaPy vs Drava (single + two-stage); manual config sweep; observability sweep; agentic (ytopt) search; TomoGAN energy.
How much disk: ~5 GB (models, datasets, build).
How much time to prepare: ~1-2 h (build + deps + data).
How much time to run (full): ~4-8 h for all sweeps at
--runs 10.Publicly available: Yes (anonymized artifact link).
Code license: see
LICENSE.Workflow framework: none required; plain Python/bash drivers.
3. Description¶
3.1 How to access¶
Clone the anonymized artifact and check out the paper branch:
git clone <ANONYMIZED-ARTIFACT-URL> drava
cd drava
git checkout paper/xloop
3.2 Hardware dependencies¶
One node with an NVIDIA A100 (or comparable) GPU.
x86-64 CPU with the
power/energy-pkg/perf event (AMD EPYC or Intel) for CPU energy.perfmust be usable (kernel.perf_event_paranoid <= 1).
3.3 Software dependencies¶
LLVM/Clang >= 20, CMake, CUDA 12.3, cuDNN 9.19.
XKRT runtime,
yaml-cpp, NATS C client +nats-server(v2.11+), SWIG 4.4.1.Python 3.13 (free-threaded), TensorFlow 2.20, Keras 3.12, NumPy 2.3, h5py, nats-py, PyYAML.
For the pvaPy baseline:
pvapy==5.6.0(module namepvaccess).For autotuning:
ytopt.
3.4 Datasets / models¶
PtychoNN: pretrained Keras/HDF5 weights + partial data via
examples/ptychonn/download_partial.py(public dataset).TomoGAN: pretrained generator + 16 preprocessed 1024x1024 slice pairs.
Throughput runs use deterministic PRNG-generated frames of the real shapes.
4. Installation¶
Follow the top-level README.md (Build Drava) and, on JLSE, the module setup
in that README. Summary:
# Modules (JLSE)
module use /soft/modulefiles
module load spack/gcc-0.6.1
module use /home/<user>/shared/modules # XKRT modules
module load llvm/master-nightly cmake intel/oneapi/release/2024.1 cuda/12.3.0 hwloc
module load xkaapi/<hash>/Debug-cuda swig/4.4.1 python/3.13-no-gil
# yaml-cpp and NATS C client: see README.md
# Build Drava
export NATS_ROOT=$HOME/opt/nats
mkdir build-debug-nats && cd build-debug-nats
CC=clang CXX=clang++ cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j
export PYTHONPATH="$(pwd):$PYTHONPATH"
5. Experiment workflow¶
All experiments and their exact commands are indexed in docs/paper.md. Each
benchmark writes a timestamped bench_logs*/ (or experiments/results/)
directory with per-run logs and a summary.csv; plot scripts consume those CSVs
and emit PDF/PNG into docs/figures/paper_figs/.
Reproducibility policy: the bulky per-run run directories (bench_logs*/,
experiments/results/) are git-ignored. The curated figure-source CSVs that
regenerate every plot are committed under experiments/figures/<experiment>/
(e.g., tomogan_energy/tomogan_energy_efficiency_data.csv and
tomogan_energy/sample_power_trace_b*.csv). To refresh a figure after a new
run, copy the relevant summary.csv/power_trace_*.csv from the run directory
into the matching experiments/figures/<experiment>/ file and re-run the plot
script.
The two experiments highlighted for this revision are detailed in Sections 7.1 (TomoGAN energy) and 7.2 (two-stage PvaPy) below.
6. Evaluation and expected results¶
PvaPy vs Drava (single stage): Drava is loss-free at publisher rates where PvaPy drops frames, and reaches up to ~2.36x higher unpaced throughput.
PvaPy vs Drava (two stage): both loss-free only up to 2 kHz for PvaPy; Drava sustains and scales the full pipeline through the unpaced rate while PvaPy fails to complete the stitch at >= 2.5 kHz.
Runtime message-rate ceiling: ~31k frames/s once callback batches are large.
Observability sweep: end-to-end optimum differs from the GPU-inference optimum (up to ~2.44x throughput improvement from batching-aware tuning).
Agentic search: ytopt finds a config ~2.24x faster than the best manual one while sampling 0.52% of the space.
TomoGAN energy: throughput and energy efficiency (frames/J) do not scale identically with batch size (non-monotonic efficiency).
Small run-to-run variation is expected; report mean +/- std over --runs 10.
7. Detailed re-run instructions (this revision)¶
7.1 TomoGAN energy (GPU + CPU), 10 runs, with power traces¶
Measures GPU energy (integrated nvidia-smi power) and CPU package
energy (perf stat -e power/energy-pkg/). On JLSE AMD EPYC the RAPL powercap
sysfs is not readable, so perf is required for CPU energy.
Preflight (must print Joules):
perf stat -e power/energy-pkg/ sleep 1
nvidia-smi -L
# If perf shows <not supported>: sudo sysctl -w kernel.perf_event_paranoid=1
Run (from examples/tomogan, NATS + venv active):
cd examples/tomogan
python benchmark.py \
--batches 2,4,8,16 \
--thread-list 2 \
--num-frames 512 \
--runs 10 \
--rate-hz 0 \
--cpu-energy-source perf \
--perf-interval-ms 200 \
--save-power-trace
Outputs (under bench_logs/<timestamp>/):
summary.csvwith per-rungpu_energy_j_per_frame,cpu_energy_j,cpu_energy_j_per_frame,total_energy_j_per_frame,stage_fps, andcpu_energy_source.power_trace_b<batch>_r<run>.csv: GPU/CPU power-vs-time samples.
Regenerate figures:
# Efficiency bars (frames/J, GPU+CPU if present) + throughput line, mean +/- std.
# Point the plot's data CSV at the new summary (or copy the needed columns into
# experiments/figures/tomogan_energy/tomogan_energy_efficiency_data.csv).
python experiments/figures/tomogan_energy/plot_tomogan_energy_efficiency.py
# Power-vs-time line chart for one representative run:
python experiments/figures/tomogan_energy/plot_tomogan_power_trace.py \
examples/tomogan/bench_logs/<timestamp>/power_trace_b16_r1.csv
7.2 PvaPy vs Drava throughput vs publisher rate (single + two stage)¶
Throughput vs. publisher rate for both the single-stage inference stream and the
full two-stage PtychoNN pipeline (stage 1 GPU inference + stage 2 stitching),
identical science across runtimes; combined into one two-panel figure
(pvapy_drava_combined.pdf). Rates: 1k, 2k, 2.5k, 3k, and unpaced (“max”,
--rate-hz 0). Five runs per point.
Single-stage sweep (examples/ptychonn/pvapy_baseline, venv active). The
single-stage throughput metric is measured inside the consumer (first-receive to
last-callback), so it is independent of publisher/harness startup:
cd examples/ptychonn/pvapy_baseline
for R in 1000 2000 2500 3000 0; do
python benchmark.py --batches 128,256,512 --runs 5 --num-frames 3600 \
--rate-hz $R --monitor-queue 1024 --start-settle-s 2
done
Two-stage sweep, fixed inference batch 128 (figure panel (b)). Drava two-stage end-to-end latency is measured from the first frame actually sent (harness “First frame sent” marker), matching PvaPy’s release-at-first-frame timing:
# PvaPy (pvapy_baseline)
for R in 1000 2000 2500 3000 0; do
python benchmark_two_stage.py --batches 128 --runs 5 --num-frames 3600 \
--rate-hz $R --monitor-queue 1024 --start-settle-s 2
done
# Drava (examples/ptychonn, NATS auto-started by the harness)
cd ../ && \
for R in 1000 2000 2500 3000 0; do
python benchmark_two_stages.py --batches 128 --runs 5 --num-frames 3600 \
--rate-hz $R --threads 4 --timeout-ms 200 --stage-config pipeline.yaml
done
Copy each run’s summary.csv into the curated CSVs under
experiments/figures/pvapy_drava_comparison/ (pvapy_drava_ptychonn.csv,
pvapy_two_stage_summary.csv, drava_two_stage_summary.csv), then regenerate:
python experiments/figures/pvapy_drava_comparison/plot_pvapy_drava_combined.py --batch 128
Notes:
A curve stops at the highest rate a runtime sustains loss-free; PvaPy is loss-free only up to 2 kHz in both configs, Drava scales to “max”.
The Drava two-stage benchmark intermittently hits a native XKRT
free(): invalid sizeabort at stage init;--max-retries(default 3) relaunches the affected run, so sweeps complete.
8. Notes / caveats¶
Single-node scope is deliberate (isolates runtime behavior from network variability); multi-node transport is future work.
The simple pvaPy
PvaServerrecord path overwrites the current PV value under load; use paced--rate-hz(and/or--monitor-queue) for loss-free points.ytopt search is a one-time offline cost that amortizes over production runs.
9. How the AD maps to paper artifacts¶
Paper item |
Driver |
Plot |
Output figure |
|---|---|---|---|
Runtime ceiling |
|
|
|
PvaPy vs Drava (single + two stage) |
|
|
|
Manual config sweep |
|
same |
|
Observability sweep |
|
|
|
Agentic search |
|
|
|
TomoGAN energy |
|
|
|
TomoGAN power trace |
|
|
(revision) |