metal-linalg for Python
QR, symmetric eigendecomposition and SVD for batches of matrices on Apple
GPUs, on MLX arrays. For PyTorch tensors,
install metal-linalg-torch instead.
import mlx.core as mx
import metal_linalg as ml
a = mx.random.normal((1000, 64, 32)) # a batch of 1000 matrices
Q, R = ml.qr(a) # Q (1000, 64, 32), R (1000, 32, 32)
U, S, Vt = ml.svd(a) # thin: U (1000, 64, 32), S (1000, 32), Vt (1000, 32, 32)
w, V = ml.eigh(a.swapaxes(-1, -2) @ a) # w ascending (1000, 32), V (1000, 32, 32)
Each call is routed to the fastest Metal kernel for its shape and batch, or to LAPACK on the CPU, by a policy measured on the Mac it runs on:
ml.device_name() # 'Apple M5 Pro'
ml.eigh_policy_source() # 'tuned:Apple M5 Pro'
ml.eigh_backend(32, 4096) # 'ql': 4096 matrices of 32x32 go to the GPU
ml.eigh_backend(512, 64) # 'cpu': the CPU's cores win 64 of 512x512
ml.set_eigh_policy(gpu_min_batch=1) # override the measured policy
Inputs may be mx.array, NumPy arrays or nested lists; outputs are float32
mx.array. ml.eigvalsh and ml.svdvals return the values alone, for less
work. The kernels and the routing are described in the
main README.
Installing
pip install metal-linalg
On an Apple Silicon Mac with macOS 14 or later and Python 3.10 to 3.14,
this installs a prebuilt wheel and the mlx it was built against; nothing is
compiled.
MLX is pinned to one release. The package shares MLX's own library and
passes mx.array objects through MLX's internals, so it works only with the
MLX it was built against, and asks pip for exactly that one (mlx==0.32.3
for this release). Installing it may therefore move your mlx to that
version, and upgrading mlx past it on its own breaks the import with an
ImportError that says so; upgrade both together, pip install -U metal-linalg mlx, once a release of this package for the newer MLX is out.
From source
On a Mac with no matching wheel, pip builds the package from source, which
needs Xcode's command line tools (xcode-select --install) and fetches CMake
and the rest itself. To build a clone, or the main branch:
pip install . # in a clone
pip install git+https://github.com/c0rmac/metal-linalg.git # main branch
Against another MLX
To build against an MLX other than the pinned one, a source build of MLX or
Homebrew's, turn off pip's build isolation so the build sees your MLX, and
--no-deps so pip leaves it alone. The build must also use the nanobind your
MLX was built with: the pip MLX 0.32.3 uses nanobind 3.0.1, Homebrew's MLX
0.32.1 uses 2.15.0. The build checks this before compiling and stops with a
message naming the mismatch.
With Homebrew's Python and MLX (brew install mlx includes the mlx Python
package), in a virtual environment that can see Homebrew's packages:
python3 -m venv --system-site-packages ~/.venvs/metal-linalg
source ~/.venvs/metal-linalg/bin/activate
pip install scikit-build-core "nanobind==2.15.0"
pip install --no-build-isolation --no-deps git+https://github.com/c0rmac/metal-linalg.git
After upgrading that MLX, reinstall the package the same way.
Calibration
Routing comes from measurements made on each kind of Mac. Where there are
none for yours, or they are stale or incomplete, importing the package raises
a metal_linalg.CalibrationWarning once per decomposition, saying so and how
to measure your Mac (about an hour and a half) and submit the results:
ml.calibration_status() # {'qr': 'current', 'eigh': 'current', 'svd': 'stale'}
warnings.filterwarnings("ignore", category=ml.CalibrationWarning), or
METAL_LINALG_NO_CALIBRATION_NOTICE=1, silences it. Which chips are measured:
the measurements page.
Tests
python -m unittest discover -s python/tests -v
Metadata
Release files for metal-linalg 2.12.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| metal_linalg-2.12.1.tar.gz | 326.5 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| metal_linalg-2.12.1-cp314-cp314-macosx_14_0_arm64.whl | CPython 3.14 | CPython 3.14 | macOS 14.0+ ARM64 | Details |
| metal_linalg-2.12.1-cp313-cp313-macosx_14_0_arm64.whl | CPython 3.13 | CPython 3.13 | macOS 14.0+ ARM64 | Details |
| metal_linalg-2.12.1-cp312-cp312-macosx_14_0_arm64.whl | CPython 3.12 | CPython 3.12 | macOS 14.0+ ARM64 | Details |
| metal_linalg-2.12.1-cp311-cp311-macosx_14_0_arm64.whl | CPython 3.11 | CPython 3.11 | macOS 14.0+ ARM64 | Details |
| metal_linalg-2.12.1-cp310-cp310-macosx_14_0_arm64.whl | CPython 3.10 | CPython 3.10 | macOS 14.0+ ARM64 | Details |
Total release size: 1.8 MB
Release files / metal_linalg-2.12.1.tar.gz
| Download URL | metal_linalg-2.12.1.tar.gz |
|---|---|
| Size | 326.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7322cbf0f72f6d6104930ce93f000ca4e47a697d5c1b0b40a55dde8dff1d9d20
|
|
BLAKE2b-256 checksum How to use checksums |
38ee68b1fd9d5127531ff996b16fa4ab46c7cc638fd9e48b18fffd45e5545928
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / metal_linalg-2.12.1-cp314-cp314-macosx_14_0_arm64.whl
| Download URL | metal_linalg-2.12.1-cp314-cp314-macosx_14_0_arm64.whl |
|---|---|
| Size | 301.5 kB |
| Tags | CPython 3.14 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
330bc10dab3068bcd432cbbe5622ef2992f47f630676ce62997dbd6beec798a5
|
|
BLAKE2b-256 checksum How to use checksums |
2d7101ad2eb61a4713d38d588b1aed3998d70d93d414e36ce47235a54d02fe5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / metal_linalg-2.12.1-cp313-cp313-macosx_14_0_arm64.whl
| Download URL | metal_linalg-2.12.1-cp313-cp313-macosx_14_0_arm64.whl |
|---|---|
| Size | 301.5 kB |
| Tags | CPython 3.13 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
2327099ab5cfcc4a23a9153612b657cf0eb3d5d3186aeb5afe37544e7df04dd2
|
|
BLAKE2b-256 checksum How to use checksums |
3a73f445317ce43012b1406c2749c4732e55eeeea82081d987c9329c9b3fc009
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / metal_linalg-2.12.1-cp312-cp312-macosx_14_0_arm64.whl
| Download URL | metal_linalg-2.12.1-cp312-cp312-macosx_14_0_arm64.whl |
|---|---|
| Size | 301.5 kB |
| Tags | CPython 3.12 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
955bb4c827d20b4c27debaf7603e503ecbab3d6c81e6fc646458dc30fb5af260
|
|
BLAKE2b-256 checksum How to use checksums |
5483b33a89b6d4148bce6119cc8709e3f9b427073d34d9e09dea22a33b00e0e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / metal_linalg-2.12.1-cp311-cp311-macosx_14_0_arm64.whl
| Download URL | metal_linalg-2.12.1-cp311-cp311-macosx_14_0_arm64.whl |
|---|---|
| Size | 302.3 kB |
| Tags | CPython 3.11 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1893641dd58a6488f9b253be41bc63c8ac70f3994d2cdee580a979af69c0bff1
|
|
BLAKE2b-256 checksum How to use checksums |
b47e8b1ead98cd95a24b34eab2684b8afc9a516163f1621813d36df766fa41ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency logRelease files / metal_linalg-2.12.1-cp310-cp310-macosx_14_0_arm64.whl
| Download URL | metal_linalg-2.12.1-cp310-cp310-macosx_14_0_arm64.whl |
|---|---|
| Size | 302.4 kB |
| Tags | CPython 3.10 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1d3eb2583f09e5d4fc6fab45612454d6b51da00965c633a9f21f5f9d7c51744d
|
|
BLAKE2b-256 checksum How to use checksums |
90769cfb0be872b5ec3e6e903070b6bfdf9d92bc017d4ec52681c235f382eced
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.
Transparency log