PyTorch CUDA:"to(device)" vs "device=device" 张量?

PyTorch CUDA: "to(device)" vs "device=device" for tensors?

我在这里 What is the difference between model.to(device) and model=model.to(device)? 发现了一个有点类似的问题,但我想再次检查是否同样适用于我的示例:

  1. 使用.to(self.device)
mask = torch.tril(torch.ones(len_q, len_k)).type(torch.BoolTensor).to(self.device)`

  1. 使用device=self.device
mask = torch.tril(torch.ones((trg_len, trg_len), device = self.device)).bool()

他们是否都在完成同一件事 - 确保 mask 进入 GPU?

torch.Tensor.to 函数将在目标设备上复制您的张量。在初始化时设置 device 选项会将其放置在初始化时,因此不涉及复制。

所以在你的情况下你宁愿这样做:

>>> mask = torch.tril(torch.ones(len_q, len_k), device=self.device)

但是为了回答您的问题,两者都具有将 mask 放在 self.device 上的效果。唯一的区别是,在前者中,您将在两台设备上都有一份数据副本。


对于 torch.Tensor.bool vs.dtype 初始化也是如此:

>>> torch.randint(0, 1, (10,)).bool()

将复制,而以下不会:

>>> torch.randint(0, 1, (10,), dtype=torch.bool)

但是,torch.tril 没有提供 dtype 选项,因此这里不相关。