两个占用内存大小 20G+的矩阵做相乘, 10 块 GPU

2021-12-11 16:04:10 +08:00
 gckend

计算逻辑很简单就是: a@b 想使用 pytorch 做 GPU 计算,10 块 GPU 的显存都是 10G ,想问问大家有好办法吗?

4086 次点击
所在节点    Python
14 条回复
Scirocco
2021-12-11 16:22:36 +08:00
说实话没怎么看明白。。就是普通的矩阵作乘法吗?那感觉没必要用 pytorch 呀?
gckend
2021-12-11 16:24:08 +08:00
@Scirocco 主要是为了方便做 GPU 计算,其他框架也可以
Scirocco
2021-12-11 16:27:37 +08:00
@gckend #2 或许可以考虑直接用 C 写 cuda 程序?

不过我也不知道 20G 这么大的矩阵怎么处理,以及多 GPU 怎么一起用。。只能提供思路,抛砖引玉 2333
mingl0280
2021-12-11 16:45:35 +08:00
miracleyin
2021-12-11 16:45:49 +08:00
如果是稀疏矩阵的话可以通过 TORCH.SPARSE 这样的 api 来写,如果是非稠密的可能得思考为什么会有那么大的矩阵乘法了。
gckend
2021-12-11 17:26:39 +08:00
@mingl0280 谢谢,不过这个并不适合我的场景。

@miracleyin 是稠密矩阵,应用场景如此,直接乘可能不行,想要找个合适的切割矩阵的方案。
Juszoe
2021-12-11 18:55:27 +08:00
可以考虑用矩阵分块乘法,可以将一次矩阵乘法分步计算,用 pytorch 应该不难实现,同时还能利用多块 GPU
hbdh5
2021-12-11 19:39:31 +08:00
简单分个块不就可以么,20g+的话分成 2x2 就行了,数据算完就取回内存或者先暂存到磁盘,乘的时候可以用 strassen 算法能减少一次子块乘
woctordho
2021-12-11 22:06:36 +08:00
原理无非就是分块,可以试试 Dask 这个包
c0xt30a
2021-12-11 22:46:51 +08:00
ABx = A(Bx)
如果有 x 这个向量的话
zhoujinjing09
2021-12-12 01:17:50 +08:00
分块就行了呀,就要手动分一下
dayeye2006199
2021-12-12 02:26:39 +08:00
这个需要 out of core computation
不考虑用 GPU 的话可以考虑

http://xarray.pydata.org/en/stable/dask.html
或者
https://docs.dask.org/en/stable/array.html
zhoujinjing09
2021-12-12 04:51:13 +08:00
或者精度要求不高的话可以考虑半精度,bfloat16 或者 tf32
necomancer
2021-12-13 13:19:54 +08:00
矩阵分块

|A B| |E F| = | AE+BG AF +BH|
|C D| |G H| |CE+DG CF+DH|

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/821528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX