内容一览:TVM 共有三种装置办法:从源码装置、运用 Docker 镜像装置和 NNPACK Contrib 装置。本文重点介绍怎么经过源码装置 TVM。

关键词:TVM 快速上手 源码装置

在之前的文章《TVM 中文站正式上线!最全机器学习模型布置「参考书」它来了》中,咱们全体介绍了 TVM 的重要作用,以及怎么凭借 TVM 中文文档,敞开机器学习编译器的探究之路。

接下来,咱们将以系列教程的形式, 具体解说 TVM 从入门到通晓的学习途径,期望每位开发者都能成为优秀的机器学习编译工程师!

本篇文章中,咱们将介绍「打地基」的关键过程–装置 TVM。

TVM 的装置可经过 3 种途径实现:

  1. 从源码装置
  2. Docker 镜像
  3. NNPACK Contrib 装置

作为装置 TVM 教程的 (Part 1),本文将具体解说从源码装置的最佳实践, 并进行最大极限地灵活装备和编译。

逐步解说怎么从源码装置 TVM

在各种体系中从 0 到 1 构建和装置 TVM 软件包包含两个过程:

  1. 从 C++ 代码中构建同享库
  • Linux:libtvm.so
  • macOS :libtvm.dylib
  • Windows:libtvm.dll

2.为编程语言包进行设置(如 Python 包)

下载 TVM 源代码,请拜访:tvm.apache.org/download

开发者:从 GitHub 获取源代码

从 GitHub 上克隆源码仓库,请运用 –recursive 选项来克隆子模块。

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

Windows 用户能够打开 Git shell,并输入以下指令:

git submodule init
git submodule update

构建同享库

咱们的方针是构建同享库:

  • 在 Linux 上
    方针库是 libtvm.so 和 libtvm_runtime.so

  • 在 MacOS 上
    方针库是 libtvm.dylib 和 libtvm_runtime.dylib

  • 在 Windows 上
    方针库是 libtvm.dll 和 libtvm_runtime.dll

也能够只构建运转时库:
tvm.hyper.ai/docs/how_to…

TVM 库的最低构建要求是:

  • 支撑 C++17 的最新 C++ 编译器
    GCC 7.1
    Clang 5.0
    Apple Clang 9.3
    Visual Stuio 2019 (v16.7)

  • CMake 3.10 或更高版别

  • 引荐运用 LLVM 构建 TVM 库以启用一切功用。

  • 如需运用 CUDA,请保证 CUDA 工具包的版别至少在 8.0 以上。
    留意:CUDA 旧版别升级后,请删去旧版别并重新启动。

  • macOS 可装置 Homebrew 以方便装置和办理依靠。

  • Python:引荐运用 3.7.X+ 和 3.8.X+ 版别,3.9.X+ 暂时不支撑。

Ubuntu/Debian 等 Linux 操作体系上,要装置这些依靠环境,请在终端执行:

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

用 Homebrew 为搭载 Intel 或 M1 芯片的 macOS 装置所需的依靠,需遵从 Homebrew 指定的装置过程,以保证正确装置和装备这些依靠:

brew install gcc git cmake
brew install llvm
brew install python@3.8

运用 cmake 来构建库

TVM 的装备能够经过编辑 config.cmake 和/或在指令行传递 cmake flags 来修正:

  • 假如没有装置 cmake,可拜访以下官网下载最新版别 cmake.org/download/
  • 创立一个构建目录,将 cmake/config.cmake 复制到该目录
