Apache TVM is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.

导语

TVM 是 acmer 陈天奇的作品,是一种用于CPU,GPU和专用加速器的开放式深度学习编译器堆栈。 它旨在缩小以生产力为中心的深度学习框架与以性能或效率为导向的硬件后端之间的差距。

在我自己的实际测试中,pytorch模型在x86平台优化后效率提升了10倍之多,而在arm平台——树莓派3B同时加载pytorch和tvm模型时,效率提升18.79倍。

由于TVM仍然处于快速开发阶段,国内相关资料不全,官方Docs在实际使用的时候存在一定的问题,所以用这篇博文记录。

这篇文章基于官方的文档,详细记录如何在X86平台启用ARM的交叉编译、并启用 Relay Arm ® Compute Library Integration

安装

从 github 克隆源存储库。使用选项一起克隆子模块非常重要。<span class="pre">--recursive</span>

git clone --recursive https://github.com/apache/incubator-tvm tvm

对于使用图形化 github 工具的用户,可以打开 git shell,并键入以下命令。

git submodule init
git submodule update

生成共享库

我们的目标是构建共享库:

  • 在 Linux 上,目标库libtvm.so
  • 在 macos 上, 目标库是libtvm.dylib
  • 在 Windows 上, 目标库是libtvm.dll
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev

最低编译要求是

  • 支持 14(g+-5 C++ 或更高)的最近 c++ 编译器
  • CMake 3.5 或更高版本
  • 我们强烈建议使用 LLVM 进行构建,以启用所有功能。
  • 如果要使用 CUDA,需要 CUDA 工具包版本 >= 8.0。如果要从旧版本升级,请确保清除旧版本并在安装后重新启动。
  • 在 macOS 上,您可能希望安装Homebrew以便轻松安装和管理依赖关系。

我们使用 cmake 来构建库。TVM的配置可以通过配置.cmake进行修改。

  • 首先,检查系统中的 cmake。如果您没有 cmake,可以从官方网站获取最新版本
  • 首先创建生成目录,将 复制到目录。<span class="pre">cmake/config.cmake</span>

    mkdir build
    cp cmake/config.cmake build
    
  • 编辑以自定义编译选项<span class="pre">build/config.cmake</span>

    • 在 macOS 上,对于某些版本的 Xcode,您需要在 LDFLAGS 中添加,否则可能会出现链接错误。<span class="pre">-lc++abi</span>
    • 更改为启用 CUDA 后端。对要构建的其他后端和库(OpenCL、RCOM、METAL、VulKAN、...)也做同样的处理。<span class="pre">set(USE_CUDA</span><span> </span><span class="pre">OFF)</span>`set(USE_CUDA ON)`
    • 为了帮助调试,请确保使用 和<span class="pre">set(USE_GRAPH_RUNTIME</span><span> </span><span class="pre">ON)</span>`set(USE_GRAPH_RUNTIME_DEBUG ON)`
  • 安装 Relay Arm ® Compute Library Integration

    • 进入 docker/install, 以root身份运行:
    • 如果是嵌入式设备,需要先修改 ubuntu_install_arm_compute_lib.sh
    • vim ubuntu_install_arm_compute_lib.sh +71
      ## 将编译线程调整为 -j1 或 -j2
    • chmod u+x *.sh
      sudo sh ubuntu_install_arm_compute_lib.sh

    *

    • TVM 可选取决于 LLVM。需要 LLVM 的 CPU 代码根需要 LLVM。

      • 使用 LLVM 构建需要 LLVM 4.0 或更高版本。请注意,默认 apt 的 LLVM 版本可能低于 4.0。
      • 由于 LLVM 需要很长时间才能从源构建,因此可以从 LLVM 下载页面下载预构建版本的 LLVM。

        • 解压缩到特定位置,修改添加build/config.cmake`set(USE_LLVM):path/to/your/llvm/bin/llvm-config)`
        • 您也可以直接设置和让 cmake 搜索一个可用版本的 LLVM。`set(USE_LLVM class="pre">ON)
      • 您也可以使用LLVM 夜间 Ubuntu 构建

        • 请注意,apt-包附加有版本号。例如,设置安装 4.0 包llvm-config</span>>set(LLVM_CONFIG llvm-config-4.0)`
    • 对于X86设备 我们还需要修改build/config.cmake

      • set(USE_ARM_COMPUTE_LIB ON)
    • 对于ARM设备 我们还需要修改build/config.cmake

      • set(USE_ARM_COMPUTE_LIB_GRAPH_RUNTIME ON)
        ## 可能要修改为安装的位置 一般在 /opt/ 下可以看到
  • 然后,我们可以构建 tvm 和相关库。

x86设备

cd build
cmake ..
make -j4
  • 您也可以使用ninja生成系统,而不是 Unix Makefile。与使用 Makefile 时,构建速度可能更快。
cd build
cmake .. -G Ninja
ninja

ARM设备

cd build
cmake ..
make runtime -j4

Python 包安装

TVM

根据您的开发环境,您可能需要使用虚拟环境和包管理器(如 或)来管理 python 包和依赖项。virtualenv conda

安装和维护 python 开发环境。

python 包位于tvm/python有两种方法可以安装该包:

对于可能更改代码的开发人员,建议使用此方法。

设置环境变量PYTHONPATH以告诉 python 在哪里可以找到库。例如,假设我们在主目录上克隆了 tvm =。然后我们可以在/.bashrc 中添加以下行。提取代码并重建项目后,将立即反映更改(无需再次调用)`setup

export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}

完成

现在可以运行以下命令测试一下了!

python3
import tvm
Last modification:September 29th, 2020 at 08:01 pm
If you think my article is useful to you, please feel free to appreciate