从源码安装

此页面提供有关如何从源码构建和安装 TVM 包的说明。

步骤 1. 安装依赖项

Apache TVM 需要以下依赖项

  • CMake (>= 3.24.0)

  • LLVM (推荐 >= 15)

  • Git

  • 一个支持 C++ 17 的最新 C++ 编译器,最低要求
    • GCC 7.1

    • Clang 5.0

    • Apple Clang 9.3

    • Visual Studio 2019 (v16.7)

  • Python (>= 3.8)

  • (可选) Conda (强烈推荐)

管理依赖项的最简单方法是通过 conda,它维护一套跨平台的工具链,包括 LLVM。要创建这些构建依赖项的环境,可以简单地使用

# make sure to start with a fresh environment
conda env remove -n tvm-build-venv
# create the conda environment with build dependency
conda create -n tvm-build-venv -c conda-forge \
    "llvmdev>=15" \
    "cmake>=3.24" \
    git \
    python=3.11
# enter the build environment
conda activate tvm-build-venv

步骤 2. 从 Github 获取源码

您也可以选择从 github 克隆源码仓库。

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

注意

使用 --recursive 标志克隆 TVM 仓库非常重要,这将自动克隆子模块。如果您忘记使用此标志,您可以通过在 TVM 仓库的根目录中运行 git submodule update --init --recursive 来手动克隆子模块。

步骤 3. 配置和构建

创建一个构建目录并运行 CMake 来配置构建。以下示例展示了如何构建

cd tvm
rm -rf build && mkdir build && cd build
# Specify the build configuration via CMake options
cp ../cmake/config.cmake .

我们希望通过将以下标志附加到配置文件末尾来专门调整它们

# controls default compilation flags (Candidates: Release, Debug, RelWithDebInfo)
echo "set(CMAKE_BUILD_TYPE RelWithDebInfo)" >> config.cmake

# LLVM is a must dependency for compiler end
echo "set(USE_LLVM \"llvm-config --ignore-libllvm --link-static\")" >> config.cmake
echo "set(HIDE_PRIVATE_SYMBOLS ON)" >> config.cmake

# GPU SDKs, turn on if needed
echo "set(USE_CUDA   OFF)" >> config.cmake
echo "set(USE_METAL  OFF)" >> config.cmake
echo "set(USE_VULKAN OFF)" >> config.cmake
echo "set(USE_OPENCL OFF)" >> config.cmake

# cuBLAS, cuDNN, cutlass support, turn on if needed
echo "set(USE_CUBLAS OFF)" >> config.cmake
echo "set(USE_CUDNN  OFF)" >> config.cmake
echo "set(USE_CUTLASS OFF)" >> config.cmake

注意

HIDE_PRIVATE_SYMBOLS 是一个配置选项,用于启用 -fvisibility=hidden 标志。此标志有助于防止 TVM 和 PyTorch 之间潜在的符号冲突。这些冲突是由于框架发布了不同版本的 LLVM 而引起的。

CMAKE_BUILD_TYPE 控制默认编译标志

  • Debug 设置 -O0 -g

  • RelWithDebInfo 设置 -O2 -g -DNDEBUG (推荐)

  • Release 设置 -O3 -DNDEBUG

一旦 config.cmake 相应地编辑完毕,使用以下命令启动构建

cmake .. && cmake --build . --parallel $(nproc)

注意

nproc 可能在所有系统上都不可用,请将其替换为您系统上的核心数

成功构建应在 build/ 目录下生成 libtvmlibtvm_runtime

离开构建环境 tvm-build-venv,有两种方法将成功构建安装到您的环境中

  • 通过环境变量安装

export TVM_HOME=/path-to-tvm
export PYTHONPATH=$TVM_HOME/python:$PYTHONPATH
  • 通过 pip 本地项目安装

conda activate your-own-env
conda install python # make sure python is installed
export TVM_LIBRARY_PATH=/path-to-tvm/build
pip install -e /path-to-tvm/python

步骤 4. 验证安装

使用具有多种语言绑定的编译器基础设施可能容易出错。因此,强烈建议在使用前验证 Apache TVM 安装。

步骤 1. 定位 TVM Python 包。 以下命令可以帮助确认 TVM 已正确安装为 python 包,并提供 TVM python 包的位置

>>> python -c "import tvm; print(tvm.__file__)"
/some-path/lib/python3.11/site-packages/tvm/__init__.py

步骤 2. 确认正在使用哪个 TVM 库。 当维护 TVM 的多个构建或安装时,仔细检查 python 包是否正在使用正确的 libtvm 变得很重要,可以使用以下命令

>>> python -c "import tvm; print(tvm._ffi.base._LIB)"
<CDLL '/some-path/lib/python3.11/site-packages/tvm/libtvm.dylib', handle 95ada510 at 0x1030e4e50>

步骤 3. 反映 TVM 构建选项。 有时,当下游应用程序失败时,很可能是 TVM 提交错误或构建标志错误导致的一些错误。为了找出原因,以下命令将有所帮助

>>> python -c "import tvm; print('\n'.join(f'{k}: {v}' for k, v in tvm.support.libinfo().items()))"
... # Omitted less relevant options
GIT_COMMIT_HASH: 4f6289590252a1cf45a4dc37bce55a25043b8338
HIDE_PRIVATE_SYMBOLS: ON
USE_LLVM: llvm-config --link-static
LLVM_VERSION: 15.0.7
USE_VULKAN: OFF
USE_CUDA: OFF
CUDA_VERSION: NOT-FOUND
USE_OPENCL: OFF
USE_METAL: ON
USE_ROCM: OFF

步骤 4. 检查设备检测。 有时,了解 TVM 是否可以检测到您的设备可能会有所帮助,可以使用以下命令

>>> python -c "import tvm; print(tvm.metal().exist)"
True # or False
>>> python -c "import tvm; print(tvm.cuda().exist)"
False # or True
>>> python -c "import tvm; print(tvm.vulkan().exist)"
False # or True

请注意,以上命令验证的是本地机器上是否存在用于 TVM 运行时(而非编译器)正常执行的实际设备。但是,TVM 编译器可以执行编译任务,而无需物理设备。只要必要的工具链(如 NVCC)可用,即使在没有实际设备的情况下,TVM 也支持交叉编译。

步骤 5. 额外的 Python 依赖项

从源码构建并不能确保安装所有必要的 Python 依赖项。以下命令可用于安装额外的 Python 依赖项

  • 必要的依赖项

pip3 install numpy
  • 如果您想使用 RPC Tracker

pip3 install tornado
  • 如果您想使用自动调优模块

pip3 install tornado psutil 'xgboost>=1.1.0' cloudpickle

高级构建配置

Ccache

在支持的平台上,Ccache 编译器包装器 可能有助于缩短 TVM 的构建时间,尤其是在使用 cutlassflashinfer 构建时。有几种方法可以在 TVM 构建中启用 CCache

  • build/config.cmake 中保留 USE_CCACHE=AUTO。如果找到 CCache,将使用它。

  • Ccache 的伪装模式。这通常在 Ccache 安装过程中启用。要在伪装模式下让 TVM 使用 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 ...

在 Windows 上构建

TVM 支持通过使用 cmake 的 MSVC 构建。您将需要获取 visual studio 编译器。最低要求的 VS 版本是 Visual Studio Enterprise 2019 (注意:我们针对 GitHub Actions 的 Windows 2019 Runner 进行测试,因此请参阅该页面以获取完整详细信息。我们建议按照 步骤 1. 安装依赖项 获取必要的依赖项并获得激活的 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

启用 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 构建。