CuPy.einsum 慢?

问题描述

我最近开始使用 CuPy。在我的应用程序中,函数 einsum 似乎没有一致的执行速度。在下面的第一个示例中,它最多比 tensordot 函数慢 5 倍(例如,对于 M = 128 和 2048)。在下面的第二个示例中,它比 dot 慢,但与 tensordot 一样快。我在使用 einsum 时是否犯了错误

我的代码

import numpy as np
import cupy as cp
import timeit
import tabulate

nrepeats = 1000
alpha_max= 11
cp.random.seed(123)

Ts = []
Ms = 2**(1+np.arange(3,alpha_max))
chi = cp.array([[0.,2.5,5.5],[2.5,0.,2.5],[5.5,0. ]])

# 1st test
for M in Ms:
    #print(M)
    shape = [3,M,M]
    ndim = len(shape)
    phi = cp.random.rand(*shape)


    t_1 = timeit.timeit(lambda: cp.einsum('mn,n...->m...',chi,phi),number=nrepeats) / float(nrepeats)
    t_2 = timeit.timeit(lambda: cp.einsum('mn,number=nrepeats) / float(nrepeats)
    t_3 = timeit.timeit(lambda: cp.tensordot(chi,phi,axes=([1],[0])),number=nrepeats) / float(nrepeats)
    Ts.append([t_1,t_2,t_3])

data = np.array(Ts)
data = np.concatenate([Ms.reshape(-1,1),data],axis=1)

print("1st test")
print(tabulate.tabulate(data,tablefmt='simple',headers=['M'] + ["t_{:d}".format(i) for i in range(1,data.shape[1])]))
print("")


# 2nd test
Ts = []
for M in Ms:
    #print(M)
    phi = cp.random.rand(M,M)
    mat = cp.random.rand(M,M)
    
    
    t_1 = timeit.timeit(lambda: cp.einsum('mn,mat,number=nrepeats) / float(nrepeats)
    t_2 = timeit.timeit(lambda: cp.dot(mat,number=nrepeats) / float(nrepeats)
    t_3 = timeit.timeit(lambda: cp.tensordot(mat,axis=1)

print("2nd test")
print(tabulate.tabulate(data,data.shape[1])]))

我的结果:

1st test
   M          t_1          t_2          t_3
----  -----------  -----------  -----------
  16  0.000625728  0.000117246  2.18285e-05
  32  0.000116557  0.000116172  2.16212e-05
  64  0.000116819  0.000117002  2.15155e-05
 128  0.000116461  0.000116047  2.16749e-05
 256  0.000159753  0.000240077  7.99196e-05
 512  0.00063619   0.00093989   0.000312955
1024  0.0028338    0.00372209   0.00106168
2048  0.0128821    0.0149504    0.00289213

2nd test
   M          t_1          t_2          t_3
----  -----------  -----------  -----------
  16  0.000252584  9.88275e-06  1.89785e-05
  32  0.000111875  1.03006e-05  2.8993e-05
  64  0.000117031  1.05121e-05  6.57232e-05
 128  0.000165988  3.82686e-05  7.81205e-05
 256  0.000161549  0.000117307  0.000154361
 512  0.000745595  0.000655062  0.000870415
1024  0.00495882   0.00228163   0.00665659
2048  0.0411153    0.017304     0.0508659

我的系统:

  • 在基于 nvidia/cuda:11.0-runtime 的 docker 容器中运行。
  • GPU。 GeForce RTX 2080 8Gb

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)