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

2021 年 12 月 11 日
 gckend

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

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

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

@miracleyin 是稠密矩阵,应用场景如此,直接乘可能不行,想要找个合适的切割矩阵的方案。
Juszoe
2021 年 12 月 11 日
可以考虑用矩阵分块乘法,可以将一次矩阵乘法分步计算,用 pytorch 应该不难实现,同时还能利用多块 GPU
hbdh5
2021 年 12 月 11 日
简单分个块不就可以么,20g+的话分成 2x2 就行了,数据算完就取回内存或者先暂存到磁盘,乘的时候可以用 strassen 算法能减少一次子块乘
woctordho
2021 年 12 月 11 日
原理无非就是分块,可以试试 Dask 这个包
c0xt30a
2021 年 12 月 11 日
ABx = A(Bx)
如果有 x 这个向量的话
zhoujinjing09
2021 年 12 月 12 日
分块就行了呀,就要手动分一下
dayeye2006199
2021 年 12 月 12 日
这个需要 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 日
或者精度要求不高的话可以考虑半精度,bfloat16 或者 tf32
necomancer
2021 年 12 月 13 日
矩阵分块

|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