解决paddleocr报错之AttributeError: ‘ParallelEnv‘ object has no attribute ‘_device_id‘

首先我的报错是这样的:

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的情况可以去我主页找一下相关方法,我也有记录的

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值