From 0b30fd3350290e85d8a5a8bb55c8d37567244d87 Mon Sep 17 00:00:00 2001 From: alanprior Date: Fri, 4 Sep 2026 23:04:45 +0300 Subject: [PATCH 1/7] Verify CI against torch 2.14.0 with main's code unchanged No code change: this commit exists only so the pull_request workflow runs on main's tree. The "Test Package Compatibility (macos-latest, 3.14, highest)" job resolves the newest torch, and since torch 2.14.0 was released it fails with Metal compiler errors ("unsupported deferred-static-alloca-size") while building MPS kernels, on the same macos-26-arm64 image where torch 2.13.0 passed hours earlier. If this job fails here too, the breakage is torch 2.14.0 on that runner, independent of any open branch. Co-Authored-By: Claude Fable 5.1 From 88cf244bafe815351fe7ccc59af9f363c7cae2b1 Mon Sep 17 00:00:00 2001 From: alanprior Date: Sat, 5 Sep 2026 00:12:17 +0300 Subject: [PATCH 2/7] Add a throwaway MPS probe workflow for the runner investigation Runs a dozen small MPS operations with torch 2.14.0 on macos-latest and on macos-15, to learn whether a cheap probe detects the Metal 4 cooperative-tensor compile failure on the virtual GPU, and which operations trigger it. Not meant to merge. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/mps-probe.yml | 60 +++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .github/workflows/mps-probe.yml diff --git a/.github/workflows/mps-probe.yml b/.github/workflows/mps-probe.yml new file mode 100644 index 000000000..0a9970a1c --- /dev/null +++ b/.github/workflows/mps-probe.yml @@ -0,0 +1,60 @@ +# Throwaway experiment for the torch 2.14 / macos-26 runner investigation: does a +# cheap MPS probe detect the Metal 4 cooperative-tensor compile failure on the +# hosted macos-26 (virtual GPU) image, and does the same probe pass on macos-15? +name: MPS probe + +on: + pull_request: + workflow_dispatch: + +jobs: + probe: + name: MPS probe (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macos-latest, macos-15] + steps: + - name: Runner hardware + run: | + sw_vers + system_profiler SPDisplaysDataType | grep -E "Chipset Model|Metal" || true + echo "IMAGE=$ImageOS $ImageVersion" + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.14" + - name: Install torch 2.14.0 only + run: python -m pip install --quiet --only-binary=:all: torch==2.14.0 + - name: Probe MPS kernels + run: | + python - <<'PY' + import platform, torch + import torch.nn.functional as F + print("macOS", platform.mac_ver()[0], "| torch", torch.__version__, + "| mps available:", torch.backends.mps.is_available()) + d = "mps" + failures = [] + def probe(name, fn): + try: + fn() + print(f"OK {name}") + except Exception as e: # noqa: BLE001 + failures.append(name) + msg = str(e).replace("\n", " ") + print(f"FAIL {name}: {type(e).__name__}: {msg[:200]}") + r = lambda *s, dtype=torch.float32: torch.randn(*s, device=d, dtype=dtype) + probe("elementwise add 1024", lambda: (r(1024) + r(1024)).sum().item()) + probe("matmul 2x2 fp32", lambda: (r(2, 2) @ r(2, 2)).sum().item()) + probe("matmul 8x8 fp32", lambda: (r(8, 8) @ r(8, 8)).sum().item()) + probe("matmul 64x64 fp32", lambda: (r(64, 64) @ r(64, 64)).sum().item()) + probe("matmul 512x512 fp32", lambda: (r(512, 512) @ r(512, 512)).sum().item()) + probe("matmul 2048x2048 fp32", lambda: (r(2048, 2048) @ r(2048, 2048)).sum().item()) + probe("matmul 64x64 fp16", lambda: (r(64, 64, dtype=torch.float16) @ r(64, 64, dtype=torch.float16)).sum().item()) + probe("matmul 64x64 bf16", lambda: (r(64, 64, dtype=torch.bfloat16) @ r(64, 64, dtype=torch.bfloat16)).sum().item()) + probe("linear 8x192 with bias fp32", lambda: F.linear(r(8, 192), r(192, 192), r(192)).sum().item()) + probe("bmm 4x64x64 fp32", lambda: torch.bmm(r(4, 64, 64), r(4, 64, 64)).sum().item()) + probe("sdpa 1x4x32x48 fp32", lambda: F.scaled_dot_product_attention(r(1, 4, 32, 48), r(1, 4, 32, 48), r(1, 4, 32, 48)).sum().item()) + probe("layer_norm 32x192", lambda: F.layer_norm(r(32, 192), (192,)).sum().item()) + print("FAILED:", failures or "none") + PY From 0b71da23a666cbd9d4f23053143f9c1a7a0e36c5 Mon Sep 17 00:00:00 2001 From: alanprior Date: Sat, 5 Sep 2026 00:31:00 +0300 Subject: [PATCH 3/7] Quote the pip line in the probe workflow: YAML read ':all: torch' as a mapping Co-Authored-By: Claude Fable 5.1 --- .github/workflows/mps-probe.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mps-probe.yml b/.github/workflows/mps-probe.yml index 0a9970a1c..9047da551 100644 --- a/.github/workflows/mps-probe.yml +++ b/.github/workflows/mps-probe.yml @@ -25,7 +25,7 @@ jobs: with: python-version: "3.14" - name: Install torch 2.14.0 only - run: python -m pip install --quiet --only-binary=:all: torch==2.14.0 + run: "python -m pip install --quiet --only-binary=:all: torch==2.14.0" - name: Probe MPS kernels run: | python - <<'PY' From 0fff10159b5f0487089a794672bb80530b536fae Mon Sep 17 00:00:00 2001 From: alanprior Date: Sat, 5 Sep 2026 00:35:01 +0300 Subject: [PATCH 4/7] Probe the SDPA kernel TabPFN's MPS backend uses, across dtypes, head dims and lengths Co-Authored-By: Claude Fable 5.1 --- .github/workflows/mps-probe.yml | 39 +++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/.github/workflows/mps-probe.yml b/.github/workflows/mps-probe.yml index 9047da551..f512d503c 100644 --- a/.github/workflows/mps-probe.yml +++ b/.github/workflows/mps-probe.yml @@ -29,7 +29,7 @@ jobs: - name: Probe MPS kernels run: | python - <<'PY' - import platform, torch + import itertools, platform, torch import torch.nn.functional as F print("macOS", platform.mac_ver()[0], "| torch", torch.__version__, "| mps available:", torch.backends.mps.is_available()) @@ -42,19 +42,26 @@ jobs: except Exception as e: # noqa: BLE001 failures.append(name) msg = str(e).replace("\n", " ") - print(f"FAIL {name}: {type(e).__name__}: {msg[:200]}") - r = lambda *s, dtype=torch.float32: torch.randn(*s, device=d, dtype=dtype) - probe("elementwise add 1024", lambda: (r(1024) + r(1024)).sum().item()) - probe("matmul 2x2 fp32", lambda: (r(2, 2) @ r(2, 2)).sum().item()) - probe("matmul 8x8 fp32", lambda: (r(8, 8) @ r(8, 8)).sum().item()) - probe("matmul 64x64 fp32", lambda: (r(64, 64) @ r(64, 64)).sum().item()) - probe("matmul 512x512 fp32", lambda: (r(512, 512) @ r(512, 512)).sum().item()) - probe("matmul 2048x2048 fp32", lambda: (r(2048, 2048) @ r(2048, 2048)).sum().item()) - probe("matmul 64x64 fp16", lambda: (r(64, 64, dtype=torch.float16) @ r(64, 64, dtype=torch.float16)).sum().item()) - probe("matmul 64x64 bf16", lambda: (r(64, 64, dtype=torch.bfloat16) @ r(64, 64, dtype=torch.bfloat16)).sum().item()) - probe("linear 8x192 with bias fp32", lambda: F.linear(r(8, 192), r(192, 192), r(192)).sum().item()) - probe("bmm 4x64x64 fp32", lambda: torch.bmm(r(4, 64, 64), r(4, 64, 64)).sum().item()) - probe("sdpa 1x4x32x48 fp32", lambda: F.scaled_dot_product_attention(r(1, 4, 32, 48), r(1, 4, 32, 48), r(1, 4, 32, 48)).sum().item()) - probe("layer_norm 32x192", lambda: F.layer_norm(r(32, 192), (192,)).sum().item()) - print("FAILED:", failures or "none") + print(f"FAIL {name}: {type(e).__name__}: {msg[:120]}") + # TabPFN's MPS attention backend: q/k/v shaped (B, H, S, D) with D padded to + # a supported head dim, attn_mask=None, an explicit scale, optional GQA. + def sdpa(dtype, D, S, gqa): + H = 4 + q = torch.randn(1, H, S, D, device=d, dtype=dtype) + kv_heads = 1 if gqa else H + k = torch.randn(1, kv_heads, S, D, device=d, dtype=dtype) + v = torch.randn(1, kv_heads, S, D, device=d, dtype=dtype) + F.scaled_dot_product_attention(q, k, v, attn_mask=None, enable_gqa=gqa, scale=D**-0.5).sum().item() + for dtype, D, S, gqa in itertools.product( + (torch.float16, torch.bfloat16, torch.float32), (32, 64, 96, 128, 256), (16, 128, 1024), (False, True) + ): + probe(f"sdpa {str(dtype).split('.')[-1]:8s} D={D:3d} S={S:4d} gqa={gqa}", lambda: sdpa(dtype, D, S, gqa)) + # Same thing under autocast, as the estimators run it. + for dtype in (torch.float16, torch.bfloat16): + def under_autocast(dtype=dtype): + with torch.autocast("mps", dtype=dtype): + q = torch.randn(1, 4, 128, 64, device=d) + F.scaled_dot_product_attention(q, q, q, attn_mask=None, scale=64**-0.5).sum().item() + probe(f"sdpa fp32 inputs under autocast({str(dtype).split('.')[-1]})", under_autocast) + print("FAILED:", len(failures), failures[:8]) PY From 6442f4dca78b03acbc71e619459d90d556cbdbaa Mon Sep 17 00:00:00 2001 From: alanprior Date: Sat, 5 Sep 2026 00:42:58 +0300 Subject: [PATCH 5/7] Run the MPS tests on macos-15 when the macos-latest virtual GPU cannot compile torch's attention kernel GitHub's macos-latest image (macos-26-arm64) runs on a virtual GPU. Since torch 2.14.0, the fp16/bf16 scaled_dot_product_attention kernel torch uses on macOS 26 fails to compile there ("unsupported deferred-static-alloca-size" from the Metal compiler), which killed the 50 tests that run the model on MPS. Physical Macs on macOS 26 compile the same kernel, so nothing in TabPFN or torch is wrong for users; only this runner cannot run the tests. The macOS "highest" leg now tries that exact attention call once before the tests. If it compiles, the leg runs the tests as before. If it fails with the Metal compile error, the leg emits a warning, skips its tests and stays green, and a new job runs the same tests on macos-15, whose macOS 15 torch does not use the new kernel. Any other failure of the check fails the leg. The fallback job is skipped whenever macos-latest can compile the kernel again, so this reverts itself when GitHub or torch fix the combination. No torch cap anywhere. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/ci.yml | 95 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e4ff17e4d..580a21a82 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,6 +34,10 @@ jobs: # This job will only start after linting succeeds needs: check_python_linting timeout-minutes: 30 + outputs: + # Written only by the macOS "highest" leg. The other legs leave it empty, + # and GitHub skips empty matrix outputs, so this is that leg's verdict. + mps_runner_broken: ${{ steps.mps_check.outputs.broken }} strategy: fail-fast: false matrix: @@ -191,12 +195,54 @@ jobs: print(f" bit {bit:>2} {name:<16} {bool(mask >> bit & 1)}") ' + # GitHub's macos-latest image runs on a virtual GPU that cannot compile the + # Metal 4 attention kernel torch >= 2.14 uses for fp16/bf16 on macOS 26, + # although physical Macs run it fine. Try it once, with the call TabPFN's MPS + # attention backend makes. If it fails that way, warn and skip the tests + # here: the macos-15 fallback job below runs them on MPS instead, and stops + # running the day this check passes again. Any other failure is real and + # fails this job. + - name: Check that MPS can run TabPFN's attention (macOS, highest only) + id: mps_check + if: ${{ runner.os == 'macOS' && matrix.dependency-set == 'highest' }} + shell: bash + run: | + set +e + uv run --no-sync python - <<'PY' + import torch + import torch.nn.functional as F + + print("torch", torch.__version__, "| mps available:", torch.backends.mps.is_available()) + if not torch.backends.mps.is_available(): + print("No MPS device: the tests will not use one either.") + raise SystemExit(0) + q = torch.randn(1, 4, 128, 64, device="mps", dtype=torch.float16) + try: + F.scaled_dot_product_attention(q, q, q, attn_mask=None, scale=64**-0.5).sum().item() + except RuntimeError as e: + if "Failed to created pipeline state object" in str(e): + print(f"MPS kernel compile failed: {str(e)[:300]}") + raise SystemExit(3) from e + raise + print("MPS attention kernel compiled and ran.") + PY + status=$? + set -e + if [ "$status" -eq 0 ]; then + echo "broken=false" >> "$GITHUB_OUTPUT" + elif [ "$status" -eq 3 ]; then + echo "::warning title=MPS tests moved to macos-15::This $ImageOS runner's virtual GPU cannot compile torch's MPS attention kernel (see the step log). The tests were skipped here and run in the job 'Test Package Compatibility (macos-15, 3.14, highest, MPS fallback)' instead." + echo "broken=true" >> "$GITHUB_OUTPUT" + else + exit "$status" + fi + - name: Run Tests (all tests) - if: ${{ matrix.dependency-set != 'lowest-direct' && github.event_name != 'pull_request' && github.event_name != 'merge_group' }} + if: ${{ matrix.dependency-set != 'lowest-direct' && github.event_name != 'pull_request' && github.event_name != 'merge_group' && steps.mps_check.outputs.broken != 'true' }} run: uv run --no-sync pytest tests/ - name: Run Tests (PR tests only) - if: ${{ matrix.dependency-set != 'lowest-direct' && (github.event_name == 'pull_request' || github.event_name == 'merge_group') }} + if: ${{ matrix.dependency-set != 'lowest-direct' && (github.event_name == 'pull_request' || github.event_name == 'merge_group') && steps.mps_check.outputs.broken != 'true' }} run: uv run --no-sync pytest -m "not slow" tests/ # We don't support MPS below PyTorch 2.6 (see tabpfn.utils.infer_devices()), thus @@ -225,6 +271,51 @@ jobs: key: hf-cache-${{ hashFiles('hf_cache/**') }} enableCrossOsArchive: true + # ------------------------------------------------------------------- + # macos-15 fallback for the MPS tests, see the "Check that MPS can run" step + # above. Skipped whenever macos-latest can run torch's MPS attention kernel. + # ------------------------------------------------------------------- + test_compatibility_mps_fallback: + name: Test Package Compatibility (macos-15, 3.14, highest, MPS fallback) + needs: test_compatibility + if: ${{ always() && needs.test_compatibility.outputs.mps_runner_broken == 'true' }} + runs-on: macos-15 + timeout-minutes: 30 + env: + HF_TOKEN: ${{ secrets.HF_TOKEN }} + TABPFN_TOKEN: ${{ secrets.TABPFN_TOKEN }} + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v4.3.1 + + - name: Set up Python 3.14 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 + with: + python-version: "3.14" + + - name: Install uv + uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0 + with: + enable-cache: true + + - name: Install dependencies + run: uv sync --group ci --resolution highest + + - *restore-hf-cache + - *restore-model-cache + - *download-models + - *save-model-cache + + - name: Run Tests (all tests) + if: ${{ github.event_name != 'pull_request' && github.event_name != 'merge_group' }} + run: uv run --no-sync pytest tests/ + + - name: Run Tests (PR tests only) + if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }} + run: uv run --no-sync pytest -m "not slow" tests/ + + - *save-hf-cache + # ------------------------------------------------------------------- # Ubuntu-latest + highest dependencies (used as gate for GPU) # ------------------------------------------------------------------- From ca17af25c717e382b91a5901bd09a8d8a56dc66a Mon Sep 17 00:00:00 2001 From: alanprior Date: Sat, 5 Sep 2026 00:43:01 +0300 Subject: [PATCH 6/7] Remove the throwaway MPS probe workflow It answered its question: a synthetic fp16 attention call with head dim >= 64 reproduces the compile failure on macos-latest and passes on macos-15. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/mps-probe.yml | 67 --------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 .github/workflows/mps-probe.yml diff --git a/.github/workflows/mps-probe.yml b/.github/workflows/mps-probe.yml deleted file mode 100644 index f512d503c..000000000 --- a/.github/workflows/mps-probe.yml +++ /dev/null @@ -1,67 +0,0 @@ -# Throwaway experiment for the torch 2.14 / macos-26 runner investigation: does a -# cheap MPS probe detect the Metal 4 cooperative-tensor compile failure on the -# hosted macos-26 (virtual GPU) image, and does the same probe pass on macos-15? -name: MPS probe - -on: - pull_request: - workflow_dispatch: - -jobs: - probe: - name: MPS probe (${{ matrix.os }}) - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [macos-latest, macos-15] - steps: - - name: Runner hardware - run: | - sw_vers - system_profiler SPDisplaysDataType | grep -E "Chipset Model|Metal" || true - echo "IMAGE=$ImageOS $ImageVersion" - - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - name: Install torch 2.14.0 only - run: "python -m pip install --quiet --only-binary=:all: torch==2.14.0" - - name: Probe MPS kernels - run: | - python - <<'PY' - import itertools, platform, torch - import torch.nn.functional as F - print("macOS", platform.mac_ver()[0], "| torch", torch.__version__, - "| mps available:", torch.backends.mps.is_available()) - d = "mps" - failures = [] - def probe(name, fn): - try: - fn() - print(f"OK {name}") - except Exception as e: # noqa: BLE001 - failures.append(name) - msg = str(e).replace("\n", " ") - print(f"FAIL {name}: {type(e).__name__}: {msg[:120]}") - # TabPFN's MPS attention backend: q/k/v shaped (B, H, S, D) with D padded to - # a supported head dim, attn_mask=None, an explicit scale, optional GQA. - def sdpa(dtype, D, S, gqa): - H = 4 - q = torch.randn(1, H, S, D, device=d, dtype=dtype) - kv_heads = 1 if gqa else H - k = torch.randn(1, kv_heads, S, D, device=d, dtype=dtype) - v = torch.randn(1, kv_heads, S, D, device=d, dtype=dtype) - F.scaled_dot_product_attention(q, k, v, attn_mask=None, enable_gqa=gqa, scale=D**-0.5).sum().item() - for dtype, D, S, gqa in itertools.product( - (torch.float16, torch.bfloat16, torch.float32), (32, 64, 96, 128, 256), (16, 128, 1024), (False, True) - ): - probe(f"sdpa {str(dtype).split('.')[-1]:8s} D={D:3d} S={S:4d} gqa={gqa}", lambda: sdpa(dtype, D, S, gqa)) - # Same thing under autocast, as the estimators run it. - for dtype in (torch.float16, torch.bfloat16): - def under_autocast(dtype=dtype): - with torch.autocast("mps", dtype=dtype): - q = torch.randn(1, 4, 128, 64, device=d) - F.scaled_dot_product_attention(q, q, q, attn_mask=None, scale=64**-0.5).sum().item() - probe(f"sdpa fp32 inputs under autocast({str(dtype).split('.')[-1]})", under_autocast) - print("FAILED:", len(failures), failures[:8]) - PY From d76e0855bbe092bfd2552cbf814d9dce21c29930 Mon Sep 17 00:00:00 2001 From: alanprior Date: Sat, 5 Sep 2026 02:56:09 +0300 Subject: [PATCH 7/7] Pin the MPS test leg to macos-15 instead of a runtime fallback torch 2.14 uses a Metal 4 fp16/bf16 attention kernel on macOS 26 that the macos-latest runner's virtual GPU cannot compile, so the only CI leg that runs TabPFN on MPS failed 50 tests. Physical Macs are unaffected. Run that leg on macos-15 for now, as done in June, and drop the probe-and-fallback job added earlier in this PR. Co-Authored-By: Claude Fable 5.1 --- .github/workflows/ci.yml | 100 +++------------------------------------ 1 file changed, 6 insertions(+), 94 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 580a21a82..f1da3f29b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,10 +34,6 @@ jobs: # This job will only start after linting succeeds needs: check_python_linting timeout-minutes: 30 - outputs: - # Written only by the macOS "highest" leg. The other legs leave it empty, - # and GitHub skips empty matrix outputs, so this is that leg's verdict. - mps_runner_broken: ${{ steps.mps_check.outputs.broken }} strategy: fail-fast: false matrix: @@ -54,7 +50,10 @@ jobs: - os: windows-latest python-version: "3.10" dependency-set: lowest-direct - - os: macos-latest + # macos-latest (macOS 26) runs on a virtual GPU that cannot compile the + # fp16/bf16 attention kernel torch >= 2.14 uses there, so the MPS tests + # fail. Physical Macs are fine. TODO: retry macos-latest around 2026-11. + - os: macos-15 python-version: "3.14" dependency-set: highest - os: windows-latest @@ -195,54 +194,12 @@ jobs: print(f" bit {bit:>2} {name:<16} {bool(mask >> bit & 1)}") ' - # GitHub's macos-latest image runs on a virtual GPU that cannot compile the - # Metal 4 attention kernel torch >= 2.14 uses for fp16/bf16 on macOS 26, - # although physical Macs run it fine. Try it once, with the call TabPFN's MPS - # attention backend makes. If it fails that way, warn and skip the tests - # here: the macos-15 fallback job below runs them on MPS instead, and stops - # running the day this check passes again. Any other failure is real and - # fails this job. - - name: Check that MPS can run TabPFN's attention (macOS, highest only) - id: mps_check - if: ${{ runner.os == 'macOS' && matrix.dependency-set == 'highest' }} - shell: bash - run: | - set +e - uv run --no-sync python - <<'PY' - import torch - import torch.nn.functional as F - - print("torch", torch.__version__, "| mps available:", torch.backends.mps.is_available()) - if not torch.backends.mps.is_available(): - print("No MPS device: the tests will not use one either.") - raise SystemExit(0) - q = torch.randn(1, 4, 128, 64, device="mps", dtype=torch.float16) - try: - F.scaled_dot_product_attention(q, q, q, attn_mask=None, scale=64**-0.5).sum().item() - except RuntimeError as e: - if "Failed to created pipeline state object" in str(e): - print(f"MPS kernel compile failed: {str(e)[:300]}") - raise SystemExit(3) from e - raise - print("MPS attention kernel compiled and ran.") - PY - status=$? - set -e - if [ "$status" -eq 0 ]; then - echo "broken=false" >> "$GITHUB_OUTPUT" - elif [ "$status" -eq 3 ]; then - echo "::warning title=MPS tests moved to macos-15::This $ImageOS runner's virtual GPU cannot compile torch's MPS attention kernel (see the step log). The tests were skipped here and run in the job 'Test Package Compatibility (macos-15, 3.14, highest, MPS fallback)' instead." - echo "broken=true" >> "$GITHUB_OUTPUT" - else - exit "$status" - fi - - name: Run Tests (all tests) - if: ${{ matrix.dependency-set != 'lowest-direct' && github.event_name != 'pull_request' && github.event_name != 'merge_group' && steps.mps_check.outputs.broken != 'true' }} + if: ${{ matrix.dependency-set != 'lowest-direct' && github.event_name != 'pull_request' && github.event_name != 'merge_group' }} run: uv run --no-sync pytest tests/ - name: Run Tests (PR tests only) - if: ${{ matrix.dependency-set != 'lowest-direct' && (github.event_name == 'pull_request' || github.event_name == 'merge_group') && steps.mps_check.outputs.broken != 'true' }} + if: ${{ matrix.dependency-set != 'lowest-direct' && (github.event_name == 'pull_request' || github.event_name == 'merge_group') }} run: uv run --no-sync pytest -m "not slow" tests/ # We don't support MPS below PyTorch 2.6 (see tabpfn.utils.infer_devices()), thus @@ -271,51 +228,6 @@ jobs: key: hf-cache-${{ hashFiles('hf_cache/**') }} enableCrossOsArchive: true - # ------------------------------------------------------------------- - # macos-15 fallback for the MPS tests, see the "Check that MPS can run" step - # above. Skipped whenever macos-latest can run torch's MPS attention kernel. - # ------------------------------------------------------------------- - test_compatibility_mps_fallback: - name: Test Package Compatibility (macos-15, 3.14, highest, MPS fallback) - needs: test_compatibility - if: ${{ always() && needs.test_compatibility.outputs.mps_runner_broken == 'true' }} - runs-on: macos-15 - timeout-minutes: 30 - env: - HF_TOKEN: ${{ secrets.HF_TOKEN }} - TABPFN_TOKEN: ${{ secrets.TABPFN_TOKEN }} - - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v4.3.1 - - - name: Set up Python 3.14 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - - name: Install uv - uses: astral-sh/setup-uv@eac588ad8def6316056a12d4907a9d4d84ff7a3b # v7.3.0 - with: - enable-cache: true - - - name: Install dependencies - run: uv sync --group ci --resolution highest - - - *restore-hf-cache - - *restore-model-cache - - *download-models - - *save-model-cache - - - name: Run Tests (all tests) - if: ${{ github.event_name != 'pull_request' && github.event_name != 'merge_group' }} - run: uv run --no-sync pytest tests/ - - - name: Run Tests (PR tests only) - if: ${{ github.event_name == 'pull_request' || github.event_name == 'merge_group' }} - run: uv run --no-sync pytest -m "not slow" tests/ - - - *save-hf-cache - # ------------------------------------------------------------------- # Ubuntu-latest + highest dependencies (used as gate for GPU) # -------------------------------------------------------------------