为啥我系统上的所有 CuPy 函数都比它们的 NumPy 对应函数慢?

Posted

技术标签:

【中文标题】为啥我系统上的所有 CuPy 函数都比它们的 NumPy 对应函数慢?【英文标题】:Why are all CuPy functions slower than their NumPy counterparts on my system?为什么我系统上的所有 CuPy 函数都比它们的 NumPy 对应函数慢? 【发布时间】:2021-02-02 12:10:01 【问题描述】:

我正在尝试使用 CuPy 来加速目前主要使用 NumPy 的 python 函数。我已经在安装了 CUDA 10.0 的 Jetson AGX Xavier 上安装了 CuPy。

CuPy 函数似乎运行良好,但是,它们比 NumPy 对应的函数慢很多。例如,我从here 运行了第一个示例,结果是毁灭性的:

import numpy as np
import cupy as cp
import time

### Numpy and CPU
s = time.time()
x_cpu = np.ones((1000,1000,1000))
e = time.time()
print(e - s) # output: 0.9008722305297852

### CuPy and GPU
s = time.time()
x_gpu = cp.ones((1000,1000,1000))
cp.cuda.Stream.null.synchronize()
e = time.time()
print(e - s) # output: 4.973184823989868

我还运行了其他函数(例如np./cp.nonzero),但它们给出了相似或更差的结果。这怎么可能?

我想为车道检测算法进行图像处理(大小为 2500x2000 灰度/单色图像),并且不能真正使用 OpenCV 中的 cuda 函数,因为我的代码中唯一在他们的库中实现的部分是cv2.cuda.warpPerspective()(仅为此将图像上传/下载到 GPU 可能没有太大意义)。我从哪里去?使用numba? (-> 可能不太合适,因为(计算密集型部分)我的算法主要由 numpy 函数调用组成)用 C++ 实现整个事情? (-> 我怀疑我的 C++ 代码会比优化后的 NumPy 函数更快)

旁注:CuPy 是使用pip3 install cupy 安装的,因为推荐的pip3 install cupy-cuda100 输出失败:

ERROR: Could not find a version that satisfies the requirement cupy-cuda100
ERROR: No matching distribution found for cupy-cuda100

【问题讨论】:

【参考方案1】:

首先:ARM 没有官方的 Cupy

​​>

您的错误来自官方 pip 存储库中没有用于 arm 64 的 cupy 二进制分发的事实。

Wheels(预编译的二进制包)可用于 Linux (x86_64) 和 Windows (amd64)。

对于 Nvidia L4T / Jetpack,您可以找到官方 NVIDIA docker 映像,包括在 Xavier 上运行的 Cupy:https://ngc.nvidia.com/catalog/containers/nvidia:l4t-ml。这对我有用,并且确实提高了我的表现。

如果你有一个解决方案可以在 Xavier 上运行 Cupy,使用有效的 CUDA 而不运行该 docker 映像。我感兴趣。我没有尝试,但如果他们设法在 docker 映像中编译 Cupy,很明显它也可以在新的本机操作系统中使用。在 Nano 上取得了一些成功:https://forums.developer.nvidia.com/t/cupy-installation-on-the-nano/189099

尝试从源安装:https://docs.cupy.dev/en/stable/install.html

第二:测试中没有计算

你的测试真的与测量加速度有关吗?我的意思是,对 CUDA 函数的第一次调用预计会很慢,因为即时内核编译或其他什么,你只测试一些分配的东西和少量的并行计算。

21 年 10 月 3 日更新

这里是他们在 docker 中运行以构建图像的指令:

#
# CuPy
#
ARG CUPY_VERSION=v9.2.0
ARG CUPY_NVCC_GENERATE_CODE="arch=compute_53,code=sm_53;arch=compute_62,code=sm_62;arch=compute_72,code=sm_72"

RUN git clone -b $CUPY_VERSION --recursive https://github.com/cupy/cupy cupy && \
    cd cupy && \
    pip3 install --no-cache-dir fastrlock && \
    python3 setup.py install --verbose && \
    cd ../ && \
    rm -rf cupy

您可以在本地环境中轻松执行它。也许根据您的主板调整 CUPY_NVCC_GENERATE_CODE 变量以获得更好的性能。我尝试时没有设置任何具体内容。

刚刚在我的 Nano board 上尝试了从源代码安装(git clone cupy 然后 pip3 install --no-cache-dir -vvvv 。(没有 sudo)然后 reboot 板)。在 VGA 图像上使用多个求和、减法、除法、乘法、剪辑等操作来处理图像。不要忘记使用 sudo jetson_clocks 命令在您的板上设置固定的高频操作。 Numpy cpu 时间 = 125ms / img 与 Cupy 时间 = 13ms /img 在使用 NVIDIA 分析器对代码进行了一些返工后。

使用 nvprof -o file.out python3 mycupyscript.pywith cp.cuda.profile(): 指令来更好地了解瓶颈。使用 nvvp 加载 file.out 并以图形方式探索性能。它可以让您升级计算方法以适应 GPU。

【讨论】:

以上是关于为啥我系统上的所有 CuPy 函数都比它们的 NumPy 对应函数慢?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我所有的回归器显示的准确度都比我所有的分类器低得多?

为啥我的 Kmeans CuPy 代码中有“OutOfMemoryError”?

如何将 cupy.ndarray 转换为标量?

使用 cupy 从 GPU 上的另一个矩阵创建距离矩阵

为啥同时使用 numba.cuda 和 CuPy 从 GPU 传输数据这么慢?

AMD GPU 上的 CuPy 导致 ImportError