gpt4 book ai didi

python - PyTorch RNN 使用 `batch_first=False` 时效率更高?

转载 作者:行者123 更新时间:2023-12-04 12:58:02 35 4
gpt4 key购买 nike

在机器翻译中,我们总是需要在注释和预测中切出第一个时间步(SOS 标记)。
使用时 batch_first=False ,切出第一个时间步仍然保持张量连续。

import torch
batch_size = 128
seq_len = 12
embedding = 50

# Making a dummy output that is `batch_first=False`
batch_not_first = torch.randn((seq_len,batch_size,embedding))
batch_not_first = batch_first[1:].view(-1, embedding) # slicing out the first time step
但是,如果我们使用 batch_first=True ,切片后,张量不再连续。我们需要先使其连续,然后才能进行 view等不同的操作.
batch_first = torch.randn((batch_size,seq_len,embedding))
batch_first[:,1:].view(-1, embedding) # slicing out the first time step

output>>>
"""
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-8-a9bd590a1679> in <module>
----> 1 batch_first[:,1:].view(-1, embedding) # slicing out the first time step

RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.
"""
这是否意味着 batch_first=False至少在机器翻译的背景下更好?因为它使我们免于执行 contiguous()步。有没有 batch_first=True的情况效果更好?

最佳答案

表现batch_first=True之间似乎没有太大区别和 batch_first=False .请看下面的脚本:

import time

import torch


def time_measure(batch_first: bool):
torch.cuda.synchronize()
layer = torch.nn.RNN(10, 20, batch_first=batch_first).cuda()
if batch_first:
inputs = torch.randn(100000, 7, 10).cuda()
else:
inputs = torch.randn(7, 100000, 10).cuda()

start = time.perf_counter()

for chunk in torch.chunk(inputs, 100000 // 64, dim=0 if batch_first else 1):
_, last = layer(chunk)

return time.perf_counter() - start


print(f"Time taken for batch_first=False: {time_measure(False)}")
print(f"Time taken for batch_first=True: {time_measure(True)}")
在我的设备 (GTX 1050 Ti) 上,PyTorch 1.6.0和 CUDA 11.0 结果如下:
Time taken for batch_first=False: 0.3275816479999776
Time taken for batch_first=True: 0.3159054920001836
(而且它以任何一种方式变化,所以没有定论)。
代码可读性 batch_first=True当你想使用其他需要 batch 的 PyTorch 层时更简单如 0第 th 维度(几乎所有 torch.nn 层都是这种情况,例如 torch.nn.Linear )。
在这种情况下,您必须 permute如果 batch_first=False 仍然返回张量被指定。
机器翻译
应该比 tensor更好一直是连续的,无需复制数据。使用 [1:] 切片看起来也更干净而不是 [:,1:] .

关于python - PyTorch RNN 使用 `batch_first=False` 时效率更高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63822152/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com