Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
140 changes: 120 additions & 20 deletions tests/python/contrib/test_hexagon/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,123 @@
<!--- specific language governing permissions and limitations -->
<!--- under the License. -->

Documents manual TE schedule to illustrate Hexagon operator slicing.

High Level Notes:
* Using float32 (for now) so that tests will pass on CPU
* Using global storage scope (for now) which means "cache" reads and writes from global, to global
* TIR is pending changes from the work-in-progress layout RFC
(https://github.com/apache/tvm-rfcs/pull/39)
* TIR has been hand-edited for context and clarity
* Added C-style comments
* Changed variable names
* Added spacing and line breaks
* Naming conventions
* Using input (instead of activation)
* Using filter (instead of weight, kernel)
* Using `k` to denote channel-out and `c` or `rc` (reduction channel) to denote channel-in
* Using `rh` and `rw` (reduction height / width) to denote filter height and width

[Conv2d](test_conv2d_blocked.md)

[Conv2d -> Conv2d](test_conv2d_conv2d.md)
# Test TVM on Hexagon
This document explains various pieces that are involved in testing TVM on an Android device which includes Hexagon DSP or Hexagon simulator.

## What is HexagonLauncherRPC?
HexagonLauncherRPC is a class to handle interactions with an Android phone which includes Hexagon DSP or Hexagon simulator to run a TVMModule(function/operation/graph) on Hexagon. HexagonLauncherRPC reuses [minRPC](https://github.com/apache/tvm/tree/main/src/runtime/minrpc) implementation to set up an RPC connection from host (your local machine) to Hexagon target, and it is passed through Android RPC server.

## Build Required Tools/Libraries
To build TVM for Hexagon and run tests you need to run multiple steps which includes preparing required tools, setup environment variables and build various versions of TVM. Alternatively, you can skip these instructions and use docker image which has pre-installed required tools. We highly recommend to use docker, specially if this is your first time working with Hexagon. For instructions on using docker image follow ["use hexagon docker image"](#use-hexagon-docker-image).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a few nits:

  • specially -> especially
  • "setting up environment variables and building various ..."

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done.


- Build TVMRuntime library and C++ RPC server for Android.
- Build minRPC server along with FastRPC for Hexagon.
- Build TVM library with Hexagon support for host machine.
- Build TVMRuntime library and RPC server for host machine.

First, ensure to export Clang libraries to `LD_LIBRARY_PATH` and Hexagon toolchain to `HEXAGON_TOOLCHAIN`:
```bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"path to `llvm-clang/lib` sub-directory"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are there any requirements on version? Might document below.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added.


export HEXAGON_TOOLCHAIN="Path to Hexagon toolchain. It can be the Hexagon toolchain included in the SDK, for example `HEXAGON_SDK_PATH/tools/HEXAGON_Tools/x.y.z/Tools`. The `x.y.z` in the path is the toolchain version number, which is specific to the version of the SDK."
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might discuss how / where to download the SDK below.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added a link

```

First build Hexagon API application under `apps/hexagon_api`. This step will generate `tvm_rpc_android` and `libtvm_runtime.so` to run on Android. Also, it generates `libtvm_runtime.a` `libtvm_runtime.so`, `libhexagon_rpc_skel.so` and `libhexagon_rpc_sim.so` to run on Hexagon device or Hexagon simulator.

**Note:** To get the most updated instructions, please take a look at [task_build_hexagon_api.sh](https://github.com/apache/tvm/blob/main/tests/scripts/task_build_hexagon_api.sh).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This link is broken in the markdown preview. Probably just because this is not merged, but mentioning just in case.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if you mean task_build_hexagon_api.sh, it should work


```bash
cd apps/hexagon_api
mkdir build
cd build
cmake -DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-28 \
-DUSE_ANDROID_TOOLCHAIN="path to `android-ndk/build/cmake/android.toolchain.cmake` file" \
-DUSE_HEXAGON_ARCH=v65|v66|v68|v69 \
-DUSE_HEXAGON_SDK="path to Hexagon SDK" \
-DUSE_HEXAGON_TOOLCHAIN="path to Hexagon toolchain `Tools` sub-directory which explained above" \
-DUSE_OUTPUT_BINARY_DIR="path to `build/hexagon_api_output` which is a sub-directory of `tvm`" ..

make -j2
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like it would be better just to refer folks to the shell script to avoid having to update in two places.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think shell script is readable enough?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it's readable. What I am suggesting is that we remove the inline bash script from the readme and simply link to task_build_hexagon_api.sh. This way we don't have to encode and update the same thing twice: once in the readme and again in the script.


Next, we need to build TVM on host with RPC and Hexagon dependencies. To do that follow these commands.

**Note:** To get the most recent configs for this step, please take a look at [task_config_build_hexagon.sh](https://github.com/apache/tvm/blob/main/tests/scripts/task_config_build_hexagon.sh).

```bash
cd tvm
mkdir build
cd build
cmake -DUSE_LLVM="path to `llvm/bin/llvm-config`" \
-DUSE_RPC=ON \
-DCMAKE_CXX_COMPILER="path to `clang++` executable" \
-DUSE_HEXAGON_SDK="path to Hexagon SDK" \
-DUSE_HEXAGON=ON ..

make -j2
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as above.


## Use Hexagon Docker Image
To use hexagon docker image, install TVM and Hexagon API follow these steps.

```bash
# Log in to docker image
cd tvm
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of cd tvm I would say (outside of the script section) that this works "from your TVM home dir"

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

./docker/bash.sh ci_hexagon

# Build TVM
./tests/scripts/task_config_build_hexagon.sh
Copy link
Contributor

@adstraw adstraw May 12, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this read

rm -rf build
./tests/scripts/task_config_build_hexagon.sh build

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added

cd build
cmake ..
make -j2

# Build Hexagon API
cd ..
./tests/scripts/task_build_hexagon_api.sh
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to put this in a checked in shell script as well. And... would be great if the script took the -j argument from the command line.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, let's add that in a separate PR


Now that you have built required tools, you can jump to [run test examples](#run-tests).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also broken

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should work too, it works for me


## Run Tests
You have the options of running Hexagon test on real hardware or on Hexagon simulator. Also, depending on whether you decided to use Hexagon docker image or not we will explain both cases here.

**Note: You can always find updated instructions based on this [script](https://github.com/apache/tvm/blob/main/tests/scripts/task_python_hexagon.sh).**

### Only follow these steps if running tests outside of docker
```bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"path to `llvm-clang/lib` sub-directory"

export HEXAGON_TOOLCHAIN="Path to Hexagon toolchain. It can be the Hexagon toolchain included in the HexagonSDK, for example `HEXAGON_SDK_PATH/tools/HEXAGON_Tools/x.y.z/Tools`. The `x.y.z` in the path is the toolchain version number, which is specific to the version of the SDK."

export PYTHONPATH=$PYTHONPATH:"path to `tvm/python`"
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Repeat from above? Necessary?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is because we also need these at runtime


### Now, follow these steps
**Note:** If you are using Hexagon docker image, first step is to log into the Hexagon docker image. Following these commands you will log in to the most recent version of Hexagon docker image on your TVM local branch.

```bash
cd tvm
./docker/bash.sh ci_hexagon
```

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Docker Noob question: No need to rebuild at this point right? Might be worth mentioning that here.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added

Now, you need to export few environment variables and execute following commands:

```bash
# Run RPC Tracker in the background
export TVM_TRACKER_HOST="0.0.0.0"
export TVM_TRACKER_PORT=9192
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it safe to hard code 9192?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed it

python -m tvm.exec.rpc_tracker --host $TVM_TRACKER_HOST --port $TVM_TRACKER_PORT&

# Only For real hardware testing
export ANDROID_SERIAL_NUMBER="You can get this number by running 'adb devices' command"

# Only For simulator testing
export HEXAGON_SHARED_LINK_FLAGS="-Lbuild/hexagon_api_output -lhexagon_rpc_sim"
export ANDROID_SERIAL_NUMBER="simulator"
```

Finally, to run a Hexagon Launcher tests you can run:
```bash
pytest tests/python/contrib/test_hexagon/test_launcher.py
```
37 changes: 37 additions & 0 deletions tests/python/contrib/test_hexagon/conv2d/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<!--- Licensed to the Apache Software Foundation (ASF) under one -->
<!--- or more contributor license agreements. See the NOTICE file -->
<!--- distributed with this work for additional information -->
<!--- regarding copyright ownership. The ASF licenses this file -->
<!--- to you under the Apache License, Version 2.0 (the -->
<!--- "License"); you may not use this file except in compliance -->
<!--- with the License. You may obtain a copy of the License at -->

<!--- http://www.apache.org/licenses/LICENSE-2.0 -->

<!--- Unless required by applicable law or agreed to in writing, -->
<!--- software distributed under the License is distributed on an -->
<!--- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -->
<!--- KIND, either express or implied. See the License for the -->
<!--- specific language governing permissions and limitations -->
<!--- under the License. -->

Documents manual TE schedule to illustrate Hexagon operator slicing.

High Level Notes:
* Using float32 (for now) so that tests will pass on CPU
* Using global storage scope (for now) which means "cache" reads and writes from global, to global
* TIR is pending changes from the work-in-progress layout RFC
(https://github.com/apache/tvm-rfcs/pull/39)
* TIR has been hand-edited for context and clarity
* Added C-style comments
* Changed variable names
* Added spacing and line breaks
* Naming conventions
* Using input (instead of activation)
* Using filter (instead of weight, kernel)
* Using `k` to denote channel-out and `c` or `rc` (reduction channel) to denote channel-in
* Using `rh` and `rw` (reduction height / width) to denote filter height and width

[Conv2d](test_conv2d_blocked.md)

[Conv2d -> Conv2d](test_conv2d_conv2d.md)
138 changes: 0 additions & 138 deletions tests/python/contrib/test_hexagon/test_launcher.md

This file was deleted.