Skip to content

Move MLX, Build Presets and macOS wheel CI to macOS 15 runners - #24441

Merged
JacobSzwejbka merged 1 commit into
release/1.6from
cherry-pick-24402-by-pytorch_bot_bot_
Nov 2, 2026
Merged

JacobSzwejbka merged 1 commit into
release/1.6from
cherry-pick-24402-by-pytorch_bot_bot_

Conversation

@pytorchbot

Copy link
Copy Markdown
Collaborator

GitHub retires its macOS 14 runner images on November 2, 2026 (announcement). After that, jobs that ask for macos-14-xlarge fail, and the MLX tests, the Apple preset builds and the macOS wheel builds still do.

What this changes

These jobs now ask for macos-15-xlarge, like the Apple and trunk workflows. The MLX LLM jobs no longer pick a runner per model; that only existed because Gemma 4 gave wrong output on macOS 14 (#19065).

The MLX jobs that build through presets now build at one less than the core count. Their presets either run an unlimited make -j or build one file at a time, and on macOS 15 these jobs took 55 to 90 minutes instead of about 40.

The wheel smoke test now checks that the macOS wheel still targets macOS 14. It fails if the tag, or any Mach-O file or Metal library in the wheel, asks for a newer macOS. This used to come for free, because the smoke test ran on macOS 14.

The macOS wheel keeps the Arm VGF backend off, as before. Its library ships only for macOS 15, so it would put code built for macOS 15.4 into a wheel that claims macOS 14. The wheel build also pins Xcode 16.4, so a runner image update cannot change the wheel.

Nothing runs on macOS 14 any more, which leaves two gaps for follow-ups. The check cannot see a call to a macOS 15-only API made without an availability check, or code built for macOS 15 that is linked into a library. And MLX is no longer tested on macOS 14, where Gemma 4 gave wrong output.

What it means for users

The wheel keeps its macosx_14_0_arm64 tag, which comes from the build settings, not from the build machine. Built with the macOS 15.5 SDK, its Core ML backend can now run multifunction and stateful (MLState) models on macOS 15 and newer. That code checks the OS version at run time, so macOS 14 behaves as before.

Test plan

  • On macOS 15, CI built every Apple preset and the Python 3.11 macOS wheel. The wheel is tagged macosx_14_0_arm64, is built with Xcode 16.4, has the Metal library and no VGF code, and passes the new check. An earlier commit also built Python 3.12 to 3.15 (ciflow/binaries), all with the same tag. The Linux wheels still build VGF.
  • Every MLX job passed on macOS 15, including the ones that need secrets (ciflow/mlx). The capped jobs took 13 to 22 minutes. Voxtral Realtime once printed only unknown tokens on an earlier commit, then passed when rerun.
  • Unit tests cover the check's decision and parsers, and run the whole check on a fake wheel with lipo and otool stubbed. With the real tools, the check also fails on altered nightly wheels: a wrong tag, a library that needs macOS 14.5 or 15.0, a flatc that needs macOS 15.0 (also as one slice of a universal binary), and a Metal library built for macOS 15.0 or with no target.

GitHub retires its macOS 14 runner images on November 2, 2026
([announcement](actions/runner-images#13518)).
After that, jobs that ask for `macos-14-xlarge` fail, and the MLX tests,
the Apple preset builds and the macOS wheel builds still do.

### What this changes

These jobs now ask for `macos-15-xlarge`, like the Apple and trunk
workflows. The MLX LLM jobs no longer pick a runner per model; that only
existed because Gemma 4 gave wrong output on macOS 14 (#19065).

The MLX jobs that build through presets now build at one less than the
core count. Their presets either run an unlimited `make -j` or build one
file at a time, and on macOS 15 these jobs took 55 to 90 minutes instead
of about 40.

The wheel smoke test now checks that the macOS wheel still targets macOS
14. It fails if the tag, or any Mach-O file or Metal library in the
wheel, asks for a newer macOS. This used to come for free, because the
smoke test ran on macOS 14.

The macOS wheel keeps the Arm VGF backend off, as before. Its library
ships only for macOS 15, so it would put code built for macOS 15.4 into
a wheel that claims macOS 14. The wheel build also pins Xcode 16.4, so a
runner image update cannot change the wheel.

Nothing runs on macOS 14 any more, which leaves two gaps for follow-ups.
The check cannot see a call to a macOS 15-only API made without an
availability check, or code built for macOS 15 that is linked into a
library. And MLX is no longer tested on macOS 14, where Gemma 4 gave
wrong output.

### What it means for users

The wheel keeps its `macosx_14_0_arm64` tag, which comes from the build
settings, not from the build machine. Built with the macOS 15.5 SDK, its
Core ML backend can now run multifunction and stateful (`MLState`)
models on macOS 15 and newer. That code checks the OS version at run
time, so macOS 14 behaves as before.

### Test plan

- On macOS 15, CI built every Apple preset and the Python 3.11 macOS
wheel. The wheel is tagged `macosx_14_0_arm64`, is built with Xcode
16.4, has the Metal library and no VGF code, and passes the new check.
An earlier commit also built Python 3.12 to 3.15 (`ciflow/binaries`),
all with the same tag. The Linux wheels still build VGF.
- Every MLX job passed on macOS 15, including the ones that need secrets
(`ciflow/mlx`). The capped jobs took 13 to 22 minutes. Voxtral Realtime
once printed only unknown tokens on an earlier commit, then passed when
rerun.
- Unit tests cover the check's decision and parsers, and run the whole
check on a fake wheel with `lipo` and `otool` stubbed. With the real
tools, the check also fails on altered nightly wheels: a wrong tag, a
library that needs macOS 14.5 or 15.0, a `flatc` that needs macOS 15.0
(also as one slice of a universal binary), and a Metal library built for
macOS 15.0 or with no target.

(cherry picked from commit 4ea7e9d)
@pytorch-bot

pytorch-bot Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

🔗 Helpful Links

🧪 See artifacts and rendered test results at hud.pytorch.org/pr/pytorch/executorch/24441

Note: Links to docs will display an error until the docs builds have been completed.

✅ You can merge normally! (1 Unrelated Failure)

As of commit a22b806 with merge base 4db778e (image):

BROKEN TRUNK - The following job failed but were present on the merge base:

👉 Rebase onto the `viable/strict` branch to avoid these failures

This comment was automatically generated by Dr. CI and updates every 15 minutes.

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Nov 2, 2026
@JacobSzwejbka JacobSzwejbka reopened this Nov 2, 2026
@JacobSzwejbka
JacobSzwejbka merged commit b9089ff into release/1.6 Nov 2, 2026
900 of 910 checks passed
@JacobSzwejbka
JacobSzwejbka deleted the cherry-pick-24402-by-pytorch_bot_bot_ branch November 2, 2026 19:28

This branch was previously deployed

1 inactive deployment
cadence — a22b806d Deployed Nov 2, 2026 by JacobSzwejbka via hifi5s-op-test / hifi5s #35997
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants