Closed Yegiri closed 4 years ago
hi~5-shot 下内存使用激增的原因有两个: (1)我们使用了pair-wise embedding技术,每次送入bert的输入变成了query 拼上一个support句,所以这里bert的内存开销直接翻倍了。 (2)另外,为了方便pair-wise和鼓励跨task学习能力,我们构造使用来自不同任务的query构造batch,于是每个batch的元素都有一个query句和一个support句组成。这会导致support变大时,内存开销急剧升高:假设batch set 大小为n, support set 大小为m,一个batch 的开销是n*m
由此,我提供几种比较容易的解决方案: (1)关闭pair-wise,并让通过设置使得 batch_size/grad_acc == 1。但是没有pair-wise性能会有损失。 (2)关掉bert的grad来不fine tune,或者只开上面几层的grad。处理好的话,应该能省一份中间结果的显存、一份梯度的显存,一份Adam中一份存动量的显存。另外,fix 部分bert底层可能也会带来性能提升。 (3)使用更大内存的卡,根据我们的经验,16g的卡肯定是够用了~ (4)使用多卡。注意你的情况下貌似已经单sample也爆内存了,所以简单的多卡是没有用的。所以建议考虑利用V系列显卡的共享显存功能,构造一个虚拟的大显存。 (5)使用内存。满足内存16g要容易的多,所以可以用时间换空间。通常cpu大概慢5-10倍,如果你有更大的内存,还可以通过开大batch 弥补一些速度损失。
提供一个稍复杂的解决方案: (1)修改data loader,实现每个batch内公用一个support set,这样support set只需要embedding一次,时间和空间都能省不少,但是没法用pair-wise了
当我用自己的数据跑模型的时候,1-shot的数据可以跑出结果,但是5-shot总是内存溢出,是因为5-shot的中间计算结果变多了吗? 想问一下有什么解决办法吗?(grad_acc设成4还是溢出)谢谢!