我正在尝试使用CUPY中的多个GPU并行化多个矩阵乘法。
Cupy加速矩阵乘法(例如$ A \ times B $)。 我想知道我是否有四个平方矩阵A,B,C,D。我想在两个不同的本地GPU上计算AB和CD。如何在CUPY中做到这一点?
例如,在张量流中,
for i in xrange(FLAGS.num_gpus):
with tf.device('/gpu:%d' % i):
CUPY中是否有类似的方法。关于Cupy的事情是,它立即执行代码,因此直到当前行结束之前(例如$ A \ times B $)它才能运行下一行(例如$ C \ times D $)。
感谢Tos的帮助。现在新的问题是 说我有十对这样的矩阵对存储在两个3d numpy数组中(例如?*?* 10)。如何编写一个循环来存储乘法结果?
anumpy #size(1e5,1e5,10)
bnumpy #size(1e5,1e5,10)
for i in range(10):
#say I have 3 gpus
with cupy.cuda.Device(i % 3):
a = cupy.array(anumpy[:,:,i])
b = cupy.array(bnumpy[:,:,i])
ab[:,:,math.floor(i/3)] = a @ b
如何将这3个Ab组合到不同的设备中? 我可以在不同的GPU中使用相同名称的数组吗?
答案 0 :(得分:1)
CuPy在大多数操作中不同步设备执行。像A.dot(B)
这样的代码在设备上启动矩阵乘积后立即返回,而无需等待设备侧操作本身,因此,如果操作足够繁重(例如,矩阵很大),则计算将与第二个有效重叠另一台设备上的矩阵产品。
答案 1 :(得分:1)
使用with cupy.cuda.Device(i)
并避免阻塞操作。例如,要计算成对的CPU阵列对,请在调用所有matmul操作之后将结果发送到CPU(cupy.asnumpy
)。
a = cupy.array(a)
b = cupy.array(b)
ab = a @ b
# ab = cupy.asnumpy(ab) # not here
with cupy.cuda.Device(1):
c = cupy.array(c)
d = cupy.array(d)
cd = c @ d
cd = cupy.asnumpy(cd)
ab = cupy.asnumpy(ab)
答案 2 :(得分:0)
我不确定100%是否能正确理解问题,但我想可能是这样的:
def my_cal(gpu_id, anumpy, bnumpy):
a = None
b = None
ab = None
with cupy.cuda.Device(gpu_id):
for i in range(10):
a = cupy.array(anumpy[:,:,i])
b = cupy.array(bnumpy[:,:,i])
ab[:,:,math.floor(i/3)] = a @ b
return cupy.asnumpy(ab)
np_ab0 = my_cal(0, anumpy, bnumpy)
np_ab1 = my_cal(1, anumpy, bnumpy)
np_ab2 = my_cal(2, anumpy, bnumpy)