Skip to content

Fix GPU CI startup and move CPU jobs to GitHub Actions - #772

Merged
jpsamaroo merged 5 commits into
masterfrom
fix-gpu-ci-bootstrap
Oct 12, 2026
Merged

jpsamaroo merged 5 commits into
masterfrom
fix-gpu-ci-bootstrap

Conversation

@jpsamaroo

@jpsamaroo jpsamaroo commented Oct 12, 2026 •

Copy link
Copy Markdown
Member

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.test environment, 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:

  • Forced LLVM 10 → 9.13.2 with CUDA 5.8.5; CUDA loads on the driver and three workers with matching versions and the same active test project.
  • Focused CPU mapreduce suite: 421/421 tests pass.
  • GPU bootstrap excludes Python. Selecting extlang/python installs both dependencies and enters the suite.
  • Python suite: 6/6 pass with one and four driver threads plus three workers, using CondaPkg commit 0187461 and PythonCall commit 4a7e029 in an isolated test project. Released versions still encounter the upstream initialization failures described above.
  • CI_TEST_FINCH=1 test-runner simulation selects only array/linalg/matmul_finch.
  • Workflow and pipeline YAML parse successfully; all remaining Buildkite step dependencies resolve and every job is a GPU test, benchmark, or report.
  • All six Buildkite report and matrix-expansion tests pass.
  • Julia syntax and git diff --check pass. Full Finch execution, GPU execution, and hosted CI reruns remain for CI.

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.
@jpsamaroo jpsamaroo changed the title Fix GPU CI dependency initialization Fix GPU CI startup and move CPU jobs to GitHub Actions Oct 12, 2026
@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Dagger benchmarks: dirty vs master

Counts are benchmark metrics (time, allocations, bytes). Timing changes require non-overlapping median ± IQR bands; both revisions need at least five timed samples, and timing regressions need an independent confirmation run.

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).

@jpsamaroo
jpsamaroo merged commit cca974c into master Oct 12, 2026
33 of 55 checks passed
@jpsamaroo
jpsamaroo deleted the fix-gpu-ci-bootstrap branch October 12, 2026 20:31
@codecov

codecov Bot commented Oct 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 61.88%. Comparing base (0238175) to head (c52f47e).
⚠️ Report is 10 commits behind head on master.

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.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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