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¶
首先将压缩包放置到服务器上。压缩包的位置没有特定要求,自己能够找到就行。接下来在服务器上解压,例如:
解压参数说明
| 短参数 | 长参数 | 功能说明 |
|---|---|---|
-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大致分为三个步骤:
- 配置安装的参数
- 编译源码
- 执行安装
我们依次进行:
--enable-optimizations: 启用优化,使 Python 运行更快,但会增加编译时间
--prefix: 指定安装路径,避免与系统 Python 冲突
-j$(nproc) :-j表示多线程,$(nproc)是CPU核心数量,可以利用所有 CPU 核心进行并行编译,显著加快速度
altinstall:alternative install,“替代安装”的意思。它非常“克制”,不会安装名为 python 或 python3 的通用链接。它只会安装带有具体版本号的命令,例如 python3.11、pip3.11 等
安装完成后,可以使用在--prefix中设置的python文件夹名称激活Python环境。比如我在--prefix中指定的python3.9,所以我激活对应Python环境的指令为python3.9。查看是否安装成功:
如果有版本号即为安装完成。
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¶
把安装包放到服务器上自己找得到的位置,进入安装包所在的文件夹内,通过以下指令进行安装:
此时进入安装界面,根据指引安装即可。
在最后询问是否初始化init的时候选择yes,等到安装完成。
安装完成之后,更新一下终端:
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 |
举个例子。
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即可:
3.3 检查是否安装好Pytorch¶
进入Python环境,依次执行以下指令:
如果输出的内容为True,那么说明torch已经安装完成,并可以成功调用GPU加速运算了。
另一种环境迁移方案
出了直接安装torch之外,其实还有一种方法可以进行环境迁移,那就是通过虚拟机创建一个跟目标服务器一样的环境,直接联网配置好对应的环境,然后通过conda-pack打包进行迁移。详细说明可见这篇文章。