diff --git a/.circleci/config.yml b/.circleci/config.yml index 25fb71fb5..26aa21ce8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -57,17 +57,18 @@ jobs: command: ./build/tests/tests mac_build_and_test: - machine: true - resource_class: ml-explore/m-builder + macos: + xcode: "15.2.0" + resource_class: macos.m1.large.gen1 steps: - checkout - run: name: Install dependencies command: | - eval "$(conda shell.bash hook)" - rm -r $CONDA_PREFIX/envs/runner-env - conda create -y -n runner-env python=3.9 - conda activate runner-env + brew install python@3.9 + python3.9 -m venv env + source env/bin/activate + pip install --upgrade pip pip install --upgrade cmake pip install --upgrade pybind11[global] pip install pybind11-stubgen @@ -78,191 +79,94 @@ jobs: - run: name: Install Python package command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - CMAKE_BUILD_PARALLEL_LEVEL="" python setup.py build_ext --inplace - CMAKE_BUILD_PARALLEL_LEVEL="" python setup.py develop + source env/bin/activate + CMAKE_BUILD_PARALLEL_LEVEL="" pip install -e . -v - run: name: Generate package stubs command: | - eval "$(conda shell.bash hook)" - conda activate runner-env + source env/bin/activate python setup.py generate_stubs - run: name: Run Python tests command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - DEVICE=cpu python -m xmlrunner discover -v python/tests -o test-results/cpu - DEVICE=gpu python -m xmlrunner discover -v python/tests -o test-results/gpu + source env/bin/activate + LOW_MEMORY=1 DEVICE=cpu python -m xmlrunner discover -v python/tests -o test-results/cpu + # TODO: Reenable when Circle CI can run gpu jobs + # DEVICE=gpu python3.9 -m xmlrunner discover -v python/tests -o test-results/gpu # TODO: Reenable when extension api becomes stable # - run: # name: Build example extension # command: | - # eval "$(conda shell.bash hook)" - # conda activate runner-env - # cd examples/extensions && python -m pip install . + # cd examples/extensions && python3.11 -m pip install . - store_test_results: path: test-results - run: name: Build CPP only command: | + source env/bin/activate mkdir -p build && cd build && cmake .. && make -j - run: name: Run CPP tests - command: METAL_DEVICE_WRAPPER_TYPE=1 METAL_DEBUG_ERROR_MODE=0 ./build/tests/tests + #command: METAL_DEVICE_WRAPPER_TYPE=1 METAL_DEBUG_ERROR_MODE=0 ./build/tests/tests + command: DEVICE=cpu ./build/tests/tests build_release: - machine: true - resource_class: ml-explore/m-builder parameters: python_version: type: string default: "3.9" - macos_version: + xcode_version: type: string - default: "14" + default: "15.2.0" + build_env: + type: string + default: "" + macos: + xcode: << parameters.xcode_version >> + resource_class: macos.m1.large.gen1 steps: - checkout - run: name: Install dependencies command: | - eval "$(conda shell.bash hook)" - rm -r $CONDA_PREFIX/envs/runner-env - conda create -y -n runner-env python=<< parameters.python_version >> - conda activate runner-env + brew install python@<< parameters.python_version >> + python<< parameters.python_version >> -m venv env + source env/bin/activate + pip install --upgrade pip pip install --upgrade cmake pip install --upgrade pybind11[global] + pip install --upgrade setuptools pip install pybind11-stubgen pip install numpy pip install twine - # TODO: Update build system to switch away from setup.py develop + pip install build - run: name: Install Python package command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - DEVELOPER_DIR=$(developer_dir_macos_<< parameters.macos_version >>) \ - PYPI_RELEASE=1 \ + source env/bin/activate + DEV_RELEASE=1 \ CMAKE_BUILD_PARALLEL_LEVEL="" \ - python setup.py develop + pip install . -v - run: name: Generate package stubs command: | - eval "$(conda shell.bash hook)" - conda activate runner-env + source env/bin/activate python setup.py generate_stubs - run: - name: Publish Python package + name: Build Python package command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - DEVELOPER_DIR=$(developer_dir_macos_<< parameters.macos_version >>) \ - PYPI_RELEASE=1 \ + source env/bin/activate + << parameters.build_env >> \ CMAKE_BUILD_PARALLEL_LEVEL="" \ - python setup.py bdist_wheel - twine upload dist/* --repository mlx - - store_artifacts: - path: dist/ - - build_dev_release: - machine: true - resource_class: ml-explore/m-builder - parameters: - python_version: - type: string - default: "3.9" - macos_version: - type: string - default: "14" - steps: - - checkout - - run: - name: Install dependencies - command: | - eval "$(conda shell.bash hook)" - rm -r $CONDA_PREFIX/envs/runner-env - conda create -y -n runner-env python=<< parameters.python_version >> - conda activate runner-env - pip install --upgrade cmake - pip install --upgrade pybind11[global] - pip install pybind11-stubgen - pip install numpy - pip install twine - - run: - name: Install Python package - command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - DEVELOPER_DIR=$(developer_dir_macos_<< parameters.macos_version >>) \ - DEV_RELEASE=1 \ - CMAKE_BUILD_PARALLEL_LEVEL="" \ - python setup.py develop - - run: - name: Generate package stubs - command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - python setup.py generate_stubs - - run: - name: Publish Python package - command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - DEVELOPER_DIR=$(developer_dir_macos_<< parameters.macos_version >>) \ - DEV_RELEASE=1 \ - CMAKE_BUILD_PARALLEL_LEVEL="" \ - python setup.py bdist_wheel - twine upload dist/* --repository mlx - - store_artifacts: - path: dist/ - - build_package: - machine: true - resource_class: ml-explore/m-builder - parameters: - python_version: - type: string - default: "3.9" - macos_version: - type: string - default: "14" - steps: - - checkout - - run: - name: Install dependencies - command: | - eval "$(conda shell.bash hook)" - rm -r $CONDA_PREFIX/envs/runner-env - conda create -y -n runner-env python=<< parameters.python_version >> - conda activate runner-env - pip install --upgrade cmake - pip install --upgrade pybind11[global] - pip install pybind11-stubgen - pip install numpy - pip install twine - - run: - name: Install Python package - command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - DEVELOPER_DIR=$(developer_dir_macos_<< parameters.macos_version >>) \ - CMAKE_BUILD_PARALLEL_LEVEL="" \ - python setup.py develop - - run: - name: Generate package stubs - command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - python setup.py generate_stubs - - run: - name: Build package distribution - command: | - eval "$(conda shell.bash hook)" - conda activate runner-env - DEVELOPER_DIR=$(developer_dir_macos_<< parameters.macos_version >>) \ - CMAKE_BUILD_PARALLEL_LEVEL="" \ - python setup.py bdist_wheel + python -m build -w + - when: + condition: << parameters.build_env >> + steps: + - run: + name: Upload package + command: | + source env/bin/activate + twine upload dist/* - store_artifacts: path: dist/ @@ -273,8 +177,8 @@ workflows: - not: << pipeline.parameters.nightly_build >> - not: << pipeline.parameters.weekly_build >> jobs: - - linux_build_and_test - mac_build_and_test + - linux_build_and_test - build_release: filters: tags: @@ -284,20 +188,22 @@ workflows: matrix: parameters: python_version: ["3.8", "3.9", "3.10", "3.11", "3.12"] - macos_version: ["13", "14"] + xcode_version: ["14.3.1", "15.2.0"] + build_env: ["PYPI_RELEASE=1"] nightly_build: when: << pipeline.parameters.nightly_build >> jobs: - - build_package: + - build_release: matrix: parameters: python_version: ["3.8", "3.9", "3.10", "3.11", "3.12"] - macos_version: ["13", "14"] + xcode_version: ["14.3.1", "15.2.0"] weekly_build: when: << pipeline.parameters.weekly_build >> jobs: - - build_dev_release: + - build_release: matrix: parameters: python_version: ["3.8", "3.9", "3.10", "3.11", "3.12"] - macos_version: ["13", "14"] + xcode_version: ["14.3.1", "15.2.0"] + build_env: ["DEV_RELEASE=1"] diff --git a/MANIFEST.in b/MANIFEST.in index d81234106..9faafee45 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ include CMakeLists.txt recursive-include mlx/ * include python/src/* -python/mlx/py.typed # support type hinting as in PEP-561 +include python/mlx/py.typed # support type hinting as in PEP-561 diff --git a/python/tests/test_ops.py b/python/tests/test_ops.py index 6ac46779d..3d84f4b02 100644 --- a/python/tests/test_ops.py +++ b/python/tests/test_ops.py @@ -1,6 +1,7 @@ # Copyright © 2023-2024 Apple Inc. import math +import os import unittest from itertools import permutations @@ -1566,6 +1567,10 @@ class TestOps(mlx_tests.MLXTestCase): d_np = np.take(b_mx, np.arange(kth), axis=axis) self.assertTrue(np.all(d_np <= c_mx)) + @unittest.skipIf( + os.getenv("LOW_MEMORY", None) is not None, + "This test requires a lot of memory", + ) def test_large_binary(self): a = mx.ones([1000, 2147484], mx.int8) b = mx.ones([2147484], mx.int8)