标记化和编码数据集使用了过多的 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)
尝试对数据进行标记化和编码以提供给神经网络。
我只有 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)