docs: define Jetson support acceptance plan

This commit is contained in:
Joseph Magly
2026-08-21 19:31:58 -04:00
parent 56bcc41c8c
commit b340cc025e
3 changed files with 426 additions and 0 deletions
+273
View File
@@ -0,0 +1,273 @@
# Jetson support acceptance and release-validation strategy
Date: 2026-08-21
Scope: OBLITERATUS issue #31
Status: assessment, not implementation
## Executive conclusion
Issue #31 cannot be validated or released on a generic ARM builder alone.
Generic ARM64 CI can cover repository-level portability, importability,
packaging, and CPU-only behavior, but Jetson support depends on the NVIDIA
JetPack software stack and on execution on Jetson-class hardware or a JetPack
container running on that hardware.
The lowest-risk support model is:
1. keep the default PR gate CPU-only and deterministic;
2. add a Jetson-specific conditional gate on a self-hosted ARM64 Jetson runner;
3. treat generic ARM64 CI as a preflight layer, not as acceptance evidence;
4. require real-device smoke evidence before declaring Jetson support.
## What the current repo policy already says
The project context already establishes that the default PR baseline is
CPU-safe, deterministic, and must not require accelerator, network, or remote
credentials. Conditional accelerator checks are explicitly outside the default
CPU job.
The current conditional policy already has:
- a CUDA gate on `self-hosted, linux, x64, cuda`;
- a documented waiver model for unavailable accelerator lanes;
- a GitHub Actions routing model that relies on runner labels and groups.
That means Jetson support should be added as a new conditional lane, not folded
into the standard CPU PR job.
## Evidence-based split: generic ARM64 vs Jetson device
### Generic ARM64 builders can validate
- Python packaging and metadata.
- Pure-Python imports and CLI/help entry points.
- CPU-only unit and boundary tests.
- Static/configuration logic that does not require CUDA or JetPack runtime
libraries.
- The fact that a workflow can target `ARM64` self-hosted runners.
This is enough for portability regressions, but not enough for Jetson runtime
support.
### Jetson hardware or JetPack container is required for
- CUDA device discovery.
- CUDA execution and memory behavior.
- cuDNN / TensorRT / JetPack-specific library compatibility.
- Any claim that NVIDIA-provided Jetson PyTorch wheels run correctly.
- Any claim that the installed runtime actually sees a Jetson GPU.
NVIDIAs Jetson PyTorch installation guide says the provided wheels are meant
to be installed on top of a specified JetPack version on a Jetson device, and
verification is done by importing `torch` on the Jetson platform.
NVIDIAs Jetson Linux validation guide also says CUDA samples can be run
natively on the target or inside the JetPack container, which is the right
acceptance bar for hardware-backed validation.
## Support tiers
### Tier 0: source-only portability
Purpose: prove the codebase does not contain obvious ARM-incompatible
assumptions.
Environment:
- GitHub-hosted Linux or self-hosted ARM64 runner;
- CPU-only;
- no NVIDIA driver, no JetPack, no CUDA.
Checks:
- `python -m build --sdist --wheel`
- install the built wheel into a clean venv
- `python -m obliteratus --help`
- import and module smoke tests
- all CPU-only pytest markers
Acceptance:
- no architecture-specific syntax/runtime breakage;
- no packaging or import regressions.
### Tier 1: Jetson preflight on generic ARM64
Purpose: catch obvious Jetson-adjacent integration mistakes before touching
hardware.
Environment:
- ARM64 Linux runner without JetPack;
- optional cross-check against Jetson-targeted config files and dependency
pins.
Checks:
- validate Jetson-specific config manifests and workflow wiring;
- verify that Jetson jobs are gated behind dedicated labels and environment
variables;
- confirm that no Jetson-only dependency is pulled into the default PR job.
Acceptance:
- the repo can express a Jetson lane cleanly;
- default CI remains CPU-only.
### Tier 2: Jetson hardware smoke
Purpose: prove the runtime actually works on a Jetson device.
Environment:
- self-hosted Linux ARM64 Jetson runner;
- JetPack installed and active;
- NVIDIA runtime / CUDA stack available.
Checks:
- `torch` import from the JetPack-aligned wheel set;
- `torch.cuda.is_available()` and device enumeration;
- a tiny tensor operation on GPU;
- a minimal model-load or model-adapter smoke if the feature requires it;
- a short CUDA sample or equivalent library smoke;
- optional containerized run using the JetPack container on the target.
Acceptance:
- the device is recognized as CUDA-capable;
- the relevant Jetson wheel/container stack works on the intended JetPack
version;
- the workflow emits logs and artifacts that identify the exact JetPack / CUDA /
wheel set used.
### Tier 3: release validation
Purpose: certify a tagged release candidate.
Environment:
- Tier 2 Jetson hardware;
- pinned dependency set and reproducible artifacts;
- retained logs and hashes.
Checks:
- Tier 2 smoke;
- the repos full release-validation suite;
- supply-chain checks for vendor artifacts;
- any release note or compatibility matrix update.
Acceptance:
- tagged releases declare Jetson support only when Tier 2 and Tier 3 pass
against the exact tagged commit.
## Recommended runner labels
Use separate labels so the workflow can route cleanly and fail obviously if the
hardware is absent.
- `self-hosted, linux, arm64, jetson`
- optional refinement: `self-hosted, linux, arm64, jetson, orin`
- optional refinement: `self-hosted, linux, arm64, jetpack-<major>`
Keep the generic ARM64 preflight on a separate label such as:
- `self-hosted, linux, arm64, arm64-preflight`
This avoids accidentally treating a generic ARM machine as a Jetson target.
GitHubs self-hosted runner routing is label-based, and jobs remain queued if
no matching runner is online. That makes an explicit Jetson label the right
mechanism for a physical-device lane.
## Exact acceptance gates
Jetson support should be considered ready only when all of these are true:
1. The default PR gate still passes with no Jetson dependency.
2. A dedicated Jetson job passes on real hardware or an equivalent JetPack
target container.
3. The exact supported JetPack version is documented.
4. The exact NVIDIA wheel/container provenance is pinned and hashed.
5. The repo has a regression test that fails if Jetson detection or the CUDA
smoke is broken.
6. The release notes state the supported JetPack / CUDA / TensorRT matrix.
## Memory and thermal constraints
Jetson support should assume small-device variability, even on higher-memory
SKUs.
Practical guardrails:
- use tiny models and short sequences for smoke tests;
- cap wall time tightly;
- assert memory-sensitive paths with low-footprint fixtures;
- avoid benchmark-length runs on the Jetson lane;
- collect `nvidia-smi`-equivalent or device telemetry only if the platform
exposes it;
- do not rely on long repeated sweeps for acceptance.
If a test is intended to validate memory pressure, it should do so with a
deterministic threshold and a short timeout, not with a human-observed
benchmark.
## Rollback and waiver policy
If Jetson hardware is unavailable, the repo should:
- keep the Jetson lane optional and separately labeled;
- preserve the generic ARM64 preflight;
- publish a time-bounded waiver in the existing conditional-policy pattern;
- avoid claiming Jetson support in release notes.
If a Jetson regression is found after support is published:
- revert or patch the exact regression on the supported branch;
- keep the Jetson lane red until the hardware smoke passes again;
- do not widen the default PR gate to hide the failure.
## Supply-chain and security considerations
Jetson support increases supply-chain risk because the runtime depends on vendor
wheels and platform-specific system packages.
Controls to require:
- pin exact NVIDIA wheel URLs and versions;
- verify hashes for every downloaded binary artifact;
- prefer official JetPack / NVIDIA container images over ad hoc mixed library
stacks;
- do not mix arbitrary patched CUDA/TensorRT libraries into the supported
matrix;
- record the exact JetPack release, CUDA version, and TensorRT version in the
evidence trail;
- treat any vendor wheel update as a release-affecting change.
NVIDIAs TensorRT documentation explicitly notes that JetPack deployments must
remain on a TensorRT 10.x release supported by the JetPack version. That means
the Jetson compatibility matrix must be version-pinned, not “latest by default.”
## Recommended implementation path
1. Keep issue #31 open as a feature/specification item until the acceptance
matrix is merged.
2. Add a Jetson conditional policy entry and workflow job with an explicit
`jetson` runner label.
3. Add a minimal Jetson smoke test that checks import, CUDA discovery, and one
tiny GPU operation.
4. Add a generic ARM64 preflight job to catch packaging and configuration
regressions early.
5. Document the supported JetPack / CUDA / TensorRT matrix in the repo docs.
6. Promote Jetson claims only after a real-device run has passed on the exact
release candidate.
## Source URLs
- https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html
- https://docs.nvidia.com/jetson/archives/r36.5/DeveloperGuide/SD/TestPlanValidation.html
- https://docs.nvidia.com/deeplearning/tensorrt/latest/installing-tensorrt/installing.html
- https://docs.github.com/en/actions/reference/runners/self-hosted-runners
- https://docs.github.com/en/actions/reference/runners/github-hosted-runners
+6
View File
@@ -80,6 +80,12 @@ uv run --extra dev python scripts/run_conditional_gate.py cuda-runtime
uv run --extra dev python scripts/run_conditional_gate.py bitsandbytes-runtime
```
Jetson CUDA support is tracked separately from this generic x64 CUDA lane. A
generic Linux ARM build can prove package portability, but it does not prove
Jetson GPU support because Jetson depends on a JetPack/L4T-matched CUDA, cuDNN,
and PyTorch runtime. The support plan, recommended container path, and acceptance
criteria are documented in [NVIDIA Jetson support plan](jetson-support.md).
## Apple MPS and MLX
MPS uses a runner labeled `self-hosted`, `macOS`, `ARM64`, and `mps`; enable its
+147
View File
@@ -0,0 +1,147 @@
# NVIDIA Jetson support plan
Issue: https://github.com/elder-plinius/OBLITERATUS/issues/31
Internal testing assessment:
[.aiwg/testing/jetson-support-assessment.md](../.aiwg/testing/jetson-support-assessment.md)
## Decision
OBLITERATUS should treat Jetson AGX support as a distinct platform target, not
as a generic Linux ARM build. Generic `linux/aarch64` packaging can prove that
the Python package resolves and imports on ARM, but it does not prove CUDA on
Jetson because Jetson devices depend on JetPack/L4T-matched CUDA, cuDNN, and
PyTorch builds.
The first supported target should be Jetson AGX Orin 64 GB on JetPack 6.x, run
through either NVIDIA's Jetson PyTorch instructions or a JetPack-compatible
container. Xavier-era JetPack 5 can be documented as best-effort until a runner
exists.
## Evidence
NVIDIA documents Jetson PyTorch as JetPack-specific pip wheels with GPU
acceleration and cuDNN support, installed on top of the matching JetPack
version:
- https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html
- https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-pytorch
The NVIDIA NGC `l4t-pytorch` container is explicitly a Jetson/JetPack image and
requires matching the container tag to the installed JetPack/L4T release. The
`jetson-containers` project provides a practical composition path for PyTorch
and Transformers on Jetson, including compatible autotag selection:
- https://github.com/dusty-nv/jetson-containers
PyTorch upstream support is moving: PyTorch 2.11 release notes say PyPI wheels
now include CUDA 13.0 for Linux aarch64, while CUDA 12.6 and 12.8 wheels remain
available from `download.pytorch.org`. That improves generic ARM CUDA, but it
does not remove the need to match Jetson's installed JetPack/CUDA stack:
- https://github.com/pytorch/pytorch/releases
bitsandbytes currently publishes Linux aarch64 CUDA builds and lists targets
for CUDA 11.8 through 13.x. AGX Orin's Ampere GPU should satisfy the compute
capability requirement for 4-bit and 8-bit quantization, but the runtime still
has to be validated on the Jetson image actually used by contributors:
- https://huggingface.co/docs/bitsandbytes/en/installation
## Current repository gaps
- `pyproject.toml` maps Linux and Windows Torch resolution to the CPU-only
PyTorch index. That is correct for default CI, but it means the locked default
environment will not discover Jetson CUDA.
- `uv.lock` includes a Linux aarch64 bitsandbytes wheel, but Torch is locked as
`2.13.0+cpu` on Linux. A Jetson runtime must intentionally override Torch
after syncing the default lock, similar to the existing CUDA conditional lane.
- `.github/workflows/conditional-tests.yml` has one CUDA lane labeled
`self-hosted, linux, x64, cuda` and installs an official `cu130` Torch build.
It cannot run on Jetson because the runner labels and Torch source are x64
CUDA-specific.
- `docs/conditional-testing.md` documents generic CUDA and bitsandbytes probes,
not Jetson labels, JetPack requirements, or container startup.
- `Dockerfile` is based on `python:3.11-slim`, installs `requirements.txt`, and
is documented as local-only. It is not a Jetson image and should not be used
for a support claim.
- `obliteratus/device.py` can already detect CUDA through PyTorch, so no special
Jetson detection is needed for the first milestone. The blocker is installing
a CUDA-enabled Jetson PyTorch runtime and proving the existing device and
bitsandbytes contracts there.
- `tests/conditional/test_cuda_runtime.py` is a good starting probe, but it does
not record Jetson-specific platform evidence such as JetPack/L4T release,
CUDA version, Python version, architecture, Torch build, and bitsandbytes
binary availability.
## Implementation options
### Option A: Native Jetson runner, minimal repo changes
Attach a self-hosted runner on the Jetson with labels such as
`self-hosted`, `linux`, `ARM64`, `jetson`, and `cuda`. Add a new conditional
gate `jetson-cuda-runtime` that:
- syncs OBLITERATUS without replacing the system/vendor Jetson Torch build;
- verifies `platform.machine()` is `aarch64`;
- records `/etc/nv_tegra_release`, `nvcc --version`, `torch.__version__`,
`torch.version.cuda`, `torch.cuda.get_device_name(0)`, and
`bitsandbytes` import/runtime status;
- runs the existing CUDA and bitsandbytes probes.
Tradeoff: lowest abstraction and fastest to validate real hardware, but it
requires maintaining the Jetson's host Python/runtime state carefully.
### Option B: Jetson container lane
Base a Jetson-specific image on an NVIDIA L4T PyTorch image or build it with
`jetson-containers` from `pytorch` plus `transformers`. Install OBLITERATUS into
that image with dependency constraints that do not replace the container's
Torch. Run the same `jetson-cuda-runtime` probe inside the container.
Tradeoff: best reproducibility and closest to the reporter's concern about
patched/static libraries, but the image has to track JetPack/L4T tags and may
need per-JetPack dependency pins.
### Option C: Generic Linux ARM build plus separate Jetson UAT
Add a hosted or self-hosted Linux ARM packaging job that installs OBLITERATUS
with CPU Torch on aarch64, then keep Jetson CUDA as manual UAT evidence until a
stable runner exists.
Tradeoff: useful packaging signal for ARM contributors, but it must not be
presented as Jetson GPU support because it does not exercise CUDA, cuDNN,
device placement, quantization kernels, or JetPack compatibility.
## Recommended path
Use Option B for the support claim and Option C as a cheap early-warning signal.
The container path matches Jetson's dependency model, avoids polluting the
default lock with Jetson-only Torch URLs, and gives contributors a repeatable
recipe. A native runner can still be used to execute the container and collect
evidence. Treat generic ARM64 as Tier 0/Tier 1 preflight only; require
real-device Jetson smoke and release validation before publishing a support
claim.
## Acceptance criteria
- `docs/conditional-testing.md` documents Jetson as a separate conditional gate
with supported JetPack versions, runner labels, and local/container commands.
- `ci/conditional-test-policy.json` includes a `jetson-cuda-runtime` gate with a
tracking issue and evidence freshness rule.
- `.github/workflows/conditional-tests.yml` has a Jetson-selected job that runs
only on a labeled Jetson runner or through a Jetson-compatible container.
- The gate records JetPack/L4T, architecture, Torch CUDA version, CUDA device
name, memory, and bitsandbytes status in JSON evidence.
- The gate runs without skips:
`python scripts/run_conditional_gate.py jetson-cuda-runtime`.
- README support language says Jetson AGX Orin is supported only for the
specific JetPack/runtime combinations that have fresh green conditional
evidence.
## User guidance until support lands
Do not install from the default OBLITERATUS lock and expect Jetson CUDA to work.
Start from a JetPack-compatible PyTorch runtime, then install OBLITERATUS
without replacing Torch. If using a container, prefer an L4T PyTorch image or a
`jetson-containers` build that matches the device's JetPack/L4T release.