cupy矩阵乘法n次

问题描述 投票:0回答:2

我需要将两个矩阵相乘很多次,我正在使用 CUPY。我就是这样做的

import cupy as cp
import time

iterations = 9680000
a = cp.random.rand(44,20)
b = cp.random.rand(20,1)

def ab(a,b,iterations):
for i in range(iterations):
    cp.matmul(a,b,out=None)

t1 = time.time()
ab(a,b,iterations)
t2 = time.time()
total = t2-t1

在上面的代码中,for循环需要很多时间,我知道不应该这样做。我应该如何用cupy重写它,这样for循环就不会成为瓶颈

python-3.x cupy
2个回答
1
投票

如果您想要将一堆

a
b
矩阵相乘,那么如果您“堆叠”矩阵而不是循环它们,那么 numpy 和 cupy 都可以更有效地执行 matmul 运算

对于 cupy,矩阵“堆栈”仍然必须适合 GPU 内存,因此需要考虑到这一点。如果您有太多矩阵,以至于堆栈无法容纳在 GPU 内存中,那么您需要找到一种方法将工作分解为多个部分,并循环遍历各个部分。但每一块都可能是一堆要相乘的矩阵。

这是一个具有较小矩阵集的示例,显示了差异:

你的方法(迭代次数减少到1000000):

$ cat t3.py
import cupy as cp
import time

iterations = 1000000
a = cp.random.rand(44,20)
b = cp.random.rand(20,1)

def ab(a,b,iterations):
  for i in range(iterations):
    cp.matmul(a,b,out=None)

t1 = time.time()
ab(a,b,iterations)
cp.cuda.Device(0).synchronize()
t2 = time.time()
total = t2-t1
print(total)
$ python t3.py
28.173577785491943
$

堆叠法(迭代减少至1000000次):

$ cat t4.py
import cupy as cp
import time

iterations = 1000000
loops = 10
stack = iterations//loops
a = cp.random.rand(stack,44,20)
b = cp.random.rand(stack,20,1)

def ab(a,b,loops):
  for i in range(loops):
    cp.matmul(a,b,out=None)

t1 = time.time()
ab(a,b,loops)
cp.cuda.Device(0).synchronize()
t2 = time.time()
total = t2-t1
print(total)
$ python t4.py
0.8356013298034668
$

0
投票

就我个人而言,这个真的对我很有帮助。

而不是

raw_outputs = []
for vector in vector_list:
    raw_outputs.append(vector @ matrix)
raw_outputs = cp.array(raw_outputs)

我用过这个

vector_matrix = cp.vstack(vector_list)
outputs = vector_matrix @ weights
© www.soinside.com 2019 - 2024. All rights reserved.