Ubuntu 22.04 安装 Apache TVM 指南

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

Apache TVMApache TVM2026/10/12

Ubuntu 22.04 安装 Apache TVM 指南

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

一、环境信息

实测环境如下:

操作系统:Ubuntu 22.04.5 LTS(x86_64)
glibc:2.35
CPU:12 核(x86_64)
内存:32 GB
磁盘:可用空间 ≥ 5 GB
软件版本:Apache TVM 0.27.0.post1(PyPI 最新稳定版,实测通过)
Python:3.10.12(apt 官方仓库,实测通过)

Ubuntu 22.04 自带的 Python 3.10 正好满足 apache-tvm 的 Python ≥ 3.10 要求,无需编译 Python,整体流程比 CentOS 8 简单很多。

二、前置条件

  1. 可以访问 PyPI(实测直连可用,但速度波动大,见「八、常见问题」)。
  2. root 权限(本文所有命令以 root 执行)。
  3. 磁盘空间:wheel 约 100 MB,安装后虚拟环境实测约 400 MB,预留 3 GB 足够。
  4. glibc 要求:预编译 wheel 为 manylinux_2_27 打包,要求 glibc ≥ 2.27;Ubuntu 22.04 的 glibc 2.35 满足。
  5. 内存与资源限制:编译与推理 1 GB 起步;做算子调优建议 ≥ 4 GB。确认文件描述符上限:
ulimit -n

实测回显:

1048576

三、版本选型

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

  • PyPI 包名 apache-tvm,最新稳定版为 0.27.0.post1,与 GitHub 官方 Release(tag v0.27.0.post1,2026-09-29 发布)版本号一致。
  • PyPI 从 0.25.0 起才提供预编译 wheel;0.19.0~0.24.0 仅在 GitHub Releases 提供源码包。
  • 预编译 wheel 要求 Python ≥ 3.10(requires_python: >=3.10),并自带 LLVM 后端(实测 USE_LLVM = ON),CPU 编译无需另装 LLVM。

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

维度PyPI 预编译包(推荐)GitHub 源码编译
版本范围0.25.0 及以上全部版本
安装耗时实测 20 秒~17 分钟(视 PyPI CDN 节点速度而定)约 15~30 分钟
附带 tvmc 命令行无(0.20.0 起 tvmc 已从源码树移除)0.19.0 及更早版本含 tvmc
适用场景常规推理、编译、二次开发需要 tvmc 或自定义后端

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

四、部署步骤

4.1 安装 Python 与 pip

apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y python3 python3-pip python3-venv
python3 --version

实测回显:

Python 3.10.12

4.2 创建独立虚拟环境

系统 pip 直接装包容易污染系统环境且受 PEP 668 限制,务必使用 venv:

python3 -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.10/site-packages/pip (python 3.10)

4.3 安装 apache-tvm

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

实测回显:

Downloading apache_tvm-0.27.0.post1-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (100.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.5/100.5 MB 88.1 kB/s  0:13:48
Installing collected packages: typing_extensions, numpy, ml_dtypes, apache-tvm-ffi, apache-tvm
Successfully installed apache-tvm-0.27.0.post1 apache-tvm-ffi-0.1.14.post1 ml_dtypes-0.6.0 numpy-2.2.6 typing_extensions-4.16.0

实测本次直连下载速度仅 88.1 kB/s,主 wheel 100.5 MB 下载了约 14 分钟,总耗时 17 分钟;速度取决于命中的 PyPI CDN 节点,慢时可改用国内加速源(见 Q2)。自动安装的依赖共 4 个:apache-tvm-ffi、ml_dtypes、numpy、typing_extensions。

4.4 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"}

再确认线程池与 CPU 数量:

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

4.5 跑通最小端到端示例

将以下内容保存为 /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)
print("输出前 2 个元素:", out.numpy()[0][:2])
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
输出前 2 个元素: [0.4101006  0.27392718]
与 NumPy matmul 结果一致: PASS

实测整套流程(含 LLVM 编译)约 2.5 秒,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_DEBUGC++ 层 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

六、升级与多版本管理

6.1 升级

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

6.2 查询可用版本

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

6.3 多版本共存

按 venv 隔离,互不影响:

python3 -m venv /opt/tvm-venv-026
/opt/tvm-venv-026/bin/pip install apache-tvm==0.26.0

注意 0.25.0 之前没有 PyPI wheel,无法 pip 安装旧版;0.20.0~0.24.0 需从 GitHub Releases 源码编译。

七、注意事项

  1. 必须用 venv:系统 Python 直接安装可能被 PEP 668 拦截(externally-managed-environment),且污染 apt 管理的包。
  2. tvmc 已移除:0.20.0 起 tvmc 从源码树删除,0.27 的 wheel 中执行 tvmc 报 No module named tvm.driver.tvmc,勿照搬旧教程。
  3. 下载慢属正常现象:wheel 体积 100 MB,PyPI 各 CDN 节点速度差异大,慢时换国内加速源。
  4. NumPy 2.x 兼容:实测 numpy 2.2.6 / 2.4.6 均正常。
  5. 磁盘占用:venv 实测约 400 MB。
  6. Ubuntu 22.04 自带 Python 3.10 恰好满足要求;若系统被降级到 3.8/3.9,需先按 Python 官方源码方式装 3.10+。

八、常见问题

**Q1:**报 "error: externally-managed-environment"? Ubuntu 22.04 部分 pip 版本对系统 Python 启用 PEP 668 保护。创建 venv 后在 venv 内安装即可,不要强行加 --break-system-packages。

**Q2:**pip 下载只有几十 kB/s? 换国内加速源(清华):

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

**Q3:**Python 3.9 服务器上报 "Could not find a version that satisfies the requirement apache-tvm (from versions: none)"? 该报错表示 pip 按 requires_python >= 3.10 过滤后无版本可选,而非网络故障。升级 Python 到 3.10+ 后重装。

Q4:import tvm 报 undefined symbol / libstdc++ 版本错误? 多见于把预编译 so 混入自编译环境或 LD_LIBRARY_PATH 指向了旧的 GCC 运行库。检查 echo $LD_LIBRARY_PATH,移除指向旧 libstdc++ 的条目后重试。

**Q5:**运行时提示 tornado 缺失? 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

如配置过 /etc/profile.d/tvm.sh 一并删除。

十、参考链接