| <!---- DO NOT MODIFY Progress Bar Start ---> |
| <div class="progress-bar-wrapper"> |
| <div class="progress-bar-item"> |
| <div class="step-number" id="step-1">1</div> |
| <span class="step-caption" id="caption-1"></span> |
| </div> |
| <div class="progress-bar-item"> |
| <div class="step-number" id="step-2">2</div> |
| <span class="step-caption" id="caption-2"></span> |
| </div> |
| <div class="progress-bar-item"> |
| <div class="step-number" id="step-3">3</div> |
| <span class="step-caption" id="caption-3"></span> |
| </div> |
| <div class="progress-bar-item"> |
| <div class="step-number" id="step-4">4</div> |
| <span class="step-caption" id="caption-4"></span> |
| </div> |
| </div> |
| <!---- DO NOT MODIFY Progress Bar End---> |
| |
| # Setting Up ExecuTorch |
| In this section, we'll learn how to |
| * Set up an environment to work on ExecuTorch |
| * Generate a sample ExecuTorch program |
| * Build and run a program with the ExecuTorch runtime |
| |
| ## System Requirements |
| ### Operating System |
| |
| We've tested these instructions on the following systems, although they should |
| also work in similar environments. |
| |
| |
| Linux (x86_64) |
| - CentOS 8+ |
| - Ubuntu 20.04.6 LTS+ |
| - RHEL 8+ |
| |
| macOS (x86_64/M1/M2) |
| - Big Sur (11.0)+ |
| |
| Windows (x86_64) |
| - Windows Subsystem for Linux (WSL) with any of the Linux options |
| |
| ### Software |
| * `conda` or another virtual environment manager |
| - We recommend `conda` as it provides cross-language |
| support and integrates smoothly with `pip` (Python's built-in package manager) |
| - Otherwise, Python's built-in virtual environment manager `python venv` is a good alternative. |
| * `g++` version 7 or higher, `clang++` version 5 or higher, or another |
| C++17-compatible toolchain. |
| |
| Note that the cross-compilable core runtime code supports a wider range of |
| toolchains, down to C++17. See the [Runtime Overview](./runtime-overview.md) for |
| portability details. |
| |
| ## Quick Setup: Colab/Jupyter Notebook Prototype |
| |
| To utilize ExecuTorch to its fullest extent, please follow the setup instructions provided below to install from source. |
| |
| Alternatively, if you would like to experiment with ExecuTorch quickly and easily, we recommend using the following [colab notebook](https://colab.research.google.com/drive/1qpxrXC3YdJQzly3mRg-4ayYiOjC6rue3?usp=sharing) for prototyping purposes. You can install directly via `pip` for basic functionality. |
| ```bash |
| pip install executorch |
| ``` |
| |
| |
| ## Environment Setup |
| |
| ### Create a Virtual Environment |
| |
| [Install conda on your machine](https://conda.io/projects/conda/en/latest/user-guide/install/index.html). Then, create a virtual environment to manage our dependencies. |
| ```bash |
| # Create and activate a conda environment named "executorch" |
| conda create -yn executorch python=3.10.0 |
| conda activate executorch |
| ``` |
| |
| ### Clone and install ExecuTorch requirements |
| |
| ```bash |
| # Clone the ExecuTorch repo from GitHub |
| # 'main' branch is the primary development branch where you see the latest changes. |
| # 'viable/strict' contains all of the commits on main that pass all of the necessary CI checks. |
| git clone --branch viable/strict https://github.com/pytorch/executorch.git |
| cd executorch |
| |
| # Update and pull submodules |
| git submodule sync |
| git submodule update --init |
| |
| # 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. |
| ./install_requirements.sh |
| ``` |
| |
| Use the [`--pybind` flag](https://github.com/pytorch/executorch/blob/main/install_requirements.sh#L26-L29) to install with pybindings and dependencies for other backends. |
| ```bash |
| ./install_requirements.sh --pybind <coreml | mps | xnnpack> |
| ``` |
| After setting up your environment, you are ready to convert your PyTorch programs |
| to ExecuTorch. |
| |
| > **_NOTE:_** Cleaning the build system |
| > |
| > When fetching a new version of the upstream repo (via `git fetch` or `git |
| > pull`) it is a good idea to clean the old build artifacts. The build system |
| > does not currently adapt well to changes in build dependencies. |
| > |
| > You should also update and pull the submodules again, in case their versions |
| > have changed. |
| > |
| > ```bash |
| > # From the root of the executorch repo: |
| > rm -rf cmake-out pip-out |
| > git submodule sync |
| > git submodule update --init |
| > ``` |
| |
| ## Create an ExecuTorch program |
| |
| After setting up your environment, you are ready to convert your PyTorch programs |
| to ExecuTorch. |
| |
| ### Export a Program |
| ExecuTorch provides APIs to compile a PyTorch [`nn.Module`](https://pytorch.org/docs/stable/generated/torch.nn.Module.html) to a `.pte` binary consumed by the ExecuTorch runtime. |
| 1. [`torch.export`](https://pytorch.org/docs/stable/export.html) |
| 1. [`exir.to_edge`](https://pytorch.org/executorch/stable/export-to-executorch-api-reference.html#exir.to_edge) |
| 1. [`exir.to_executorch`](ir-exir.md) |
| 1. Save the result as a [`.pte` binary](pte-file-format.md) to be consumed by the ExecuTorch runtime. |
| |
| |
| Let's try this using with a simple PyTorch model that adds its inputs. |
| |
| Create `export_add.py` in a new directory outside of the ExecuTorch repo. |
| |
| **Note: It's important that this file does does not live in the directory that's a parent of the `executorch` directory. We need python to import from site-packages, not from the repo itself.** |
| |
| ``` |
| mkdir -p ../example_files |
| cd ../example_files |
| touch export_add.py |
| ``` |
| |
| Add the following code to `export_add.py`: |
| ```python |
| import torch |
| from torch.export import export |
| from executorch.exir import to_edge |
| |
| # Start with a PyTorch model that adds two input tensors (matrices) |
| class Add(torch.nn.Module): |
| def __init__(self): |
| super(Add, self).__init__() |
| |
| def forward(self, x: torch.Tensor, y: torch.Tensor): |
| return x + y |
| |
| # 1. torch.export: Defines the program with the ATen operator set. |
| aten_dialect = export(Add(), (torch.ones(1), torch.ones(1))) |
| |
| # 2. to_edge: Make optimizations for Edge devices |
| edge_program = to_edge(aten_dialect) |
| |
| # 3. to_executorch: Convert the graph to an ExecuTorch program |
| executorch_program = edge_program.to_executorch() |
| |
| # 4. Save the compiled .pte program |
| with open("add.pte", "wb") as file: |
| file.write(executorch_program.buffer) |
| |
| ``` |
| |
| Then, execute it from your terminal. |
| ```bash |
| python3 export_add.py |
| ``` |
| |
| If it worked you'll see `add.pte` in that directory |
| |
| See the [ExecuTorch export tutorial](tutorials_source/export-to-executorch-tutorial.py) to learn more about the export process. |
| |
| |
| ## Build & Run |
| |
| After creating a program go back to the executorch directory to execute it using the ExecuTorch runtime. |
| ``` |
| cd ../executorch |
| ``` |
| |
| For now, let's use [`executor_runner`](https://github.com/pytorch/executorch/blob/main/examples/portable/executor_runner/executor_runner.cpp), an example that runs the `forward` method on your program using the ExecuTorch runtime. |
| |
| ### Build Tooling Setup |
| The ExecuTorch repo uses CMake to build its C++ code. Here, we'll configure it to build the `executor_runner` tool to run it on our desktop OS. |
| ```bash |
| # Clean and configure the CMake build system. Compiled programs will |
| # appear in the executorch/cmake-out directory we create here. |
| (rm -rf cmake-out && mkdir cmake-out && cd cmake-out && cmake ..) |
| |
| # Build the executor_runner target |
| cmake --build cmake-out --target executor_runner -j9 |
| ``` |
| |
| > **_NOTE:_** Cleaning the build system |
| > |
| > When fetching a new version of the upstream repo (via `git fetch` or `git |
| > pull`) it is a good idea to clean the old build artifacts. The build system |
| > does not currently adapt well to changes in build dependencies. |
| > |
| > You should also update and pull the submodules again, in case their versions |
| > have changed. |
| > |
| > ```bash |
| > # From the root of the executorch repo: |
| > rm -rf cmake-out pip-out |
| > git submodule sync |
| > git submodule update --init |
| > ``` |
| |
| ### Run Your Program |
| |
| Now that we've exported a program and built the runtime, let's execute it! |
| |
| ```bash |
| ./cmake-out/executor_runner --model_path ../example_files/add.pte |
| ``` |
| Our output is a `torch.Tensor` with a size of 1. The `executor_runner` sets all input values to a [`torch.ones`](https://pytorch.org/docs/stable/generated/torch.ones.html) tensor, so when `x=[1]` and `y=[1]`, we get `[1]+[1]=[2]` |
| :::{dropdown} Sample Output |
| |
| ``` |
| Output 0: tensor(sizes=[1], [2.]) |
| ``` |
| ::: |
| |
| To learn how to build a similar program, visit the [Runtime APIs Tutorial](extension-module.md). |
| |
| ## Next Steps |
| |
| Congratulations! You have successfully exported, built, and run your first |
| ExecuTorch program. Now that you have a basic understanding of ExecuTorch, |
| explore its advanced features and capabilities below. |
| |
| * Build an [Android](demo-apps-android.md) or [iOS](demo-apps-ios.md) demo app |
| * Learn more about the [export process](export-overview.md) |
| * Dive deeper into the [Export Intermediate Representation (EXIR)](ir-exir.md) for complex export workflows |
| * Refer to [advanced examples in executorch/examples](https://github.com/pytorch/executorch/tree/main/examples) |