xref: /aosp_15_r20/external/executorch/backends/qualcomm/README.md (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker# Qualcomm AI Engine Direct Backend
2*523fa7a6SAndroid Build Coastguard Worker
3*523fa7a6SAndroid Build Coastguard WorkerDisclaimer: At present, we do not offer any backward compatibility guarantees
4*523fa7a6SAndroid Build Coastguard Workerfor any APIs. We are currently in a development phase, and as such,
5*523fa7a6SAndroid Build Coastguard Workerwe reserve the right to modify interfaces and implementations.
6*523fa7a6SAndroid Build Coastguard Worker
7*523fa7a6SAndroid Build Coastguard WorkerThis backend is implemented on the top of
8*523fa7a6SAndroid Build Coastguard Worker[Qualcomm AI Engine Direct SDK](https://developer.qualcomm.com/software/qualcomm-ai-engine-direct-sdk).
9*523fa7a6SAndroid Build Coastguard WorkerPlease follow [tutorial](../../docs/source/build-run-qualcomm-ai-engine-direct-backend.md) to setup environment, build, and run executorch models by this backend (Qualcomm AI Engine Direct is also referred to as QNN in the source and documentation).
10*523fa7a6SAndroid Build Coastguard Worker
11*523fa7a6SAndroid Build Coastguard WorkerA website version of the tutorial is [here](https://pytorch.org/executorch/stable/build-run-qualcomm-ai-engine-direct-backend.html).
12*523fa7a6SAndroid Build Coastguard Worker
13*523fa7a6SAndroid Build Coastguard Worker## Delegate Options
14*523fa7a6SAndroid Build Coastguard Worker
15*523fa7a6SAndroid Build Coastguard WorkerPlease check `generate_qnn_executorch_compiler_spec()` in
16*523fa7a6SAndroid Build Coastguard Worker[utils.py](./utils/utils.py) for supported SoC and inference type.
17*523fa7a6SAndroid Build Coastguard Worker
18*523fa7a6SAndroid Build Coastguard Worker### Supported Chipset
19*523fa7a6SAndroid Build Coastguard Worker- Snapdragon 8 Gen 1
20*523fa7a6SAndroid Build Coastguard Worker- Snapdragon 8 Gen 1+
21*523fa7a6SAndroid Build Coastguard Worker- Snapdragon 8 Gen 2
22*523fa7a6SAndroid Build Coastguard Worker- Snapdragon 8 Gen 3
23*523fa7a6SAndroid Build Coastguard Worker
24*523fa7a6SAndroid Build Coastguard Worker### Adding more supported Chipset
25*523fa7a6SAndroid Build Coastguard WorkerCurrently, users cannot add additional chipset models because the chipset ID is not accessible to community users. If you have specific chipset models you wish to add, please contact one of the authors in the `Code Reviews` section at the bottom of this page.
26*523fa7a6SAndroid Build Coastguard Worker
27*523fa7a6SAndroid Build Coastguard Worker### Supported Inference Type
28*523fa7a6SAndroid Build Coastguard Worker- Quantized
29*523fa7a6SAndroid Build Coastguard Worker- FP16
30*523fa7a6SAndroid Build Coastguard Worker
31*523fa7a6SAndroid Build Coastguard Worker## Directory Structure
32*523fa7a6SAndroid Build Coastguard Worker
33*523fa7a6SAndroid Build Coastguard Worker```
34*523fa7a6SAndroid Build Coastguard Workerbackends/qualcomm
35*523fa7a6SAndroid Build Coastguard Worker├── aot # Codes for generating QNN context binary (AoT Part).
36*523fa7a6SAndroid Build Coastguard Worker|   ├── wrappers # Wrapper of QNN data structures for ease of use.
37*523fa7a6SAndroid Build Coastguard Worker|   └── python # Python interface for using QNN libraries.
38*523fa7a6SAndroid Build Coastguard Worker├── builders # Codes for lowering each operators (AoT Part).
39*523fa7a6SAndroid Build Coastguard Worker├── partition # QNN Partitioner (AoT Part).
40*523fa7a6SAndroid Build Coastguard Worker├── _passes # Various private passes helping lower models to QNN backend (AoT Part).
41*523fa7a6SAndroid Build Coastguard Worker├── python # Places to put pybind artifacts for accessing QNN APIs, structures, etc (AoT Part).
42*523fa7a6SAndroid Build Coastguard Worker├── quantizer # QNN Quantizer
43*523fa7a6SAndroid Build Coastguard Worker├── runtime # Here is QNN runtime responsbile for compiling a model on x64.
44*523fa7a6SAndroid Build Coastguard Worker|   |       # Meanwhile, this is also the runtime responsbile for executing compiled
45*523fa7a6SAndroid Build Coastguard Worker|   |       # models on a device.
46*523fa7a6SAndroid Build Coastguard Worker|   └── backends # Backends supported by QNN.
47*523fa7a6SAndroid Build Coastguard Worker|       └── htpbackend
48*523fa7a6SAndroid Build Coastguard Worker|           ├── aarch64 # Configuration required to run on device. (Device Part).
49*523fa7a6SAndroid Build Coastguard Worker|           └── x86_64 # Configuration required to compile graph on host. (AoT Part).
50*523fa7a6SAndroid Build Coastguard Worker├── scripts # Misc supporting scripts, not related to core functionality.
51*523fa7a6SAndroid Build Coastguard Worker├── serialization # Contains files related to serializing QNN compiler options and SoC information
52*523fa7a6SAndroid Build Coastguard Worker├── tests # Unit tests and model tests go here.
53*523fa7a6SAndroid Build Coastguard Worker└── utils # Miscellaneous utilities.
54*523fa7a6SAndroid Build Coastguard Worker
55*523fa7a6SAndroid Build Coastguard Workerexamples/qualcomm
56*523fa7a6SAndroid Build Coastguard Worker├── executor_runner # A general runner that is capable of running most of the basic models.
57*523fa7a6SAndroid Build Coastguard Worker├── oss_scripts # Scripts for OSS(Open Source Software) models and customized runner for some specific models.
58*523fa7a6SAndroid Build Coastguard Worker├── qaihub_scripts # Scripts for Qaihub models and corresponding customized runner for these models.
59*523fa7a6SAndroid Build Coastguard Worker└── scripts # Scripts for models provided by executorch.
60*523fa7a6SAndroid Build Coastguard Worker```
61*523fa7a6SAndroid Build Coastguard Worker
62*523fa7a6SAndroid Build Coastguard Worker## Examples
63*523fa7a6SAndroid Build Coastguard Worker
64*523fa7a6SAndroid Build Coastguard WorkerPlease see this [README.md](../../examples/qualcomm/README.md).
65*523fa7a6SAndroid Build Coastguard Worker
66*523fa7a6SAndroid Build Coastguard WorkerFurther, an example build script is provided as [build.sh](scripts/build.sh).
67*523fa7a6SAndroid Build Coastguard Worker
68*523fa7a6SAndroid Build Coastguard Worker## Issues
69*523fa7a6SAndroid Build Coastguard WorkerIf you want to address the problem encountered, it would be great to have reproduction information for indicating maintainers. Please also follow the [policy](../../CONTRIBUTING.md#issues) to emit issues.
70*523fa7a6SAndroid Build Coastguard Worker
71*523fa7a6SAndroid Build Coastguard Worker## Pull Requests
72*523fa7a6SAndroid Build Coastguard WorkerPRs are always welcome to help improve the codebase in a comprehensive manner. Before submitting changes, please apply:
73*523fa7a6SAndroid Build Coastguard Worker
74*523fa7a6SAndroid Build Coastguard Worker- **Check the Coding Style**:<br/>
75*523fa7a6SAndroid Build Coastguard Worker    Make sure your code follows the [style guides](../../CONTRIBUTING.md#coding-style) and passes the [lint checks](../../CONTRIBUTING.md#lintrunner).
76*523fa7a6SAndroid Build Coastguard Worker
77*523fa7a6SAndroid Build Coastguard Worker- **Add Unit Tests**:<br/>
78*523fa7a6SAndroid Build Coastguard Worker    Following is an example of adding test case after [creating new operator builder](builders/README.md), please navigate to `backends/qualcomm/tests` folder and put minimum example module in `model.py`. e.g.:
79*523fa7a6SAndroid Build Coastguard Worker    ```python
80*523fa7a6SAndroid Build Coastguard Worker    class IndexPut(torch.nn.Module):
81*523fa7a6SAndroid Build Coastguard Worker        ...
82*523fa7a6SAndroid Build Coastguard Worker
83*523fa7a6SAndroid Build Coastguard Worker    # please insert implementation in alphabetical order
84*523fa7a6SAndroid Build Coastguard Worker    class LayerNorm(torch.nn.Module):
85*523fa7a6SAndroid Build Coastguard Worker        def __init__(self):
86*523fa7a6SAndroid Build Coastguard Worker            super().__init__()
87*523fa7a6SAndroid Build Coastguard Worker            self.layer_norm = torch.nn.LayerNorm([768], eps=1e-6)
88*523fa7a6SAndroid Build Coastguard Worker
89*523fa7a6SAndroid Build Coastguard Worker        def forward(self, x):
90*523fa7a6SAndroid Build Coastguard Worker            return self.layer_norm(x)
91*523fa7a6SAndroid Build Coastguard Worker
92*523fa7a6SAndroid Build Coastguard Worker
93*523fa7a6SAndroid Build Coastguard Worker    class LeakyReLUDefault(torch.nn.Module):
94*523fa7a6SAndroid Build Coastguard Worker        ...
95*523fa7a6SAndroid Build Coastguard Worker    ```
96*523fa7a6SAndroid Build Coastguard Worker    Also extend sections `TestQNNFloatingPointOperator`, `TestQNNQuantizedOperator` in `test_qnn_delegate.py`. e.g.:
97*523fa7a6SAndroid Build Coastguard Worker    ```python
98*523fa7a6SAndroid Build Coastguard Worker    class TestQNNQuantizedOperator(TestQNN):
99*523fa7a6SAndroid Build Coastguard Worker        def test_qnn_backend_interpolate_nearest_2d(self):
100*523fa7a6SAndroid Build Coastguard Worker            ...
101*523fa7a6SAndroid Build Coastguard Worker
102*523fa7a6SAndroid Build Coastguard Worker        # please insert it implementation alphabetical order
103*523fa7a6SAndroid Build Coastguard Worker        def test_qnn_backend_layer_norm(self):
104*523fa7a6SAndroid Build Coastguard Worker            module = LayerNorm()  # noqa: F405
105*523fa7a6SAndroid Build Coastguard Worker            sample_input = (torch.randn(196, 768),)
106*523fa7a6SAndroid Build Coastguard Worker            module = self.get_qdq_module(module, sample_input)
107*523fa7a6SAndroid Build Coastguard Worker            self.lower_module_and_test_output(module, sample_input)
108*523fa7a6SAndroid Build Coastguard Worker
109*523fa7a6SAndroid Build Coastguard Worker        def test_qnn_backend_leaky_relu(self):
110*523fa7a6SAndroid Build Coastguard Worker            ...
111*523fa7a6SAndroid Build Coastguard Worker    ```
112*523fa7a6SAndroid Build Coastguard Worker
113*523fa7a6SAndroid Build Coastguard Worker- **Verify Unit Test Results**:<br/>
114*523fa7a6SAndroid Build Coastguard Worker    ```bash
115*523fa7a6SAndroid Build Coastguard Worker    cd $PATH_TO_EXECUTORCH
116*523fa7a6SAndroid Build Coastguard Worker    # example usage of performing unit test
117*523fa7a6SAndroid Build Coastguard Worker    python backends/qualcomm/tests/test_qnn_delegate.py -k TestQNNQuantizedOperator.test_qnn_backend_layer_norm -s $DEVICE_SERIAL -m SM8650 -b build-android/ -a $PATH_TO_TEST_ARTIFACTS
118*523fa7a6SAndroid Build Coastguard Worker    ```
119*523fa7a6SAndroid Build Coastguard Worker    The test graph is expected to have 1 delegated node with only placeholders / output nodes being left. Check the execution report for more information.
120*523fa7a6SAndroid Build Coastguard Worker
121*523fa7a6SAndroid Build Coastguard Worker- **Code Reviews**:<br/>
122*523fa7a6SAndroid Build Coastguard Worker    Please ping authors in Qualcomm AI Engine Direct related PRs for reviewing, possible candidates are listed below:
123*523fa7a6SAndroid Build Coastguard Worker    - [chiwwang](https://github.com/chiwwang)
124*523fa7a6SAndroid Build Coastguard Worker    - [shewu-quic](https://github.com/shewu-quic)
125*523fa7a6SAndroid Build Coastguard Worker    - [chunit-quic](https://github.com/chunit-quic)
126*523fa7a6SAndroid Build Coastguard Worker    - [winskuo-quic](https://github.com/winskuo-quic)
127*523fa7a6SAndroid Build Coastguard Worker    - [chuntl](https://github.com/chuntl)
128*523fa7a6SAndroid Build Coastguard Worker    - [haowhsu-quic](https://github.com/haowhsu-quic)
129*523fa7a6SAndroid Build Coastguard Worker
130*523fa7a6SAndroid Build Coastguard WorkerThanks again for your contribution!
131