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

myss37ts  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(188)

我想将cupy.linalg.pinv函数应用于100 k数组,但与Numpy等效函数相比,我看到性能下降。
我的100 k数组是二维数组。主阵列形状为:(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秒,系统:27.4秒,总计:49.9 s壁时间:11秒
在GPU上使用Cupy的确切等效值会产生错误:

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 s壁时间:22.3秒
它需要22.3s,是CPU时间的两倍,不计算数据传输。Nvidia-smi命令确认GPU正在工作。
那么为什么CPU的性能更好呢?

  • 注意:CPU为Intel 24 Core 13900 k,GPU为Nvidia RTX 4090*
7gcisfzg

7gcisfzg1#

这是我使用的Cupy版本的known issue:v8.现在Cupy v12使用broadcasting,因此它具有与NumPy完全相同的行为。

%%time
cp.linalg.pinv(main_arr_gpu)

CPU时间:用户12.7秒,系统:0 ns,总计:12.7 s壁时间:12.7秒
几乎是同样的执行时间。我相信我的阵列不够大,无法注意到重大改进。
从conda-forge安装:conda install -c conda-forge cupy=12.0.0

t8e9dugd

t8e9dugd2#

你看到的表演并不令人惊讶。逆运算不像矩阵乘法那样容易并行化,因此在切换到GPU时,您通常看不到任何性能增益。
在这里您可以看到您的经验已被其他benchmarking共享。
这也是通常用于科学计算的“传统”计算集群更喜欢高内核数而不是GPU的部分原因

相关问题