重要提示
您正在查看 NeMo 2.0 文档。此版本对 API 和一个新库 NeMo Run 进行了重大更改。我们目前正在将 NeMo 1.0 的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档。
GPT 模型训练#
生成式预训练 Transformer (GPT) 是一种仅解码器的 Transformer 模型。本节演示如何使用 NeMo 训练 GPT 风格的模型。
注意
此示例最好使用最新的 NeMo 框架训练容器完成 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/nemo。
下载和预处理数据#
注意
以下示例将花费大约 3 小时来下载数据、预处理数据和训练分词器。
下载数据。
以下步骤将下载大约 20GB 的 Wikipedia 数据,这可能需要几个小时才能完成。
wget https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2
提取原始数据。
pip install wikiextractor
python -m wikiextractor.WikiExtractor enwiki-latest-pages-articles.xml.bz2 --json
find text -name 'wiki_*' -exec cat {} \; > train_data.jsonl
现在,train_data.jsonl 将包含我们的 JSON 行格式的训练数据。我们特别关注 “text” 字段中的数据。
训练分词器。
下面,我们将考虑训练数据分词器的两个选项:使用预构建的 Hugging Face BPE 或训练并使用您自己的 Google Sentencepiece 分词器。
请注意,只有第二个选项允许您试验词汇表大小。
选项 1: 使用 Hugging Face GPT2 分词器文件。
使用此选项,我们将下载预构建的词汇表并合并 BPE 分词器的文件。
wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-vocab.json
wget https://s3.amazonaws.com/models.huggingface.co/bert/gpt2-merges.txt
选项 2: 使用 Google Sentencepiece 分词器库。
NeMo 包含 Google Sentencepiece 作为依赖项,因此如果您已安装 NeMo,则应该已经安装了它。请注意,训练分词器模型也需要一些时间。
sudo apt install jq
jq .text train_data.jsonl >> text_for_tokenizer.txt
spm_train --input=text_for_tokenizer.txt \
--model_prefix=spm_32k_wiki \
--vocab_size=32768 \
--character_coverage=0.9999 \
--model_type=bpe \
--byte_fallback=true \
--pad_id=0 --unk_id=1 --bos_id=2 --eos_id=3 \
--split_digits true
完成此步骤可能需要一些时间。完成后,您将有两个文件:spm_32k_wiki.model
和 spm_32k_wiki.vocab
,分别对应于模型和词汇表。
将训练数据转换为内存映射格式。
内存映射格式使训练更高效,尤其是在有许多节点和 GPU 的情况下。此步骤还将使用步骤 3 中的分词器模型对数据进行分词。
选项 1: 使用 Hugging Face GPT2 分词器文件。
python <NeMo_ROOT_FOLDER>/scripts/nlp_language_modeling/preprocess_data_for_megatron.py \
--input=train_data.jsonl \
--json-keys=text \
--tokenizer-library=megatron \
--vocab gpt2-vocab.json \
--dataset-impl mmap \
--tokenizer-type GPT2BPETokenizer \
--merge-file gpt2-merges.txt \
--output-prefix=hfbpe_gpt_training_data \
--append-eod \
--workers=32
选项 2: 使用 Google Sentencepiece 分词器库。
python <NeMo_ROOT_FOLDER>/scripts/nlp_language_modeling/preprocess_data_for_megatron.py \
--input=train_data.jsonl \
--json-keys=text \
--tokenizer-library=sentencepiece \
--tokenizer-model=spm_32k_wiki.model \
--output-prefix=gpt_training_data \
--append-eod \
--workers=32
创建自定义训练配方#
要使用 NeMo 2.0 训练模型,需要训练配方。您可以参考 本教程 学习如何创建自定义训练配方或使用现有配方,请参考 NeMo 团队开发的 LLM 配方。
训练模型#
准备好训练数据、分词器和配方后,您就可以训练模型了。您可以按照 本教程 使用现有配方训练模型,或者按照 本教程 使用自定义配方训练模型。
下一步#
有关更多信息,请参阅