OpenAI 联合创始人Andrej Karpathy大神上传了一段 4 小时视频讲座: “让我们复现 GPT-2(124M)

视频之所以这么长,是因为它非常全面:从一个空文件开始,大神手把手,事无巨细的的教你最终构建复现一个GPT-2(124M)模型:

  • 首先构建了 GPT-2 网络

  • 然后优化它以便快速训练

  • 接着参考 GPT-2 和 GPT-3 论文来设置训练运行的优化和超参数

  • 然后进行模型评估

  • 最后启动模型训练等待结果

讲座地址:https://www.youtube.com/watch?v=l8pRSuU81PU‍

值得注意的是:

这个视频是基于“Zero To Hero”系列的,在讲解过程中会时不时地参考以前的视频。你也可以把这个视频看作是一步步构建 nanoGPT 仓库的过程。到视频的结尾,构建出来的 nanoGPT 仓库与实际的 nanoGPT 仓库大约有 90% 的相似度。也就是说,通过这个视频,你将能够构建一个几乎完整的 nanoGPT 模型

有人问大神这个适合初学者从头开始按照视频构建吗?这是大神回复,适合初学者,这个视频会带初学者走的很远

GitHub相关的 GitHub 仓库包含完整的提交历史,因此你可以逐步查看视频中的所有代码更改。https://github.com/karpathy/build-nanogpt

从总体上看,视频分为以下几个部分:

第 1 部分:构建网络

  1. 首先探索了 GPT-2(124M)的 OpenAI 检查点‍

  2. 实现 GPT-2 的神经网络模块(nn.Module)‍

  3. 加载 Huggingface/GPT-2 的参数‍

  4. 实现前向传递来获得 logits 输出‍

  5. 初始化采样,处理前缀标记和标记化‍

  6. 编写采样循环,自动检测设备‍

  7. 开始训练,处理数据批次 (B,T) 并生成 logits (B,T,C)‍

  8. 计算交叉熵损失‍

  9. 编写优化循环,使模型过拟合单个批次‍

  10. 实现简化版的数据加载器‍

  11. 共享参数 wte 和 lm_head‍

  12. 进行模型初始化,使用标准差 0.02 和残差初始化

    ‍‍


第 2 部分:加快训练速度

  1. 使用 GPU 和混合精度训练,将训练时间缩短到 1000ms‍

  2. 利用张量核心,计算代码时间,使用 TF32 精度,将时间缩短到 333ms‍

  3. 使用 float16、梯度缩放器和 bfloat16,将时间缩短到 300ms‍

  4. 使用 torch.compile,减少 Python 开销和内核融合,将时间缩短到 130ms‍

  5. 使用闪存注意力,将时间缩短到 96ms‍

  6. 调整词汇表大小,从 50257 增加到 50304,将时间缩短到 93ms‍

第 3 部分:设置运行

  1. 设置超参数,使用 AdamW 优化器和梯度剪裁‍

  2. 使用预热加余弦衰减的学习率调度器‍

  3. 调整批次大小,使用权重衰减和 FusedAdamW,将时间缩短到 90ms‍

  4. 实现梯度累积‍

  5. 使用分布式数据并行(DDP)进行训练‍

  6. 讨论 GPT-2 和 GPT-3 使用的数据集以及 FineWeb(EDU)‍

  7. 设置验证数据拆分,计算验证损失,恢复采样

    ‍‍

第 4 部分:查看结果

  1. 使用 HellaSwag 进行模型评估,开始训练运行‍

  2. 第二天早上查看结果,我们成功复现了 GPT-2 和 GPT-3‍

  3. 致敬 llm.c,它使用原生 C/CUDA 实现了等效但更快的代码

    ‍‍

最后,总结整个过程,并介绍了 build-nanogpt 的 GitHub 仓库。通过这个视频,你可以全面了解如何从零开始复现 GPT-2(124M)模型,并学习到很多优化和实用技巧

⭐星标AI寒武纪,好内容不错过

用你的在看告诉我~

Andrej Karpathy上新