如何使用 numpy einsum_path 结果?

我正在使用 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 告诉我的内容?


一只甜甜圈
浏览 181回答 2
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计算。问题的大小将决定它的时间是总时间的一小部分还是大部分。

HUWWW

从源代码Theoretical Speedup = speedup = naive_cost / opt_costnaive_cost = _flop_count(idx_contract, idx_removed, len(input_sets), idx_dict)因此,从这一点来看,要加快该过程,您需要降低FLOPS(每秒浮点运算)。由于朴素成本是未优化表达式的成本,因此您需要以这样一种方式重写您的表达式,即删除与表达式相关的任何“垃圾”,同时在不更改表达式的基础结构的情况下离开。从你的问题来看,你正在做一些复杂的表达,这可能是不可能的。但是要回答你的问题,尝试重写你的表达式是一种更紧凑的方式,以获得较低的理论加速。您可以尝试使用不同的路径来降低您的 FLOPS。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python