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()