【 torch.multiporcessing】附带强化学习多进程例子

torch.multiporcessing

import torch.multiporcessing as mp

mp.set_start_method('spawn', force=True)

选择进程的启动方法。
在 Unix 上通过 spawn 和 forkserver 方式启动多进程会同时启动一个 资源追踪 进程,负责追踪当前程序的进程产生的、并且不再被使用的命名系统资源(如命名信号量以及 SharedMemory 对象)。当所有进程退出后,资源追踪会负责释放这些仍被追踪的的对象。通常情况下是不会有这种对象的,但是假如一个子进程被某个信号杀死,就可能存在这一类资源的“泄露”情况。(泄露的信号量以及共享内存不会被释放,直到下一次系统重启,对于这两类资源来说,这是一个比较大的问题,因为操作系统允许的命名信号量的数量是有限的,而共享内存也会占据主内存的一片空间)

要选择一个启动方法,你应该在主模块的 if name == ‘main’ 子句中调用 set_start_method() 。reference

mp.Process(target= ,args=)

mp.Process创建多进程, target代表要运行的函数,args代表这个函数要输入的参数。

p = mp.Process(target= args=)
p.start()

开始运行进程中(Process)的代码

p.join()

主进程等待所有子进程执行完毕

mp.Manager()

共享进程间数据
共享的内容支持list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value ,Array等多种格式。reference

举个例子:

manager = mp.Manager()
shared_list = manager.list()  #共享的是list
shared_dict = manager.dict()  #共享的是dict

Examples

  • 通过多进程的强化学习算法
    强化学习中有两个部分可以使用多进程,一是采集数据,二是训练数据。
    参考:代码
import torch.multiprocessing as mp

def worker():
  ...省略

def train():
  ...省略

if __name__=='__main__':
   mp.set_start_method('spawn')

   processes = []  #初始化一个进程列表,把进程都append里面
   manager = mp.Manager()  #实例化一个可以进程间共享参数的类
   #这些未来的进程中需要共享内容()以下都是
   train_modes = manager.list()
   n_iters = manager.list()
   curr_env_steps = manager.list()
   ToM_count = manager.list()
   ToM_history = manager.list()
   Policy_history = manager.list()
   step_history = manager.list()
   loss_history = manager.list()

    # 创建args.workers个多进程,采集数据,就是让智能体在不同环境中交互
   for rank in range(0, args.workers):
       p = mp.Process(target=worker, args=(rank, args, shared_model, train_modes, n_iters, curr_env_steps, ToM_count, ToM_history, Policy_history, step_history, loss_history))

       # 参数的初始化
       train_modes.append(args.train_mode)
       n_iters.append(0)
       curr_env_steps.append(args.env_steps)
       ToM_count.append(0)
       ToM_history.append([])
       Policy_history.append([])
       step_history.append([])
       loss_history.append([])

       # 启动当前进程
       p.start()
       processes.append(p)
       time.sleep(args.sleep_time)

   if args.workers > 0:
       # 在创建一个进程,用来训练
       p = mp.Process(target=train, args=(args, shared_model, optimizer_Policy, optimizer_ToM, train_modes, n_iters, curr_env_steps, ToM_count, ToM_history, Policy_history, step_history, loss_history))
       p.start()
       processes.append(p)
       time.sleep(args.sleep_time)

   # 结束语
   for p in processes:
       time.sleep(args.sleep_time)
       p.join()
  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值