跳转至

Linux系统下离线安装torch:从安装Python开始

适用于Ubuntu、麒麟系统等Linux操作系统。

1 前言

尽管我个人非常推荐使用Anaconda管理Python环境,但在实际的应用环境中,仍不可避免地存在需要用的原生Python的情况。但Anaconda的优越性实在是太高,非常方便,我也更推荐这种方案。但原生Python方案仍旧有一定的应用环境,同时对于理解离线安装Python是很好的实践教材。因此,我们会先用Python的传统方案演示安装过程,历经千帆后再用Anaconda秒杀比赛。

如果你只是想快点安装完成,并不想知道Anaconda有多方便,可以直接跳过Python部分。

本教程主要分为两步:首先,我们会先安装最基础的Python环境;在此基础之上,我们安装torch等额外的包。

2 安装Python

2.1 Python传统方案(很麻烦)

2.1.1 下载Python源码

Linux上离线安装Python不像在Windows上直接双击.exe文件这么简单,需要我们手动进行编译。

首先需要在Python官网下载需要版本的Python源码压缩包,推荐下载Gzipped source tarball压缩格式,方便Linux系统解压,后续我们会在服务器上解压并编译。

2.1.2 编译Python

首先将压缩包放置到服务器上。压缩包的位置没有特定要求,自己能够找到就行。接下来在服务器上解压,例如:

Bash
tar -xzf Python-3.9.18.tgz
解压参数说明
短参数 长参数 功能说明
-c --create 创建一个新的归档文件(打包模式)
-x --extract 从归档文件中提取(解压)文件
-t --list 列出归档文件中的内容(不解压)
-f --file 指定归档文件名,此参数后必须紧跟文件名
-v --verbose 显示操作过程中的详细文件列表
-z --gzip 使用 gzip 算法进行压缩或解压(对应 .tar.gz 格式)
-j --bzip2 使用 bzip2 算法进行压缩或解压(对应 .tar.bz2 格式)
-J --xz 使用 xz 算法进行压缩或解压(对应 .tar.xz 格式)
-C --directory 切换到指定目录,常用于指定解压的目标路径
-p --preserve-permissions 保留文件的原始权限(常用于解压或备份)

此时源码就已经解压到了./Python-3.9.18文件夹中,cd进入该文件夹,接下来开始编译。

在Linux上编译安装Python大致分为三个步骤:

  1. 配置安装的参数
  2. 编译源码
  3. 执行安装

我们依次进行:

1.配置安装的参数
./configure --enable-optimizations --prefix=/usr/local/python3.9

--enable-optimizations: 启用优化,使 Python 运行更快,但会增加编译时间 --prefix: 指定安装路径,避免与系统 Python 冲突

2. 编译源码
make -j$(nproc)

-j$(nproc)-j表示多线程,$(nproc)是CPU核心数量,可以利用所有 CPU 核心进行并行编译,显著加快速度

3. 执行安装
make altinstall

altinstall:alternative install,“替代安装”的意思。它非常“克制”,不会安装名为 python 或 python3 的通用链接。它只会安装带有具体版本号的命令,例如 python3.11、pip3.11 等

安装完成后,可以使用在--prefix中设置的python文件夹名称激活Python环境。比如我在--prefix中指定的python3.9,所以我激活对应Python环境的指令为python3.9。查看是否安装成功:

Bash
python3.9 -V

如果有版本号即为安装完成。

Note

需要注意的是,按照上述流程正确安装是极度理想的情况。在实际的工程环境中,Python编译需要各种环境依赖包(比如_ctype的编译需要libffi),缺少这些依赖包可能会导致一些比较重要的Python底层库安装失败(如缺少_ctype会导致torch无法正确import)。为了保证Python正确编译,还需要保证这些环境已经安装。

但幸好,我们还有一种方案可以避免这些编译依赖问题。没错,救星就是Anaconda。

2.2 Anaconda(强烈推荐)

如果你只是希望拥有一个Python的环境,那么Anaconda是很好的选择。如果你不仅需要一个Python环境,还需要在Python环境中安装各种额外的包(比如torch),那么Anaconda是更好的选择。

如果你已经经历过了手动编译Python的阶段,那么你或多或少经历过因为缺少各种依赖导致的Python编译失败(总会缺少那么一些依赖包)。有没有什么方法可以不这么麻烦呢?有的,Anaconda。

Anaconda内部已经预编译好了需要的所有库!也就是说,即使服务器上缺少编译这些包所需要的环境,也不影响——因为Python包已经编译好了。

具体安装Anaconda的流程如下:

2.2.1 下载对应的Anaconda安装包

Anaconda的历史版本安装包在官方归档中下载,不同Anaconda版本对应的Python版本详见官方的release note

