在下面的示例中,我在GPU上分配了模型和张量。它是全局可见的。我不希望子进程必须复制数据,而且我也不知道为什么需要这样做,因为在设备存储空间中传递地址就足够了。 (吞吐量非常重要,如果每个孩子每收到一个请求就复制数据,则将花费太多时间)。但是,当我发送请求时,我可以看到(使用nvidia-smi
,孩子在分配自己的d0_model
和d0_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数据,因为这会带来不必要的开销和分配时间。
是否要使工作进程(或线程,如果无法使用进程,则使线程)和子进程共享GPU分配的数据?
如果我的第一个问题的答案是“否”,那么有没有办法预分配每个孩子的名字。他们不必花时间在GPU上分配模型和张量(每个孩子都有模型和张量的唯一副本,但是他们在第一次生成时就已经分配了它,并一直保持到收到请求为止)?