首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在cupy中使用多个gpus?

如何在cupy中使用多个gpus?
EN

Stack Overflow用户
提问于 2019-09-19 10:11:31
回答 3查看 2.6K关注 0票数 1

我正在尝试在CUPY中使用多个GPU并行化多个矩阵乘法。

Cupy加速矩阵乘法(例如$A\times B$)。我想知道我是否有四个方阵A,B,C,D。我想在两个不同的本地GPU上计算AB和CD。如何在CUPY中完成此操作?

例如,在tensorflow中,

代码语言:javascript
复制
for i in xrange(FLAGS.num_gpus):
  with tf.device('/gpu:%d' % i):

在CUPY中也有类似的方法吗?关于Cupy的事情是,它直接执行代码,所以它不能运行下一行(例如$C\times D$),直到当前行结束(例如$A\times B$)。

谢谢Tos的帮助。现在新的问题是,假设我有10个这样的矩阵对存储在两个3Dnumpy数组中(比如说?**10)。我如何写一个循环来存储乘法的结果?

代码语言:javascript
复制
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中使用相同名称的阵列吗?

EN

回答 3

Stack Overflow用户

发布于 2019-09-19 12:49:17

使用with cupy.cuda.Device(i),避免阻塞操作。例如,要计算CPU数组对的matmul,在调用所有matmul操作之后,将结果发送到CPU (cupy.asnumpy)。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-09-19 12:29:32

在大多数操作中,CuPy不会同步设备执行。像A.dot(B)这样的代码在设备上启动矩阵乘积后立即返回,而不等待设备端操作本身,因此如果操作足够重(例如矩阵很大),则计算实际上与另一个设备上的第二个矩阵乘积重叠。

票数 1
EN

Stack Overflow用户

发布于 2019-09-20 18:44:42

我不是100%确定我是否正确理解了这个问题,但我猜可能是这样的:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58002793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档