CentOS 8 安装 Apache TVM 指南

面向 CentOS 8 服务器从零安装 Apache TVM 的完整指南,覆盖版本选型、Python 3.11 源码编译、虚拟环境部署、import 验证与最小编译示例,并汇总实测排障记录。

Apache TVMApache TVM2026/10/12

CentOS 8 安装 Apache TVM 指南

本文以一台全新的 CentOS 8 x86_64 服务器为起点,从零完成 Apache TVM(Python 包名 apache-tvm)的安装、验证与最小端到端编译示例,所有命令与回显均来自实测环境。

一、环境信息

实测环境如下:

操作系统:CentOS Linux 8(x86_64)
内核 glibc:2.28
CPU:12 核(x86_64)
内存:32 GB
磁盘:可用空间 ≥ 5 GB
软件版本:Apache TVM 0.27.0.post1(PyPI 最新稳定版,实测通过)
Python:3.11.9(源码编译安装,实测通过)

CentOS 8 已于 2021 年 12 月 31 日停止维护,官方源已迁移至 vault 归档源。实测环境使用清华大学的 CentOS Vault 归档站点(8.5.2111 版本树),/etc/yum.repos.d/CentOS-Linux-*.repo 中的 baseurl 指向:

https://mirrors.tuna.tsinghua.edu.cn/centos-vault/8.5.2111/AppStream/x86_64/os/
https://mirrors.tuna.tsinghua.edu.cn/centos-vault/8.5.2111/BaseOS/x86_64/os/

若服务器尚未配置归档源,请先修改 repo 文件再执行后续步骤,否则所有 dnf install 都会因源 404 而失败。

二、前置条件

  1. 可以访问互联网(实测环境可直连 PyPI;如带宽受限,见「八、常见问题」中的换源加速方案)。
  2. root 权限(本文所有命令以 root 执行)。
  3. 磁盘空间:预编译 wheel 约 100 MB,安装后虚拟环境约 400 MB,加上 Python 3.11 编译目录,预留 5 GB 足够。
  4. glibc 版本要求:PyPI 预编译 wheel 为 manylinux_2_27 标准打包,要求 glibc ≥ 2.27。CentOS 8 的 glibc 为 2.28,满足要求(实测确认)。
  5. 内存建议:编译示例与常规推理 1 GB 即可;若计划做算子调优(autotuning),建议 ≥ 4 GB。同时建议检查文件描述符上限,避免并发编译时报错:
ulimit -n

实测回显:

1048576

若该值过小(如 1024),可在 /etc/security/limits.conf 中为部署账号追加 nofile 配置。

三、版本选型

3.1 版本现状(2026-10 实测核实)

  • PyPI 包名 apache-tvm,最新稳定版为 0.27.0.post1(GitHub 官方同名 tag v0.27.0.post1 发布于 2026-09-29),两者版本号一致。
  • PyPI 上提供预编译 wheel 的版本从 0.25.0 才开始;更早的 0.19.0~0.24.0 仅在 GitHub Releases 提供源码包,未发布 PyPI 包。
  • 预编译 wheel 的 Python 要求为 Python ≥ 3.10(requires_python: >=3.10)。

3.2 PyPI 预编译包与源码编译对比

维度PyPI 预编译包(推荐)GitHub 源码编译
版本范围0.25.0 及以上全部版本(含 0.19.0 等)
Python 要求≥ 3.10与源码版本相关
安装耗时实测约 20 秒(网络通畅时)约 15~30 分钟(含 LLVM 依赖时更久)
附带 tvmc 命令行无(0.20.0 起 tvmc 已从源码树移除,0.25+ 的 wheel 自然不含)0.19.0 及更早版本含 tvmc
适用场景常规推理、编译、二次开发需要旧版 tvmc 或自定义后端

结论:常规使用直接 pip install apache-tvm 安装 0.27.0.post1;确需 tvmc 命令行工具时才选择源码编译 0.19.0(详见《Apache TVM 常用 CLI 命令与工具详解》)。

3.3 CPU 后端说明

预编译 wheel 自带 LLVM 后端(实测 libinfo() 回显 USE_LLVM = ON),target="llvm" 与 target="c" 均可直接使用,无需自行安装 LLVM;CUDA 等加速后端同样已编译进 wheel,但本指南聚焦 CPU(llvm)路径,无需 NVIDIA 相关组件。

3.4 CentOS 8 的 Python 困境(实测)

CentOS 8 AppStream 仓库最高只提供 Python 3.9(实测 dnf install python39 得到 3.9.6),不满足 apache-tvm 的 ≥ 3.10 要求。实测在 Python 3.9 下直接安装会报错:

ERROR: Could not find a version that satisfies the requirement apache-tvm (from versions: none)
ERROR: No matching distribution found for apache-tvm

