如何使用 Cupy 将矩阵的伪逆应用于 N 个数组?

How to apply the pseudo-inverse of a matrix to N arrays with Cupy?

提问人:Begoodpy 提问时间:6/4/2023 更新时间:6/5/2023 访问量:59

问:

我想将 cupy.linalg.pinv 函数应用于 100k 数组,但与 Numpy 等效项相比,我发现性能有所下降。

我的 100k 数组是二维数组。主要数组形状为:(100000, 1397, 2)

# generating the data
arr = np.random.uniform(low=0.5, high=1500.20,size=(1397, 2))
main_arr = np.tile(arr, (100000, 1, 1))

使用 NumPy,该函数在 11 秒内运行:

%%time
np.linalg.pinv(main_arr)

CPU 时间:用户 22.5 秒,sys:27.4 秒,总计:49.9 秒 墙体时间: 11 秒

在使用 Cupy 的 GPU 上,完全等效的会给出错误:

main_arr_gpu = cp.array(main_arr) # Copy the array to the GPU
cp.linalg.pinv(main_arr_gpu)

LinAlgError:给定三维数组。数组必须是二维的

因此,我使用列表推导来遍历数组:

%%time
[cp.linalg.pinv(arr_gpu) for arr_gpu in main_arr_gpu]

CPU 时间:用户 22.3 秒,系统:0 ns,总计:22.3 秒 壁挂时间: 22.3 s

它需要 22.3 秒,是 CPU 时间的两倍,不计算数据传输。Nvidia-smi 命令确认 GPU 正在工作。

那么,为什么CPU的性能更好呢?

注意:CPU 是 Intel 24 Core 13900k,GPU 是 Nvidia RTX 4090

numpy 矩阵-逆 cupy

评论


答:

0赞 Simon Tartakovksy 6/5/2023 #1

您看到的性能并不太令人惊讶。逆向不像矩阵乘法那样容易并行化,因此在切换到 GPU 时通常看不到任何性能提升。

在这里你可以看到你的经验已经被其他人的基准测试所分享。

这就是为什么通常用于科学计算的“传统”计算集群更喜欢高核心数而不是 GPU 的部分原因

评论

1赞 Begoodpy 6/5/2023
谢谢。此评论:scicomp.stackexchange.com/a/5374 提到 GPU 上的反转应该更快
1赞 Begoodpy 6/5/2023 #2

这是我使用的 Cupy 版本的一个已知问题:v8。现在 Cupy v12 使用广播,因此它的行为与 NumPy 完全相同。

%%time
cp.linalg.pinv(main_arr_gpu)

CPU 时间:用户 12.7 秒,系统:0 ns,总计:12.7 秒 墙时间:12.7 秒

执行时间几乎相同。我相信我的阵列还不够大,无法注意到重大改进。

要从 conda-forge 安装它:conda install -c conda-forge cupy=12.0.0