Celery:使工作进程和子进程(或线程)共享GPU分配的数据

时间:2019-02-23 03:29:35

标签: python celery pytorch

在下面的示例中,我在GPU上分配了模型和张量。它是全局可见的。我不希望子进程必须复制数据,而且我也不知道为什么需要这样做,因为在设备存储空间中传递地址就足够了。 (吞吐量非常重要,如果每个孩子每收到一个请求就复制数据,则将花费太多时间)。但是,当我发送请求时,我可以看到(使用nvidia-smi,孩子在分配自己的d0_modeld0_in_tensor

app = Celery('tasks', backend='rpc://', broker='pyamqp://guest@localhost//')

# allocate model and weight on the GPU
d0_model = nn.Conv1d(in_channel, 10, kernel_size).to("cuda:0")
d0_in_tensor = torch.randn(batch, in_channel, out_channel).to("cuda:0")

# task using the model and weight
@app.task
def torch_conv1d(gpu):
    if gpu == 0:
        return d0_in_tensor

我不想让我的孩子复制工作人员的GPU数据,因为这会带来不必要的开销和分配时间。

  1. 是否要使工作进程(或线程,如果无法使用进程,则使线程)和子进程共享GPU分配的数据?

  2. 如果我的第一个问题的答案是“否”,那么有没有办法预分配每个孩子的名字。他们不必花时间在GPU上分配模型和张量(每个孩子都有模型和张量的唯一副本,但是他们在第一次生成时就已经分配了它,并一直保持到收到请求为止)?

0 个答案:

没有答案