Python 我的行为很奇怪
尝试使用mpi4py在多个进程中加载pickle。以下是我拥有的大部分时间都运作良好的产品:Python 我的行为很奇怪,python,mpi,pickle,Python,Mpi,Pickle,尝试使用mpi4py在多个进程中加载pickle。以下是我拥有的大部分时间都运作良好的产品: for ix in range(len(frames)): if comm.rank == 0: frame = frames[ix] logging.debug("{0}: doing stuff, frame {1}".format(comm.rank,frame)) W, nodes = pickle.load(open(os.path.jo
for ix in range(len(frames)):
if comm.rank == 0:
frame = frames[ix]
logging.debug("{0}: doing stuff, frame {1}".format(comm.rank,frame))
W, nodes = pickle.load(open(os.path.join(args.network_dir, '{0}.pkl'.format(frame))))
freqs = np.random.normal(0., 5.*np.pi/180., size = len(W))
else:
W = None
nodes = None
freqs = None
comm.Barrier()
W = comm.bcast(W, root = 0)
nodes = comm.bcast(nodes, root = 0)
freqs = comm.bcast(freqs, root = 0)
comm.Barrier()
但它会可靠地卡在广播步骤上。所有进程的freqs必须相同,因此必须由一个进程生成。我可以让每个人自己装泡菜,就像:
for ix in range(len(frames)):
frame = frames[ix]
logging.debug("{0}: doing stuff, frame {1}".format(comm.rank,frame))
W, nodes = pickle.load(open(os.path.join(args.network_dir, '{0}.pkl'.format(frame))))
if comm.rank == 0:
freqs = np.random.normal(0., 5.*np.pi/180., size = len(W))
else:
freqs = None
# broadcast and stuff
但是每个人都装了不同的泡菜!那是不应该发生的,对吧?每个进程都应该在ix=0时进入循环,对吗
非常感谢您的帮助。我不是python专家,但有几点一般性意见。首先,您需要确保每个进程调用广播的次数相同:“for”循环是否保证每个进程上的迭代次数相同?第二,在广播之前或之后,您都不需要障碍物:广播(与所有集体广播一样)确保自动完成所需的任何同步。是的。for循环应该保证每个进程都有相同的迭代,这就是为什么对于第二个选项,每个人都在不同的框架中出现,这确实令人困惑。我会在广播结束后简单地设置一个障碍,看看这是否有帮助。请提供一个更清晰的观察到的行为描述。一个明显的错误是,
帧
在每个级别上不相等。我不是python专家,但有一些一般性的评论。首先,您需要确保每个进程调用广播的次数相同:“for”循环是否保证每个进程上的迭代次数相同?第二,在广播之前或之后,您都不需要障碍物:广播(与所有集体广播一样)确保自动完成所需的任何同步。是的。for循环应该保证每个进程都有相同的迭代,这就是为什么对于第二个选项,每个人都在不同的框架中出现,这确实令人困惑。我会在广播结束后简单地设置一个障碍,看看这是否有帮助。请提供一个更清晰的观察到的行为描述。一个明显的错误是,帧
在每个秩上不相等。