blob: f28883446fd5064cabb2b5ac90ff2895aa7fde2a [file] [log] [blame]
.. 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.
.. _deploy-and-integration:
Deploy Models and Integrate TVM
===============================
This page contains guidelines on how to deploy TVM to various platforms
as well as how to integrate it with your project.
.. image:: https://tvm.apache.org/images/release/tvm_flexible.png
Build the TVM runtime library
-----------------------------
.. _build-tvm-runtime-on-target-device:
Unlike traditional deep learning frameworks. TVM stack is divided into two major components:
- TVM compiler, which does all the compilation and optimizations of the model
- TVM runtime, which runs on the target devices.
In order to integrate the compiled module, we **do not** need to build entire
TVM on the target device. You only need to build the TVM compiler stack on your
desktop and use that to cross-compile modules that are deployed on the target device.
We only need to use a light-weight runtime API that can be integrated into various platforms.
For example, you can run the following commands to build the runtime API
on a Linux based embedded system such as Raspberry Pi:
.. code:: bash
git clone --recursive https://github.com/apache/tvm tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
cmake ..
make runtime
Note that we type ``make runtime`` to only build the runtime library.
It is also possible to cross compile the runtime. Cross compiling
the runtime library should not be confused with cross compiling models
for embedded devices.
If you want to include additional runtime such as OpenCL,
you can modify ``config.cmake`` to enable these options.
After you get the TVM runtime library, you can link the compiled library
.. figure:: https://raw.githubusercontent.com/tlc-pack/web-data/main/images/dev/tvm_deploy_crosscompile.svg
:align: center
:width: 85%
A model (optimized or not by TVM) can be cross compiled by TVM for
different architectures such as ``aarch64`` on a ``x64_64`` host. Once the model
is cross compiled it is necessary to have a runtime compatible with the target
architecture to be able to run the cross compiled model.
Cross compile the TVM runtime for other architectures
-----------------------------------------------------
In the example :ref:`above <build-tvm-runtime-on-target-device>` the runtime library was
compiled on a Raspberry Pi. Producing the runtime library can be done much faster on
hosts that have high performace processors with ample resources (such as laptops, workstation)
compared to a target devices such as a Raspberry Pi. In-order to cross compile the runtime the toolchain
for the target device must be installed. After installing the correct toolchain,
the main difference compared to compiling natively is to pass some additional command
line argument to cmake that specify a toolchain to be used. For reference
building the TVM runtime library on a modern laptop (using 8 threads) for ``aarch64``
takes around 20 seconds vs ~10 min to build the runtime on a Raspberry Pi 4.
cross-compile for aarch64
"""""""""""""""""""""""""
.. code-block:: bash
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
.. code-block:: bash
cmake .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++ \
-DCMAKE_FIND_ROOT_PATH=/usr/aarch64-linux-gnu \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DMACHINE_NAME=aarch64-linux-gnu
make -j$(nproc) runtime
For bare metal ARM devices the following toolchain is quite handy to install instead of gcc-aarch64-linux-*
.. code-block:: bash
sudo apt-get install gcc-multilib-arm-linux-gnueabihf g++-multilib-arm-linux-gnueabihf
cross-compile for RISC-V
"""""""""""""""""""""""""
.. code-block:: bash
sudo apt-get update
sudo apt-get install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
.. code-block:: bash
cmake .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++ \
-DCMAKE_FIND_ROOT_PATH=/usr/riscv64-linux-gnu \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DMACHINE_NAME=riscv64-linux-gnu
make -j$(nproc) runtime
The ``file`` command can be used to query the architecture of the produced runtime.
.. code-block:: bash
file libtvm_runtime.so
libtvm_runtime.so: ELF 64-bit LSB shared object, UCB RISC-V, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=e9ak845b3d7f2c126dab53632aea8e012d89477e, not stripped
Optimize and tune models for target devices
-------------------------------------------
The easiest and recommended way to test, tune and benchmark TVM kernels on
embedded devices is through TVM's RPC API.
Here are the links to the related tutorials.
- :ref:`tutorial-cross-compilation-and-rpc`
- :ref:`tutorial-deploy-model-on-rasp`
Deploy optimized model on target devices
----------------------------------------
After you finished tuning and benchmarking, you might need to deploy the model on the
target device without relying on RPC. See the following resources on how to do so.
.. toctree::
:maxdepth: 2
cpp_deploy
android
integrate
hls
arm_compute_lib
tensorrt
vitis_ai
bnns
Additional Deployment How-Tos
-----------------------------
We have also developed a number of how-tos targeting specific devices, with
working Python code that can be viewed in a Jupyter notebook. These how-tos
describe how to prepare and deploy models to many of the supported backends.
.. toctree::
:maxdepth: 1
../deploy_models/index