Repository navigation
fix(ci): stop main ci cancellation, fix heavy OOM, move CI to Blacksmith - #18
Conversation
ci.yml ran on push to main and was also called by images.yml on the same push. Both runs shared the group ci-refs/heads/main with cancel-in-progress, so one always cancelled the other: 8 of the last 10 main-push ci runs ended cancelled while images succeeded. Drop the push trigger: images.yml already runs ci before publishing, so each merge now gets exactly one ci run, the one that gates publication. Key the group on github.workflow too (in a called run it is the caller's name, images), and only cancel in progress for pull_request, so a PR run and the images run never share a group and the images-called run is never cancelled. images.yml keeps serializing main pushes with its own images-main group. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
full-suite failed on every nightly run. The last three were killed with "The runner has received a shutdown signal" after exactly 504 tests, each time while running tests/auditor/test_od_bisect.py. Run locally, two tests in that file peak at 18.4 and 18.9 GB RSS, above the 16 GB of the hosted ubuntu-24.04 runner, so the runner is evicted. blacksmith-16vcpu-ubuntu-2404 has 62 GB. native and canary pass on hosted runners and stay there. timeout-minutes is set from a measured dispatch on this branch. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…nners PR CI took ~45 min of wall clock on 2 vCPU hosted runners (run 39352445497): the slowest shard ran 21 min and test-slow (e2e) waited in the queue for 28 min before it started. blacksmith-8vcpu-ubuntu-2404 gives 8 vCPU / 30 GB and starts in seconds (canary run 39420280084). The shard count and file split stay the same. The astral-sh/setup-uv cache stays: it uses the actions cache, which Blacksmith serves. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Only runs-on changes. docker/setup-buildx-action and docker/build-push-action stay: the attested subject is the build-push-action digest output and the provenance comes from actions/attest-build-provenance, so keeping the same actions keeps the exact-digest attestation path the Cortex supervisor verifies. A branch cannot publish, so a Blacksmith-specific builder could not be proven before merge. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
Dispatch 39420692371 on this branch ran full-suite to completion on blacksmith-16vcpu-ubuntu-2404 in 55 min 27 s (pytest 3293 s). 90 min leaves about 60% margin; the old 150 min was sized for 2 vCPU. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… runner Blacksmith runners are recorded in the build provenance as runnerEnvironment=self-hosted. Cortex verifies its own image attestations with `gh attestation verify --deny-self-hosted-runners`, and the existing hypertrain attestations are runnerEnvironment=github-hosted. A digest built on a Blacksmith runner could be rejected by a verifier with that flag, so the publish job (build, push and attest) returns to ubuntu-24.04. The ci called by images keeps the Blacksmith runners: tests do not produce provenance. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Summary
Fix the
cirun that always ends "cancelled" on main, fix the nightlyheavyfull-suitekill, and move CI to Blacksmith runners.Why
ci.ymlran onpush: mainand was also called byimages.ymlon the same push. Both runs used the groupci-refs/heads/mainwithcancel-in-progress: true, so one cancelled the other. Evidence: 8 of the last 10 main-pushciruns werecancelledwhileimagessucceeded on the same SHAs (gh run list --branch main --workflow ci).heavykilled after ~3 min. On the last 3 nightsfull-suitegot "The runner has received a shutdown signal" after exactly 504 tests, each time insidetests/auditor/test_od_bisect.py. Run locally,test_fault_in_od_encoder_layer_bisectedpeaks at 18.4 GB RSS andtest_fault_in_embed_and_tailat 18.9 GB. The hosted runner has 16 GB, so the kill is an OOM eviction.test-slow (e2e)started 28 min after the run was created.What changed
ci.yml: removed thepush: maintrigger (main is covered byimages→workflow_call). The group is nowci-${{ github.workflow }}-${{ github.ref }};cancel-in-progressapplies only topull_request. In a called workflow,github.workflowis the caller's name (images), so the images-called run is inci-images-refs/heads/mainand a PR run is inci-ci-refs/pull/N/merge. They never share a group, and the run that gates publication is never cancelled. Pushes to main still serialize throughimages-main(cancel-in-progress: false). Workflow and job names are unchanged.heavy.yml:full-suiteruns onblacksmith-16vcpu-ubuntu-2404(62 GB),timeout-minutes150 → 90 (measured 55 min 27 s + ~60% margin).nativeandcanarypass already and are unchanged. The suite now runs to the end and fails on real tests (77 failed / 17 errors; mostly pre-existing od-fixture and native-only cases, plus 2test_publish_exclusionsfailures that are also red locally on main). Tracked in heavy full-suite: 77 real failures once the runner no longer OOMs #19, not hidden.ci.yml:lint, thetestshards andtest-slowrun onblacksmith-8vcpu-ubuntu-2404. The 8 shards and their split are unchanged. Theastral-sh/setup-uvcache is kept.images.yml: the calledciruns on Blacksmith, butpublish(build, push and attest) stays onubuntu-24.04(GitHub-hosted); see Risk.docker/setup-buildx-actionanddocker/build-push-actionare kept. The attestation subject is that action'sdigestoutput, and provenance is signed byactions/attest-build-provenance. A branch must never publish, so a Blacksmith builder could not be proven to keep the exact-digest +gh attestation verifypath before merge.miner-flow.ymlwas checked and left unchanged. It is not called by another workflow, and its main-push runs are allsuccess. The singlecancelledrun was a superseded PR push, which is the intended behaviour.Runner check (canary run 39420280084, since removed)
All of 4/8/16/32 vCPU
ubuntu-2404started within about 10 s, even though 8 and 16 vCPU are not listed in any org runner group. All Blacksmith sizes reportAMD EPYC, avx512f=yes, systemd as PID 1, and docker 28.0.4. The GitHub-hosted runners reportAMD EPYC 7763, avx512f=no. The CPU class differs.ATEN_CPU_CAPABILITY=avx2is still forced.tests/trainer/test_golden_replay.py(shard 0) passed with no xfail on Blacksmith (173 passed), andGOLDENis unchanged.How it was tested
ciwall clocktest (7)20 min 53 stest (7)15 min 09 simages(ci + publish)heavyfull-suitepython3 -c "import yaml,..." .github/workflows/*.yml: all 6 files valid. actionlint is not installed on the host.Risk and rollback
Blacksmith billing now applies to these jobs. Rollback: revert the runs-on commits, which are independent of the cancellation fix.
Attested builds stay GitHub-hosted (commit 14068dd). A Blacksmith runner is recorded in the build provenance as
runnerEnvironment=self-hosted. Cortex verifies its own image attestations withgh attestation verify --deny-self-hosted-runners, and the existing hypertrain attestations aregithub-hosted; the miners' and operators' deployment guidance checks provenance too. So thepublishjob (the only one that creates provenance) returns toubuntu-24.04; everything else (lint, shards, test-slow,heavy, and thecicalled byimages) stays on Blacksmith. No measurement ofpublishalone on Blacksmith vs hosted was made, so nothing here argues against the hosted default.CPU class. Blacksmith runners report AMD EPYC with avx512f=yes; GitHub-hosted report EPYC 7763 with avx512f=no.
ATEN_CPU_CAPABILITY=avx2is still forced andtests/trainer/test_golden_replay.pypassed without xfail in this PR's runs.Checklist
continue-on-errorimagesafter-merge timing and attestation verify (cannot run from a branch)🤖 Generated with Claude Code
Summary by CodeRabbit