PyTorch 多处理:访问共享模型时是否需要使用 Lock()?

Fed*_*hin 7 reinforcement-learning python-multiprocessing pytorch

我有一些关于使用torch.multiprocessing模块的问题。假设我有一个torch.nn.Module电话model,我打电话model.share_memory()给它。

如果两个线程同时调用forward(), 即会发生什么情况model(input)?安全吗?或者我应该使用锁定机制来确保model多个线程不会同时访问?类似地,如果两个或多个线程有一个优化器工作model.parameters()并且它们同时调用会发生什么optimizer.step()

我问这些问题是因为我经常看到在optimizer.step()没有锁定机制的共享模型上被调用(即在 A3C 或 ACER 的 RL 实现中),我想知道这样做是否安全。

And*_*uib 1

它不一定是安全的,因为它们是异步运行的,而不是并行运行的。引用文档

使用 torch.multiprocessing,可以 异步训练模型,参数可以一直共享,也可以 定期同步。在第一种情况下,我们建议发送整个模型对象,而在后一种情况下,我们建议仅发送 state_dict()。