mkdir build
cp cmake/config.cmake build
  • 编辑 build/config.cmake 自定义编译选项

    • 对于 macOS 某些版别的 Xcode,需求在 LDFLAGS 中增加 -lc++abi,避免呈现链接过错

    • set(USE_CUDA OFF) 改为 set(USE_CUDA ON) 以启用 CUDA 后端。对其他你想构建的后端和库(OpenCL,RCOM,METAL,VULKAN……)做相同的处理。

    • 为了便于调试,请保证运用 set(USE_GRAPH_EXECUTOR ON)set(USE_PROFILER ON) 启用嵌入式图形执行器 (embedded graph executor) 和调试功用。

    • 如需用 IR 调试,能够设置 set(USE_RELAY_DEBUG ON),同时设置环境变量 TVM_LOG_DEBUG。

  • TVM 需求 LLVM 用于 CPU 代码生成工具 (Codegen)。引荐运用 LLVM 构建。

    • 运用 LLVM 构建时需求 LLVM 4.0 或更高版别。留意,默许的 apt 中的 LLVM 版别或许低于 4.0。

    • 因为 LLVM 从源码构建需求很长时刻,引荐从 LLVM 下载页面 下载预构建版别。

      1. 解压缩到某个特定方位,修正 build/config.cmake 以增加 set(USE_LLVM /path/to/your/llvm/bin/llvm-config)

      2. 或直接设置 set(USE_LLVM ON),运用 CMake 查找一个可用的 LLVM 版别。

    • 也能够运用 LLVM Ubuntu 每日构建
      留意 apt-package 会在 llvm-config 中附加版别号。例如,假如你装置了 LLVM 10 版别,则设置 set(USE_LLVM llvm-config-10)

    • PyTorch 的用户主张设置 set(USE_LLVM "/path/to/llvm-config --link-static")set(HIDE_PRIVATE_SYMBOLS ON) 以避免 TVM 和 PyTorch 运用的不同版别的 LLVM 之间潜在的符号冲突。

    • 某些支撑平台上,Ccache 编译器 Wrapper 可协助削减 TVM 的构建时刻。在 TVM 构建中启用 CCache 的办法包含:

      1. Ccache 的 Masquerade 形式。通常在 Ccache 装置过程中启用。要让 TVM 在 masquerade 中运用 Ccache,只需在装备 TVM 的构建体系时指定适当的 C/C++ 编译器途径。例如:cmake -DCMAKE_CXX_COMPILER=/usr/lib/ccache/c++ ...
      2. Ccache 作为 CMake 的 C++ 编译器前缀。在装备 TVM 的构建体系时,将 CMake 变量 CMAKE_CXX_COMPILER_LAUNCHER 设置为一个适宜的值。例如:cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ...
  • 构建 TVM 及相关库:

cd build
cmake ..
make -j4

能够运用 Ninja 来加速构建

cd build
cmake .. -G Ninja
ninja

在 TVM 的根目录下也有一个 Makefile,它能够自动完结其中的几个过程: 创立构建目录,将默许的 config.cmake 复制到该构建目录下,运转 cmake,并运转 make。

构建目录能够用环境变量 TVM_BUILD_PATH 来指定。假如 TVM_BUILD_PATH 没有设置,Makefile 就会假定应该运用 TVM 里边的 build 目录。由 TVM_BUILD_PATH 指定的途径能够是绝对途径,也能够是相对于 TVM 根目录的途径。假如 TVM_BUILD_PATH 被设置为一个以空格分隔的途径列表,则将创立一切列出的途径。

假如运用另一个构建目录,那么应该在运转时设置环境变量 TVM_LIBRARY_PATH,它指向编译后的 libtvm.solibtvm_runtime.so 的方位。假如没有设置,TVM 将寻找相对于 TVM Python 模块的方位。与 TVM_BUILD_PATH 不同,这必须是一个绝对途径。

# 在 "build" 目录下构建
make
# 代替方位,"build_debug"
TVM_BUILD_PATH=build_debug make
# 同时构建 "build_release" 和 "build_debug"
TVM_BUILD_PATH="build_debug build_release" make
# 运用调试构建
TVM_LIBRARY_PATH=~/tvm/build_debug python3

假如一切顺利,咱们就能够去检查 Python 包的装置了。

运用 Conda 环境进行构建

Conda 能够用来获取运转 TVM 所需的必要依靠。 假如没有装置 Conda,请参照 Conda 装置指南 来装置 Miniconda 或 Anaconda。在 Conda 环境中运转以下指令:

# 用 yaml 指定的依靠创立 Conda 环境
conda env create --file conda/build-environment.yaml
# 激活所创立的环境
conda activate tvm-build

上述指令将装置一切必要的构建依靠,如 CMake 和 LLVM。 接下来能够运转上一节中的标准构建过程。

在 Conda 环境之外运用已编译的二进制文件,可将 LLVM 设置为静态链接形式 set(USE_LLVM "llvm-config --link-static")。这样一来,生成的库就不会依靠于 Conda 环境中的动态 LLVM 库。

