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)? 发现了一个有点类似的问题,但我想再次检查是否同样适用于我的示例:
- 使用
.to(self.device)
mask = torch.tril(torch.ones(len_q, len_k)).type(torch.BoolTensor).to(self.device)`
和
- 使用
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
选项,因此这里不相关。
我在这里 What is the difference between model.to(device) and model=model.to(device)? 发现了一个有点类似的问题,但我想再次检查是否同样适用于我的示例:
- 使用
.to(self.device)
mask = torch.tril(torch.ones(len_q, len_k)).type(torch.BoolTensor).to(self.device)`
和
- 使用
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
选项,因此这里不相关。