该报错的本质是 pip 按 requires_python >= 3.10 过滤后无任何可用版本,报错措辞容易误导为"网络问题"。解决方法是源码编译 Python 3.10 及以上版本,本文选用 3.11.9。

四、部署步骤

4.1 安装编译工具与依赖

dnf --setopt=install_weak_deps=False install -y gcc make openssl-devel bzip2-devel libffi-devel zlib-devel xz-devel sqlite-devel readline-devel wget

实测完成后确认编译器:

gcc --version | head -1
gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4)

gcc 8.5 可满足 Python 3.11 的编译要求。

4.2 源码编译安装 Python 3.11.9

cd /tmp
wget -q https://mirrors.huaweicloud.com/python/3.11.9/Python-3.11.9.tgz
tar xf Python-3.11.9.tgz
cd Python-3.11.9
./configure --prefix=/usr/local/python3.11 --with-openssl=/usr --enable-shared LDFLAGS='-Wl,-rpath,/usr/local/python3.11/lib'
make -j$(nproc)
make install

实测要点:

  • --enable-shared 生成 libpython3.11.so,LDFLAGS 中的 rpath 避免运行时找不到共享库。
  • 若省略 --with-openssl=/usr,编译虽能完成但 ssl 模块缺失,后续 pip 访问 https 源会失败。
  • 12 核服务器实测整套编译约 4 分钟。

验证:

/usr/local/python3.11/bin/python3.11 --version
/usr/local/python3.11/bin/python3.11 -c "import ssl; print('ssl ok', ssl.OPENSSL_VERSION)"
Python 3.11.9
ssl ok OpenSSL 1.1.1k  FIPS 25 Mar 2021

4.3 创建独立虚拟环境

/usr/local/python3.11/bin/python3.11 -m venv /opt/tvm-venv
/opt/tvm-venv/bin/pip install --upgrade pip
/opt/tvm-venv/bin/pip --version
pip 26.2.1 from /opt/tvm-venv/lib/python3.11/site-packages/pip (python 3.11)

4.4 安装 apache-tvm

/opt/tvm-venv/bin/pip install apache-tvm

实测回显(网络通畅时全程约 20 秒):

Successfully installed apache-tvm-0.27.0.post1 apache-tvm-ffi-0.1.14.post1 ml_dtypes-0.6.0 numpy-2.4.6 typing_extensions-4.16.0

自动安装的依赖共 4 个:apache-tvm-ffi(FFI 基础库)、ml_dtypes、numpy、typing_extensions。

4.5 import 验证

/opt/tvm-venv/bin/python -c "import tvm; print(tvm.__version__); print(tvm.target.Target('llvm'))"
0.27.0.post1
{"kind":"llvm","tag":"","keys":["cpu"],"mtriple":"x86_64-conda-linux-gnu"}

LLVM 后端可正常解析即安装成功。再确认线程池配置:

/opt/tvm-venv/bin/python -c "import tvm; print('num_threads =', tvm.runtime.num_threads())"
num_threads = 6

4.6 跑通最小端到端示例

将以下内容保存为 /opt/tvm_min_demo.py:

"""TVM 最小端到端示例:构造 Relax IRModule -> 编译到 llvm -> VM 执行 -> 与 NumPy 对比"""
import numpy as np
import tvm
from tvm import relax
from tvm.script import relax as R

print("TVM version:", tvm.__version__)

@R.function
def main(x: R.Tensor((2, 3), "float32"), w: R.Tensor((3, 4), "float32")) -> R.Tensor((2, 4), "float32"):
    with R.dataflow():
        gv: R.Tensor((2, 4), "float32") = R.matmul(x, w)
        R.output(gv)
    return gv

mod = tvm.ir.IRModule({"main": main})
target = tvm.target.Target("llvm")
ex = relax.build(mod, target)
dev = tvm.runtime.device("cpu")
vm = relax.VirtualMachine(ex, dev)

x_np = np.random.rand(2, 3).astype("float32")
w_np = np.random.rand(3, 4).astype("float32")
out = vm["main"](tvm.runtime.tensor(x_np, dev), tvm.runtime.tensor(w_np, dev))

print("输出形状:", out.shape, "dtype:", out.dtype)
np.testing.assert_allclose(out.numpy(), x_np @ w_np, rtol=1e-4, atol=1e-5)
print("与 NumPy matmul 结果一致: PASS")

执行:

/opt/tvm-venv/bin/python /opt/tvm_min_demo.py

实测回显:

TVM version: 0.27.0.post1
输出形状: (2, 4) dtype: float32
与 NumPy matmul 结果一致: PASS

实测整套"构图 -> llvm 编译 -> 执行 -> 校验"耗时约 1.2 秒,说明 CPU 编译链完整可用。

五、配置说明

5.1 关键环境变量

以下变量均写入 /etc/profile.d/tvm.sh(或部署账号的 ~/.bashrc)后重新登录生效:

