Source-linked AI summary
pytest-gpu-proof: Enabling Cloud-CPU Continuous Integration for GPU Code with Local GPU Attestation
Brian Plancher
TL;DR
GPU acceleration is routine in robotics, but costly cloud GPU runners leave academic robotics software often severely under-tested. pytest-gpu-proof runs GPU tests locally and lets CPU-based CI verify signed receipts; the tool keeps expensive GPU computation on local hardware.
Problem
Cloud GPU CI often requires costly advanced features, and cloud-based GPU CI is generally avoided outside the largest corporations, leaving open-source GPU-accelerated robotics software often severely under-tested.
Source: §I · p. 1Method
pytest-gpu-proof runs GPU tests locally, signs a receipt of what ran and what it produced, and integrates verification into CPU-based CI workflows.
Source: §I · p. 1, §II · p. 2Results
pytest-gpu-proof enables CI of GPU projects while keeping expensive GPU compute on local hardware.
Source: §IV · p. 2Takeaways & Limitations
A receipt pins the passing-test claim to a source tree, commit, test list, outcomes, and date, allowing each push to be checked for accidental staleness.
Source: §III · p. 2A receipt is a keyholder’s attestation, not cryptographic proof of GPU execution, because a dishonest signer can sign anything.
Source: §III · p. 2
Abstract
from arXiv · showhide
GPU acceleration is now routine across robotics, but cloud-hosted GPU continuous integration (CI) runners are expensive, resulting in severe under-testing of GPU-accelerated code. We present pytest-gpu-proof, an open-source pytest plugin offering a practical middle ground. Tests can be run on a local machine, signed with a receipt of exactly what ran and what it produced, and integrated into standard CPU CI workflows (e.g., GitHub Actions). The tool is open source and on PyPI, and we are actively integrating it across our lab's software stack.
I. INTRODUCTION
GPU use in robotics is growing, while costly cloud GPU CI leaves open-source academic robotics software often severely under-tested. pytest-gpu-proof addresses this gap by moving GPU runs local and letting CPU-based CI verify signed attestations.
I. INTRODUCTION
- GPU-title or abstract papers grew from 25 at IROS and ICRA 2023 combined to 89 at IROS 2025 and ICRA 2026 combined.The cited work spans robotics areas including simulation, vision, estimation, mapping, planning, control, and end-to-end learning.Source: §I · p. 1
- Figure 1 depicts local signed GPU runs followed by cloud CI verification in seconds, with failures on drift from the attested run to the current tree.The authors frame the tool as support for low-resourced developers maintaining and testing software through CI.Source: Figure 1 · p. 1, §I · p. 1
- Cloud GPU runs often require costly advanced features, so cloud-based GPU CI is generally avoided outside the largest corporations.Open-source GPU-accelerated robotics software is consequently often severely under-tested, despite difficult-to-detect errors such as data-dependent race conditions.Source: §I · p. 1
- pytest-gpu-proof lets developers run GPU tests locally, sign what ran and what it produced, and integrate the attestation into CPU-based CI workflows.The plugin requires only pytest and an SSH key; its own CI runs at 100% test coverage, and it is open source under an MIT license and available on PyPI.Source: §I · p. 1
II. PLUGIN DESIGN AND OPERATION
pytest-gpu-proof runs GPU tests locally, signs a receipt of the run, and has CI verify it with a quick CPU-only step. Policies and sharding support different repository, release, and signer requirements.
II. PLUGIN DESIGN AND OPERATION
- The operation is summarized as running locally, signing, and verifying everywhere.Source: §II · p. 1
- The workflow selects GPU tests with a pytest marker, records their outcomes and run context in a JSON receipt, and signs it with the developer’s Ed25519 SSH key.The receipt includes the collected test set, outcomes and durations, expected skips, commit and tree state, environment and reported GPU, and a SHA-256 source fingerprint.Source: §II · p. 2
- CPU-only verification recomputes the source fingerprint and checks commit ancestry, passing tests, expected skips, freshness, and clean-tree policies.The receipt is committed with the code; CI can run locally or in the cloud.Source: §II · p. 2
- A comparison feature pairs a GPU kernel with a user-provided CPU or GPU reference implementation and records the outcome in the receipt.Source: §II · p. 2
- Declarative policies set fingerprint scope, receipt age, recording mode, and test manifests; they also support sharded receipts, release test requirements, and signer restrictions.Unknown policy fields fail verification; unchanged shards can carry forward, and signer policies can be open or restricted to allowlisted users.Source: §II · p. 2
III. WHAT A RECEIPT DOES AND DOES NOT PROVE
A receipt ties the claim that GPU tests pass to a specific source tree, commit, test list, outcome set, and date, and verification catches accidental staleness. It remains an attestation by a keyholder, not proof that GPU execution actually occurred.
III. WHAT A RECEIPT DOES AND DOES NOT PROVE
- Rechecking each push catches accidental staleness, identified as the dominant practical failure mode, by pinning the passing-test claim to the source tree, commit, test list, outcomes, and date.Source: §III · p. 2
- A receipt is a keyholder’s attestation, not cryptographic proof of GPU execution, because a dishonest signer can sign anything.The trust model is the same as a signed Git tag or release artifact; a restricted signing policy limits trust to chosen developers.Source: §III · p. 2
IV. CONCLUSION AND FUTURE WORK
pytest-gpu-proof keeps expensive GPU computation on local hardware while enabling CI for GPU projects. The authors welcome workshop discussion to refine policy vocabulary and adversarial feedback on the plugin design and trust model.
IV. CONCLUSION AND FUTURE WORK
- pytest-gpu-proof enables CI of GPU projects while keeping expensive GPU compute on local hardware.Source: §IV · p. 2