构建共享库
我们的目标是建立共享库:
在 Linux 上,目标库是 libtvm.so
和 libtvm_runtime.so
。
在 macOS 上,目标库是 libtvm.dylib
和 libtvm_runtime.dylib
在 Windows 上,目标库是 libtvm.dll
和 libtvm_runtime.dll
也可以只 构建运行时的 库。
TVM
库的最低构建要求是:
- A recent C++ compiler supporting C++ 17, at the minimum
-
CMake 3.18 or higher
我们强烈建议使用 LLVM 构建,以启用所有的功能。
如果你想使用 CUDA,需要 CUDA 工具箱版本 >=8.0。如果你从旧版本升级,请确保在安装后清除旧版本并重新启动。
在 macOS 上,你可能想安装 Homebrew 以方便安装和管理依赖性。
Python 也是必需的。避免使用 Python 3.9.X+,它不 支持。然而,3.7.X+ 和 3.8.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
Note that the version of CMake on apt may not be sufficiently up to date; it may be necessary to install it directly from Kitware’s third-party APT repository.
On Fedora/CentOS and related operating systems use:
sudo dnf update
sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y python-devel ncurses-compat-libs zlib-devel cmake libedit-devel libxml2-devel
使用 Homebrew 为运行英特尔或 M1 处理器的 macOS 安装所需的依赖项。你必须遵循 Homebrew 指定的安装后步骤,以确保正确地安装和配置这些依赖项:
brew install gcc git cmake
brew install llvm
brew install python@3.8
If you are on macOS with an M1 Processor you may need to use conda to manage dependencies while building. Specifically you may need, Miniforge to ensure that the dependencies obtained using pip are compatible with M1.
brew install miniforge
conda init
conda create --name tvm python=3.8
conda activate tvm
我们使用 cmake 来构建库。TVM 的配置可以通过编辑 config.cmake
和/或在命令行传递 cmake 标志来修改:
首先,检查你系统中的 cmake。如果你没有 cmake,你可以从 官方网站 获得最新版本。
首先创建 build 目录,将 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)
启用嵌入式图形执行器和调试功能
要用 IR 进行调试,set(USE_RELAY_DEBUG ON)
并设置环境变量 TVM_LOG_DEBUG
。
export TVM_LOG_DEBUG="ir/transform.cc=1,relay/ir/transform.cc=1"
TVM requires LLVM for CPU codegen. We highly recommend you to build with the LLVM support on.
使用 LLVM 构建时需要 LLVM 4.0 或更高版本。注意,默认的 apt 中的 LLVM 版本可能低于 4.0。
由于 LLVM 从源代码构建需要很长时间,你可以从 LLVM 下载页面 下载预构建的 LLVM 版本。
你也可以使用 LLVM Nightly Ubuntu 构建版
如果你是 PyTorch 的用户,建议设置 (USE_LLVM "/path/to/llvm-config --link-static")
和 set(HIDE_PRIVATE_SYMBOLS ON)
,以避免 TVM 和 PyTorch 使用的不同版本 LLVM 之间的潜在 symbol 冲突。
On supported platforms, the Ccache compiler wrapper may be helpful for
reducing TVM’s build time. There are several ways to enable CCache in TVM builds:
Leave USE_CCACHE=AUTO in build/config.cmake. CCache will be used if it is found.
Ccache’s Masquerade mode. This is typically enabled during the Ccache installation process.
To have TVM use Ccache in masquerade, simply specify the appropriate C/C++ compiler
paths when configuring TVM’s build system. For example:
cmake -DCMAKE_CXX_COMPILER=/usr/lib/ccache/c++ ...
.
Ccache as CMake’s C++ compiler prefix. When configuring TVM’s build system,
set the CMake variable CMAKE_CXX_COMPILER_LAUNCHER
to an appropriate value.
E.g. cmake -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ...
.
然后我们可以建立 tvm 和相关的库。
cd build
cmake ..
make -j4
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.so
和 libtvm_runtime.so
的位置。如果没有设置,tvm 将寻找相对于 tvm python 模块的位置。与 TVM_BUILD_PATH
不同,这必须是一个绝对路径。
# Build in the "build" directory
make
# Alternate location, "build_debug"
TVM_BUILD_PATH=build_debug make
# Build both "build_release" and "build_debug"
TVM_BUILD_PATH="build_debug build_release" make
# Use debug build
TVM_LIBRARY_PATH=~/tvm/build_debug python3
如果一切顺利,我们可以去 Python 软件包的安装。
用 Conda 环境构建
Conda 是一种非常方便的方式,可以获得运行 TVM 所需的必要依赖。首先,如果你的系统中还没有 conda,请按照 conda 的安装指南 来安装 miniconda 或 anaconda。在 conda 环境下运行以下命令:
# Create a conda environment with the dependencies specified by the yaml
conda env create --file conda/build-environment.yaml
# Activate the created environment
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
# Run conda/build_cuda.sh to build with cuda enabled
conda install tvm -c ./conda/pkg
构建在 Windows 上
TVM support build via MSVC using cmake. You will need to obtain a visual studio compiler.
The minimum required VS version is Visual Studio Enterprise 2019 (NOTE: we test
against GitHub Actions’ Windows 2019 Runner, so see that page for full details.
We recommend following 用 Conda 环境构建 to obtain necessary dependencies and
get an activated tvm-build environment. Then you can run the following command to 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 运行时。确保安装系统中已经安装了 ROCm。
安装最新的 LLVM 稳定版本(v6.0.1),以及 LLD,确保 ld.lld
可以通过命令行使用。