首先我的报错是这样的:
Traceback (most recent call last):
File "/home/xaishu/桌面/dev_xiashu/cll_ocr/tools/train.py", line 199, in <module>
config, device, logger, vdl_writer = program.preprocess(is_train=True)
File "/home/xaishu/桌面/dev_xiashu/cll_ocr/tools/program.py", line 651, in preprocess
device = 'gpu:{}'.format(dist.ParallelEnv()
File "/home/xaishu/anaconda3/envs/cll_ocr/lib/python3.9/site-packages/paddle/distributed/parallel.py", line 781, in device_id
return self._device_id
AttributeError: 'ParallelEnv' object has no attribute '_device_id'
根据提供的错误信息,是在PaddlePaddle的分布式训练代码中出现了问题。具体来说,错误发生在第651行的dist.ParallelEnv()
调用,该调用返回的ParallelEnv
对象没有_device_id
属性。这个问题可能是由于PaddlePaddle库版本不兼容或代码逻辑错误导致的,于是我去查看了我的pip list:
paddleocr 2.6
paddlepaddle 2.6.0
paddlepaddle-gpu 2.6.0.post116
因为我的不算老版本。因此,这可能不是版本不兼容引起的问题。
于是我去查看了官方文档,文档显示在2.6.0及以上版本中,应使用dist.get_world_size()
代替dist.ParallelEnv().nranks
,并且应使用dist.get_rank()
代替dist.ParallelEnv().local_rank
。
下面是PaddlePaddle 2.6.0官方文档中get_world_size()
和get_rank()
的相关说明:
paddle.distributed.get_world_size()
获取全局并行训练的进程数。
返回值:int,表示全局并行训练的进程数。
说明:本函数只能在分布式训练环境下调用,否则将会抛出异常。
paddle.distributed.get_rank()
获取当前进程在全局并行训练中的全局唯一标识符。
返回值:int,表示当前进程在全局并行训练中的全局唯一标识符。
说明:本函数只能在分布式训练环境下调用,否则将会抛出异常。
所以我们可以知道在PaddlePaddle 2.6.0及以上版本中,ParallelEnv
对象不再具有_device_id
属性。取而代之的是,你应该使用dist.get_rank()
函数获取当前进程在全局并行训练中的唯一标识符。也就是用
else:
device = 'gpu:{}'.format(dist.get_rank()) if use_gpu else 'cpu'
替换掉
else:
device = 'gpu:{}'.format(dist.ParallelEnv()
.dev_id) if use_gpu else 'cpu'
这样就可以解决这个报错了,如果出现不能使用gpu的情况可以去我主页找一下相关方法,我也有记录的