集群离线环境编译pytorch

embedded/2025/2/25 5:16:52/

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权限的时候。爆这个错几乎只能在集群环境下重新编译。包括跑一些程序也是,本地编译放在集群上跑有时候也会爆这个错,所以最保险的还是放在集群环境下编译在集群环境下跑程序。


http://www.ppmy.cn/embedded/164972.html

相关文章

51单片机-定时器中断

1、使用定时器,该做哪些工作 初始化程序应完成如下工作: 对TMOD赋值,以确定T0和T1的工作方式。计算初值,并将其写入TH0、TL0或TH1、TL1。中断方式时,则对EA赋值,开发定时器中断。使用TR0或TR1置为&#x…

JavaScript如何深拷贝一个对象或数组?JSON.parse (JSON.stringify ()) 这种方法有什么局限性?

如何深拷贝一个对象或数组 啥是深拷贝 深拷贝就像是给一个东西(对象或者数组)做了个完全一样的“克隆体”。这个“克隆体”和原来的东西没有任何关联,你对“克隆体”做任何修改,都不会影响到原来的东西,反过来也一样…

PHP MySQL 读取数据

PHP MySQL 读取数据 引言 在Web开发中,PHP和MySQL是两个常用的技术。PHP是一种服务器端脚本语言,而MySQL是一个关系型数据库管理系统。两者结合,可以构建强大的动态网站。本文将详细介绍如何使用PHP和MySQL进行数据的读取操作。 PHP与MySQ…

git@ccc.coding.net: Permission denied (publickey).

在使用composer update时发生了以下错误 gitccc.coding.net: Permission denied (publickey). 这个错误通常是由于git没有通过ssh密钥认证,无法连接到远程仓库。 需要对ssh做一下配置。 检查本地是否有ssh密钥存在 ls -al ~/.ssh如果有id_rsa相关的内容&#xff…

【Python爬虫(46)】解锁分布式爬虫:实时数据处理的奥秘

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…

Docker 的安全配置与优化(一)

引言 在当今快速发展的云计算和 DevOps 时代,Docker 作为容器化技术的佼佼者,已经成为现代开发和运维的基石。它以其独特的优势,如环境隔离、快速部署、资源高效利用等,极大地改变了软件交付和运行的方式。在微服务架构中&#x…

Deepin(Linux)设置开机自动启动 MySQL

要在系统启动时自动启动 MySQL,可以通过配置 systemd 来实现。由于已经完成了 MySQL 的安装并且能够启动 MySQL 服务,接下来我们将创建一个 systemd 服务单元文件,让 MySQL 在系统启动时自动启动。 1. 创建 systemd 服务文件 首先&#xff…

设备唯一ID获取,支持安卓/iOS/鸿蒙Next(uni-device-id)UTS插件

设备唯一ID获取 支持安卓/iOS/鸿蒙(uni-device-id)UTS插件 介绍 获取设备唯一ID、设备唯一标识,支持安卓(AndroidId/OAID/IMEI/MEID/MacAddress/Serial/UUID/设备基础信息),iOS(Identifier/UUID),鸿蒙&am…