From 61076a4701f028fcfc4ecd8c534b320232c3a30b Mon Sep 17 00:00:00 2001 From: Zuby Afzal Date: Mon, 28 Apr 2025 20:39:05 -0700 Subject: [PATCH 1/6] Update docs for intel-macOS systems and building from source --- README.md | 2 +- docs/source/backends-xnnpack.md | 2 +- docs/source/getting-started.md | 5 +++-- docs/source/using-executorch-building-from-source.md | 12 ++++++++++-- docs/source/using-executorch-ios.md | 9 ++++++++- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c0d594e7733..c6628a13824 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ It supports a wide range of models including LLMs (Large Language Models), CV (C Platform Support: - Operating Systems: - iOS - - Mac + - MacOS (ARM64) - Android - Linux - Microcontrollers diff --git a/docs/source/backends-xnnpack.md b/docs/source/backends-xnnpack.md index db1c055dc9c..a6e515c5af2 100644 --- a/docs/source/backends-xnnpack.md +++ b/docs/source/backends-xnnpack.md @@ -14,7 +14,7 @@ The XNNPACK delegate is the ExecuTorch solution for CPU execution on mobile CPUs - ARM64 on Android, iOS, macOS, Linux, and Windows. - ARMv7 (with NEON) on Android. - ARMv6 (with VFPv2) on Linux. -- x86 and x86-64 (up to AVX512) on Windows, Linux, macOS, Android, and iOS simulator. +- x86 and x86-64 (up to AVX512) on Windows, Linux, Android. ## Development Requirements diff --git a/docs/source/getting-started.md b/docs/source/getting-started.md index b7a97190b49..be15e7d6ea2 100644 --- a/docs/source/getting-started.md +++ b/docs/source/getting-started.md @@ -10,8 +10,9 @@ The following are required to install the ExecuTorch host libraries, needed to e - Python 3.10 - 3.12 - g++ version 7 or higher, clang++ version 5 or higher, or another C++17-compatible toolchain. -- Linux or MacOS operating system (Arm or x86). - - Windows is supported via WSL. +- Linux (x86_64 or ARM64) or macOS (ARM64). + - Intel-based macOS systems require building PyTorch from source (see [Building From Source](using-executorch-building-from-source.md) for instructions). + - Windows is supported via WSL. ## Installation To use ExecuTorch, you will need to install both the Python package and the appropriate platform-specific runtime libraries. Pip is the recommended way to install the ExecuTorch python package. diff --git a/docs/source/using-executorch-building-from-source.md b/docs/source/using-executorch-building-from-source.md index e2657e69b55..2764dda4bb1 100644 --- a/docs/source/using-executorch-building-from-source.md +++ b/docs/source/using-executorch-building-from-source.md @@ -16,7 +16,7 @@ Linux (x86_64) - Ubuntu 20.04.6 LTS+ - RHEL 8+ -macOS (x86_64/M1/M2) +macOS (x86_64/ARM64) - Big Sur (11.0)+ Windows (x86_64) @@ -56,13 +56,21 @@ Or alternatively, [install conda on your machine](https://conda.io/projects/cond conda create -yn executorch python=3.10.0 && conda activate executorch ``` -## Install ExecuTorch pip package from Source +## Install ExecuTorch pip package from source ```bash # Install ExecuTorch pip package and its dependencies, as well as # development tools like CMake. # If developing on a Mac, make sure to install the Xcode Command Line Tools first. + # Intel-based macOS systems require building PyTorch from source (see below) ./install_executorch.sh ``` + + Use the [`--use-pt-pinned-commit` flag](https://github.com/pytorch/executorch/blob/main/install_executorch.sh) to install Executorch with an existing PyTorch build. + See the [PyTorch instructions](https://github.com/pytorch/pytorch#installation) on how to build PyTorch from source. + + ```bash + ./install_executorch.sh --use-pt-pinned-commit + ``` Use the [`--pybind` flag](https://github.com/pytorch/executorch/blob/main/install_executorch.sh#L26-L29) to install with pybindings and dependencies for other backends. ```bash diff --git a/docs/source/using-executorch-ios.md b/docs/source/using-executorch-ios.md index 35fa7c187c5..01ea7f15728 100644 --- a/docs/source/using-executorch-ios.md +++ b/docs/source/using-executorch-ios.md @@ -4,7 +4,7 @@ ExecuTorch supports both iOS and macOS via Objective-C, Swift, and C++. ExecuTor ## Integration -The ExecuTorch Runtime for iOS and macOS is distributed as a collection of prebuilt [.xcframework](https://developer.apple.com/documentation/xcode/creating-a-multi-platform-binary-framework-bundle) binary targets. These targets are compatible with both iOS and macOS devices and simulators and are available in both release and debug modes: +The ExecuTorch Runtime for iOS and macOS (ARM64) is distributed as a collection of prebuilt [.xcframework](https://developer.apple.com/documentation/xcode/creating-a-multi-platform-binary-framework-bundle) binary targets. These targets are compatible with both iOS and macOS devices and simulators and are available in both release and debug modes: * `executorch` - Main Runtime components * `backend_coreml` - Core ML backend @@ -118,6 +118,13 @@ python3 -m venv .venv && source .venv/bin/activate && pip install --upgrade pip ./backends/apple/mps/install_requirements.sh ``` +- **Intel-based macOS** systems require building PyTorch from source: + - Use the [`--use-pt-pinned-commit` flag](https://github.com/pytorch/executorch/blob/main/install_requirements.sh) to install Executorch with an existing PyTorch build. + See the [PyTorch instructions](https://github.com/pytorch/pytorch#installation) on how to build PyTorch from source. + ```bash + ./install_requirements.sh --use-pt-pinned-commit + ``` + 5. Install [CMake](https://cmake.org): Download the macOS binary distribution from the [CMake website](https://cmake.org/download), open the `.dmg` file, move `CMake.app` to the `/Applications` directory, and then run the following command to install the CMake command-line tools: From 11a582e9582a36a8db6a7ba17b9f5e6a801f9170 Mon Sep 17 00:00:00 2001 From: Zuby Afzal Date: Mon, 28 Apr 2025 20:39:48 -0700 Subject: [PATCH 2/6] Add intel-macOS system check --- install_requirements.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/install_requirements.py b/install_requirements.py index 4c468b979d1..a98850b4cf7 100644 --- a/install_requirements.py +++ b/install_requirements.py @@ -75,6 +75,10 @@ def python_is_compatible(): def install_requirements(use_pytorch_nightly): + # Prevent pip install attempt on Intel-based macOS (no prebuilt PyTorch binaries available) + if use_pytorch_nightly and is_intel_mac_os(): + sys.exit(1) + # pip packages needed by exir. EXIR_REQUIREMENTS = [ # Setting use_pytorch_nightly to false to test the pinned PyTorch commit. Note @@ -139,6 +143,24 @@ def install_requirements(use_pytorch_nightly): ) +# Prebuilt binaries for Intel-based macOS are no longer available on PyPI; users must compile from source. +# PyTorch stopped building macOS x86_64 binaries since version 2.3.0 (January 2024). +def is_intel_mac_os(): + # Returns True if running on Intel-based macOS + if platform.system().lower() == "darwin" and platform.machine().lower() in ( + "x86", + "x86_64", + "i386", + ): + print( + "ERROR: Prebuilt PyTorch binaries are no longer available for Intel-based macOS.\n" + "Please compile from source by following https://pytorch.org/executorch/0.6/using-executorch-building-from-source.html", + file=sys.stderr, + ) + return True + return False + + def main(args): parser = argparse.ArgumentParser() parser.add_argument( From a094e82709006dd339c9ca2d5aa9389978bd1963 Mon Sep 17 00:00:00 2001 From: Zuby Afzal Date: Thu, 1 May 2025 21:32:59 -0700 Subject: [PATCH 3/6] Update pip install commands for intel macOS systems and pytorch versions built from source --- install_requirements.py | 71 +++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/install_requirements.py b/install_requirements.py index a98850b4cf7..0552ee1928d 100644 --- a/install_requirements.py +++ b/install_requirements.py @@ -75,8 +75,10 @@ def python_is_compatible(): def install_requirements(use_pytorch_nightly): - # Prevent pip install attempt on Intel-based macOS (no prebuilt PyTorch binaries available) - if use_pytorch_nightly and is_intel_mac_os(): + is_intel_mac = is_intel_mac_os() + + # Skip pip install on Intel macOS if using nightly. + if use_pytorch_nightly and is_intel_mac: sys.exit(1) # pip packages needed by exir. @@ -84,17 +86,21 @@ def install_requirements(use_pytorch_nightly): # Setting use_pytorch_nightly to false to test the pinned PyTorch commit. Note # that we don't need to set any version number there because they have already # been installed on CI before this step, so pip won't reinstall them - f"torch==2.8.0.{NIGHTLY_VERSION}" if use_pytorch_nightly else "torch", - ( - f"torchvision==0.22.0.{NIGHTLY_VERSION}" - if use_pytorch_nightly - else "torchvision" - ), # For testing. + f"torch==2.8.0.{NIGHTLY_VERSION}" if use_pytorch_nightly else "torch" ] - EXAMPLES_REQUIREMENTS = [ - f"torchaudio==2.6.0.{NIGHTLY_VERSION}" if use_pytorch_nightly else "torchaudio", - ] + EXAMPLES_REQUIREMENTS = [] + + # Only pip install torchvision and torchaudio if not building PyTorch from source on Intel macOS, + # to avoid installing incompatible prebuilt wheels from PyPI. + if not is_intel_mac: + EXIR_REQUIREMENTS.append( + f"torchvision==0.22.0.{NIGHTLY_VERSION}" + ) # For testing. + + EXAMPLES_REQUIREMENTS = [ + f"torchaudio==2.6.0.{NIGHTLY_VERSION}", + ] # Assemble the list of requirements to actually install. # TODO: Add options for reducing the number of requirements. @@ -102,22 +108,25 @@ def install_requirements(use_pytorch_nightly): # Install the requirements. `--extra-index-url` tells pip to look for package # versions on the provided URL if they aren't available on the default URL. - subprocess.run( - [ - sys.executable, - "-m", - "pip", - "install", - "-r", - "requirements-examples.txt", - "-r", - "requirements-dev.txt", - *REQUIREMENTS_TO_INSTALL, - "--extra-index-url", - TORCH_NIGHTLY_URL, - ], - check=True, - ) + pip_args = [ + sys.executable, + "-m", + "pip", + "install", + "-r", + "requirements-examples.txt", + "-r", + "requirements-dev.txt", + *REQUIREMENTS_TO_INSTALL, + "--extra-index-url", + TORCH_NIGHTLY_URL, + ] + + # If pytorch is built from source add no-deps flag to stop dependencies from changing torch version + if not use_pytorch_nightly: + pip_args.append("--no-deps") + + subprocess.run(pip_args, check=True) LOCAL_REQUIREMENTS = [ "third-party/ao", # We need the latest kernels for fast iteration, so not relying on pypi. @@ -143,18 +152,18 @@ def install_requirements(use_pytorch_nightly): ) -# Prebuilt binaries for Intel-based macOS are no longer available on PyPI; users must compile from source. +# Prebuilt wheels for Intel macOS are no longer available on PyPI; users must compile from source. # PyTorch stopped building macOS x86_64 binaries since version 2.3.0 (January 2024). def is_intel_mac_os(): - # Returns True if running on Intel-based macOS + # Returns True if running on Intel macOS if platform.system().lower() == "darwin" and platform.machine().lower() in ( "x86", "x86_64", "i386", ): print( - "ERROR: Prebuilt PyTorch binaries are no longer available for Intel-based macOS.\n" - "Please compile from source by following https://pytorch.org/executorch/0.6/using-executorch-building-from-source.html", + "ERROR: Prebuilt PyTorch wheels are no longer available for Intel-based macOS.\n" + "Please build from source by following https://pytorch.org/executorch/0.6/using-executorch-building-from-source.html", file=sys.stderr, ) return True From d117bd3b50a5bbec5cf378bc36e2081ac5cb3fec Mon Sep 17 00:00:00 2001 From: Zuby Afzal Date: Thu, 1 May 2025 21:33:56 -0700 Subject: [PATCH 4/6] Remove redundant python compatibility check --- install_executorch.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/install_executorch.py b/install_executorch.py index 4c7b51ef239..0700e5ec49d 100644 --- a/install_executorch.py +++ b/install_executorch.py @@ -196,9 +196,6 @@ def _list_pybind_defines(args) -> Tuple[bool, List[str]]: def main(args): - if not python_is_compatible(): - sys.exit(1) - parser = build_args_parser() args = parser.parse_args() From 35ecca2a9ed54875ef0ebaad7e5bb4de5d9adf73 Mon Sep 17 00:00:00 2001 From: Zuby Afzal Date: Thu, 1 May 2025 21:42:06 -0700 Subject: [PATCH 5/6] Update building from source docs --- docs/source/using-executorch-building-from-source.md | 2 +- docs/source/using-executorch-ios.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/using-executorch-building-from-source.md b/docs/source/using-executorch-building-from-source.md index 2764dda4bb1..8281815f9b0 100644 --- a/docs/source/using-executorch-building-from-source.md +++ b/docs/source/using-executorch-building-from-source.md @@ -61,7 +61,7 @@ Or alternatively, [install conda on your machine](https://conda.io/projects/cond # Install ExecuTorch pip package and its dependencies, as well as # development tools like CMake. # If developing on a Mac, make sure to install the Xcode Command Line Tools first. - # Intel-based macOS systems require building PyTorch from source (see below) + # Intel-based macOS systems require building PyTorch, Torchvision, and Torchaudio from source (see below) ./install_executorch.sh ``` diff --git a/docs/source/using-executorch-ios.md b/docs/source/using-executorch-ios.md index 01ea7f15728..78a77cee353 100644 --- a/docs/source/using-executorch-ios.md +++ b/docs/source/using-executorch-ios.md @@ -118,7 +118,7 @@ python3 -m venv .venv && source .venv/bin/activate && pip install --upgrade pip ./backends/apple/mps/install_requirements.sh ``` -- **Intel-based macOS** systems require building PyTorch from source: +- **Intel-based macOS** systems require building PyTorch, Torchvision, and Torchaudio from source: - Use the [`--use-pt-pinned-commit` flag](https://github.com/pytorch/executorch/blob/main/install_requirements.sh) to install Executorch with an existing PyTorch build. See the [PyTorch instructions](https://github.com/pytorch/pytorch#installation) on how to build PyTorch from source. ```bash From 20d664c1e13effb3c2deaad6a459f86fe6a4ff36 Mon Sep 17 00:00:00 2001 From: Zuby Afzal Date: Mon, 12 May 2025 16:32:48 -0700 Subject: [PATCH 6/6] Restore fallback installs for audio and vision; move print statement; update docs url --- install_requirements.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/install_requirements.py b/install_requirements.py index 0552ee1928d..71fdd2411aa 100644 --- a/install_requirements.py +++ b/install_requirements.py @@ -79,6 +79,11 @@ def install_requirements(use_pytorch_nightly): # Skip pip install on Intel macOS if using nightly. if use_pytorch_nightly and is_intel_mac: + print( + "ERROR: Prebuilt PyTorch wheels are no longer available for Intel-based macOS.\n" + "Please build from source by following https://docs.pytorch.org/executorch/main/using-executorch-building-from-source.html", + file=sys.stderr, + ) sys.exit(1) # pip packages needed by exir. @@ -92,14 +97,20 @@ def install_requirements(use_pytorch_nightly): EXAMPLES_REQUIREMENTS = [] # Only pip install torchvision and torchaudio if not building PyTorch from source on Intel macOS, - # to avoid installing incompatible prebuilt wheels from PyPI. + # to avoid having incompatible prebuilt wheels from PyPI installed. if not is_intel_mac: EXIR_REQUIREMENTS.append( f"torchvision==0.22.0.{NIGHTLY_VERSION}" + if use_pytorch_nightly + else "torchvision" ) # For testing. EXAMPLES_REQUIREMENTS = [ - f"torchaudio==2.6.0.{NIGHTLY_VERSION}", + ( + f"torchaudio==2.6.0.{NIGHTLY_VERSION}" + if use_pytorch_nightly + else "torchaudio" + ) ] # Assemble the list of requirements to actually install. @@ -156,18 +167,11 @@ def install_requirements(use_pytorch_nightly): # PyTorch stopped building macOS x86_64 binaries since version 2.3.0 (January 2024). def is_intel_mac_os(): # Returns True if running on Intel macOS - if platform.system().lower() == "darwin" and platform.machine().lower() in ( + return platform.system().lower() == "darwin" and platform.machine().lower() in ( "x86", "x86_64", "i386", - ): - print( - "ERROR: Prebuilt PyTorch wheels are no longer available for Intel-based macOS.\n" - "Please build from source by following https://pytorch.org/executorch/0.6/using-executorch-building-from-source.html", - file=sys.stderr, - ) - return True - return False + ) def main(args):