环境变量作用实测说明
TVM_LIBRARY_PATH自定义 libtvm.so 搜索路径,优先级高于 wheel 自带路径指向不存在目录不影响导入,仅在需要替换 so 时使用
TVM_NUM_THREADSCPU 线程池线程数设为 4 后 tvm.runtime.num_threads() 实测返回 4
TVM_LOG_DEBUG打开 C++ 层 DLOG/VLOG 日志格式为 文件名=级别 逗号分隔,0/空 关闭,1 开启 DLOG
TVM_BACKTRACE报错时打印 C++/Python 混合回溯设为 1 后可见 TVM 源码级回溯,排障利器
TVM_CACHE_DIR编译缓存目录默认在用户目录下,多账号部署时建议显式指定

5.2 验证环境变量

TVM_NUM_THREADS=4 /opt/tvm-venv/bin/python -c "import tvm; print(tvm.runtime.num_threads())"
4

TVM_LIBRARY_PATH 的语义为"前插搜索路径":wheel 内置的 tvm/lib 目录仍是兜底,因此即使配置了无效路径,import tvm 也不会失败。

六、升级与多版本管理

6.1 升级到最新版

/opt/tvm-venv/bin/pip install --upgrade apache-tvm

6.2 查询可用版本

/opt/tvm-venv/bin/pip index versions apache-tvm

实测可列出 0.27.0.post1、0.27.0、0.26.0、0.25.0 等全部含 wheel 的版本。

6.3 多版本共存

推荐"一环境一虚拟环境"的隔离方式,避免直接升级破坏现有业务:

/usr/local/python3.11/bin/python3.11 -m venv /opt/tvm-venv-026
/opt/tvm-venv-026/bin/pip install apache-tvm==0.26.0

回滚即切换 venv 路径,无需卸载任何系统组件。注意 0.25.0 之前的版本在 PyPI 上没有 wheel,无法用 pip 直接安装旧版。

七、注意事项

  1. 不要使用系统 Python 3.6 或 AppStream 的 Python 3.9:实测均无法安装 apache-tvm(见 3.4 节报错)。
  2. glibc 版本红线:manylinux_2_27 wheel 要求 glibc ≥ 2.27,CentOS 8 满足;但更老的 CentOS 7(glibc 2.17)不满足,只能源码编译 TVM。
  3. tvmc 已移除:0.20.0 起 tvmc 从源码树删除,PyPI 0.25+ 的包不含该命令,勿按旧文档执行 tvmc compile(实测报 No module named tvm.driver.tvmc)。
  4. NumPy 版本:0.27.0.post1 可搭配 NumPy 2.x(实测 2.4.6 正常),无需降级。
  5. 磁盘占用:venv 实测约 400 MB,其中主 so 约 260 MB。
  6. 内存与 ulimit:并行编译大量算子时建议内存 ≥ 4 GB,ulimit -n ≥ 65535。
  7. CentOS 8 已 EOL,dnf 必须走 vault 归档源,否则连 gcc 都装不上。

八、常见问题

Q1:pip install apache-tvm 报 "Could not find a version that satisfies the requirement apache-tvm (from versions: none)"? Python 版本低于 3.10。实测 Python 3.9.6 必现。按 4.2 节源码编译 Python 3.11 后在 venv 中安装即可。

**Q2:**pip 下载速度只有几十 kB/s 怎么办? 实测同一环境下不同 CDN 节点速度差异巨大(一次直连实测 88 kB/s、耗时 17 分钟;另一次 20 秒完成)。可改用国内加速源:

/opt/tvm-venv/bin/pip install -i https://pypi.tuna.tsinghua.edu.cn/simple apache-tvm

Q3:import tvm 报 ImportError: libpython3.11.so.1.0: cannot open shared object file? 编译 Python 时未加 LDFLAGS='-Wl,-rpath,/usr/local/python3.11/lib'。补救:把 /usr/local/python3.11/lib 写入 /etc/ld.so.conf.d/python311.conf 后执行 ldconfig。

**Q4:**编译时报 Target("llvm -mcpu=core-avx2") 不支持? 0.27 已移除 "llvm -mcpu=xxx" 字符串形式(实测报错原文:CLI target string form (e.g. "llvm -mcpu=xxx") is no longer supported),改用字典形式:

tvm.target.Target({"kind": "llvm", "mcpu": "core-avx2"})

Q5:import tvm 时报 tornado 相关 ModuleNotFoundError? RPC tracker 等组件需要可选依赖,安装:pip install "apache-tvm[rpc]"。核心编译与运行功能不依赖它。

九、卸载方式

/opt/tvm-venv/bin/pip uninstall -y apache-tvm apache-tvm-ffi ml_dtypes
rm -rf /opt/tvm-venv
rm -rf /usr/local/python3.11
rm -f /etc/ld.so.conf.d/python311.conf && ldconfig

若曾配置 /etc/profile.d/tvm.sh,一并删除后重新登录即可。

十、参考链接