选择对应系统架构操作系统的安装版本(Linux通常是xxx.sh的安装包),下载即可。

2.2.2 安装Anaconda

把安装包放到服务器上自己找得到的位置,进入安装包所在的文件夹内,通过以下指令进行安装:

Bash
bash anaconda.xxx.xxx.sh

此时进入安装界面,根据指引安装即可。

在最后询问是否初始化init的时候选择yes,等到安装完成。

安装完成之后,更新一下终端:

Bash
source ~/.bashrc

2.2.3 检查安装是否完成

完成安装之后,可以通过conda activate激活conda环境,此时在终端的用户名左侧会出现字样(base),表明已经激活了conda环境。

没错,这就结束了,这就是Anaconda。当然,如果你觉得Anaconda太过臃肿,可以考虑安装miniconda,更加精简,两者功能是一致的,只是miniconda自带的Python包会更少一些。

3 安装PyTorch

再经过了上述步骤之后,我们已经拥有了一个最基础的Python环境。现在就到了另外一个痛点,如何才能够在这样的离线环境中再安装一些Python包?如比Pytorch?

在Python里,很多包之间都会有相互依赖关系,比如 pandas 依赖 numpy, pytz 等,matplotlib 依赖 numpy, pyparsing, python-dateutil 等。有时候,依赖包也会依赖一些包,以此类推。

通常,在联网环境下pip install安装某个Python包,会自动安装所需要的Python依赖包。但是在离线环境中,只会提示报错,无法正确安装。

想要完整安装某个包,就必须把对应的依赖包也安装。那么如何下载一个包所有的依赖包吗?必须要等到安装包错的时候才能知道缺少什么包吗?还是必须要我们一个个查呢?当然不是——除非你真的很闲。

3.1 下载某个Python包和对应的依赖包

pip download <package>可以把某个包的.whl文件下载到本地,同时会下载所需要的依赖包。所以不要再自己一个个去找.whl文件下载啦,只需要pip download <package>即可。

pip download 常用参数详解
参数 作用 可选值/示例
-d <dir> 指定下载文件存放的目录。 pip download torch -d ./my_packages
--platform <platform> 指定目标平台,下载适用于该平台的包。 linux_x86_64, win_amd64, macosx_10_9_x86_64 等。pip download torch --platform win_amd64
--python-version <version> 指定目标 Python 版本,下载与此版本兼容的包。 3.8, 3.9, 3.10, 3.11 等。pip download torch --python-version 3.10
--abi <abi> 指定目标 ABI (Application Binary Interface)。 cp310, cp310m, none 等。pip download some_package --abi cp310
--only-binary=:all: 强制只下载 wheel 格式的二进制包,不下载源码包。 :all: 是特殊值。pip download torch --only-binary=:all:
--no-binary=:all: 强制只下载源码包,不下载 wheel 包。 :all: 是特殊值。pip download numpy --no-binary=:all:
--no-deps 不下载指定包的依赖项,只下载包本身。 pip download torch --no-deps
-i <url> 指定要从中下载包的主要 PyPI 索引 URL。 pip download torch -i https://pypi.tuna.tsinghua.edu.cn/simple/
--extra-index-url <url> 指定额外的 PyPI 索引 URL。 pip download torch --extra-index-url https://download.pytorch.org/whl/cu118
--trusted-host <hostname> 将指定主机标记为受信任,允许从 HTTP URL 下载 (常与 index-url 配合使用)。 pip download torch --index-url http://example.com/pypi --trusted-host example.com

举个例子。

CMD
pip3 download torch torchvision --index-url https://download.pytorch.org/whl/cu124 --platform linux_x86_64 --only-binary=:all:

这里我使用的--index-url即官方提供的安装指令中的url。需要注意的是,有时候官方提供的最新url链接不一定会有我们想要的架构和操作系统,可以在后缀中添加/torch进入网址Ctrl + ++F++搜索检查一下有没有自己想要的版本。比如https://download.pytorch.org/whl/cu124/torch

3.2 目标服务器上安装Pytorch

下载好之后,把所有文件打包到目标服务器上,进入文件夹内,安装所有的.whl即可:

Bash
python3.9 -m pip install ./*.whl

3.3 检查是否安装好Pytorch

进入Python环境,依次执行以下指令:

Text Only
import torch

torch.cuda.is_available()

如果输出的内容为True,那么说明torch已经安装完成,并可以成功调用GPU加速运算了。

另一种环境迁移方案

出了直接安装torch之外,其实还有一种方法可以进行环境迁移,那就是通过虚拟机创建一个跟目标服务器一样的环境,直接联网配置好对应的环境,然后通过conda-pack打包进行迁移。详细说明可见这篇文章