为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 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 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信