前言

最近在训练Densenet(121?),大概10M的参数,这种级别的参数,32G内存的v100突然就不够用了。

于是上了a100的80G内存,但是这个时候就开始思考,有没有什么办法能够减少内存的使用。

这个时候发现了我们一般会使用的预先分配储存空间的办法torch.zeros((nb_test, 3, 224, 224), device=device)

正文

1. 什么笨蛋会用append()

因为每次 append() 操作都会创建新的列表对象,尤其当数据量很大的时候,会占用较多内存。

这也是为什么我们在一般的python 代码不会有append()的原因

2. 预先分配空间

大部分的python 代码,或者神经网络代码都会是torch.zeros((nb_test, 3, 224, 224), device=device),这样的形式,其中nb_test是总样本数目,3,224,224是样本的大小。

这是因为如果预先分配空间的话,那么就不存在每次操作都创建一个新的列表对象来占用内存的问题了。

总结

学会了如何更好的编程!

不要当一直用append()的笨蛋啊!

参考

[1] 自己
[2] ChatGPT

Q.E.D.


立志做一个有趣的碳水化合物