亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

torch / np einsum 內部到底是如何工作的

torch / np einsum 內部到底是如何工作的

慕碼人2483693 2023-07-18 15:24:41
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 timeimport torchfor 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))
查看完整描述

2 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

這可能與 GPU 可以并行計算a @ b.t(). 這意味著 GPU 實際上不必等待每個行列乘法計算完成即可計算下一個乘法。如果您檢查 CPU,您會發現它torch.diag(a @ b.t())torch.einsum('ij,ij->i',a,b) 大型ab.



查看完整回答
反對 回復 2023-07-18
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

我不能代表,但幾年前曾在一些細節上torch合作過。np.einsum然后它根據索引字符串構造一個自定義迭代器,僅執行必要的計算。從那時起,它以各種方式進行了重新設計,顯然將問題轉化為@可能的情況,從而利用了 BLAS(等)庫調用。


In [147]: a = np.arange(12).reshape(3,4)

In [148]: b = a


In [149]: np.einsum('ij,ij->i', a,b)

Out[149]: array([ 14, 126, 366])

我不能確定在這種情況下使用了什么方法。通過“j”求和,還可以通過以下方式完成:


In [150]: (a*b).sum(axis=1)

Out[150]: array([ 14, 126, 366])

正如您所注意到的,最簡單的方法dot創建一個更大的數組,我們可以從中拉出對角線:


In [151]: ([email protected]).shape

Out[151]: (3, 3)

但這不是正確的使用方法@。 通過提供高效的“批量”處理@進行擴展。np.dot所以i維度是批次一,也是j一dot。


In [152]: a[:,None,:]@b[:,:,None]

Out[152]: 

array([[[ 14]],


       [[126]],


       [[366]]])

In [156]: (a[:,None,:]@b[:,:,None])[:,0,0]

Out[156]: array([ 14, 126, 366])

換句話說,它使用 (3,1,4) 和 (3,4,1) 生成 (3,1,1),在共享大小 4 維度上進行乘積之和。


一些采樣時間:


In [162]: timeit np.einsum('ij,ij->i', a,b)

7.07 μs ± 89.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [163]: timeit (a*b).sum(axis=1)

9.89 μs ± 122 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [164]: timeit np.diag([email protected])

10.6 μs ± 31.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [165]: timeit (a[:,None,:]@b[:,:,None])[:,0,0]

5.18 μs ± 197 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)


查看完整回答
反對 回復 2023-07-18
  • 2 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號