Skip to content

docs: kkt is retired, occidata is the sole GPU runner; document the GPU docs-build pass - #19

Merged
ocots merged 1 commit into
mainfrom
docs/gpu-docs-build-runners
Sep 2, 2026
Merged

ocots merged 1 commit into
mainfrom
docs/gpu-docs-build-runners

Conversation

@ocots

@ocots ocots commented Sep 2, 2026

Copy link
Copy Markdown
Member

Two things converge in this PR: WORKFLOWS.md's runner-fleet description had drifted well past what the fleet actually does, and control-toolbox/OptimalControl.jl#885 part 2 adds a new pattern (documentation.yml's optional build-gpu pass) worth documenting from day one.

The fleet is not what this document said

Measured 2026-09-02 by checking every CI.yml directly (not inferred from labels, which lag behind actual jobs) plus gh api orgs/control-toolbox/actions/runners:

  • kkt is retired, not "the other half of a split alongside occidata". The org registers only occidata-runner and pinwheel — no kkt. Every package with GPU-relevant code (CTParser.jl, CTDirect.jl, CTFlows.jl, CTSolvers, CTLie) calls ci.yml exactly twice: github-runner + occidata-runner. No repo has a third job. A three-way split, which this document described for CTFlows.jl, doesn't exist anywhere.
  • CTLie has already joined the split, not "planned" (test: add GPU test suite and split CI, closes #21).
  • CTDirect.jl has already migrated off its older, separate GPU.yml onto the same two-way split as everyone else — its own CI.yml comment says so directly ("Replaces the retired kkt runner").
  • The kkt-runner label survives as an inert leftover in three repos (OptimalControl, CTFlows.jl, CTLie) — defined, consumed by nothing.

All corrected: the trigger-labels table (§2, kkt-runner now marked retired), the naming-convention paragraph right after it, the reusable-workflows table and split-CI paragraphs (§3.1), the fleet adoption table (§4), the walkthrough example (§3.1), and the new-repo checklist (§8) — which, uncorrected, would have told someone bootstrapping a repo to create a label for a runner that doesn't exist.

A third self-hosted GPU box, pinwheel, exists and was undocumented. Found while probing occidata's org runner listing for the same task. It's AMD, not CUDA — not a candidate for any :gpu CI in this ecosystem, since the whole stack (ExaModels → MadNLPGPU → CUDSS) is CUDA-only. Recorded so nobody points a CUDA job at it by accident.

New: documentation.yml's optional GPU upgrade pass

CTActions#71 adds build-gpu, gated by a new gpu_runner input, for control-toolbox/OptimalControl.jl#885 part 2. Documented here as a distinct shape from ci.yml's split, not the same pattern: publish then upgrade, not attempt then fall back. A docs build's single job both builds and deploys (deploydocs runs inside docs/make.jl), so there's no room to attempt-GPU-then-fall-back-to-CPU within one job the way ci.yml's split can. build-gpu instead runs only once the existing GitHub-hosted build job has already published, and can never fail the workflow (continue-on-error: true) — on success it redeploys with real GPU numbers, on failure or a long queue the already-published site is simply left as is.

documentation.yml's row in §3.1's reusable-workflows table gains its new gpu_runner/gpu_timeout_minutes inputs; §3.2 gains occidata's new role as a docs-build target, plus two operational quirks worth knowing before blaming a slow or retried job on the runner itself — its /tmp is wiped hourly at HH:01, and this workflow's own Monday 02:30 UTC maintenance purges the compiled-code cache.

Also

Fixed one incidental markdownlint MD028 (two adjacent blockquotes separated by a blank line) introduced while drafting the pinwheel note.

🤖 Generated with Claude Code

…PU docs-build pass

Measured 2026-09-02 while planning/probing control-toolbox/OptimalControl.jl#885 part 2
(a GPU-backed docs build) — the fleet had moved well past what this document described.

**`kkt` is retired, not "the other half of a split alongside occidata".** Confirmed via
`gh api orgs/control-toolbox/actions/runners`: the org registers only `occidata-runner`
and `pinwheel`, no `kkt`. Every `CI.yml` in the fleet was checked directly (not inferred
from labels, which lag): CTParser.jl, CTDirect.jl, CTFlows.jl, CTSolvers and CTLie all
call `ci.yml` exactly twice -- `github-runner` + `occidata-runner` -- and none has a
third job or a `kkt` job of any kind. A three-way split (`github` + `kkt` + `occidata`)
does not exist anywhere; this document previously described one for CTFlows.jl. The
`kkt-runner` label itself survives as an inert leftover in three repos (OptimalControl,
CTFlows.jl, CTLie) -- defined, but consumed by nothing.

**CTLie has already joined the split**, not "planned" -- `test: add GPU test suite and
split CI (closes #21)`. **CTDirect.jl has already migrated off its older, separate
`GPU.yml`** onto the same two-way split everyone else uses -- its own CI.yml says so
directly ("Replaces the retired kkt runner"). Both corrected throughout, including the
fleet-wide adoption table (§4), the walkthrough example (§3.1), and the new-repo
checklist (§8) -- a checklist telling someone to create a `kkt-runner` label would have
been actively wrong.

**A third self-hosted GPU box, `pinwheel`, exists and was undocumented.** Found while
probing `occidata`'s org runner listing for the same task. It is AMD, not CUDA, and is
not a candidate for any `:gpu` CI in this ecosystem -- the whole stack (ExaModels through
MadNLPGPU to CUDSS) is CUDA-only. Recorded so nobody discovers it by accident and points
a CUDA job at it.

**New: `documentation.yml` can carry the same kind of split, shaped differently.**
control-toolbox/OptimalControl.jl#885 part 2 (CTActions#71) adds an optional `build-gpu`
upgrade pass -- publish then upgrade, not attempt-then-fallback, because a docs build's
single job both builds and deploys, so there is no room to attempt-and-fall-back within
one job the way `ci.yml`'s split does. Documented as the pattern any future caller
wanting GPU-backed docs numbers should follow. `documentation.yml`'s row in §3.1's table
gains its new `gpu_runner`/`gpu_timeout_minutes` inputs; §3.2 gains occidata's new role
as a docs-build target and its two operational quirks (hourly `/tmp` wipe, Monday cache
purge) worth knowing before blaming a slow or retried job on the runner.

Fixed one incidental markdownlint MD028 (two adjacent blockquotes separated by a blank
line) introduced while drafting this.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ocots
ocots merged commit b7337bb into main Sep 2, 2026
@ocots
ocots deleted the docs/gpu-docs-build-runners branch September 2, 2026 13:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant