【问题标题】:How can I use multiple gpus in cupy?如何在 Cupy 中使用多个 GPU?
【发布时间】:2019-09-19 02:11:30
【问题描述】:

我正在尝试在 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 的问题在于它会立即执行代码,因此它无法运行下一行(例如 $C\times D$),直到当前行完成(例如 $A\times B$)。

感谢托斯的帮助。现在新的问题是, 假设我有十个这样的矩阵对存储在两个 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 中拥有同名的数组吗?

【问题讨论】:

    标签: gpu cupy


    【解决方案1】:

    使用with cupy.cuda.Device(i) 并避免阻塞操作。例如,要计算 CPU 数组对的 matmul,请在调用所有 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)
    

    【讨论】:

    • 您好,您的回答有帮助。还有一个问题,我怎样才能在一个循环中形成这些?有关详细信息,请参阅我对原始问题的编辑。
    • 这个答案真的很有帮助。我认为阻塞操作意味着CPU和GPU之间的数据交换,更具体地说。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不能 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)
      

      【讨论】:

      • 如果 ab 存储在第一个 cpu 中,则无法从第二个和第三个 gpu 访问它。
      猜你喜欢
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2019-10-03
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      相关资源
      最近更新 更多