【问题标题】:Numpy Einsum Path Differences and the Optimize ArgumentNumpy Einsum 路径差异和优化参数
【发布时间】:2018-03-13 20:10:07
【问题描述】:

我有以下张量执行,

np.einsum('k,pjqk,yzjqk,yzk,ipqt->it', A, B, C, D, E)

我注意到,当“z”或“q”在维度上扩展时,执行时间确实会受到影响,尽管我的直觉是它可能不应该那么糟糕——也许这是我可以手动优化的输入表单张量收缩。

经过一番挖掘,我发现优化有两种模式:“最优”和“贪婪”。如果我分别针对两种模式评估我的路径:

(['einsum_path', (0, 3), (1, 3), (0, 2), (0, 1)],
'  Complete contraction:  k,pjqk,yzjqk,yzk,ipqt->it\n'
'         Naive scaling:  8\n'
'     Optimized scaling:  5\n'
'      Naive FLOP count:  5.530e+04\n'
'  Optimized FLOP count:  7.930e+02\n'
'   Theoretical speedup:  69.730\n'
'  Largest intermediate:  2.400e+01 elements\n'
'--------------------------------------------------------------------------\n'
'scaling                  current                                remaining\n'
'--------------------------------------------------------------------------\n'
'   3                  yzk,k->yzk                  pjqk,yzjqk,ipqt,yzk->it\n'
'   5              yzk,yzjqk->jqk                        pjqk,ipqt,jqk->it\n'
'   4                jqk,pjqk->qp                              ipqt,qp->it\n'
'   4                 qp,ipqt->it                                   it->it')

(['einsum_path', (2, 3), (1, 3), (1, 2), (0, 1)],
'  Complete contraction:  k,pjqk,yzjqk,yzk,ipqt->it\n'
'         Naive scaling:  8\n'
'     Optimized scaling:  5\n'
'      Naive FLOP count:  5.530e+04\n'
'  Optimized FLOP count:  1.729e+03\n'
'   Theoretical speedup:  31.981\n'
'  Largest intermediate:  4.800e+01 elements\n'
'--------------------------------------------------------------------------\n'
'scaling                  current                                remaining\n'
'--------------------------------------------------------------------------\n'
'   5              yzk,yzjqk->jqk                      k,pjqk,ipqt,jqk->it\n'
'   4               jqk,pjqk->qkp                           k,ipqt,qkp->it\n'
'   5               qkp,ipqt->tik                                k,tik->it\n'
'   3                   tik,k->it                                   it->it')

测试结果表明,“最佳”对我来说要快得多,如图所示。

问题

谁能简单地解释一下区别是什么以及为什么将“贪婪”设置为默认值?

总是使用“最佳”有什么缺点?

如果我的 einsum 计算要运行 1000 次(这是优化迭代的一部分),我是否应该重新构建执行以自动受益于“最佳”路径而无需重新计算(或'贪婪'路径)每次?

【问题讨论】:

    标签: numpy numpy-einsum


    【解决方案1】:

    对于任何发现此内容的人来说,再多读一点就会发现以下内容:

    'greedy' 通常在大多数用例中产生'最佳'解决方案的性能非常好,并且执行速度更快。对于可能无意中在迭代循环中使用 einsum 的普通用户,将 'greedy' 保留为默认值可能就足够了。

    否则,对于一次性计算,“最佳”的最小额外开销似乎意味着它可以有效地使用,除了可能是大量索引之外,它可能会提供很大的提升(如我的情况) .

    在循环中最好的做法是预先计算它(或在第一次迭代中计算并更新一个非局部变量)并将其作为参数提供:

    path, display = np.einsum_path('k,pjqk,yzjqk,yzk,ipqt->it', A, B, C, D, E, optimize='optimal')
    for i in range(BIG_INT):
        # other things
        calculation = np.einsum_path('k,pjqk,yzjqk,yzk,ipqt->it', A, B, C, D, E, optimize=path)
        # more things
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多