从源代码安装#

本页提供了如何从源代码构建和安装 TVM 包的说明。

步骤 1:安装依赖项#

Apache TVM 需要以下依赖项:

  • CMake (>= 3.24.0)

  • LLVM (recommended >= 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

第二步:从 Github 获取源代码#

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

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

备注

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

第三步:配置与构建#

创建 build 目录并运行 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 可能并非在所有系统上都可用,请将其替换为系统中实际的 CPU 核心数。

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

退出构建环境 tvm-build-venv 后,有两种方法可以将成功构建的 TVM 安装到你的环境中:

  • 通过环境变量安装

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 decorator attrs
  • 如果你想使用 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 来构建测试。