首页 > 解决方案 > 关于 Python 中的多处理速度提升的问题

问题描述

我在处理多个视频的项目中工作,每个视频时长 1-2 小时,并且我可以使用 SLURM Worload Manager 访问高性能集群。程序的主要任务是跟踪对象并评估跟踪器的一些性能指标,这一切都使用 numpy 和 opencv 命令完成,并且仅在一个视频上运行时运行良好,大约 30 FPS。但是,我想在某种程度上并行运行评估以节省时间。我的代码的简化版本可能如下所示:

class Task:
    def __init__(videos):
        self.videos = videos
        self.object_tracker = ObjectTracker()

    def execute(self):
        jobs = []
        for video in self.videos:
            worker = VideoWorker(video=video, self.object_tracker)
            jobs.append(worker)
            worker.start()

        for j in jobs:
             j.join()

class VideoWorker(multiprocessing.Process):
    def __init__(self, video, object_tracker):
        self.video = video
        self.object_tracker = object_tracker

    def run(self):
        cap = cv2.VideoCapture(video.path_to_video)

        while cap.isOpened():
            frame = cap.read()
            objects, tracks = self.object_tracker.process_frame(frame)

            """
            ... Further processing involving numpy and cv2 methods 
            """
            logging.info("Accuracy: %.2f" % accuracy")

我没有包括在并行/串行处理之间切换的行,但这只是一些 if/else 语句。

我可以运行我的代码的方式:

当仅在一个节点上使用多处理时,我期待或希望获得类似的性能,因为这会为我简化一些事情(例如,我可以直接收集所有结果)。我的理解是,多处理会产生一个新的 python 进程并将其分配给一个空闲核心,并将必要的数据复制到为该新产生的进程保留的内存空间中。当处理能力似乎不是极限时,为什么这会慢得多?使用多处理时阻止我的评估循环运行得更快的时间在哪里?我很高兴得到一些澄清!

标签: pythonopencvmultiprocessingpython-multiprocessingslurm

解决方案


推荐阅读