以上内容展现了怎么运用 Conda 供给必要的依靠,从而构建 libtvm。假如现已运用 Conda 作为软件包办理器,并且期望直接将 TVM 作为 Conda 软件包来构建和装置,能够依照以下指导进行:

conda build --output-folder=conda/pkg  conda/recipe
# 在启用 CUDA 的情况下运转 conda/build_cuda.sh 来构建
conda install tvm -c ./conda/pkg

在 Windows 上构建

TVM 支撑经过 MSVC 运用 CMake 构建。 需求有一个 Visual Studio 编译器。VS 的最低版别为 Visual Studio Enterprise 2019

留意:检查针对 GitHub Actions 的完整测验细节,请拜访 Windows 2019 Runner :

github.com/actions/vir…

官方引荐运用 Conda 环境进行构建,以获取必要的依靠及激活的 tvm-build 环境。

运转以下指令行:

mkdir build
cd build
cmake -A x64 -Thost=x64 ..
cd ..

上述指令在构建目录下生成了解决方案文件。接着运转:

cmake --build build --config Release -- /m

构建 ROCm 支撑

现在,ROCm 只在 Linux 上支撑,因此一切教程均以 Linux 为基础编写的。

  • 设置 set(USE_ROCM ON),将 ROCM_PATH 设置为正确的途径。
  • 需求先从 ROCm 中装置 HIP runtime。保证装置体系中现已装置了 ROCm。
  • 装置 LLVM 的最新稳定版别(v6.0.1),以及 LLD,保证 ld.lld 能够经过指令行获取。

Python 包的装置

TVM 包

本部分介绍运用 virtualenv 或 conda 等虚拟环境和软件包办理器,来办理 Python 软件包和依靠的办法。
Python 包坐落 tvm/python。装置办法有两种:

  • 办法 1

本办法适用于有或许修正代码的开发者。

设置环境变量 PYTHONPATH,告知 Python 在哪里能够找到这个库。例如,假定咱们在 /path/to/tvm 目录下克隆了 tvm,咱们能够在 ~/.bashrc 中增加以下代码:这使得拉取代码及重建项目时,无需再次调用 setup,这些改变就会当即反映出来。

export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}
  • 办法 2

经过 setup.py 装置 TVM 的 Python 绑定:

# 为当时用户装置 TVM 软件包
# 留意:假如你经过 homebrew 装置了 Python,那么在装置过程中就不需求 --user
#        它将被自动装置到你的用户目录下。
#        在这种情况下,供给 --user 标志或许会在装置时引发过错。
export MACOSX_DEPLOYMENT_TARGET=10.9  # 这是 mac 所需求的,以避免与 libstdc++ 的符号冲突
cd python; python setup.py install --user; cd ..

Python 依靠

留意,假如你想要装置到一个受办理的本地环境,如 virtualenv,则不需求 --user 标志。

  • 必要的依靠:
pip3 install --user numpy decorator attrs
  • 运用 RPC 跟踪器
pip3 install --user tornado
  • 运用 auto-tuning 模块
pip3 install --user tornado psutil xgboost cloudpickle

留意:在搭载 M1 芯片的 Mac 上,装置 xgboost / scipy 时或许遇到一些问题。scipy 和 xgboost 需求装置 openblas 等额定依靠。运转以下指令行,装置 scipy 和 xgboost 以及所需的依靠和装备:

brew install openblas gfortran
pip install pybind11 cython pythran
export OPENBLAS=/opt/homebrew/opt/openblas/lib/
pip install scipy --no-use-pep517
pip install xgboost

装置 Contrib 库

NNPACK Contrib 装置,检查
tvm.hyper.ai/docs/instal…

启用 C++ 测验

能够用 Google Test 来驱动 TVM 中的 C++ 测验。装置 GTest 最简单的办法是从源代码装置:

git clone https://github.com/google/googletest
cd googletest
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

装置成功后,能够用 ./tests/scripts/task_cpp_unittest.sh 来构建和启动 C++ 测验,或许直接用 make cpptest 构建。

以上便是本期教程–装置 TVM 的 Part 1 部分,在 Part 2 中,咱们将继续解说另外两种 TVM 装置办法:Docker 镜像装置以及 NNPACK Contrib 装置。

欢迎我们继续重视 tvm.hyper.ai,了解 TVM 中文的最佳进展!

—— 完 ——