标记化和编码数据集使用过多的RAM



尝试标记和编码数据以提供给神经网络。

我只有25GB的RAM,每次我试图运行我的谷歌colab下面的代码时都会崩溃。知道如何防止他的事情发生吗?"您的会话在使用所有可用RAM后崩溃">

我认为标记化/编码50000个句子块是可行的,但不幸的是没有。该代码在长度为130万的数据集上工作。当前数据集的长度为500万。

max_q_len = 128
max_a_len = 64    
trainq_list = train_q.tolist()    
batch_size = 50000

def batch_encode(text, max_seq_len):
for i in range(0, len(trainq_list), batch_size):
encoded_sent = tokenizer.batch_encode_plus(
text,
max_length = max_seq_len,
pad_to_max_length=True,
truncation=True,
return_token_type_ids=False
)
return encoded_sent
# tokenize and encode sequences in the training set
tokensq_train = batch_encode(trainq_list, max_q_len)

标记器来自HuggingFace:

tokenizer = BertTokenizerFast.from_pretrained('bert-base-multilingual-uncased')

无论大小,都应该使用生成器并将数据传递给tokenizer.batch_encode_plus

从概念上讲,类似这样的东西:

培训清单

这个可能包含从一些文件中读取的句子列表。如果这是一个单独的大文件,您可以按照这个答案延迟读取输入的部分(最好是一次读取batch_size行(:

def read_in_chunks(file_object, chunk_size=1024):
"""Lazy function (generator) to read a file piece by piece.
Default chunk size: 1k."""
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data

否则,打开一个文件(比内存小得多,因为使用BERT编码后它会大得多(,类似这样:

import pathlib

def read_in_chunks(directory: pathlib.Path):
# Use "*.txt" or any other extension your file might have
for file in directory.glob("*"):
with open(file, "r") as f:
yield f.readlines()

编码

编码器应该把这个生成器和yield带回编码的部分,类似这样:

# Generator should create lists useful for encoding
def batch_encode(generator, max_seq_len):
tokenizer = BertTokenizerFast.from_pretrained("bert-base-multilingual-uncased")
for text in generator:
yield tokenizer.batch_encode_plus(
text,
max_length=max_seq_len,
pad_to_max_length=True,
truncation=True,
return_token_type_ids=False,
)

保存编码文件

由于文件太大,无法放入RAM内存,因此应将其保存到磁盘(或在生成时以某种方式使用(。

类似的东西:

import numpy as np

# I assume np.arrays are created, adjust to PyTorch Tensors or anything if needed
def save(encoding_generator):
for i, encoded in enumerate(encoding_generator):
np.save(str(i), encoded)

最新更新