在一些批次之后,Pytorch将继续运行

在一些批次之后,Pytorch将继续运行,pytorch,gpt-2,Pytorch,Gpt 2,我试图在一个大数据集(26k个样本)上使用类似GPT2的模型进行推理。为了加快速度,我想分批做,但试着在Cuda OOM中进行一些分批之后。它只有在某些批处理之后才会熄灭这一事实对我来说听起来很奇怪,因为我认为在不同的批处理中,内存使用应该或多或少保持不变。 这是我的代码: tokenizer.padding_side = "left" tokenizer.pad_token = tokenizer.eos_token sentences = ["<STAR

我试图在一个大数据集(26k个样本)上使用类似GPT2的模型进行推理。为了加快速度,我想分批做,但试着在Cuda OOM中进行一些分批之后。它只有在某些批处理之后才会熄灭这一事实对我来说听起来很奇怪,因为我认为在不同的批处理中,内存使用应该或多或少保持不变。 这是我的代码:

tokenizer.padding_side = "left"
tokenizer.pad_token = tokenizer.eos_token

sentences = ["<START_TOK>" + s + "<END_TOK>" + tokenizer.eos_token for s in sentences]

inputs = tokenizer(sentences, return_tensors="pt", padding=True, max_length=1024, truncation=True)

device = torch.device("cuda:0")
inputs = inputs.to(device)
model = model.to(device)
model.eval()
res = []
with torch.no_grad():
    output_sequences = model.generate(
            input_ids=inputs['input_ids'],
            attention_mask=inputs['attention_mask'],
            max_length=1024,
            pad_token_id=tokenizer.eos_token_id,
            no_repeat_ngram_size=2,
            do_sample=True,
            top_k=100,
            top_p=0.9,
            temperature=0.85
        )
     output_sequences = output_sequences.cpu() #not really sure this is useful, just tried, but the problem remained
     for i in range(len(sentences)):
         res.append(tokenizer.decode(output_sequences[i]))
model.train()
return res
tokenizer.padding\u side=“left”
tokenizer.pad_token=tokenizer.eos_token
句子=[“”+s+“”+tokenizer.eos_句子中s的标记]
输入=tokenizer(句子,return_tensors=“pt”,padding=True,max_length=1024,truncation=True)
设备=火炬。设备(“cuda:0”)
输入=输入。到(设备)
模型=模型到(设备)
model.eval()
res=[]
使用手电筒。无梯度()
输出序列=model.generate(
input_ID=输入['input_ID'],
注意屏蔽=输入[“注意屏蔽”],
最大长度=1024,
pad\u-token\u-id=tokenizer.eos\u-token\u-id,
无重复内存大小=2,
do_sample=True,
top_k=100,
top_p=0.9,
温度=0.85
)
output_sequences=output_sequences.cpu()#不确定这是否有用,只是尝试了一下,但问题仍然存在
对于范围内的i(len(句子)):
res.append(tokenizer.decode(输出_序列[i]))
模型列车()
返回res

可能是什么问题?

检查每个批次的最大序列长度,看看您的gpu是否同时崩溃longest@KonstantinosKokos是的,检查每个批次中最长的句子,当它崩溃时,它总是在一个包含迄今为止最长句子的批次(它的长度取决于批次大小),但关键是,标记器应该将它们全部固定为1024,这就是应该输入GPU内存的内容,我错了吗?我假设标记器填充到最大序列长度,而不是1024。