Repository navigation
Fix GPU CI startup and move CPU jobs to GitHub Actions - #772
Merged
Merged
Conversation
Adding a GPU backend can downgrade LLVM and Atomix. Install optional backends together before importing Dagger or starting workers, and launch workers in the active test project so Pkg.test sandbox dependencies match on every process. Validated on Julia 1.11.9 with a forced LLVM 10 to 9.13.2 downgrade and CUDA 5.8.5: the driver and three workers load matching versions from the same project. The focused CPU mapreduce suite passes all 421 tests.
PythonCall initializes its interpreter during test-environment precompilation. A Python library discovery failure was aborting the Metal GPU job before any tests ran. Install PythonCall and CondaPkg on demand before imports instead, preserving the default CPU Python suite while keeping GPU-only jobs independent of Python. Validated that the GPU bootstrap excludes Python and that selecting extlang/python installs both dependencies and enters that suite. The local Python suite reproduces the existing Python library discovery failure; no Python runtime behavior is changed.
Finch needs CPU workers rather than GPU hardware. Move its Julia 1.11 job to ubuntu-latest while preserving the 90-minute timeout, optional-dependency signal, skip condition, and coverage reporting. Validated the workflow YAML and confirmed CI_TEST_FINCH selects only array/linalg/matmul_finch in the test runner.
CPU test matrices, TimespanLogging, DaggerWebDash, and CPU benchmarks already run on GitHub Actions. Remove their duplicate Buildkite jobs and unused anchors so GPU agents only service GPU tests, benchmarks, and reports. Validated YAML, all remaining step dependencies, and GPU job classification in both pipelines; all six Buildkite report and matrix-expansion tests pass.
Contributor
Dagger benchmarks:
|
| Backend | Regressions | Improvements | Within noise | Inconclusive time | Suites |
|---|---|---|---|---|---|
| Threads | 0 | 1 | 10 | 1 | 4/4 |
| Distributed | 4 | 3 | 1 | 1 | 4/4 |
| Distributed+Threads | 0 | 0 | 0 | 1 | 4/4 |
| MPI | 0 | 0 | 0 | 2 | 4/4 |
| MPI+Threads | 1 | 2 | 18 | 1 | 4/4 |
| Total | 5 | 6 | 29 | 6 | 20/20 |
Regressions across all backends
| Backend | Benchmark | Metric | Change |
|---|---|---|---|
| Distributed | linalg/dagger/N=1024 (block 128)/matmul (A*A) |
allocs | +113.6% |
| Distributed | linalg/dagger/N=1024 (block 128)/matmul (A*A) |
memory | +112.3% |
| Distributed | linalg/dagger/N=1024 (block 128)/syrk (A'*A) |
allocs | +61.8% |
| MPI+Threads | stencil/dagger/N=1024 (block 128)/assign (const) |
time | +45.1% |
| Distributed | linalg/dagger/N=1024 (block 128)/syrk (A'*A) |
memory | +40.5% |
Improvements across all backends
| Backend | Benchmark | Metric | Change |
|---|---|---|---|
| MPI+Threads | linalg/dagger/N=256 (block 256)/matvec (A*x) |
time | -46.3% |
| Threads | array/dagger/N=1024 (block 512)/norm |
time | -42.7% |
| MPI+Threads | array/dagger/N=1024 (block 512)/norm |
time | -38.9% |
| Distributed | array/dagger/N=1024 (block 128)/add (X + X) |
memory | -38.2% |
| Distributed | sparse/dagger/N=1024 (block 64)/cg solve (laplacian) |
memory | -34.5% |
| Distributed | sparse/dagger/N=1024 (block 64)/cg solve (laplacian) |
allocs | -31.2% |
Threads (1 process × 4 threads) — 0 regressions, 1 improvements
| Suite | Regressions | Improvements | Within noise | Inconclusive time |
|---|---|---|---|---|
| array | 0 | 1 | 4 | 0 |
| linalg | 0 | 0 | 3 | 0 |
| sparse | 0 | 0 | 0 | 0 |
| stencil | 0 | 0 | 3 | 1 |
Improvements
| Benchmark | Metric | Change |
|---|---|---|
array/dagger/N=1024 (block 512)/norm |
time | -42.7% |
Within noise
| Benchmark | Metric | Change |
|---|---|---|
stencil/dagger/N=256 (block 128)/alloc (neighbors Wrap) |
time | +174.6% |
array/dagger/N=256 (block 256)/broadcast (X .+ 1) |
time | +71.0% |
stencil/dagger/N=256 (block 128)/multi-expr |
time | +38.0% |
array/dagger/N=256 (block 128)/map (sin.(X)) |
time | +37.8% |
stencil/dagger/N=1024 (block 512)/assign (const) |
time | +37.8% |
linalg/dagger/N=256 (block 128)/syrk (A'*A) |
time | +31.3% |
array/dagger/N=256 (block 256)/norm |
time | +28.8% |
linalg/dagger/N=1024 (block 512)/matvec (A*x) |
time | -34.5% |
array/dagger/N=256 (block 128)/norm |
time | -36.6% |
linalg/dagger/N=256 (block 128)/matmul (A*A) |
time | -36.7% |
Inconclusive timing changes
| Benchmark | Metric | Change |
|---|---|---|
stencil/dagger/N=1024 (block 512)/neighbors (Pad) |
time | +50.0% |
Distributed (4 processes × 1 thread) — 4 regressions, 3 improvements
| Suite | Regressions | Improvements | Within noise | Inconclusive time |
|---|---|---|---|---|
| array | 0 | 1 | 0 | 0 |
| linalg | 4 | 0 | 1 | 1 |
| sparse | 0 | 2 | 0 | 0 |
| stencil | 0 | 0 | 0 | 0 |
Regressions
| Benchmark | Metric | Change |
|---|---|---|
linalg/dagger/N=1024 (block 128)/matmul (A*A) |
allocs | +113.6% |
linalg/dagger/N=1024 (block 128)/matmul (A*A) |
memory | +112.3% |
linalg/dagger/N=1024 (block 128)/syrk (A'*A) |
allocs | +61.8% |
linalg/dagger/N=1024 (block 128)/syrk (A'*A) |
memory | +40.5% |
Improvements
| Benchmark | Metric | Change |
|---|---|---|
array/dagger/N=1024 (block 128)/add (X + X) |
memory | -38.2% |
sparse/dagger/N=1024 (block 64)/cg solve (laplacian) |
memory | -34.5% |
sparse/dagger/N=1024 (block 64)/cg solve (laplacian) |
allocs | -31.2% |
Within noise
| Benchmark | Metric | Change |
|---|---|---|
linalg/dagger/N=1024 (block 128)/matmul (A*A) |
time | +58.6% |
Inconclusive timing changes
| Benchmark | Metric | Change |
|---|---|---|
linalg/dagger/N=1024 (block 128)/solve (A\b via lu) |
time | +165.9% |
Distributed+Threads (2 processes × 2 threads) — 0 regressions, 0 improvements
| Suite | Regressions | Improvements | Within noise | Inconclusive time |
|---|---|---|---|---|
| array | 0 | 0 | 0 | 1 |
| linalg | 0 | 0 | 0 | 0 |
| sparse | 0 | 0 | 0 | 0 |
| stencil | 0 | 0 | 0 | 0 |
Inconclusive timing changes
| Benchmark | Metric | Change |
|---|---|---|
array/dagger/N=1024 (block 512)/alloc (rand) |
time | +142.7% |
MPI (4 ranks × 1 thread) — 0 regressions, 0 improvements
| Suite | Regressions | Improvements | Within noise | Inconclusive time |
|---|---|---|---|---|
| array | 0 | 0 | 0 | 2 |
| linalg | 0 | 0 | 0 | 0 |
| sparse | 0 | 0 | 0 | 0 |
| stencil | 0 | 0 | 0 | 0 |
Inconclusive timing changes
| Benchmark | Metric | Change |
|---|---|---|
array/dagger/N=1024 (block 512)/add (X + X) |
time | +46.7% |
array/dagger/N=1024 (block 512)/norm |
time | +45.0% |
MPI+Threads (2 ranks × 2 threads) — 1 regressions, 2 improvements
| Suite | Regressions | Improvements | Within noise | Inconclusive time |
|---|---|---|---|---|
| array | 0 | 1 | 9 | 0 |
| linalg | 0 | 1 | 3 | 0 |
| sparse | 0 | 0 | 0 | 0 |
| stencil | 1 | 0 | 6 | 1 |
Regressions
| Benchmark | Metric | Change |
|---|---|---|
stencil/dagger/N=1024 (block 128)/assign (const) |
time | +45.1% |
Improvements
| Benchmark | Metric | Change |
|---|---|---|
linalg/dagger/N=256 (block 256)/matvec (A*x) |
time | -46.3% |
array/dagger/N=1024 (block 512)/norm |
time | -38.9% |
Within noise
| Benchmark | Metric | Change |
|---|---|---|
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) |
time | +96.1% |
array/dagger/N=256 (block 128)/norm |
time | +95.3% |
stencil/dagger/N=256 (block 256)/update (+) |
time | +94.9% |
stencil/dagger/N=256 (block 256)/neighbors (Pad) |
time | +56.1% |
stencil/dagger/N=256 (block 256)/assign (const) |
time | +54.0% |
array/dagger/N=256 (block 256)/broadcast (X .+ 1) |
time | +51.5% |
stencil/dagger/N=1024 (block 512)/update (+) |
time | +48.9% |
array/dagger/N=1024 (block 128)/reduce (sum) |
time | +46.0% |
linalg/dagger/N=256 (block 256)/qr |
time | +45.2% |
stencil/dagger/N=256 (block 256)/multi-expr |
time | +43.6% |
array/dagger/N=1024 (block 512)/map (sin.(X)) |
time | +40.2% |
linalg/dagger/N=256 (block 128)/cholesky |
time | +39.7% |
array/dagger/N=256 (block 256)/add (X + X) |
time | +39.6% |
array/dagger/N=256 (block 128)/alloc (rand) |
time | +37.6% |
stencil/dagger/N=256 (block 256)/neighbors (Wrap) |
time | +36.1% |
array/dagger/N=1024 (block 512)/alloc (rand) |
time | -35.7% |
linalg/dagger/N=1024 (block 512)/matmul (A*A) |
time | -47.6% |
array/dagger/N=256 (block 128)/transpose (permutedims) |
time | -56.8% |
Inconclusive timing changes
| Benchmark | Metric | Change |
|---|---|---|
stencil/dagger/N=1024 (block 512)/multi-expr |
time | +93.2% |
Full results and plots (download the benchmark-results-* artifacts).
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #772 +/- ##
==========================================
+ Coverage 60.68% 61.88% +1.20%
==========================================
Files 125 125
Lines 18159 18155 -4
==========================================
+ Hits 11019 11235 +216
+ Misses 7140 6920 -220 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Buildkite run for #769 aborts CUDA, ROCm, and oneAPI tests during setup: installing a GPU backend downgrades LLVM after dependencies are already loaded. Workers also launch in the repository project instead of the temporary
Pkg.testenvironment, so their dependency versions can differ from the driver's.Resolve optional packages together before imports and worker startup, and launch workers with
Base.active_project(). Install PythonCall and CondaPkg only when the Python suite is selected, so Metal tests no longer abort during unrelated Python initialization. Default CPU runs still select the Python suite.Run Finch tests in a dedicated GitHub Actions job on
ubuntu-latest, preserving Julia 1.11, the 90-minute timeout, test selection, skip condition, and coverage reporting. Remove the duplicate CPU tests and benchmarks from the OpenCL Buildkite pipeline; both Buildkite pipelines now contain GPU tests, benchmarks, and their reports. CPU coverage remains in GitHub Actions.GPU runtime fixes are covered by #758; the reduction fix remains in #769.
The Python failures also occur in unrelated PR #771. Both fail in CondaPkg 0.2.37 when it opens a nonexistent global Julia
Project.toml; the upstream fix is merged. PythonCall also has a merged fix for conda-forge Python 3.15 shared-library discovery. These fixes were unreleased at validation time. Testing both fixed commits together passes the Python suite; no dependency workaround is added here.Validation on Julia 1.11.9:
extlang/pythoninstalls both dependencies and enters the suite.0187461and PythonCall commit4a7e029in an isolated test project. Released versions still encounter the upstream initialization failures described above.CI_TEST_FINCH=1test-runner simulation selects onlyarray/linalg/matmul_finch.git diff --checkpass. Full Finch execution, GPU execution, and hosted CI reruns remain for CI.