torch.einsum这是有关GPU内部工作的查询。我知道如何使用einsum。它是执行所有可能的矩阵乘法,然后只选择相关的矩阵乘法,还是仅执行所需的计算?
例如,考虑形状 的两个张量a和,我希望找到形状的每个相应张量 的点积。使用einsum,代码为:b(N,P)ni(1,P)
torch.einsum('ij,ij->i',a,b)
在不使用 einsum 的情况下,获取输出的另一种方法是:
torch.diag(a @ b.t())
现在,第二个代码应该比第一个代码执行更多的计算(例如, if N= 2000,它执行2000更多的计算)。然而,当我尝试对这两个操作进行计时时,它们完成所需的时间大致相同,这就引出了一个问题。是否einsum执行所有组合(如第二个代码),并挑选出相关值?
要测试的示例代码:
import time
import torch
for i in range(100):
a = torch.rand(50000, 256).cuda()
b = torch.rand(50000, 256).cuda()
t1 = time.time()
val = torch.diag(a @ b.t())
t2 = time.time()
val2 = torch.einsum('ij,ij->i',a,b)
t3 = time.time()
print(t2-t1,t3-t2, torch.allclose(val,val2))
SMILET
莫回无
相关分类