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

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

如何使用 numpy einsum_path 結果?

如何使用 numpy einsum_path 結果?

一只甜甜圈 2021-10-26 18:46:16
我正在使用 numpy einsum 對一些 3 維和 4 維張量執行相當復雜的操作。我的實際代碼是np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)這就是我想要它做的。使用 einsum_path,結果是:>>> path = np.einsum_path('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)>>> print(path[0])['einsum_path', (0, 1), (0, 3), (0, 1), (0, 1)]>>> print(path[1])  Complete contraction:  oij,imj,mjkn,lnk,plk->op         Naive scaling:  8     Optimized scaling:  5      Naive FLOP count:  2.668e+07  Optimized FLOP count:  1.340e+05   Theoretical speedup:  199.136  Largest intermediate:  7.700e+02 elements--------------------------------------------------------------------------scaling                  current                                remaining--------------------------------------------------------------------------   4                imj,oij->moj                     mjkn,lnk,plk,moj->op   5               moj,mjkn->nok                          lnk,plk,nok->op   4                plk,lnk->npk                              nok,npk->op   4                 npk,nok->op                                   op->op這表明理論加速約為 200 倍。我怎樣才能使用這個結果來加速我的代碼?我如何“實施” einsum_path 告訴我的內容?
查看完整描述

2 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

做一些時間測試


path = np.einsum_path('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi)


np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=False)

np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=True)         

np.einsum('oij,imj,mjkn,lnk,plk->op',phi,B,Suu,B,phi, optimize=path[0])

在我的測試中,第二個 2 以相同的速度運行。對于小問題optimize=False更快,大概是因為分析和重新排列需要時間。對于大問題,理論加速比更大,實際加速比True可能大于理論。據推測,內存管理正在減緩這種False情況。


該theoretical speedup就是這樣,僅僅基于一個估計FLOPS計數。只有當 FLOPS 在計算中占主導地位時,這才是正確的。


你也可以計時path計算。問題的大小將決定它的時間是總時間的一小部分還是大部分。


查看完整回答
反對 回復 2021-10-26
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

從源代碼


Theoretical Speedup = speedup = naive_cost / opt_cost

naive_cost = _flop_count(idx_contract, idx_removed, len(input_sets), idx_dict)

因此,從這一點來看,要加快該過程,您需要降低FLOPS(每秒浮點運算)。由于樸素成本是未優化表達式的成本,因此您需要以這樣一種方式重寫您的表達式,即刪除與表達式相關的任何“垃圾”,同時在不更改表達式的基礎結構的情況下離開。


從你的問題來看,你正在做一些復雜的表達,這可能是不可能的。但是要回答你的問題,嘗試重寫你的表達式是一種更緊湊的方式,以獲得較低的理論加速。


您可以嘗試使用不同的路徑來降低您的 FLOPS。


查看完整回答
反對 回復 2021-10-26
  • 2 回答
  • 0 關注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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