提问人:Begoodpy 提问时间:6/4/2023 更新时间:6/5/2023 访问量:59
如何使用 Cupy 将矩阵的伪逆应用于 N 个数组?
How to apply the pseudo-inverse of a matrix to N arrays with Cupy?
问:
我想将 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
答:
您看到的性能并不太令人惊讶。逆向不像矩阵乘法那样容易并行化,因此在切换到 GPU 时通常看不到任何性能提升。
在这里你可以看到你的经验已经被其他人的基准测试所分享。
这就是为什么通常用于科学计算的“传统”计算集群更喜欢高核心数而不是 GPU 的部分原因
评论
这是我使用的 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
评论