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