我有一个张量x和 x.shape=(batch_size,10)
x.shape=(batch_size,10)
我想在所有元素中添加一个,并采取两种不同的操作
x=x+1
for i in range(0,batch_size): x[i]=x[i]+1
我通过这两个操作获得了相同的张量,但是当我调用 loss.backward() 时,(2)在反向传播中花费的时间比(1)多得多 .
loss.backward()
它们之间的区别是什么?
这是可以预料的 . 首先,前进也慢得多:使用 for 循环,Python向PyTorch发送以下请求 batch_size 次:
for
batch_size
获取 x 的 i 元素
x
i
加1
使用递增的值更新 x 的 i 元素
Python很慢 . 在第二版中,Python将单个消息"add 1 everywhere"调度到PyTorch . PyTorch比Python快得多(更不用说它能够加速GPU加速) . 这要归功于名为vectorization的技术,并不是特定于PyTorch,而是基本上所有Python(以及许多其他)数学包 .
其次,对于你的落后,PyTorch需要跟踪发生在 x 的所有操作并通过它们反向传播 . 在第一种情况下,它们是 batch_size ,在第二种情况下,只有一种 . 再次,矢量化获胜 .
1 回答
这是可以预料的 . 首先,前进也慢得多:使用
for
循环,Python向PyTorch发送以下请求batch_size
次:获取
x
的i
元素加1
使用递增的值更新
x
的i
元素Python很慢 . 在第二版中,Python将单个消息"add 1 everywhere"调度到PyTorch . PyTorch比Python快得多(更不用说它能够加速GPU加速) . 这要归功于名为vectorization的技术,并不是特定于PyTorch,而是基本上所有Python(以及许多其他)数学包 .
其次,对于你的落后,PyTorch需要跟踪发生在
x
的所有操作并通过它们反向传播 . 在第一种情况下,它们是batch_size
,在第二种情况下,只有一种 . 再次,矢量化获胜 .