Project Icon

pythia

大语言模型训练过程知识演化分析开源项目

Pythia是一个开源项目,旨在分析大语言模型训练过程中的知识演化。该项目提供完整的模型、数据和代码,包含154个训练检查点,支持研究人员深入探索学习动态和因果关系。Pythia是业界首个支持全面复现和学习动态分析的模型套件,为大语言模型的可解释性研究提供了重要工具。

Pythia: 跨时间和规模解释Transformers模型

这个仓库是EleutherAI的Pythia项目,该项目结合可解释性分析和缩放规律,以理解自回归Transformers模型在训练过程中知识如何发展和演变。有关模型、训练和特性的详细信息,请参阅我们的论文《Pythia: 一套用于分析大型语言模型训练和缩放的工具》。

Pythia套件的开发明确目的是为了支持可解释性、学习动态以及伦理和透明度研究,现有的模型套件对此不足。Pythia套件的主要特点是:

  1. 论文中使用的所有模型、数据和代码都已公开发布,可以完全复现结果。我们论文中的所有结果都经过至少一个其他实验室的独立验证。
  2. 所有模型在整个训练过程中保存了154个检查点,可以研究大型语言模型的学习动态。
  3. 所有模型都以相同的顺序在相同的数据上进行训练,使研究人员能够探索对训练过程的因果干预。

在发布时,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 检查点
14M61284322M1.0e-3标准版
31M62568322M1.0e-3标准版
70M65128642M1.0e-3标准版, 去重版
160M1276812642M6.0e-4标准版, 去重版
410M24102416642M3.0e-4标准版, 去重版
1B16204882562M3.0e-4标准版, 去重版
1.4B242048161282M2.0e-4标准版, 去重版
2.8B32256032802M1.6e-4标准版, 去重版
6.9B324096321282M1.2e-4标准版, 去重版
12B365120401282M1.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.aistella@eleuther.ai

❗ Huggingface上尺寸为160m、410m、1.4bpythia-{size}-v0模型是在71500步中以4M令牌的批量大小进行训练的,每500步保存一次检查点。为了与所有2M批量模型保持一致,Huggingface上这些v0模型的步骤名称已重命名。因此,标记为pythia-1.4b-v0step1000检查点实际上是第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的更多论文列表,请参见此处

语言模型内部机制

学习动态

训练数据如何决定模型行为

安全、审计和合规研究

引用详情

如果您在研究中使用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

除非适用法律要求或书面同意,否则根据许可证分发的软件是基于 "按原样"分发的,不附带任何明示或暗示的担保或条件。 有关许可证下的特定语言管理权限和限制,请参阅许可证。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号