【问题标题】:Transmit informations back and forth in pyton multiprocessing using shared arrays使用共享数组在 python 多处理中来回传输信息
【发布时间】:2021-04-25 11:03:06
【问题描述】:

我正在测试一种使用多处理加速“高级”计算的方法。 这个想法是让多个进程(我们称它们为G)执行同一任务T的不同执行。这可能是一项漫长的任务(玩整个棋盘游戏),最终会返回一些结果。它可以是异步的,我已经知道如何使用 multiprocessingapply_async 收集所有结果。

但是,在某些时候,T 需要调用 GPU 函数。我的想法是创建另一个进程 S 作为服务,从注册的 Gs 收集数据,在收集的数据上调用 GPU 函数(tensorflow NN 评估)(同时将 Gs 停止)并将结果“发送”回所有相应的 Gs。

我看了How do I make processes able to write in an array of the main program?的答案。但是,这里的不同之处在于,聚会不仅仅发生在任务结束时。

你认为这可能吗?我还尝试了使用 ctypes 和 OpenMP 的不同方法,但均未成功。

这是我想做的伪代码:

shared_service = Service()

class Worker():
    def __init__(self):
       shared_service.register(self)
       ...

    def run(self):
       finished = False
       while (not finished):
            ... do my stuff ...
            ... gather data to "send" to GPU ...
            shared_service.request(data, self.callback)
            ... wait for result ...
            ... use result ...
            ... do more stuff ...
    def callback(self, result):
        ... store result ...

class Service():
    ...
    def register(self, o):
        ... register new "client" ...

    def request(self, o, data):
        ... add request to current buffer(and keep track of requester)...

    def run(self):
        while(True):
            ... wait for full buffer ...
            ... call GPU function ...
            ... dispatch results to "clients" ...

main:
  ... init one "Service" ...
  ... init N "Worker" ...

  ... run N Workers asynchronously ...

感谢您的帮助!

【问题讨论】:

    标签: python multiprocessing gpu data-sharing


    【解决方案1】:

    GPU 底层架构的工作方式是,其内部的所有内核都执行相同的指令,但在数据数组的不同部分。另一个重要的架构特性是将 CPU 内存复制到 GPU 内存,供 GPU 用于完整执行内核(一系列指令),然后将结果复制回 CPU 以执行任何操作。

    所以你很可能

    1. 仅针对 GPU 执行单个唯一任务,无论您如何编写更高层并等待其执行的全部持续时间(即使某些并行代码提前完成)
    2. 调用tensorflow API 并让它处理所有 GPU 管理(或您选择的任何 API)
    3. 使用内置的async(找到here)而不用担心GPU,而是获得多处理器环境的好处(取决于实际的任务)

    【讨论】:

    • 嗨。事实上,我知道 GPU 是瓶颈,它必须要计算所有 CPU 的数据。尽管如此,并行化这些 CPU 工作仍然是提高执行时间的一种方法。此外,如果没有并行工作,同样的情况也会发生:GPU 是瓶颈。但是,调用 tf GPU 操作并不比仅一批 64 个 64*N(N 是并行 cpu 工作人员的数量)长得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2023-03-10
    • 2020-11-13
    • 1970-01-01
    • 2021-03-19
    • 2022-10-15
    相关资源
    最近更新 更多