xref: /aosp_15_r20/external/executorch/examples/portable/README.md (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker# ExecuTorch in Portable Mode
2*523fa7a6SAndroid Build Coastguard Worker
3*523fa7a6SAndroid Build Coastguard WorkerThis dir contains demos to illustrate an end-to-end workflow of using ExecuTorch in [portable mode](../../docs/source/concepts.md#portable-mode-lean-mode).
4*523fa7a6SAndroid Build Coastguard Worker
5*523fa7a6SAndroid Build Coastguard Worker
6*523fa7a6SAndroid Build Coastguard Worker## Directory structure
7*523fa7a6SAndroid Build Coastguard Worker```bash
8*523fa7a6SAndroid Build Coastguard Workerexamples/portable
9*523fa7a6SAndroid Build Coastguard Worker├── scripts                           # Python scripts to illustrate export workflow
10*523fa7a6SAndroid Build Coastguard Worker│   ├── export.py
11*523fa7a6SAndroid Build Coastguard Worker│   └── export_and_delegate.py
12*523fa7a6SAndroid Build Coastguard Worker├── custom_ops                        # Contains examples to register custom operators into PyTorch as well as register its kernels into ExecuTorch runtime
13*523fa7a6SAndroid Build Coastguard Worker├── executor_runner                   # Contains an example C++ wrapper around the ExecuTorch runtime
14*523fa7a6SAndroid Build Coastguard Worker└── README.md                         # This file
15*523fa7a6SAndroid Build Coastguard Worker```
16*523fa7a6SAndroid Build Coastguard Worker
17*523fa7a6SAndroid Build Coastguard Worker## Using portable mode
18*523fa7a6SAndroid Build Coastguard Worker
19*523fa7a6SAndroid Build Coastguard WorkerWe will walk through an example model to generate a `.pte` file in [portable mode](../../docs/source/concepts.md#portable-mode-lean-mode) from a python `torch.nn.module`
20*523fa7a6SAndroid Build Coastguard Workerfrom the [`models/`](../models) directory using scripts in the `portable/scripts` directory. Then we will run on the `.pte` model on the ExecuTorch runtime. For that we will use `executor_runner`.
21*523fa7a6SAndroid Build Coastguard Worker
22*523fa7a6SAndroid Build Coastguard Worker
23*523fa7a6SAndroid Build Coastguard Worker1. Following the setup guide in [Setting up ExecuTorch](https://pytorch.org/executorch/stable/getting-started-setup)
24*523fa7a6SAndroid Build Coastguard Workeryou should be able to get the basic development environment for ExecuTorch working.
25*523fa7a6SAndroid Build Coastguard Worker
26*523fa7a6SAndroid Build Coastguard Worker2. Using the script `portable/scripts/export.py` generate a model binary file by selecting a
27*523fa7a6SAndroid Build Coastguard Workermodel name from the list of available models in the `models` dir.
28*523fa7a6SAndroid Build Coastguard Worker
29*523fa7a6SAndroid Build Coastguard Worker
30*523fa7a6SAndroid Build Coastguard Worker```bash
31*523fa7a6SAndroid Build Coastguard Workercd executorch # To the top level dir
32*523fa7a6SAndroid Build Coastguard Worker
33*523fa7a6SAndroid Build Coastguard Worker# To get a list of example models
34*523fa7a6SAndroid Build Coastguard Workerpython3 -m examples.portable.scripts.export -h
35*523fa7a6SAndroid Build Coastguard Worker
36*523fa7a6SAndroid Build Coastguard Worker# To generate a specific pte model
37*523fa7a6SAndroid Build Coastguard Workerpython3 -m examples.portable.scripts.export --model_name="mv2" # for MobileNetv2
38*523fa7a6SAndroid Build Coastguard Worker
39*523fa7a6SAndroid Build Coastguard Worker# This should generate ./mv2.pte file, if successful.
40*523fa7a6SAndroid Build Coastguard Worker```
41*523fa7a6SAndroid Build Coastguard Worker
42*523fa7a6SAndroid Build Coastguard WorkerUse `-h` (or `--help`) to see all the supported models.
43*523fa7a6SAndroid Build Coastguard Worker
44*523fa7a6SAndroid Build Coastguard Worker3. Once we have the model binary (`.pte`) file, then let's run it with ExecuTorch runtime using the `executor_runner`.
45*523fa7a6SAndroid Build Coastguard Worker
46*523fa7a6SAndroid Build Coastguard Worker```bash
47*523fa7a6SAndroid Build Coastguard Worker# Build the tool from the top-level `executorch` directory.
48*523fa7a6SAndroid Build Coastguard Worker(rm -rf cmake-out \
49*523fa7a6SAndroid Build Coastguard Worker    && mkdir cmake-out \
50*523fa7a6SAndroid Build Coastguard Worker    && cd cmake-out \
51*523fa7a6SAndroid Build Coastguard Worker    && cmake -DEXECUTORCH_PAL_DEFAULT=posix ..) \
52*523fa7a6SAndroid Build Coastguard Worker  && cmake --build cmake-out -j32 --target executor_runner
53*523fa7a6SAndroid Build Coastguard Worker
54*523fa7a6SAndroid Build Coastguard Worker# Run the tool on the generated model.
55*523fa7a6SAndroid Build Coastguard Worker./cmake-out/executor_runner --model_path mv2.pte
56*523fa7a6SAndroid Build Coastguard Worker```
57*523fa7a6SAndroid Build Coastguard Worker
58*523fa7a6SAndroid Build Coastguard WorkerThis will run the model with all input tensor elements set to `1`, and print
59*523fa7a6SAndroid Build Coastguard Workerthe outputs. For example:
60*523fa7a6SAndroid Build Coastguard Worker```
61*523fa7a6SAndroid Build Coastguard WorkerI 00:00:00.004885 executorch:executor_runner.cpp:73] Model file mv2.pte is loaded.
62*523fa7a6SAndroid Build Coastguard WorkerI 00:00:00.004902 executorch:executor_runner.cpp:82] Using method forward
63*523fa7a6SAndroid Build Coastguard WorkerI 00:00:00.004906 executorch:executor_runner.cpp:129] Setting up planned buffer 0, size 18652672.
64*523fa7a6SAndroid Build Coastguard WorkerI 00:00:00.007243 executorch:executor_runner.cpp:152] Method loaded.
65*523fa7a6SAndroid Build Coastguard WorkerI 00:00:00.007490 executorch:executor_runner.cpp:162] Inputs prepared.
66*523fa7a6SAndroid Build Coastguard WorkerI 00:00:06.887939 executorch:executor_runner.cpp:171] Model executed successfully.
67*523fa7a6SAndroid Build Coastguard WorkerI 00:00:06.887975 executorch:executor_runner.cpp:175] 1 outputs:
68*523fa7a6SAndroid Build Coastguard WorkerOutput 0: tensor(sizes=[1, 1000], [
69*523fa7a6SAndroid Build Coastguard Worker  -0.50986, 0.300638, 0.0953877, 0.147722, 0.231202, 0.338555, 0.20689, -0.057578, -0.389269, -0.060687,
70*523fa7a6SAndroid Build Coastguard Worker  -0.0213992, -0.121035, -0.288955, 0.134054, -0.171976, -0.0603627, 0.0203591, -0.0585333, 0.337855, -0.0718644,
71*523fa7a6SAndroid Build Coastguard Worker  0.490758, 0.524144, 0.197857, 0.122066, -0.35913, 0.109461, 0.347747, 0.478515, 0.226558, 0.0363523,
72*523fa7a6SAndroid Build Coastguard Worker  ...,
73*523fa7a6SAndroid Build Coastguard Worker  -0.227163, 0.567008, 0.202894, 0.71008, 0.421649, -0.00655106, 0.0114818, 0.398908, 0.0349851, -0.163213,
74*523fa7a6SAndroid Build Coastguard Worker  0.187843, -0.154387, -0.22716, 0.150879, 0.265103, 0.087489, -0.188225, 0.0213046, -0.0293779, -0.27963,
75*523fa7a6SAndroid Build Coastguard Worker  0.421221, 0.10045, -0.506771, -0.115818, -0.693015, -0.183256, 0.154783, -0.410679, 0.0119293, 0.449714,
76*523fa7a6SAndroid Build Coastguard Worker])
77*523fa7a6SAndroid Build Coastguard Worker```
78*523fa7a6SAndroid Build Coastguard Worker
79*523fa7a6SAndroid Build Coastguard Worker## Custom Operator Registration
80*523fa7a6SAndroid Build Coastguard Worker
81*523fa7a6SAndroid Build Coastguard WorkerExplore the demos in the [`custom_ops/`](./custom_ops) directory to learn how to register custom operators into ExecuTorch as well as register its kernels into ExecuTorch runtime.
82