从源码安装
这个页面给出了如何在各种系统上从头开始构建和安装 TVM 软件包的说明。它包括两个步骤:
首先从 C++ 代码中构建共享库(linux 为 libtvm.so
,macOS 为 libtvm.dylib
,windows 为 libtvm.dll
)。
语言包的设置(如 Python 包)。
要开始使用,请从 下载页面 下载 tvm 源代码。
开发者:从 Github 获取源码
你也可以选择从 github 克隆源码 repo。重要的是,要用 --recursive
选项来克隆子模块。
git clone --recursive https://github.com/apache/tvm tvm
对于使用 github 工具的 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
库的最低构建要求是:
- 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
请注意,apt上的CMake版本可能不是最新的;可能需要直接从 Kitware 的第三方APT仓库 安装。
在Fedora/CentOS及其相关操作系统上,请使用以下命令:
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
如果您在搭载M1处理器的macOS上,可能需要使用conda来管理构建过程中的依赖项。具体来说,您可能需要使用 Miniforge,以确保通过pip获取的依赖项与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 冲突。
在支持的平台上,Ccache 编译器包装器 可能有助于减少TVM构建时间。
保留 build/config.cmake 中的 USE_CCACHE=AUTO。如果找到CCache,将自动使用它。
Ccache 的 Masquerade 模式。通常在Ccache安装过程中启用。要让 TVM 使用 Masquerade 模式下的 Ccache,只需在配置 TVM 构建系统时指定正确的 C/C++ 编译器路径。例如: cmake -DCMAKE_CXX_COMPILER=/usr/lib/ccache/c++ ...
。
将Ccache作为CMake的C++编译器前缀。在配置TVM构建系统时,设置CMake变量 CMAKE_CXX_COMPILER_LAUNCHER
为适当的值。例如: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 支持通过 cmake 使用 MSVC 进行构建。您需要获取 Visual Studio 编译器。最低要求的 VS 版本是 Visual Studio Enterprise 2019 (注意:根据 GitHub Actions 的 Windows 2019 Runner 进行测试,因此请查看该页面以获取完整详情。我们建议按照:ref:build-with-conda 来获取必要的依赖项并激活 tvm-build 环境。然后您可以运行以下命令进行构建
mkdir build
cd build
cmake ..
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
可以通过命令行使用。
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 绑定:
# install tvm package for the current user
# NOTE: if you installed python via homebrew, --user is not needed during installaiton
# it will be automatically installed to your user directory.
# providing --user flag may trigger error during installation in such case.
export MACOSX_DEPLOYMENT_TARGET=10.9 # This is required for mac to avoid symbol conflicts with libstdc++
cd python; python setup.py install --user; cd ..
Python 依赖
注意,如果你要安装到一个受管理的本地环境,如 virtualenv
,则不需要 --user
flag。
pip3 install --user numpy decorator attrs
pip3 install --user typing-extensions psutil scipy
pip3 install --user tornado
pip3 install --user tornado psutil 'xgboost>=1.1.0' cloudpickle
注意在 M1 macs 上,你可能在安装 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>=1.1.0'
启用 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
安装 GTest 后,可以用 ./tests/scripts/task_cpp_unittest.sh
构建和启动 C++ 测试,或者直接用 make cpptest
构建。