PaddleOCR 使用总结二:服务器单机多卡训练报错

1,016 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 ————————————————————————————————————————————————————————

1、问题阐述

使用PaddleOCR在服务器上进行单机多卡训练时,发现会报错,报错信息如下所示。

W0111 17:25:32.685145 56257 dynamic_loader.cc:207] You may need to install ‘nccl2’ from NVIDIA official website: developer.nvidia.com/nccl/nccl-d… install PaddlePaddle. Traceback (most recent call last): File “tools/train.py”, line 114, in main(config, device, logger, vdl_writer) File “tools/train.py”, line 47, in main dist.init_parallel_env() File “/home/disk0/zw/anaconda3/envs/paddle/lib/python3.7/site-packages/paddle/distributed/parallel.py”, line 181, in init_parallel_env parallel_helper._init_parallel_ctx() File “/home/disk0/zw/anaconda3/envs/paddle/lib/python3.7/site-packages/paddle/fluid/dygraph/parallel_helper.py”, line 42, in _init_parallel_ctx parallel_ctx__clz.init() RuntimeError: (PreconditionNotMet) The third-party dynamic library (libnccl.so) that Paddle depends on is not configured correctly. (error code is libnccl.so: cannot open shared object file: No such file or directory) Suggestions:

Check if the third-party dynamic library (e.g. CUDA, CUDNN) is installed correctly and its version is matched with paddlepaddle you installed. Configure third-party dynamic library environment variables as follows: Linux: set LD_LIBRARY_PATH by export LD_LIBRARY_PATH=... Windows: set PATH by set PATH=XXX; (at /paddle/paddle/fluid/platform/dynload/dynamic_loader.cc:234)

2、问题分析

错误的原因很明显,程序在运行过程中找不到nccl相关组件,那么GPU之间的信息是无法沟通的,所以自然就无法进行单机多卡训练,那么我们首先要确认服务器上有没有安装nccl组件。

默认情况下,nccl组件安装在 /usr/local/cuda-version,首先去这里看看有没有nccl相关组件,如果这里没有再去 /usr/lib/x86_64-linux-gnu,看看这里有没有 libnccl.so 文件,如果最后确定是没有装nccl组件,那么就直接上手装即可,如果有的话那么直接配置一下文件即可(这里放到第四部分——添加环境变量讲)。

3、nccl库安装

因为nvidia官方网站容易登不上,并且下载文件时需要注册账号,较为麻烦,所以这里我们直接利用git,将其在github上的文件clone到服务器上,这里需要执行下面的命令。需要注意的,在服务器上,通常我们所使用的是非root账户,一些权限我们是没有的,所以为了方便,我们直接将ncll库clone自己的路径下: /home/user-name

$ git clone https://github.com/NVIDIA/nccl

执行下面的命令进入nccl文件夹

$ cd nccl

接下来便是安装nccl了,README文档中提供了三种安装方式。

1、直接安装,适用于CUDA_HOME路径为默认路径的情况

$ make -j src.build

2、指定CUDA_HOME安装,适用于CUDA_HOME路径非默认路径的情况

$ make src.build CUDA_HOME=<path to cuda install>

3、自定义安装,根据服务器的显卡架构和算力配置NVCC_GENCODE参数,这样可以使得安装后整个文件较小

$ make -j src.build NVCC_GENCODE="-gencode=arch=compute_70,code=sm_70"

因为我们的账户是非root账户,并且为了避免因为配置参数出错导致的各种问题,我们可以采取下面的安装命令,需要注意的是,我在自己的根目录下又建立了 software 文件夹,将 nccl 安装在 software 文件夹下。

make -j src.build BUILDDIR=/home/user-name/software/nccl CUDA_HOME=/usr/local/cuda-version

在之后的安装过程中如果没有什么错误信息(例如:failed……),那么证明我们的安装过程是正确的,没有问题的,到这里nccl的安装就结束了。

4、添加环境变量

/home/user-name 下面有文件 .bashrc ,执行下面的命令

$ vim ~/.bashrc

打开 .bashrc 文件后,直接到最后一行,在 # <<< conda initialize <<< 下面添加下面的内容,如果自己可以找到nccl的相关文件,可以直接将其按下面的方式配置文件即可,不必再次安装

# 此语句是为了初始化自己的环境,看自己需要决定是否添加
export PATH="/home/user-name/miniconda3/bin:$PATH"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/user-name/software/nccl/lib
export PATH=$PATH:/home/user-name/software/nccl/bin

添加完上述内容之后,保存、退出文件,再执行下面的命令,使得配置生效

source ~/.bashrc

到此,nccl的安装和配置全部完成,可以运行服务器单机多卡训练程序,测试nccl是否安装成功,对于PaddleOCR,可以直接运行下面的命令,注意要进入自己的工程目录 /PaddleOCR 中,并且激活自己配置好的环境

python -m paddle.distrbuted.launch --gpus '0,1,2,3' tools/train.py -c config/det/det_r50_vd_db.yml

参考文献

1、Linux下NCCL源码编译安装 - chenzhen0530 - 博客园 (cnblogs.com)

2、You may need to install ‘nccl2‘ from NVIDIA official website_修炼之路的博客-CSDN博客

3、DistributedDataParallel - 简书 (jianshu.com)

4、服务器linux环境下Horovod安装 - whcsrl_技术网

5、GitHub - NVIDIA/nccl: Optimized primitives for collective multi-GPU communication