Pythia: 跨时间和规模解释Transformers模型
这个仓库是EleutherAI的Pythia项目,该项目结合可解释性分析和缩放规律,以理解自回归Transformers模型在训练过程中知识如何发展和演变。有关模型、训练和特性的详细信息,请参阅我们的论文《Pythia: 一套用于分析大型语言模型训练和缩放的工具》。
Pythia套件的开发明确目的是为了支持可解释性、学习动态以及伦理和透明度研究,现有的模型套件对此不足。Pythia套件的主要特点是:
- 论文中使用的所有模型、数据和代码都已公开发布,可以完全复现结果。我们论文中的所有结果都经过至少一个其他实验室的独立验证。
- 所有模型在整个训练过程中保存了154个检查点,可以研究大型语言模型的学习动态。
- 所有模型都以相同的顺序在相同的数据上进行训练,使研究人员能够探索对训练过程的因果干预。
在发布时,Pythia是世界上唯一满足这些要求的模型套件。事实上,我们为12B参数模型发布的154个检查点,代表了每个模型的部分训练检查点数量超过了世界上所有12B+模型曾发布的总和。我们的工作激发了其他人创建类似项目,包括LLM360的Amber和K2-65B、AI2的OLMo以及Zyphra的BlackMamba。
除了Pythia套件本身,该仓库还作为一个中心,包含以下论文的信息、代码和可复现说明:
更新日志
[2024年7月9日] 大幅修改了readme,包括更好的历史背景说明,并推广了人们使用Pythia进行的许多出色研究。还添加了后续训练模型的链接。
[2023年11月2日] 应一些研究人员的要求,我们添加了14M和31M模型。我们计划在未来训练这些模型的去重版本。
[2023年4月3日] 我们发布了所有Pythia模型的新版本,修复了原始套件中的各种不一致。有关更改的详细信息,请参阅Pythia论文的附录B。旧模型("v0")仍可在此处获得,可用于消融研究。
[2023年1月20日] 2023年1月20日,我们决定重命名Pythia模型套件,在总参数计数中包括嵌入层和反嵌入层参数,与许多其他模型套件一致,因为我们认为这种惯例更好地反映了这些模型的设备内存使用情况。我们还发现由于打字错误,我们的一个模型比我们想象的要小,并用预期大小的模型替换了它。详情请见此处。
目录
模型
我们在Pile数据集上训练并发布了8种规模的模型套件,以及应用去重后的Pile数据集。所有8种规模的模型都在完全相同的数据上按完全相同的顺序进行训练。每个模型在训练过程中看到了299,892,736,000 = 300B个token。对于"标准"模型,这相当于Pile上不到1个epoch,对于去重后的Pile(一个epoch包含207B个token)则相当于= 1.5个epoch。所有模型都使用混合精度训练,除了EleutherAI/pythia-1b
使用bf16外,其他模型都使用fp16,因为在fp16下该模型在训练后期出现了无法恢复的损失尖峰。
在初始发布后,应对稀疏自编码器缩放感兴趣的对齐研究人员的要求,我们训练了14M和31M参数的模型。
参数 | 层数 | 模型维度 | 头数 | 头维度 | 批量大小 | 学习率 | Hugging Face 检查点 |
---|---|---|---|---|---|---|---|
14M | 6 | 128 | 4 | 32 | 2M | 1.0e-3 | 标准版 |
31M | 6 | 256 | 8 | 32 | 2M | 1.0e-3 | 标准版 |
70M | 6 | 512 | 8 | 64 | 2M | 1.0e-3 | 标准版, 去重版 |
160M | 12 | 768 | 12 | 64 | 2M | 6.0e-4 | 标准版, 去重版 |
410M | 24 | 1024 | 16 | 64 | 2M | 3.0e-4 | 标准版, 去重版 |
1B | 16 | 2048 | 8 | 256 | 2M | 3.0e-4 | 标准版, 去重版 |
1.4B | 24 | 2048 | 16 | 128 | 2M | 2.0e-4 | 标准版, 去重版 |
2.8B | 32 | 2560 | 32 | 80 | 2M | 1.6e-4 | 标准版, 去重版 |
6.9B | 32 | 4096 | 32 | 128 | 2M | 1.2e-4 | 标准版, 去重版 |
12B | 36 | 5120 | 40 | 128 | 2M | 1.2e-4 | 标准版, 去重版 |
为了促进大型语言模型学习动态的研究,我们为每个模型提供了154个检查点,分别代表第0步(初始化)、第1步、第2步、第4步、第8步、第16步、第32步、第64步、第128步、第256步、第512步、第1000步,以及之后每1000步的状态。我们还上传了预分词的数据文件和一个脚本,用于重建所有模型在训练过程中使用的数据加载器。更多详情请参见重现训练部分。
用于使用GPT-NeoX库训练这些模型的配置文件可以在本仓库的models/
目录中找到,也可以在GPT-NeoX库本身中找到。
我们在最初训练这些模型时犯了一个错误,导致不同运行之间存在一些不一致。我们修复了这些不一致并重新运行了整个模型套件,原始运行版本以EleutherAI/pythia-160m-v0
的名称提供。有关v0模型与主套件的区别的更多详情,请参阅Pythia论文。
多个随机种子
用于训练Pythia模型的随机种子是GPT-NeoX的默认值:1234。为了促进研究随机性如何影响模型行为,我们一直在使用不同的随机种子训练更多模型。目前,我们已经使用从1到9的每个随机种子训练并发布了以下模型:
- Pythia 14M
- Pythia 31M
- Pythia 70M
- Pythia 160M
- Pythia 410M
所有这些模型都是标准的Pythia模型,而不是在去重的Pile数据集上训练的模型。与最初发布的模型结合在一起,它们代表了使用不同随机种子的十个其他完全相同的变体。
使用Pythia
快速开始
所有Pythia模型都托管在Hugging Face Hub上。可以通过以下代码加载和使用它们(以3000步的pythia-70M-deduped
模型检查点为例):
from transformers import GPTNeoXForCausalLM, AutoTokenizer
model = GPTNeoXForCausalLM.from_pretrained(
"EleutherAI/pythia-70m-deduped",
revision="step3000",
cache_dir="./pythia-70m-deduped/step3000",
)
tokenizer = AutoTokenizer.from_pretrained(
"EleutherAI/pythia-70m-deduped",
revision="step3000",
cache_dir="./pythia-70m-deduped/step3000",
)
inputs = tokenizer("你好,我是", return_tensors="pt")
tokens = model.generate(**inputs)
tokenizer.decode(tokens[0])
所有模型都经过了相当于143000步、批量大小为2,097,152个token的训练。修订版/分支step143000
与每个模型main
分支上的模型检查点完全一致。
我们还提供了GPT-NeoX库接受的所有模型检查点格式,最终步骤的检查点和优化器状态可以从Hugging Face Hub上的EleutherAI/neox-ckpt-pythia-xxx-deduped-v1
下载,但由于优化器状态的大小和预期的较低需求,我们不会大规模提供所有步骤的检查点。如果你想使用GPT-NeoX代码库内的中间模型进行分析,或者想要其他步骤的优化器状态,请发送邮件至hailey@eleuther.ai和stella@eleuther.ai。
❗ Huggingface上尺寸为
160m、410m、1.4b
的pythia-{size}-v0
模型是在71500步中以4M令牌的批量大小进行训练的,每500步保存一次检查点。为了与所有2M批量模型保持一致,Huggingface上这些v0模型的步骤名称已重命名。因此,标记为pythia-1.4b-v0
的step1000
检查点实际上是第500步,但它已经处理了与其他step1000检查点相同数量的令牌。
复现训练
(由@BaruchG提供的扩展复现说明)
我们提供训练数据以便复现我们的训练过程。GPT-NeoX库需要预先分词的训练数据,以两个内存映射的numpy数组形式存储:一个.bin
文件和一个.idx
文件。我们通过Hugging Face hub提供这些文件。要下载并使用去重后的Pile训练数据:
git lfs clone https://huggingface.co/datasets/EleutherAI/pythia_deduped_pile_idxmaps
# 可选步骤,以确保文件未损坏
python utils/checksum_shards.py
python utils/unshard_memmap.py --input_file ./pythia_deduped_pile_idxmaps/pile_0.87_deduped_text_document-00000-of-00082.bin --num_shards 83 --output_dir ./pythia_pile_idxmaps/
# 完整文件的正确sha256值为 0cd548efd15974d5cca78f9baddbd59220ca675535dcfc0c350087c79f504693
# 可以通过以下命令验证:sha256sum ./pythia_pile_idxmaps/*
这个过程需要一天多的时间才能完成,但不应该需要超过5 GB的内存。我们建议下载这些数据,而不是从头开始重新分词Pile数据集,以确保保持Pythia模型所见的数据顺序。除了训练数据外,您还需要本地复制一份我们用于训练模型的分词器。您可以在这里找到它。
接下来,您需要设置训练环境:
git clone https://github.com/EleutherAI/gpt-neox.git
cd gpt-neox
git checkout v1.0
pip install -r requirements/requirements-flashattention.txt
wget https://github.com/EleutherAI/pythia/blob/main/models/160M/pythia-160m-deduped.yml
docker build -t pythia:latest .
容器构建完成后,使用以下命令运行容器(从GPT-NeoX仓库的根目录运行,确保pythia yaml文件可以从该文件夹内访问):
docker run --runtime=nvidia --rm -it -e NVIDIA_VISIBLE_DEVICES=0,1,2,3 --shm-size=1g --ulimit memlock=-1 --mount type=bind,src=$PWD,dst=/gpt-neox -v $(pwd):/workspace/ pythia:latest bash
如果数据集和Yaml文件无法从Docker容器内访问,您可以使用-v参数添加更多连接的卷。
修改数据路径和分词器路径的行如下:
"train-data-paths": ["/fsx/pile/pile_20B_tokenizer_text_document"], #指向步骤1中生成的包含.bin和.idx文件的文件夹
"valid-data-paths": ["/fsx/pile/pile_20B_tokenizer_text_document"], #指向步骤1中生成的包含.bin和.idx文件的文件夹
"test-data-paths": ["/fsx/pile/pile_20B_tokenizer_text_document"], #指向步骤1中生成的包含.bin和.idx文件的文件夹
"tokenizer-type": "HFTokenizer",
"vocab-file": "/fsx/pile/20B_tokenizer.json", #指向步骤2中获取的分词器
根据您可用的显存大小,您可能需要调整批量大小。总批量大小的计算方式为总GPU数 * train_micro_batch_size_per_gpu * gradient_accumulation_steps / (pipe-parallel-size * model-parallel-size)
,需要保持在1024以匹配Pythia训练批量大小。您可以:
"train_micro_batch_size_per_gpu": XXX, #设置为适合您GPU内存的值
"gradient_accumulation_steps": 1, #设置为一个值以补偿,使总批量大小为1024
如果您希望保存权重,也可以将该信息添加到yaml文件中。例如,要保存在checkpoints文件夹中,您可以在底部添加:
"launcher": "slurm",
"deepspeed_slurm": false,
"save": "checkpoints",
"load": "checkpoints",
"checkpoint_validation_with_forward_pass": False,
}
确保路径是Docker容器内的路径,如果您希望权重持久化,请确保它们可以从容器外部访问,例如在/workspace/中。
现在您应该能够通过运行以下命令开始训练模型:
python deepy.py train.py pythia-160m-deduped.yml 2>&1 | tee output.txt
输出将保存到output.txt,如果您不想这样做,只需删除结尾部分。
为了将您的模型转换为Hugging Face transformers
格式,您可以使用GPT-NeoX库中的tools/convert_to_hf.py
脚本。您可能需要在文件类型中添加from typing import List
,并将这里的行从list[torch.Tensor]
更改为List[torch.Tensor]
。然后,您可以像这样运行脚本来转换第143000步的权重:
python tools/convert_to_hf.py --input_dir checkpoints/global_step143000/ --config_file checkpoints2/global_step 143000/configs/pythia-70m.yml --output_dir ./output/
这应该会输出一个类似于https://huggingface.co/EleutherAI/pythia-70m-deduped/tree/main 的文件结构。
❗ 有时人们会发现他们最终没有得到正确的分词器,原因我们无法调试。如果您的
tokenizer_config.json
与这里的不同,special_tokens_map.json
与这里的不同,您可能需要用Huggingface上的文件替换它们。 要使用我们的评估库进行评估,请在这里安装容器(已测试4.28和4.29版本)。设置好该Docker容器后,运行:
git clone https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
pip install -e .
按照Harness仓库中的说明进行操作。然后,你应该能够通过指向你的权重(应该在你的容器中)来运行基准测试,运行类似以下的命令:
python3 main.py --model hf-causal-experimental --model_args pretrained=../gpt-neox/output/ --tasks lambada_openai,piqa,winogrande,arc_easy,sciq,wikitext --device cuda:0
探索数据集
我们提供了一个工具,用于查看所有模型在训练期间使用的训练数据加载器的特定部分,位于utils/batch_viewer.py
。
首先,我们需要克隆Pythia仓库:
git clone https://github.com/EleutherAI/pythia
接下来,我们必须安装依赖项:
pip install torch==1.13.0+cu117 -f https://download.pytorch.org/whl/torch/
pip install numpy tqdm huggingface_hub
然后,我们必须下载适当的数据集。我们提供了预先打乱的重复和去重版本的Pile数据集。使用Huggingface的工具下载适当的版本,如下所示:
提示:确保将
path/to/*
替换为你打算保存从Huggingface下载的数据集的适当路径。
- 要下载标准版本,使用
from huggingface_hub import hf_hub_download hf_hub_download(repo_id="EleutherAI/pile-standard-pythia-preshuffled", repo_type="dataset", cache_dir="path/to/local/folder")
- 要下载去重版本,使用
from huggingface_hub import hf_hub_download hf_hub_download(repo_id="EleutherAI/pile-deduped-pythia-preshuffled", repo_type="dataset", cache_dir="path/to/local/folder")
现在你可以使用utils/unshard_mmap.py
脚本合并文件:
python3 utils/unshard_mmap.py --input_file "path/to/local/folder/document-00000-of-00020.bin" --num_shards 21 --output_dir "path/to/merged/folder/"
确保也将索引文件复制到合并文件夹,使用以下命令:
cp path/to/local/folder/document.idx path/to/merged/folder/document.idx
现在,我们已经准备好运行utils/batch_viewer.py
了!
python3 utils/batch_viewer.py \
--start_iteration 0 \
--end_iteration 1000 \
--load_path path/to/merged/folder/document \
--save_path path/to/save/folder/ \
--conf_dir utils/dummy_config.yml
这将保存一个包含所有索引的单独文件,作为numpy数组。
你现在可以使用numpy加载它,如下所示:
import numpy as np
indices = np.load("path/to/save/folder/indices.npy")
这些索引包含大小为(None, 2049)的整数序列的标记化序列,其中每个整数对应于一个唯一的标记索引。
请注意,文档是连接的,并由EOD
标记分隔。因此,每个样本或批次可能不以EOD标记开始。在训练期间,目标标记向左移动1位。因此,序列长度为2048的模型需要2049长度的序列进行训练(更多信息,请参阅此评论)
Pythia论文复现
我们在本仓库的case-studies/
文件夹中为那些有兴趣复现Pythia套件论文中进行的案例研究的人提供了进一步的信息。
基准分数
我们还提供了各种NLP数据集的0-shot和5-shot基准结果:
- ARC-challenge (
arc_challenge
) - ARC-easy (
arc_easy
) - BLiMP (
blimp_*
) - Lambada (
lambada_openai
) - LogiQA (
logiqa
) - MMLU (
hendrycksTest*
) - PiQA (
piqa
) - SciQ (
sciq
) - Wikitext (
wikitext
) - Winogrande (
winogrande
) - WSC (
wsc
)
评估是在GPT-NeoX中使用LM Evaluation Harness进行的,可以在本仓库的evals/pythia-v1/*/*
中按模型和步骤查看。警告:所有评估都是使用语言模型评估工具的待办提交版本在几年前运行的,可能无法通过当前版本重现。
基于Pythia的研究
我们的Pythia项目的主要目标是在EleutherAI和整个社区中促进可解释性和学习动态等主题的研究。在这里,我们记录了使用我们模型的精选论文,重点关注那些受Pythia套件独特赋能的工作,这些工作如果使用其他组织发布的模型可能会较难实现或无法实现。有关引用Pythia的更多论文列表,请参见此处。
语言模型内部机制
- Belrose等人。"通过调谐镜头从Transformer中引出潜在预测。" arXiv预印本 arXiv:2303.08112 (2023)。EleutherAI论文
- Brown等人。"通过表示差异理解语言模型的内部工作原理。" 自然语言处理实证方法会议 (2023)。
- Feng和Steinhardt。"语言模型如何在上下文中绑定实体?" 国际学习表示会议 (2023)。
- Garde、Kran和Barez。"DeepDecipher:访问和调查大型语言模型中的神经元激活。" arXiv预印本 arXiv:2310.01870 (2023)。
- Gurnee等人。"在干草堆中寻找神经元:使用稀疏探测的案例研究。" 机器学习研究交易 (2023)。
- Stolfo、Belinkov和Sachan。"使用因果中介分析理解语言模型中的算术推理。" 自然语言处理实证方法会议 (2023)。
学习动态
- Gupta等人。"大型语言模型的持续预训练:如何重新预热你的模型?"《ICML基础模型高效系统研讨会》(2023)。
- Michaelov和Bergen。"新兴的无能力?预训练过程中的反向缩放"《计算语言学协会发现:EMNLP》(2023)。
- Sanyal等人。"理解早期权重平均对训练大型语言模型的有效性"《arXiv预印本arXiv:2306.03241》(2023)。
- Tian等人。"JoMA:通过MLP和注意力的联合动力学揭示多层Transformer的奥秘"《arXiv预印本arXiv:2310.0053》(2023)。
- Ye等人。"语言通才vs.专才:对多语言迁移能力的实证重新审视"arXiv预印本arXiv:2306.06688 (2023)。
- Belrose等人。"神经网络学习日益复杂的统计"《国际学习表示会议》(2024)。EleutherAI论文
- Godey等人。"为什么小型语言模型表现不佳?通过Softmax瓶颈研究语言模型饱和"《arXiv预印本arXiv:2404.07647》(2024)。
- Singh等人。"神经网络优化轨迹的特征:方向探索和冗余"《arXiv预印本arXiv:2403.07379》(2024)。
- Tigges等人。"语言模型机制在训练和规模上的稳定性和泛化性"《ICML机制可解释性研讨会》(2024)。EleutherAI论文
训练数据如何决定模型行为
- Roger。"大型语言模型有时会生成纯负强化文本"《arXiv预印本arXiv:2306.07567》(2023)。
- Oh等人。"频率解释了大型语言模型的规模、训练数据量和惊奇度与阅读时间拟合之间的反相关"《arXiv预印本arXiv:2402.02255》(2024)。
- Liu等人。"GPT模型训练数据的影响研究"《arXiv预印本arXiv:2404.07840》(2024)。
- Lesci等人。"记忆化概况的因果估计"《计算语言学协会》(2024)。
安全、审计和合规研究
- Ippolito等人。"在黑盒访问语言生成系统的情况下逆向工程解码策略。"《国际自然语言生成会议》2023。
- Biderman等人。"大型语言模型中的新兴和可预测记忆化。"《神经信息处理系统》(2023)。EleutherAI论文
- Choi、Shavit和Duvenaud。"验证神经模型训练数据的工具"《神经信息处理系统》(2023)。
- Li等人。"MoPe:基于模型扰动的语言模型隐私攻击"《自然语言处理经验方法会议》(2023)。
- Min等人。"SILO语言模型:在非参数数据存储中隔离法律风险"《国际学习表示会议》(2024)。
- Pawelczyk等人。"机器遗忘未能移除数据投毒攻击"《arXiv预印本arXiv:2406.17216》(2024)。
- Prashanth等人。"背诵、重构、回忆:语言模型中记忆化作为一种多面现象"《arXiv预印本arXiv:2406.17746》(2024)。EleutherAI论文
- Duan等人。"成员推理攻击对大型语言模型有效吗?"《语言建模会议》(2024)。
引用详情
如果您在研究中使用Pythia模型,请引用我们的论文:
@inproceedings{biderman2023pythia,
title={Pythia: A suite for analyzing large language models across training and scaling},
author={Biderman, Stella and Schoelkopf, Hailey and Anthony, Quentin Gregory and Bradley, Herbie and O'Brien, Kyle and Hallahan, Eric and Khan, Mohammad Aflah and Purohit, Shivanshu and Prashanth, USVSN Sai and Raff, Edward and others},
booktitle={International Conference on Machine Learning},
pages={2397--2430},
year={2023},
organization={PMLR}
}
如果您使用了本仓库中其他论文的数据或结果,请引用相应的论文。引用信息可在各自的README中找到,为方便起见,这里也复制如下:
@inproceedings{biderman2023emergent,
title={Emergent and Predictable Memorization in Large Language Models},
author={Biderman, Stella and Prashanth, USVSN Sai and Sutawika, Lintang and Schoelkopf, Hailey and Anthony, Quentin and Purohit, Shivanshu and Raff, Edward},
journal={Advances in Neural Information Processing Systems},
year={2023}
}
如果您有兴趣引用我们的训练数据、训练库或评估库,可以使用以下引用:
@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}
}
@article{biderman2022datasheet,
title={Datasheet for the pile},
author={Biderman, Stella and Bicheno, Kieran and Gao, Leo},
journal={arXiv preprint arXiv:2201.07311},
year={2022}
}
@软件{gpt-neox-库, 标题 = {{GPT-NeoX:基于PyTorch的大规模自回归语言建模}}, 作者 = {Andonian, Alex and Anthony, Quentin and Biderman, Stella and Black, Sid and Gali, Preetham and Gao, Leo and Hallahan, Eric and Levy-Kramer, Josh and Leahy, Connor and Nestler, Lucas and Parker, Kip and Pieler, Michael and Phang, Jason and Purohit, Shivanshu and Schoelkopf, Hailey and Stander, Dashiell and Songz, Tri and Tigges, Curt and Thérien, Benjamin and Wang, Phil and Weinbach, Samuel}, 网址 = {https://www.github.com/eleutherai/gpt-neox}, doi = {10.5281/zenodo.5879544}, 月份 = {9}, 年份 = {2023}, 版本 = {2.0.0}, }
@其他{eval-harness, 作者 = {Gao, Leo and Tow, Jonathan and Abbasi, Baber and Biderman, Stella and Black, Sid and DiPofi, Anthony and Foster, Charles and Golding, Laurence and Hsu, Jeffrey and Le Noac'h, Alain and Li, Haonan and McDonell, Kyle and Muennighoff, Niklas and Ociepa, Chris and Phang, Jason and Reynolds, Laria and Schoelkopf, Hailey and Skowron, Aviya and Sutawika, Lintang and Tang, Eric and Thite, Anish and Wang, Ben and Wang, Kevin and Zou, Andy}, 标题 = {少样本语言模型评估框架}, 月份 = 9, 年份 = 2021, 发布者 = {Zenodo}, 版本 = {v0.0.1}, doi = {10.5281/zenodo.5371628}, 网址 = {https://doi.org/10.5281/zenodo.5371628} }
许可证
以下许可证适用于此GitHub仓库中的所有代码,以及Pythia模型和本仓库中包含的任何其他受版权保护的作品。
版权所有 2024 EleutherAI
根据Apache许可证2.0版(以下简称"许可证")获得许可; 除非遵守许可证,否则您不得使用此文件。 您可以在以下位置获取许可证副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则根据许可证分发的软件是基于 "按原样"分发的,不附带任何明示或暗示的担保或条件。 有关许可证下的特定语言管理权限和限制,请参阅许可证。