cupy执行任务的时间为48毫秒,numpy执行任务的时间为4毫秒。为什么以及如何修复?

2024-05-23 16:43:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用cupy在GPU上执行任务-以下是代码:

# on CPU
x_cpu = np.array([1, 2, 3])
%timeit l2_cpu = np.linalg.norm(x_cpu)

# on GPU
x_gpu = cp.array([1, 2, 3])
%timeit l2_gpu = cp.linalg.norm(x_gpu)

以下是输出:

4 µs ± 18 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
48.7 µs ± 86.4 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) ```

问题:

我的问题是——在我的情况下,为什么丘比的工作速度比努比慢?我原以为丘比会比努比工作得快。我做错了什么,也许有人可以建议我如何修复它

环境:

  • 操作系统:Ubuntu 20.04
  • 视频
 > nvidia-smi
 Wed Sep 15 22:11:36 2021       
 +-----------------------------------------------------------------------------+
 | NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    CUDA Version: 11.4     |
 |-------------------------------+----------------------+----------------------+
 | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
 | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
 |                               |                      |               MIG M. |
 |===============================+======================+======================|
 |   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0 Off |                  N/A |
 | 41%   33C    P8     1W / 260W |    184MiB / 11019MiB |      0%      Default |
 |                               |                      |                  N/A |
 +-------------------------------+----------------------+----------------------+
                                                                              
 +-----------------------------------------------------------------------------+
 | Processes:                                                                  |
 |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
 |        ID   ID                                                   Usage      |
 |=============================================================================|
 |    0   N/A  N/A    627367      C   ...conda3/envs/t1/bin/python      181MiB |
 +-----------------------------------------------------------------------------+

此外,我使用puthon3.8,并安装了:

  • 丘比特8.3.0
  • cupy-cuda114 9.4.0
  • cudatoolkit 10.1.243 h6bb024c_0
    等等

更新

我还使用了1023272项的数组-结果如下:

  • 每个回路175µs±10.2µs(7次运行的平均值±标准偏差,每个10000个回路)
  • 每个回路579µs±97.1 ns(7次运行的平均值±标准偏差,每个1000个回路)

此外,我使用nvidia smi检查了GPU的利用率,我可以确认——GPU参与了计算


Tags: normgpuonnpusagecpuarraycp
1条回答
网友
1楼 · 发布于 2024-05-23 16:43:26

您正在通过cupy测试测量4-8 GB/s的数据复制性能。范数是标准化的,所以它很可能是一个简短的缩减,以找到矩阵中的最大元素,并将所有元素除以该值。这使得通过pcie传输的每个字节的计算量很小

如果您真的想比较计算性能,可以执行矩阵乘法之类的操作,并使用足够大的矩阵大小,如2048x2048 x 2048x2048

在您当前的测试中,numpy受到ram带宽的限制,而cupy受到pcie带宽的限制。您可以为cuda打开一个分析器,查看内核的精确计算时间并使用它(应该已经比cpu快了)

在第一个测试中,只有3个元素,所以第一个测试numpy结果可能是python的函数调用开销。然后,cupy结果必须是内核启动开销和python函数开销,以及调用数据复制函数的额外开销。即使只是在cuda中启动内核,空内核函数也要花费10-20微秒

相关问题 更多 >