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

Tokenizing & encoding dataset uses too much RAM

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

我只有 25GB RAM,每次我尝试 运行 我的 google colab 下面的代码都会崩溃。知道如何防止他的发生吗? “您的会话在使用所有可用 RAM 后崩溃”

我认为 tokenize/encoding 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

从概念上讲,是这样的:

训练清单

这个可能包含从某些文件中读取的句子列表。如果这是一个大文件,您可以按照 this answer 延迟读取部分输入(最好一次读取 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)