TVM 从入门到精通 | 安装 TVM (Part 1)

2023-02-27 16:28:36 浏览数 (1)

By 超神经

内容一览: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 源代码,请访问:

https://tvm.apache.org/download

开发者:从 GitHub 获取源代码

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

代码语言:javascript复制
git clone --recursive https://github.com/apache/tvm tvm

Windows 用户可以打开 Git shell,并输入以下命令:

代码语言:javascript复制
git submodule init
git submodule update

构建共享库

我们的目标是构建共享库:

* 在 Linux 上

目标库是 libtvm.solibtvm_runtime.so

* 在 MacOS 上

目标库是 libtvm.dyliblibtvm_runtime.dylib

* 在 Windows 上

目标库是 libtvm.dlllibtvm_runtime.dll

也可以只构建运行时库:

https://tvm.hyper.ai/docs/how_to/deploy/

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 操作系统上,要安装这些依赖环境,请在终端执行:

代码语言:javascript复制
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 指定的安装步骤,以保证正确安装和配置这些依赖:

代码语言:javascript复制
brew install gcc git cmake
brew install llvm
brew install python@3.8

使用 cmake 来构建库。

TVM 的配置可以通过编辑 config.cmake 和/或在命令行传递 cmake flags 来修改:

* 如果没有安装 cmake,可访问以下官网下载最新版本 https://cmake.org/download/

* 创建一个构建目录,将 cmake/config.cmake 复制到该目录

代码语言:javascript复制
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

代码语言:javascript复制
export TVM_LOG_DEBUG="ir/transform.cc=1;relay/ir/transform.cc=1"

* 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 及相关库:

代码语言:javascript复制
cd build
cmake ..
make -j4

- 可以使用 Ninja 来加速构建

代码语言:javascript复制
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 不同,这必须是一个绝对路径。

代码语言:javascript复制
# 在 "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 安装指南 https://docs.conda.io/projects/conda/en/latest/user-guide/install/ 来安装 Miniconda 或 Anaconda。在 Conda 环境中运行以下命令:

代码语言:javascript复制
# 用 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 软件包来构建和安装,可以按照以下指导进行:

代码语言:javascript复制
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 :

https://github.com/actions/virtual-environments/blob/main/images/win/Windows2019-Readme.md

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

运行以下命令行:

代码语言:javascript复制
mkdir build
cd build
cmake -A x64 -Thost=x64 ..
cd ..

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

代码语言:javascript复制
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 包

本部分介绍利用 virtualenvconda 等虚拟环境和软件包管理器,来管理 Python 软件包和依赖的方法。

Python 包位于 tvm/python。安装方法有两种:

* 方法 1

本方法适用于有可能修改代码的开发者。

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

代码语言:javascript复制
export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}

* 方法 2

通过 setup.py 安装 TVM 的 Python 绑定:

代码语言:javascript复制
# 为当前用户安装 TVM 软件包
# 注意:如果你通过 homebrew 安装了 Python,那么在安装过程中就不需要 --user
#        它将被自动安装到你的用户目录下。
#        在这种情况下,提供 --user 标志可能会在安装时引发错误。
export MACOSX_DEPLOYMENT_TARGET=10.9  # 这是 mac 所需要的,以避免与 libstdc   的符号冲突
cd python; python setup.py install --user; cd ..

Python 依赖

注意,如果你想要安装到一个受管理的本地环境,如 virtualenv,则不需要 --user 标志。

* 必要的依赖:

代码语言:javascript复制
pip3 install --user numpy decorator attrs

* 使用 RPC 跟踪器

代码语言:javascript复制
pip3 install --user tornado

* 使用 auto-tuning 模块

代码语言:javascript复制
pip3 install --user tornado psutil xgboost cloudpickle

注意:在搭载 M1 芯片的 Mac 上,安装 xgboost / scipy 时可能遇到一些问题。scipy 和 xgboost 需要安装 openblas 等额外依赖。运行以下命令行,安装 scipy 和 xgboost 以及所需的依赖和配置:

代码语言:javascript复制
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 安装,查看

https://tvm.hyper.ai/docs/install/nnpack

启用 C 测试

可以用 Google Test 来驱动 TVM 中的 C 测试。安装 GTest 最简单的方法是从源代码安装:

代码语言:javascript复制
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 安装。

—— 完 ——

0 人点赞