代码之家  ›  专栏  ›  技术社区  ›  erip Jigar Trivedi

如何确保并行化随机种子实验时的可重复性?

  •  3
  • erip Jigar Trivedi  · 技术社区  · 6 年前

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

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

    我最初的想法是 multiprocessing.Pool . 然而,如果进程的完成时间是不确定的,则在对帧进行采样时将存在竞争条件;i、 例如,如果proc1花费的时间比proc0长,则 Videos 类将不同于过程0比过程1花费的时间。

    1 回复  |  直到 6 年前
        1
  •  1
  •   erip Jigar Trivedi    6 年前

    我的解决方案有点不合常规,因为它是特定于库的。Mydia允许传递帧以提取,而不是强制 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 做阅读。