PaddleOCR多机多卡分布式训练指南 | 基于Ubuntu18.04
一、项目背景
生僻字的fine-tune不能简单的使用几百个数据训练一下,这样会让之前学习到的忘掉。
怎么办呢,就只能加大数据量,在git上提了issue以后简单了解到了以下内容:
- 数据量要大 最少几百万条数据
- 对于生僻字的覆盖要均匀 每个字最少出现200次以上
- 场景尽量多样 可以做合成数据
于是我就用前面的博客写的生僻字数据集制作,简单做了40w数据。
我有两台2080,又没有办法把两个2080放在一个主板上,那么故事就开始了。
二、环境配置
-
首先要满足单机多卡或者单机单卡没有问题,这保证了你的paddle环境没有问题。 然后不同机器之间的代码、数据与运行命令或脚本需要保持一致。 所有主机要在相同的网段里面,最好连在1个路由器或者交换机上面,可以互相ping通。
上述要求都满足之后开始安装nccl,也是属于nvidia全家桶里面的一个东西。
下载地址:
请注意,一定要选择对应的cuda版本,我就是以为cuda版本都一样,一堆操作猛如虎
如果不确认可以用nvidia-smi命令查看cuda版本
安装也很简单
要选择本地安装的版本,比如我的cuda版本是10.2,对应好Ubuntu18的版本,那就选箭头所示的那个。网络版会重置安装你的显卡驱动和cuda,不建议用这个。
下载好了之后:
sudo dpkg -i nccl-local-repo-ubuntu1804-2.9.9-cuda11.0_1.0-1_amd64.deb
使用dpkg安装,这时候会出一个提示:
需要执行一下红框里面的这句话加入key,显示OK以后再执行上面dpkg安装的命令
只要setting up就可以了
下一步,安装libnccl前先更新一下
sudo apt update
再
sudo apt install libnccl2 libnccl-dev
这样就算安装好了,如果你不放心,可以用
sudo dpkg -l | grep nccl
看看有没有nccl
注意,所有参与训练的机器都需要安装paddle的环境和nccl.
三、paddle分布式训练
主要分为主机和从机,主机显示一些训练过程中loss,acc之类的训练日志,从机就傻傻的计算就好了。
先说从机:从机执行一个训练命令就可以了:
python -m paddle.distributed.launch --ips="192.168.51.27,192.168.51.26" --gpus="0" tools/train.py -c /home/nvidia/PaddleOCR/configs/rec/ch_ppocr_v2.0/rec_chinese_common_train_v2.0.yml
主要包含4部分:
-
paddle.distributed.launch 启动分布式训练 ips 参与训练的机器ip,注意谁在第一位谁就是主机,ip之间用逗号分割,注意先后次序要在每一台机器上执行的时候保持一致。 gpus 指定每台机器的显卡序号,多卡就是1,2,3这样指定 train.py 和 yml配置文件
从机启动命令之后会有如下内容打印出来:
注意看这个从机的启动命令与我上面说的稍有不同,其实没什么区别,就是python -m paddle.distributed.launch 换成了 fleetrun
方框里面的第一个1就是设备序号,因为我就两台主机,这个是从机,所以它是1.
到server listening on: xxxx successful. 的时候代表启动成功了,等待主机发出训练命令。
下面再看主机:
方框里面那个第一个位置变成了0 ,这是第1台设备,也是主机,当这个命令执行的时候从机就会刷出最后3条内容:确认设备顺序,算力情况,各依赖版本。
接着就是打印各机器的训练配置。然后开始训练。
四、重要补充
注意看红框那个位置,我第一次训练的时候主机卡到哪里就没下文了,并不报错,也不初始化数据集索引,解决办法是互换了主从机,让之前的从机作为主机,之前的主机作为从机。
还有就是我之前提到最好把训练的机器都放在一个路由器或者交换机下面,不要跨域,因为:
看看这恐怖的带宽。