2023-11-30 02:30:41 +08:00
|
|
|
Build and Install
|
|
|
|
=================
|
|
|
|
|
2024-01-13 05:34:16 +08:00
|
|
|
Python Installation
|
|
|
|
-------------------
|
2023-11-30 02:30:41 +08:00
|
|
|
|
2023-11-30 08:36:43 +08:00
|
|
|
MLX is available on PyPI. All you have to do to use MLX with your own Apple
|
|
|
|
silicon computer is
|
2023-11-30 02:30:41 +08:00
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
2023-11-30 08:23:42 +08:00
|
|
|
pip install mlx
|
2023-11-30 02:30:41 +08:00
|
|
|
|
2023-12-07 23:29:17 +08:00
|
|
|
To install from PyPI you must meet the following requirements:
|
|
|
|
|
|
|
|
- Using an M series chip (Apple silicon)
|
|
|
|
- Using a native Python >= 3.8
|
2024-03-08 00:19:43 +08:00
|
|
|
- macOS >= 13.5
|
2023-12-07 23:29:17 +08:00
|
|
|
|
2023-12-07 00:10:51 +08:00
|
|
|
.. note::
|
2024-03-08 05:27:57 +08:00
|
|
|
MLX is only available on devices running macOS >= 13.5
|
2023-12-14 11:48:00 +08:00
|
|
|
It is highly recommended to use macOS 14 (Sonoma)
|
2023-12-07 00:10:51 +08:00
|
|
|
|
2024-01-13 05:34:16 +08:00
|
|
|
|
|
|
|
MLX is also available on conda-forge. To install MLX with conda do:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
conda install conda-forge::mlx
|
|
|
|
|
|
|
|
|
2023-12-07 23:29:17 +08:00
|
|
|
Troubleshooting
|
|
|
|
^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
*My OS and Python versions are in the required range but pip still does not find
|
|
|
|
a matching distribution.*
|
|
|
|
|
|
|
|
Probably you are using a non-native Python. The output of
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
python -c "import platform; print(platform.processor())"
|
|
|
|
|
|
|
|
should be ``arm``. If it is ``i386`` (and you have M series machine) then you
|
|
|
|
are using a non-native Python. Switch your Python to a native Python. A good
|
2023-12-18 05:20:55 +08:00
|
|
|
way to do this is with `Conda <https://stackoverflow.com/q/65415996>`_.
|
2023-12-07 23:29:17 +08:00
|
|
|
|
|
|
|
|
2023-11-30 02:30:41 +08:00
|
|
|
Build from source
|
|
|
|
-----------------
|
|
|
|
|
|
|
|
Build Requirements
|
|
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
- A C++ compiler with C++17 support (e.g. Clang >= 5.0)
|
|
|
|
- `cmake <https://cmake.org/>`_ -- version 3.24 or later, and ``make``
|
2024-03-08 05:27:57 +08:00
|
|
|
- Xcode >= 15.0 and macOS SDK >= 14.0
|
2023-11-30 02:30:41 +08:00
|
|
|
|
2024-01-08 11:11:04 +08:00
|
|
|
.. note::
|
|
|
|
Ensure your shell environment is native ``arm``, not ``x86`` via Rosetta. If
|
|
|
|
the output of ``uname -p`` is ``x86``, see the :ref:`troubleshooting section <build shell>` below.
|
2023-11-30 02:30:41 +08:00
|
|
|
|
|
|
|
Python API
|
|
|
|
^^^^^^^^^^
|
|
|
|
|
|
|
|
To build and install the MLX python library from source, first, clone MLX from
|
|
|
|
`its GitHub repo <https://github.com/ml-explore/mlx>`_:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
git clone git@github.com:ml-explore/mlx.git mlx && cd mlx
|
|
|
|
|
2024-07-30 02:44:06 +08:00
|
|
|
Then simply build and install MLX using pip:
|
2023-11-30 02:30:41 +08:00
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
2024-09-11 06:15:17 +08:00
|
|
|
CMAKE_BUILD_PARALLEL_LEVEL=8 pip install .
|
2023-11-30 02:30:41 +08:00
|
|
|
|
2024-07-30 02:44:06 +08:00
|
|
|
For developing, install the package with development dependencies, and use an
|
|
|
|
editable install:
|
2023-11-30 02:30:41 +08:00
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
2024-09-11 06:15:17 +08:00
|
|
|
CMAKE_BUILD_PARALLEL_LEVEL=8 pip install -e ".[dev]"
|
2023-11-30 02:30:41 +08:00
|
|
|
|
2024-07-30 02:44:06 +08:00
|
|
|
Once the development dependencies are installed, you can build faster with:
|
2023-11-30 08:23:42 +08:00
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
2024-09-11 06:15:17 +08:00
|
|
|
CMAKE_BUILD_PARALLEL_LEVEL=8 python setup.py build_ext --inplace
|
2023-11-30 08:23:42 +08:00
|
|
|
|
2024-07-30 02:44:06 +08:00
|
|
|
Run the tests with:
|
2023-11-30 08:23:42 +08:00
|
|
|
|
|
|
|
.. code-block:: shell
|
2023-12-07 23:29:17 +08:00
|
|
|
|
2023-11-30 08:23:42 +08:00
|
|
|
python -m unittest discover python/tests
|
2023-11-30 02:30:41 +08:00
|
|
|
|
2024-07-30 02:44:06 +08:00
|
|
|
Optional: Install stubs to enable auto completions and type checking from your
|
|
|
|
IDE:
|
2023-12-15 04:58:45 +08:00
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
python setup.py generate_stubs
|
|
|
|
|
2023-11-30 02:30:41 +08:00
|
|
|
C++ API
|
|
|
|
^^^^^^^
|
|
|
|
|
|
|
|
Currently, MLX must be built and installed from source.
|
|
|
|
|
|
|
|
Similarly to the python library, to build and install the MLX C++ library start
|
|
|
|
by cloning MLX from `its GitHub repo
|
|
|
|
<https://github.com/ml-explore/mlx>`_:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
git clone git@github.com:ml-explore/mlx.git mlx && cd mlx
|
|
|
|
|
|
|
|
Create a build directory and run CMake and make:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
mkdir -p build && cd build
|
2024-04-20 03:24:07 +08:00
|
|
|
cmake .. && make -j
|
2023-11-30 02:30:41 +08:00
|
|
|
|
|
|
|
Run tests with:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
make test
|
|
|
|
|
|
|
|
Install with:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
make install
|
|
|
|
|
|
|
|
Note that the built ``mlx.metallib`` file should be either at the same
|
|
|
|
directory as the executable statically linked to ``libmlx.a`` or the
|
|
|
|
preprocessor constant ``METAL_PATH`` should be defined at build time and it
|
|
|
|
should point to the path to the built metal library.
|
|
|
|
|
2024-04-20 03:24:07 +08:00
|
|
|
.. list-table:: Build Options
|
2023-11-30 02:30:41 +08:00
|
|
|
:widths: 25 8
|
|
|
|
:header-rows: 1
|
|
|
|
|
|
|
|
* - Option
|
|
|
|
- Default
|
|
|
|
* - MLX_BUILD_TESTS
|
|
|
|
- ON
|
|
|
|
* - MLX_BUILD_EXAMPLES
|
|
|
|
- OFF
|
|
|
|
* - MLX_BUILD_BENCHMARKS
|
|
|
|
- OFF
|
|
|
|
* - MLX_BUILD_METAL
|
|
|
|
- ON
|
2024-05-14 07:08:11 +08:00
|
|
|
* - MLX_BUILD_CPU
|
|
|
|
- ON
|
2023-11-30 02:30:41 +08:00
|
|
|
* - MLX_BUILD_PYTHON_BINDINGS
|
|
|
|
- OFF
|
2024-03-29 00:40:31 +08:00
|
|
|
* - MLX_METAL_DEBUG
|
|
|
|
- OFF
|
2024-05-10 08:39:44 +08:00
|
|
|
* - MLX_BUILD_SAFETENSORS
|
|
|
|
- ON
|
|
|
|
* - MLX_BUILD_GGUF
|
|
|
|
- ON
|
2024-05-23 03:57:13 +08:00
|
|
|
* - MLX_METAL_JIT
|
|
|
|
- OFF
|
2023-12-07 00:10:51 +08:00
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
2024-04-20 03:24:07 +08:00
|
|
|
If you have multiple Xcode installations and wish to use
|
|
|
|
a specific one while building, you can do so by adding the
|
|
|
|
following environment variable before building
|
2023-12-07 00:10:51 +08:00
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
export DEVELOPER_DIR="/path/to/Xcode.app/Contents/Developer/"
|
|
|
|
|
2024-04-20 03:24:07 +08:00
|
|
|
Further, you can use the following command to find out which
|
2023-12-14 11:48:00 +08:00
|
|
|
macOS SDK will be used
|
2023-12-07 00:10:51 +08:00
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
xcrun -sdk macosx --show-sdk-version
|
2023-12-18 05:20:55 +08:00
|
|
|
|
2024-05-14 07:08:11 +08:00
|
|
|
Binary Size Minimization
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2024-05-25 02:44:40 +08:00
|
|
|
To produce a smaller binary use the CMake flags ``CMAKE_BUILD_TYPE=MinSizeRel``
|
|
|
|
and ``BUILD_SHARED_LIBS=ON``.
|
2024-05-14 07:08:11 +08:00
|
|
|
|
|
|
|
The MLX CMake build has several additional options to make smaller binaries.
|
|
|
|
For example, if you don't need the CPU backend or support for safetensors and
|
|
|
|
GGUF, you can do:
|
|
|
|
|
2024-05-21 02:51:47 +08:00
|
|
|
.. code-block:: shell
|
|
|
|
|
2024-06-28 01:43:13 +08:00
|
|
|
cmake .. \
|
2024-05-21 02:51:47 +08:00
|
|
|
-DCMAKE_BUILD_TYPE=MinSizeRel \
|
|
|
|
-DBUILD_SHARED_LIBS=ON \
|
2024-05-23 03:57:13 +08:00
|
|
|
-DMLX_BUILD_CPU=OFF \
|
2024-05-21 02:51:47 +08:00
|
|
|
-DMLX_BUILD_SAFETENSORS=OFF \
|
2024-05-24 07:23:44 +08:00
|
|
|
-DMLX_BUILD_GGUF=OFF \
|
2024-05-23 03:57:13 +08:00
|
|
|
-DMLX_METAL_JIT=ON
|
|
|
|
|
2024-05-25 02:44:40 +08:00
|
|
|
THE ``MLX_METAL_JIT`` flag minimizes the size of the MLX Metal library which
|
2024-05-23 03:57:13 +08:00
|
|
|
contains pre-built GPU kernels. This substantially reduces the size of the
|
|
|
|
Metal library by run-time compiling kernels the first time they are used in MLX
|
|
|
|
on a given machine. Note run-time compilation incurs a cold-start cost which can
|
|
|
|
be anwywhere from a few hundred millisecond to a few seconds depending on the
|
|
|
|
application. Once a kernel is compiled, it will be cached by the system. The
|
|
|
|
Metal kernel cache persists accross reboots.
|
2024-05-14 07:08:11 +08:00
|
|
|
|
2023-12-18 05:20:55 +08:00
|
|
|
Troubleshooting
|
|
|
|
^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
Metal not found
|
|
|
|
~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
You see the following error when you try to build:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
error: unable to find utility "metal", not a developer tool or in PATH
|
|
|
|
|
|
|
|
To fix this, first make sure you have Xcode installed:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
xcode-select --install
|
|
|
|
|
|
|
|
Then set the active developer directory:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
|
2024-01-08 11:11:04 +08:00
|
|
|
|
2024-04-20 03:24:07 +08:00
|
|
|
x86 Shell
|
2024-01-08 11:11:04 +08:00
|
|
|
~~~~~~~~~
|
|
|
|
|
|
|
|
.. _build shell:
|
|
|
|
|
|
|
|
If the ouptut of ``uname -p`` is ``x86`` then your shell is running as x86 via
|
|
|
|
Rosetta instead of natively.
|
|
|
|
|
|
|
|
To fix this, find the application in Finder (``/Applications`` for iTerm,
|
|
|
|
``/Applications/Utilities`` for Terminal), right-click, and click “Get Info”.
|
|
|
|
Uncheck “Open using Rosetta”, close the “Get Info” window, and restart your
|
|
|
|
terminal.
|
|
|
|
|
|
|
|
Verify the terminal is now running natively the following command:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
$ uname -p
|
|
|
|
arm
|
2024-01-13 05:34:16 +08:00
|
|
|
|
|
|
|
Also check that cmake is using the correct architecture:
|
|
|
|
|
|
|
|
.. code-block:: shell
|
|
|
|
|
|
|
|
$ cmake --system-information | grep CMAKE_HOST_SYSTEM_PROCESSOR
|
|
|
|
CMAKE_HOST_SYSTEM_PROCESSOR "arm64"
|
|
|
|
|
|
|
|
If you see ``"x86_64"``, try re-installing ``cmake``. If you see ``"arm64"``
|
|
|
|
but the build errors out with "Building for x86_64 on macOS is not supported."
|
|
|
|
wipe your build cahce with ``rm -rf build/`` and try again.
|