Python多处理-无抓取GPU

Python多处理-无抓取GPU,python,multiprocessing,Python,Multiprocessing,我并行运行一个函数,每个工人都可以访问一个id为0或1的GPU def f(GPU_id, arg): # Select GPU to use. os.environ["CUDA_VISIBLE_DEVICES"]=str(GPU_id) # Do something with arg. 假设我想计算arg=[1,2,3,4] from multiprocessing import Pool p = Pool(2) for arg in [[1, 2], [3, 4]

我并行运行一个函数,每个工人都可以访问一个id为0或1的GPU

def f(GPU_id, arg):
    # Select GPU to use.
    os.environ["CUDA_VISIBLE_DEVICES"]=str(GPU_id)
    # Do something with arg.
假设我想计算
arg=[1,2,3,4]

from multiprocessing import Pool

p = Pool(2)
for arg in [[1, 2], [3, 4]]:
    # Call the function in parallel on GPU 0 and 1
    p.starmap(f, zip([0, 1], arg))
但是现在,我想异步运行它(不确定这是否是正确的术语),这意味着工作人员不会等到其他人完成任务后再进入下一个任务。因此,工作者需要保留GPU_id并从列表中获取下一个参数


有什么办法吗?

您面临的问题是每个进程必须存储它应该使用的GPU。目前,通过压缩,您可以手动选择在哪个GPU上处理哪个参数。这反过来会导致一些进程等待其他进程,因为它们被分配到同一个GPU

解决此问题的方法是在使用map函数之前为每个CPU分配一个GPU ID。在这种情况下,您不需要手动压缩GPU ID,而是让多处理模块处理调度

为进程分配GPU ID可以通过查找当前CPU ID,然后使用映射获得相应的GPU ID来完成。为此,我们将使用函数获取当前进程。获取进程后,我们需要获得一个唯一标识符,用于将CPU ID映射到GPU ID。这可以使用属性完成。如果您阅读了文档,据说如果没有手动设置名称,所有进程都将被分配一个名称,其形式为
进程-
。因此,我们可以从进程名中提取ID,并使用它来获得唯一的GPU标识符

工作示例
打印
[3,5,7,10]
意味着每个进程都被分配到自己的GPU标识符。

只是为了让其他人可以找到:我对TensorFlow模型运行网格搜索/交叉验证。每次运行都是独立的,并且在单个GPU上运行。此部分将TensorFlow限制为单个GPU:
os.environ[“CUDA\U可见\U设备”]=str(GPU\U id)
。有了eozd的答案,工人在完成旧任务后立即开始下一组参数。我不明白是哪一部分真正使GPU上发生了一些事情,而不是默认的CPU?
import multiprocessing

# can also be a dictionary
gpu_id_list = [3, 5, 7, 10]


def function(x):
    cpu_name = multiprocessing.current_process().name
    cpu_id = int(cpu_name[cpu_name.find('-') + 1:]) - 1
    gpu_id = gpu_id_list[cpu_id]

    return x * gpu_id


if __name__ == '__main__':
    pool = multiprocessing.Pool(4)
    input_list = [1, 1, 1, 1]
    print(pool.map(function, input_list))