集群离线环境编译pytorch

发布于:2025-02-21 ⋅ 阅读:(19) ⋅ 点赞:(0)

intro

        对于一些需要更改pytorch源码或者需要特定pytorch版本的需求可能需要更改pytorch。下面是笔者在集群服务器上重新编译pytorch 的一个过程。记录了出现的一些问题和解决方案

编译环境

        由于集群操作系统的一些库版本太低(比如glibc库),我尽量选择的都是比较老的python包或者编译依赖的版本。我使用的版本如下:CentOS 7.6.1810 ,gcc 8.3.0  ,cuDNN/8.0.4.30-CUDA-10.1.243   ,cuda/10.1   ,nccl/2.8.3,torch1.5.1,python 3.7,torchvision 0.6.1,torchaudio 0.5.0,cmake 3.14.3,glibc 2.17,mpich3.3

        选择这些版本的环境一个重要的参照是,很多包可以直接load module,省去了很多环境配置和安装的麻烦,尤其是在离线环境下。并且在anaconda环境下安装,这样可以避免很多麻烦,隔离环境。

比如在这里:

module load anaconda3
module load cuda/10.1
module load cuDNN/7.6.5.32-CUDA-10.1.243
module swap intel gnu8/8.3.0
module load cmake/3.14.3
module load nccl/2.8.3

        对于离线环境的集群,anaconda环境有时候不能直接 pip install,一个比较好的解决方案是,在本地创建好需要的conda环境,并安装好需要的py包,最后把整个conda环境打包上传到集群,再解压到相应目录下。但要注意的是,由于不是在本地直接创建的conda环境,会出现找不到一些头文件或者库文件的情况,所以需要根据出现的问题,单独设置一些环境变量,在这里我设置了:

export CXXFLAGS="-I/path/to/your/python.h"
export LD_LIBRARY_PATH=/path/to/your/conda/envs/lib:$LD_LIBRARY_PATH
export CFLAGS="-I/path/to/your/python.h"
export PYTHON_INCLUDE_DIR=/path/to/your/python.h

        设置这些是因为我出现了找不到python.h头文件的问题,而这个头文件应该在conda环境下的include的文件夹下的一个pythonx.xm文件夹下。并且对于c和c++的头文件环境配置都应该设置,否则就会在最后 install project的时候报错。

        关于nccl环境的配置可以参考:使用系统内NCCL环境重新编译Pytorch ,如果你想直接使用pytorch 自带的nccl的话,就不需要配置这个了。

        并且编译pytorch 需要mpich的依赖,我查阅到似乎openmpi也可以,但是仍然还是推荐使用mpich。注意这里需要根据cuda版本找到需要的mpich版本,版本不匹配的话也会报错!在离线环境下安装mpich需要去mpich官网找到对应版本的源码,然后make install。可以参考这位大佬写的:Linux安装MPICH3.x。这里我配置的环境变量是:

export PATH=/path/to/bin:$PATH
export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH
export CPATH=/path/to/include:$CPATH

编译

        首先应该conda activate 对应的环境,最好不要使用base环境。然后进入pytorch的源码目录。编译之前可以指定一些环境变量,这取决于你的需求,比如:

        

export USE_CUDA=1
export USE_CUDNN=1
export USE_NCCL=1
export USE_GLOO=0 
export USE_SYSTEM_NCCL=1 
export NCCL_INCLUDE_DIR=$NCCL_INCLUDE_DIR 
export NCCL_LIB_DIR=$NCCL_LIB_DIR

当然也可以在指令中直接加入:

USE_GLOO=0 USE_SYSTEM_NCCL=1 NCCL_INCLUDE_DIR=$NCCL_INCLUDE_DIR NCCL_LIB_DIR=$NCCL_LIB_DIR python setup.py develop

编译过程非常耗时,根据集群的配置可以调整MAX_JOBS这个环境变量比如:

export MAX_JOBS=20

如果编译节点的核数比较多可以适当提升此值来加快编译速度。最后要说的是,pytorch 的编译过程会出现各种各样奇怪的问题,所以还是要有耐心。笔者在大概反复重复了5-6遍这个编译过程,可以说是相当折磨!当出现错误的时候可以执行:

make clean
python setup.py clean
rm -rf build

然后再重新编译就好。如果在登录节点编译太大的文件会被清退,可以申请一个计算节点来执行编译任务。在编译过程中会出现很多warning,这些不需要太在意,只要不是提示找不到哪个头文件或者lib库就没什么问题。

其他

        笔者在配置环境的时候曾经尝试过,在本地编译好的torch打包成wheel文件,注入到集群的conda环境当中,或者直接打包本地的conda环境注入到集群环境中。但是发现import的时候会爆很多奇奇怪怪的错误。包括找不到某个包,找不到某个头文件。其中最致命的是爆glibc版本过低的问题。这个库是操作系统内一个很重要的c库,而且一般不能随便更新,否则会出现很严重的问题。尤其是在集群没有root权限的时候。爆这个错几乎只能在集群环境下重新编译。包括跑一些程序也是,本地编译放在集群上跑有时候也会爆这个错,所以最保险的还是放在集群环境下编译在集群环境下跑程序。