第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

torch / np einsum 內(nèi)部到底是如何工作的

torch / np einsum 內(nèi)部到底是如何工作的

慕碼人2483693 2023-07-18 15:24:41
torch.einsum這是有關(guān)GPU內(nèi)部工作的查詢。我知道如何使用einsum。它是執(zhí)行所有可能的矩陣乘法,然后只選擇相關(guān)的矩陣乘法,還是僅執(zhí)行所需的計算?例如,考慮形狀 的兩個張量a和,我希望找到形狀的每個相應(yīng)張量 的點積。使用einsum,代碼為:b(N,P)ni(1,P)torch.einsum('ij,ij->i',a,b)在不使用 einsum 的情況下,獲取輸出的另一種方法是:torch.diag(a @ b.t())現(xiàn)在,第二個代碼應(yīng)該比第一個代碼執(zhí)行更多的計算(例如, if N= 2000,它執(zhí)行2000更多的計算)。然而,當我嘗試對這兩個操作進行計時時,它們完成所需的時間大致相同,這就引出了一個問題。是否einsum執(zhí)行所有組合(如第二個代碼),并挑選出相關(guān)值?要測試的示例代碼: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條經(jīng)驗 獲得超4個贊

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



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

TA貢獻1865條經(jīng)驗 獲得超7個贊

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


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創(chuàng)建一個更大的數(shù)組,我們可以從中拉出對角線:


In [151]: (a@b.T).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(a@b.T)

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)


查看完整回答
反對 回復(fù) 2023-07-18
  • 2 回答
  • 0 關(guān)注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號