Pytorch多进程Queue通信产生Segmentation fault (core dumped)——解决方案及代码规范

在Pytorch多进程强化学习项目中,作者遇到Queue通信导致的Segmentation fault (core dumped)问题。通过排查发现,错误源于未正确处理Queue中的Tensor数据,导致内存耗尽。解决方案是遵循官方文档建议,及时释放消费者进程中的内存,保持生产者进程运行,避免直接使用接收到的tensor。
摘要由CSDN通过智能技术生成

最近在做一个强化学习的项目,运用多进程分布训练时遇到了段错误的问题,这里记录下解决的过程思路和方案。

由于智能体与环境交互的过程涉及到了第三方的程序以及大量的文件读写操作,使得整个实验过程非常慢,为了解决交互部分的速度瓶颈,采用Ape-X( Distributed Prioritized Experience Replay)的分布式训练思路,即多个actor负责与环境交互,得到的交互数据存储到公共replay memory中,一个leaner负责从memory中抽样训练更新网络。

由于Pytorch在多进程方面的封装较好,我采用torch.multiprocessing包来实现多进程,并通过其中的Queue队列来实现进程间通信,也就是actor将交互数据发送给learner。主要代码结构简化如下:

def actor(q):
    # 创建环境
    ...
    while True:
        # 获取交互数据 batch 类型为Tensor
        ...
        q.put(batch)

def learner(q)
    # 创建memory
    memory = Memory()
    ...
    while True:
        batch = q.get() # <--- *** 产生 SegFault的地方 ***
        memory.push(batch) 
        update_model()

if __name__ == '__main__':
    # 创建模型、优化器等
    model = DQN()
    model.share_memory()
    ...

   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值