tokenizers "Solution" to memory hogging in train_new_from_iterator with a hack

sz81bmfz  于 6个月前  发布在  其他
关注(0)|答案(7)|浏览(86)

你好

我正在使用Llama Tokenizer(meta-llama/Llama-2-7b-hf)对一个中等大小的语料库(Fineweb-10BT样本:1500万个文档,平均长度为2300个字符)进行训练。在“预处理序列”的第一步之后,“分词”步骤需要1小时以上的时间,我的RAM(780GB)用完了。我清楚地记得几天前,当我训练类似大小(但不同的)语料库时,这个步骤只需要大约1分钟。

在互联网上找到的所有帮助hereherehere 之后,并多次更改服务器(升级RAM),都没有解决问题。最后我发现,在之前的运行中,我使用了不同版本的旧分词器“meta-llama/Meta-Llama-3-8B”。更换后,一切恢复正常,处理时间保持在约1分钟,没有内存占用问题。

虽然不太确定这到底是怎么回事,但还是把它放在这里,希望有经验的人能进一步研究,并希望能帮助到其他人。

30byixjq

30byixjq1#

感谢!
可能是因为新的分词器没有使用规范化器/只使用了预分词器?不是特别确定,但感谢分享!🤗

w3nuxt5m

w3nuxt5m2#

你好,我也在使用Refined Web Dataset训练一个分词器时遇到了类似的问题。与issue类似,我使用了train_from_iterator()函数来训练一个SentencePieceBPETokenizer(),在预处理序列的过程中,我耗尽了内存。我不认为切换到另一个分词器能满足我的需求,如果可以的话,您能给我一些关于如何在大型数据集上进行训练的见解吗?

7nbnzgx9

7nbnzgx93#

你能提供一个简短的脚本来重现这个问题吗?

eit6fx6z

eit6fx6z4#

当然,下面的代码会抛出一个内存不足的错误,process_files是从RefinedWeb数据集中下载的Arrow文件的路径列表:

from datasets import load_dataset
data_files = {"train": process_files}

dataset = load_dataset("arrow", data_files=data_files, split="train", streaming=True)

# Build an iterator over this dataset
def batch_iterator(input_sentence_size=None, batch_size=1000):
    for elem in dataset.iter(batch_size=batch_size):
        yield elem["content"]

tokenizer = SentencePieceBPETokenizer()
tokenizer.train_from_iterator(
    iterator=batch_iterator(),
    vocab_size=30_000,
    min_frequency=5,
    show_progress=True,
    limit_alphabet=500,
)
gg58donl

gg58donl5#

我刚刚运行了脚本,没有观察到任何OOM。
我使用了30 vCPU/240 GB的AMD-Epyc服务器。在count_pairs阶段,内存消耗呈线性增长,最大值约为60%。
注意事项:我使用了FineWeb-Edu-10BT样本,将其保存为parquet文件而不是arrow。
希望这有所帮助。

zi8p0yeb

zi8p0yeb6#

有一个关于箭头支持的持续性PR,如果这有帮助的话,我们应该合并它!

b1payxdu

b1payxdu7#

这个问题已经过期,因为它已经打开了30天,没有活动。请移除过期标签或评论,否则将在5天内关闭。

相关问题