From c1884cbd3c116ca7d09edcf3663963643d553df2 Mon Sep 17 00:00:00 2001 From: Farhad Ramezanghorbani Date: Wed, 16 Sep 2026 11:45:22 -0700 Subject: [PATCH 1/3] ci: upload coverage to Codecov from the GPU test job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Codecov app is installed but receives nothing. pyproject's pytest addopts already run --cov=nvsubquadratic --cov-report=term, so coverage is computed on every gpu-tests run and then discarded to the log. Two things made this non-obvious. pytest runs inside the CI container via `docker run --rm`, so a report written in the container disappears with it — the coverage directory has to be a bind mount. And the image runs as USER ubuntu (Dockerfile:218), whose uid need not match the runner's, so the mount point is chmod 777 rather than relying on a uid match. Only --cov-report=xml is added on the command line; --cov and the term report stay in pyproject so local runs are unchanged and CI logs keep the summary. The upload is deliberately incapable of failing the job: `continue-on-error` plus `fail_ci_if_error: false`. gpu-tests is a required status check that takes ~36 minutes on a single self-hosted runner, and a Codecov outage or a missing CODECOV_TOKEN is not worth blocking a merge over. If the token secret is absent the action falls back to tokenless upload, which works for public repos. Also gitignores the `coverage/` directory the job creates in the workspace; .gitignore already covered `.coverage` and a bare `coverage.xml` but not the directory. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Farhad Ramezanghorbani --- .github/workflows/gpu-tests.yml | 23 ++++++++++++++++++++++- .gitignore | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gpu-tests.yml b/.github/workflows/gpu-tests.yml index 536ed139..5cd33677 100644 --- a/.github/workflows/gpu-tests.yml +++ b/.github/workflows/gpu-tests.yml @@ -66,9 +66,30 @@ jobs: - name: Run pytest run: | + # pytest runs inside the container, so coverage has to be written to a + # bind mount or it disappears with --rm. The image runs as USER ubuntu + # (Dockerfile:218), whose uid need not match the runner's, hence 777. + mkdir -p "${{ github.workspace }}/coverage" + chmod 777 "${{ github.workspace }}/coverage" docker run --rm --gpus all \ + -v "${{ github.workspace }}/coverage:/coverage" \ nvsubquadratic-ci:${{ github.sha }} \ - python -m pytest nvsubquadratic/ tests/ -v --tb=short + python -m pytest nvsubquadratic/ tests/ -v --tb=short \ + --cov-report=xml:/coverage/coverage.xml + # --cov and --cov-report=term already come from pyproject addopts; this + # only adds the machine-readable report Codecov needs. + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 + if: always() + continue-on-error: true + with: + files: ${{ github.workspace }}/coverage/coverage.xml + # Never let a Codecov outage or a missing token fail the job this + # workflow exists for. gpu-tests is a required status check and takes + # ~36 minutes; coverage reporting is not worth blocking a merge over. + fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} - name: Run distributed CP tests run: | diff --git a/.gitignore b/.gitignore index 85f56772..508a35d8 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ htmlcov/ .cache nosetests.xml coverage.xml +coverage/ *.cover *.py,cover .hypothesis/ From 03e9ae39845a3f89d0223d646aa1c9177e790738 Mon Sep 17 00:00:00 2001 From: Farhad Ramezanghorbani Date: Wed, 16 Sep 2026 11:51:59 -0700 Subject: [PATCH 2/3] ci: route subquadratic-ops binding changes to @moradza MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @moradza maintains the upstream subquadratic-ops package, so a change to the wrapper layer that binds to it — dtype/shape marshalling, the arch gating, the torch.compile lowering he rewrote — should reach him automatically rather than by someone remembering to add him. He is listed alongside the default owners rather than instead of them. GitHub requires an approving review from at least one codeowner per changed file, so this auto-requests his review without making him a hard blocker when he is away, and without preventing @farhadrgh from self-approving. Listing @moradza alone on a line would make his approval mandatory for that path; the comment in the file records that as the deliberate alternative. Verified: @moradza has write access, and all 12 paths exist at this commit. Bundled with the Codecov change because gpu-tests.yml has a bare `pull_request:` trigger with no path filter, so every PR — including a CODEOWNERS-only one — costs a ~36-minute run on the single self-hosted runner. Two config PRs would pay that twice. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Farhad Ramezanghorbani --- .github/CODEOWNERS | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c9c5c4ba..f4ff7b4f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -24,3 +24,28 @@ # Documentation source. /docs/ @farhadrgh @saeepaliwal + +# subquadratic-ops kernel bindings. +# +# @moradza maintains the upstream subquadratic-ops package these files bind to, +# so a change to the wrapper layer, its dtype/shape marshalling, or the +# torch.compile lowering should reach him automatically rather than by memory. +# +# He is listed ALONGSIDE the default owners, not instead of them: GitHub +# requires an approval from at least one codeowner per changed file, so this +# auto-requests his review without making him a hard blocker when he is +# unavailable. To make his approval mandatory for these paths, list @moradza +# alone on the line — note that would also stop @farhadrgh self-approving +# kernel changes. +/nvsubquadratic/ops/fftconv_custom.py @farhadrgh @saeepaliwal @moradza +/nvsubquadratic/ops/fftconv_lowering.py @farhadrgh @saeepaliwal @moradza +/nvsubquadratic/ops/causal_conv1d_custom.py @farhadrgh @saeepaliwal @moradza +/nvsubquadratic/modules/subq_ops_causal_conv1d.py @farhadrgh @saeepaliwal @moradza +/tests/ops/test_fused_fftconv2d.py @farhadrgh @saeepaliwal @moradza +/tests/ops/test_fftconv_lowering.py @farhadrgh @saeepaliwal @moradza +/tests/ops/test_fftconv_custom.py @farhadrgh @saeepaliwal @moradza +/tests/ops/test_fftconv_custom_1d.py @farhadrgh @saeepaliwal @moradza +/tests/ops/test_causal_conv1d_custom.py @farhadrgh @saeepaliwal @moradza +/tests/ops/test_subq_ops_fft_conv2d.py @farhadrgh @saeepaliwal @moradza +/tests/modules/test_subq_ops_causal_conv1d.py @farhadrgh @saeepaliwal @moradza +/tests/modules/test_ckconv_nd_subq.py @farhadrgh @saeepaliwal @moradza From c74b4441006919449267f7d50f408a2c3f2c2b3b Mon Sep 17 00:00:00 2001 From: Farhad Ramezanghorbani Date: Wed, 16 Sep 2026 13:07:51 -0700 Subject: [PATCH 3/3] ci: route ImageNet and spatial-recall changes to their authors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds ownership for the two experiment families: - ImageNet / ViT5 (benchmarks/vit5_imagenet, examples/imagenet_classification, examples/vit5_imagenet, the profiling report, and the two imagenet datamodules) -> @Dafidofff and @moradza. - Spatial recall (examples/spatial_recall_{1d,2d,3d,v2}, reports/spatial_recall, spatial_recall_dataset.py and its motion test) -> @dwromero and @Dafidofff. All 13 paths verified to exist at this commit. As with the subq-ops rules, each line lists the new owners ALONGSIDE the defaults, so their review is auto-requested without making any one person a merge blocker. Two things recorded in the file because both fail silently: - @dwromero and @Dafidofff currently have `read` access. GitHub ignores a CODEOWNERS entry for a user without write access — no auto-request, no required review, and no hard error. These rules stay inert until someone grants them write. @moradza already has it. - @Dafidofff is David Wessels. A separate @dwessels account exists and is not him; naming it would produce a rule that never fires. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: Farhad Ramezanghorbani --- .github/CODEOWNERS | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f4ff7b4f..378ca8ef 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -49,3 +49,30 @@ /tests/ops/test_subq_ops_fft_conv2d.py @farhadrgh @saeepaliwal @moradza /tests/modules/test_subq_ops_causal_conv1d.py @farhadrgh @saeepaliwal @moradza /tests/modules/test_ckconv_nd_subq.py @farhadrgh @saeepaliwal @moradza + +# ⚠️ PREREQUISITE for the two sections below: a CODEOWNERS entry naming a user +# WITHOUT write access to this repo is silently ignored — no auto-request, no +# required review, and no error beyond a soft warning in GitHub's CODEOWNERS +# editor. As of 2026-09-16 @dwromero and @Dafidofff have `read` only, so these +# rules are inert until someone with admin grants them write (Settings -> +# Collaborators, or add them to a team with write). @moradza already has write. +# +# Note @Dafidofff is David Wessels. A separate `@dwessels` account exists and is +# NOT him — naming it would produce a rule that silently never fires. + +# ImageNet / ViT5 experiments — @Dafidofff and @moradza. +/benchmarks/vit5_imagenet/ @farhadrgh @saeepaliwal @Dafidofff @moradza +/examples/imagenet_classification/ @farhadrgh @saeepaliwal @Dafidofff @moradza +/examples/vit5_imagenet/ @farhadrgh @saeepaliwal @Dafidofff @moradza +/reports/vit5_imagenet_dataloader_profiling/ @farhadrgh @saeepaliwal @Dafidofff @moradza +/experiments/datamodules/dali_imagenet_fused.py @farhadrgh @saeepaliwal @Dafidofff @moradza +/experiments/datamodules/tinyimagenet.py @farhadrgh @saeepaliwal @Dafidofff @moradza + +# Spatial-recall experiments — @dwromero and @Dafidofff. +/examples/spatial_recall_1d/ @farhadrgh @saeepaliwal @dwromero @Dafidofff +/examples/spatial_recall_2d/ @farhadrgh @saeepaliwal @dwromero @Dafidofff +/examples/spatial_recall_3d/ @farhadrgh @saeepaliwal @dwromero @Dafidofff +/examples/spatial_recall_v2/ @farhadrgh @saeepaliwal @dwromero @Dafidofff +/reports/spatial_recall/ @farhadrgh @saeepaliwal @dwromero @Dafidofff +/experiments/datamodules/spatial_recall_dataset.py @farhadrgh @saeepaliwal @dwromero @Dafidofff +/tests/test_spatial_recall_motion.py @farhadrgh @saeepaliwal @dwromero @Dafidofff