【问题标题】:How can I ensure repeatability while parallelizing a randomly seeded experiment?如何在并行化随机种子实验时确保可重复性?
【发布时间】:2019-03-13 12:35:58
【问题描述】:

我正在使用Mydia 从视频中提取随机帧。因为我有很多视频,所以我想在保持可重复性的同时并行化这个工作流程。 mydia.Videos 接受随机种子,这对于确保可重复性很重要。现在我需要处理并行化部分。

给定 n 视频和随机种子 r,我如何确保每个视频的提取帧相同,而不管工人数量如何?我对算法组件特别感兴趣,不一定是代码。

我最初的想法是使用multiprocessing.Pool。但是,如果进程的完成时间不确定,那么在对帧进行采样时就会出现竞争条件;即,如果 proc 1 花费的时间比 proc 0 长,则来自 Videos 类的采样帧将不同于 proc 0 花费的时间比 proc 1 长的情况。

【问题讨论】:

  • 直观地说:破解该库不使用np.random.seed(random_state) + np.random.rand(),而是使用r = np.random.RandomState(17) + r.rand()。含义:每个工人一个 PRNG。不知道为什么不经常这样做。 PRNG 污染似乎是一件事(我认为 Jupyter/ipython 过去在它的 gui 中做到了)。
  • @sascha 可以肯定的是,子进程将维护np.random.RandomState - 这如何确保乱序处理仍然以相同的顺序采样?很抱歉,如果这很明显,但我无法理解它。

标签: python-3.x algorithm random multiprocessing


【解决方案1】:

我的解决方案有点不正统,因为它是特定于库的。 Mydia 允许传递帧以代替强制Videos 客户端直接采样。这使我有机会预先计算要在父进程中采样的帧。通过这样做,我可以通过用这些帧实例化一个新的Videos 来“模拟”子进程中的随机性。例如:

class MySampler:
   def __init__(self, input_directory: Path, total_frames: int, num_frames: int, fps: int):
       self.input_directory = Path(input_directory)

       self.frames_per_video = [
            self.__get_frame_numbers_for_each_video(total_frames, num_frames, fps)
            for _ in self.input_directory.glob("*.mp4")
        ]

    @staticmethod
    def get_reader(num_frames: int, frames: List[int]):
        # ignores the inputs and returns samples the frames that its constructed with
        return Videos(target_size=(512, 512), num_frames=num_frames, mode=lambda *_: frames)

然后我可以简单地并行化:

   def sample_frames(self, number_of_workers: int):
        pool = Pool(processes=number_of_workers)    
        videos = list(self.input_directory.glob("*.mp4"))

        pool.starmap_async(self.read_video, zip(self.frames_per_video, videos))    

        pool.close()
        pool.join()

其中read_video 是调用get_reader 并进行读取的方法。

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2015-06-30
    • 2015-07-14
    相关资源
    最近更新 更多