##概述
最近几天有个模型,使用了local adaptation,就是在inference阶段也加入了训练的过程,因为需要进行模型复制和较大的batch_size进行训练,这样就导致我显卡直接爆炸。我用的看的K80,显存12G。模型用的BERT+文本分类,输入的Sequence_size=512(下简写为seq_size)。
##思考过程
接下来分享一下我的思考过程,可以看到就模型本身是不大的,即使扩大一倍也不会爆显存,问题就出在这个输入上,seq_size较大的时候,batch_size就要注意了,不然会导致计算的时候矩阵过大,有可能爆显存。我一直把inference的input_batch_size调小到1,都还是不行。说明目前来看不是输入位置的和前向计算过程中导致的爆显存。
接下来调试代码到local adaptation部分,这里会从memory里匹配出32个数据来进行模型参数的更新,我在训练阶段就没有设置过这么大的batch_size,因为一定会爆,问题应该就出在这里了。
##解决过程
首先想到的就是直接开并行,在model的最外层直接用DataParallel封装。使用4个GPU并行处理,发现不行,在local adaptation的地方出现数据分发的错误,源代码很长,就改成一个类似伪代码的片段给大家展示一下
import torch
class Net(torch.nn.Module):
def __init__(model_path):
super(Net, self).__init__()
self.classify = load_model(model_pat