*自 2021 年 8 月起,代码不再维护。它以档案形式保存在这里,供希望继续使用它的人使用。
? 1T 还是让我的兄弟们崩溃?
使用 mesh-tensorflow 库实现模型和数据并行的类 GPT3 模型。
如果您只是来玩我们预先训练的模型,我们强烈建议您尝试 HuggingFace Transformer 集成。
训练和推理在 TPU 上得到官方支持,并且也应该在 GPU 上运行。当我们将重点转移到 GPU 特定的存储库 GPT-NeoX 时,该存储库将(大部分)存档。
除了 GPT-3 提供的功能外,我们还提供以下功能:
注意,虽然 neo在技术上可以在 200B+ 参数下运行训练步骤,但在这些规模上效率非常低。除其他事项外,这一点以及我们可以使用许多 GPU 的事实促使我们将开发转移到 GPT-NeoX。
2021 年 3 月 21 日更新:
我们很自豪地发布两个在 The Pile 上训练的预训练 GPT-Neo 模型,权重和配置可以从 the-eye.eu 免费下载。
1.3B:https://mystic.the-eye.eu/public/AI/gptneo-release/GPT3_XL/
2.7B:https://mystic.the-eye.eu/public/AI/gptneo-release/GPT3_2-7B/
有关如何进行这些设置的更多信息,请参阅 colab 笔记本,或通读自述文件的其余部分。
型号及尺寸 | 桩BPB | 桩PPL | 维基文本 PPL | 兰巴达PPL | 兰巴达加速器 | 维诺格兰德 | 海拉斯瓦格 |
---|---|---|---|---|---|---|---|
GPT-Neo 125M | ----- | ----- | 32.285 | 30.266 | 37.36% | 50.43% | 28.67% |
GPT-3 125M | ----- | ----- | ----- | 18.6 | 42.7% | 52.0% | 33.7% |
GPT-Neo 350M | ----- | ----- | 22.5657 | 13.876 | 47.27% | 51.14% | 32.16% |
GPT-3 350M | ----- | ----- | ----- | 9.09 | 54.3% | 52.1% | 43.6% |
GPT-3阿达 | 0.9631 | ----- | ----- | 9.954 | 51.60% | 52.90% | 35.93% |
GPT-Neo 1.3B | 0.7527 | 6.159 | 13.10 | 7.498 | 57.23% | 55.01% | 38.66% |
GPT-3 1.3B | ----- | ----- | ----- | 5.44 | 63.6% | 58.7% | 54.7% |
GPT-2 1.5B | 1.0468 | ----- | 17.48 | 10.634 | 51.21% | 59.40% | 40.03% |
GPT-Neo 2.7B | 0.7165 | 5.646 | 11.39 | 5.626 | 62.22% | 56.50% | 42.73% |
GPT-3 2.7B | ----- | ----- | ----- | 4.60 | 67.1% | 62.3% | 62.8% |
型号及尺寸 | 数学问答 | 公共医学质量保证 | 皮卡 |
---|---|---|---|
GPT-Neo 125M | 22.78% | 55.10% | 63.06% |
GPT-3 125M | ----- | ----- | 64.6% |
GPT-Neo 350M | 23.45% | 53.80% | 65.07% |
GPT-3 350M | ----- | ----- | 70.2% |
GPT-3阿达 | 24.29% | 52.80% | 68.88% |
GPT-Neo 1.3B | 24.05% | 54.40% | 71.11% |
GPT-3 1.3B | ----- | ----- | 75.1% |
GPT-2 1.5B | 23.64% | 58.33% | 70.78% |
GPT-Neo 2.7B | 24.72% | 57.54% | 72.14% |
GPT-3 2.7B | ----- | ----- | 75.6% |
注意:所有评估都是使用我们的评估工具完成的。 GPT-2 和 GPT-3 的一些结果与各自论文中报告的值不一致。我们目前正在调查原因,并且非常感谢反馈以及对我们的评估工具的进一步测试。
git clone https://github.com/EleutherAI/GPTNeo
cd GPTNeo
pip3 install -r requirements.txt
注册 Google Cloud Platform,并创建存储桶。
使用ctpu up --vm-only
通过 google shell ( https://ssh.cloud.google.com/
) 创建虚拟机,以便它可以连接到您的 Google 存储桶和 TPU 并使用 pip 安装要求(见上文) 。
Google colab 免费提供 tpu-v8s,这应该足以将我们的模型微调到 GPT3XL(1.5B 参数)大小。单击以运行我们的示例 Colab 笔记本。
有关更详细的说明,请阅读下面的培训指南。
您还可以选择在 GPU 上本地训练 GPTNeo。为此,您可以省略上面的 Google 云设置步骤,并在本地 git 克隆存储库。运行下面的训练指南,然后在运行 main.py 时,您只需省略tpu
标志,并传入 GPU id 即可。
注意:一些用户报告说 MTF 很难识别他们的 GPU。有关如何修复该问题的详细信息和说明,请参阅此处。
一旦您拥有经过训练的模型,或者下载了我们预先训练的模型之一,生成文本就像运行带有--predict
标志的 main.py 脚本一样简单。您可以使用--prompt
标志传递提示 txt 文件的路径,如下所示:
python3 main.py --predict --prompt < example_prompt.txt > --tpu < tpu_name > --model < config_name >
或者,如果使用 GPU:
python3 main.py --predict --prompt < example_prompt.txt > --gpu_ids < device:GPU:0 device:GPU: 1> --model < config_name >
我们建议您在我们的存储库中使用 Huggingface 的预训练 GPT2 分词器(下面提供的说明),但如果您想训练具有不同词汇量大小的模型,我们提供了训练您自己的分词器的设施,如下所示:
python data/train_tokenizer.py
--base_dir ./path/to/your/txt/files
--output_dir ./output/path
--file_type txt
--vocab_size 50257
# if it succeeded, you should see the message
# 'tokenizer saved at ./output/path/byte-level-bpe.tokenizer.json'
如果您只想测试训练,可以跳过此步骤并下载一些虚拟数据,如下所示:
wget https://storage.googleapis.com/connors-datasets/bundestag/bundestag_0.tfrecords
然后将数据复制到您的存储桶,或者如果使用 GPU,则复制到本地目录:
gsutil cp bundestag_0.tfrecords gs://<your bucket>/
如果使用您自己的数据进行训练,您可以使用data/create_tfrecords.py
脚本将文本数据编码到 tfrecords 中。
您的数据必须采用大量普通 .txt 文件的形式(每个文件一个文档),或者采用 lm_dataformat 支持的任何格式。
您可以运行不带参数的脚本来查看所有选项的帮助。
在文档模式下 tfrecords 中的每个示例都是一个(大小可变)文档。这将与documents_fixed
和documents_random
采样模式一起使用(有关更多详细信息,请参阅参数参考部分)。文档模式是默认模式。
以下命令将使用 gpt2 tokenizer 对base_dir中可接受的格式的所有文件进行标记,并将它们保存到output_dir
python3 create_tfrecords.py --mode documents --input_dir <base> --name <name> --output_dir <output> --use_gpt2_tokenizer --minimum_size <min>
input_dir
:定义数据所在的文件夹。该脚本将对该文件夹中存在的所有文件进行编码。name
:输出文件的名称将为name_i.tfrecords
,其中 i 是文件的编号。output_dir
:保存 tfrecords 的位置use_gpt2_tokenizer
:是否使用预训练的 HuggingFace GPT2 tokenizer,在这种情况下分隔符将设置为 [50256]。encoder_path
:如果不使用预训练的 gpt2 分词器,请使用此标志提供生成的分词器 json 的路径。separator
:以列表格式编写,在文档之间插入的分隔符标记(例如“[0]”)。将取决于您的编码器。minimum_size
:文档必须具有的最小大小(以标记为单位),否则将被丢弃。这将在稍后确定您的stitch
参数: stitch * minimum_size
必须始终大于或等于n_ctx
(有关更多详细信息,请参阅参数参考部分)。 要在模型中使用数据集,您必须首先在./configs/dataset_configs
文件夹下注册该数据集。首先选择扩展名为.json
文件名。该文件名将用作数据集标识。配置应按以下方式填写。
如果您有使用预训练 gpt2 分词器编码的数据集,则可以像这样指定:
{
"n_vocab" : 50257 ,
"path" : " gs://neo-datasets/openwebtext-documents/openwebtext_*.tfrecords " ,
"eval_path" : " gs://neo-datasets/openwebtext-documents/openwebtext_*.tfrecords " ,
"tokenizer_is_pretrained" : true ,
"tokenizer_path" : " gpt2 "
}
或者如果您已经训练了自定义分词器,如下所示:
{
"n_vocab" : 32768 ,
"path" : " ./path/to/your/*.tfrecords " ,
"eval_path" : " ./path/to/your/eval/*.tfrecords " ,
"tokenizer_path" : " ./path/to/your/byte-level-bpe.tokenizer.json "
}
最后,在模型配置中,将上面创建的文件名添加到datasets
数组中。
<dataset id>
将是您在上面创建的文件名,不包括.json
"datasets": [[<dataset id>, <stitch>, <datatype>, <weight>]] # datasets key defines at run time how each dataset is processed for training
设置数据集后,在/configs
中找到合适的配置。
这里我们使用 GPT3-XL 大小的模型作为示例,但./configs
中有更多模型,所有这些模型在可用配置部分都有简短的摘要。
您需要做的就是如上所述编辑数据集 ID,并编辑model_path
(将保存日志和检查点)以指向您具有写入权限的云存储桶(或本地路径,如果使用 GPU)。
{
"n_head" : 32 ,
"n_vocab" : 50257 ,
"embed_dropout" : 0.1 ,
"lr" : 0.0002 ,
"lr_decay" : " cosine " ,
"warmup_steps" : 3000 ,
"beta1" : 0.9 ,
"beta2" : 0.95 ,
"epsilon" : 1e-8 ,
"opt_name" : " adam " ,
"weight_decay" : 0.1 ,
"train_batch_size" : 512 ,
"attn_dropout" : 0.1 ,
"train_steps" : 286150 ,
"eval_steps" : 0 ,
"predict_steps" : 1 ,
"res_dropout" : 0.1 ,
"eval_batch_size" : 128 ,
"predict_batch_size" : 1 ,
"iterations" : 2500 ,
"n_embd" : 2048 ,
"datasets" : [[ " your_dataset_name " , 25 , " documents_random " , 1.0 ]],
"model_path" : " gs://neo-models/GPT3_XL " ,
"n_ctx" : 2048 ,
"n_layer" : 24 ,
"scale_by_depth" : true ,
"scale_by_in" : false ,
"attention_types" : [[[ " global " ], 24 ]],
"mesh_shape" : " x:128,y:2 " ,
"layout" : " batch:x,memory_length:y,embd:y " ,
"activation_function" : " gelu " ,
"recompute_grad" : true ,
"gradient_clipping" : 1.0 ,
"tokens_per_mb_per_replica" : 2048
}
python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --tpu <tpu-name>
tpu
:要使用的 TPU 的名称。steps_per_checkpoint
:保存检查点的频率(以步骤为单位)。--auto_layout
和--auto_layout_and_mesh_shape
(可选):禁用训练并自动生成内存高效layout
(和mesh_shape
)gpu_ids
:如果使用 GPU 进行训练,请省略tpu
标志并传入 GPU 的 id。在下面的示例中,我们在 3 个 GPU 上进行训练,指定它们的设备 ID(以空格分隔): python3 main.py --model <your_config_name> --steps_per_checkpoint <n> --gpu_ids <device:GPU:0 device:GPU:1>
我们有多种模型大小可用,但我们的一些配置需要大型 TPU,并且需要进行调整才能在较小的机器或 GPU 上运行。以下是 configs 目录中每个模型的简短指南:
待办事项
Sacred 有助于跟踪实验,并且比张量板更好用。
设置:
安装 Docker 和 Docker-compose
运行docker-compose up
使用方法:
确保 model_dir 中没有任何指标日志(它会触发张量板的指标内容,假设它是现有运行的延续)。您可以使用gsutil rm -r ...
删除模型目录
运行python3 run_experiment.py --tpu sometpuhere --model someconfig.json
选项与main.py
相同。
您可以访问 http://server_ip_goes_here:8081/ 查看 Omniboard 概述。如果您更喜欢查看张量板,该脚本还会启动张量板并自动为其分配一个端口。该脚本应在日志顶部附近打印出张量板端口。
如果您对特定配置文件的数据集感到困惑,您可以使用单个命令轻松检查最小和最大令牌 ID。这对于确保模型的词汇量大小至少与最大标记 id 一样大很有用。如果您尝试在索引超出范围的矩阵上进行收集,Tensorflow 不会出错,因此您需要确保词汇量足够大。
python main --model {config_name} --check_dataset
除了能够训练大型 GPT 之外,该存储库还允许您轻松进行屏蔽语言建模(BERT、RoBERTa)。为此,您必须执行两个附加步骤。
对数据集进行标记时,必须为[mask]
标记保留一个特殊的 ID。
在配置中,您必须定义两个附加字段
"mlm_training" : true , # must be set to true
"mlm_mask_id" : < mask id > # the mask id that you reserved from above
这就是使用 MLM 目标训练模型所需的全部内容,适用于已正确编码的任何类型的数据。如果您想调整其他相关的超参数,请继续阅读。
"mlm_cls_token_id" : < cls token id > , # auto append specified CLS token id on the left
"mlm_mask_prob" : 0.15 , # the probability of masking a token, defaults to 15%
"mlm_same_token_prob" : 0.10 , # probability of keeping the token the same, defaults to 10%
"mlm_random_token_prob" : 0.10 , # probability of tokens that are replaced with random tokens, 10% was recommended by the BERT paper
"mlm_mask_ignore_ids" : [ < cls token > , < sep token > ] # ignore masking other special tokens, if any
从/configs
中选择一个有效的配置并根据需要调整参数:
n_heads
:注意力头的数量。n_embd
:隐藏层的大小,必须能被n_heads
整除。n_vocab
:词汇量。embed_dropout
、 res_dropout
、 attn_dropout
:词嵌入/残差/注意力的丢弃概率lr
:学习率warmup_steps
:达到完全学习率之前的步数(从0
到lr
线性斜坡)。lr_decay
: cosine
或linear
。opt_name
: adam
或adafactor
。beta1
、 beta2
和epsilon
: adam
优化器参数。beta1
、 ada_epsilon1
和ada_epsilon2
: adafactor
优化器参数。weight_decay
:权重衰减参数,如果不存在,则不使用权重衰减(使用 Adam 的权重衰减修复)(默认值:0.01)(可选)。train_batch_size
:训练期间的批量大小。train_steps
:训练步骤数(批次),目前设置为大约 1 个时期(数据集中的标记总数/每批次的标记数量 (= train_batch_size
/ n_ctx
))。eval_steps
:每次评估运行的步骤数。设置为0
表示不进行评估。即在每个检查点之后,对模型进行eval_steps
测试iterations
:排队到 TPU 的步骤数,必须小于steps_per_checkpoint
。 (默认值:500)datasets
:要使用的 tfrecords 数据集列表。每个数据集都是一个包含以下参数的列表: [train glob , eval glob, stitch, sampling_mode, weight]
。例如,对于单个数据集(注意双列表): [["bundestag_*.tfrecords", "", 10, "random_sample", 1.0]]
dataset_id
: ./configs/dataset_configs
中数据集配置文件的名称stitch
:如果使用sampling_mode
random_sample
,输入管道会将这一数量的文本采样为一个样本。您必须选择缝合,以便stitch * minimum_document_length >= n_ctx
sampling_mode
: chunks
(tfrecords被预处理成正确的长度并按顺序读取)或documents_random
( stitch
文档数量被连接,然后n_ctx
块被随机二次采样)weights
:该数据集与其他数据集相比应具有多少相对权重model
:要训练哪个模型。目前仅支持GPT
,如果不存在则默认为 GPT。model_path
:用于保存模型检查点和日志的 Google 存储桶位置(或本地路径,如果使用 GPU)。n_ctx
:上下文窗口的大小。默认值为 2048n_layer
:模型中的层(块)数。scale_by_depth
:如果为 true,则层的权重初始化将按照其深度进行缩放,如 GPT2 论文中所示。scale_by_in
:如果为 true,则层的权重初始化将按其输入数量进行缩放,如 GPT2 论文中所示。mesh_shape
:Mesh 是一个 n 维处理器数组,其命名维度用于 mesh-tensorflow 库中的并行性。每个张量根据布局在网格尺寸上均匀分割(见下文)。 “mesh_shape”是该数组的形状,并且必须等于处理器的数量。例如,对于 v3-128 TPU“mesh_shape”:“x:16,y:8”。layout
:张量布局在其网格上,每个处理器上有一个切片。张量“布局”是一个单射部分映射,指定张量的哪些维度(均匀)分布在网格的哪些维度上。张量的任何维度都不能在其网格的两个维度上拆分,并且张量的任何两个维度都不能在其网格的同一维度上拆分。用户以(张量维度名称,网格维度名称)对的形式定义一组全局布局规则。如果存在匹配规则,则张量的维度会在其网格的维度上分割,例如(对于上面的示例 mesh_shape: "layout":"batch:x,heads:y"activation_function
: selu
(自归一化)或gelu
(OA 使用),前馈传递中使用的激活函数。 (默认:格鲁)attention_types
:以下格式列表中每层的注意力类型 [[["attention_type"], n_layers]]。例如,对于 12 层网络 [[["global"], 12]] 或 [[["local"], 10], [["global"], 2]]。linear
、 global
、 local
或none
。我们发现global
和linear
的 50/50 混合效果很好。 none
允许您创建仅前馈层以实现更高效的 PAR Transformer 模型。precision
: float32
或bfloat16
。tokens_per_mb_per_replica
:如果不是 None,则会将批次拆分为包含tokens_per_mb_per_replica
令牌的更小的微批次,以避免 OOM。梯度在本地累积并减少一次。重要提示:mb 在这里指的是小批量而不是兆字节。专家荟萃
moe_layers
:要附加专家层混合的层编号列表。例如: [2,4,6,8,10,12]
。我们通过实验发现,每两个 self-attention 层都有一个 moe 层,可以很好地工作。moe_params
:传递到 moe 层的附加 kwargs 的字典。 EG {"moe_dropout_rate": 0.0 }
实验特点
axial_pos_emb_
:如果为 true,则使用[轴向位置嵌入](https://arxiv.org/abs/1912.12180。mlp_glu
:如果为 true,则使用前馈层的门控线性单元变体。scalenorm
:如果为 true,则使用scalenorm 而不是layernorm。rezero
:如果为 true,则使用 rezero 而不是 Layernorm。num_mem_kv
:添加来自全注意力论文的内存/键值。 Param 是一个 int ,包含所需内存/键值的数量。macaron
:如果 true - 对每个层块使用一个 macaron 变压器。 如果您发现 GPT-Neo 对您的工作有帮助,您可以将此存储库引用为
@software{gpt-neo,
author = {Black, Sid and
Gao, Leo and
Wang, Phil and
Leahy, Connor and
Biderman, Stella},
title = {{GPT-Neo: Large Scale Autoregressive Language
Modeling with Mesh-Tensorflow}},
month = mar,
year = 2021,
note = {{If you use this software, please cite it using
these metadata.}},
publisher = {Zenodo},
version = {1.0},
doi = {10.5281/zenodo.5297715},
url = {https://doi.org/10.5281/zenodo.5297715}
}
版本号应替换为您正在使用的版本号,年份对应于项目的开源版本。
如果您对引用 Pile 上训练的 GPT-Neo 模型特别感兴趣,我们也将不胜感激
@article{gao2020pile,
title={The Pile: An 800GB Dataset of Diverse Text for Language Modeling},
author={Gao, Leo and Biderman, Stella and Black, Sid and Golding, Laurence and Hoppe, Travis and Foster, Charles and Phang, Jason and He, Horace and Thite, Anish and Nabeshima, Noa and others},
journal={arXiv preprint arXiv:2101.00027},
year={2020}
}