爱笑的姑娘|特斯拉AI总监写了个GPT的Pytorch训练库,一天star量破千

机器之心报道
编辑:魔王、张倩
如果说GPT模型是所向披靡的战舰 , 那么minGPT大概算是个头虽小但仍能乘风破浪的游艇了吧 。
最近 , 「史上最大AI模型」GPT-3风靡全球 。
GPT系列可以说是人工智能领域「暴力美学」的代表作了 。 2018诞生的GPT , 1.17亿参数;2019年GPT-2 , 15亿参数;2020年GPT-3 , 1750亿参数 。 短短一年时间 , GPT模型的参数量就呈指数级增长 。
GPT-3发布后不久 , OpenAI即向社区开放了商业API , 鼓励大家使用GPT-3尝试更多的实验 。 然而 , API的使用需要申请 , 而且你的申请很有可能石沉大海 。 那么 , 除了使用官方API以外 , 我们还有没有其他方法能上手把玩一下这个「最大模型」呢?
近日 , 特斯拉人工智能研究负责人、前OpenAI研究科学家AndrejKarpathy进行了尝试 。
他基于PyTorch , 仅用300行左右的代码就写出了一个小型GPT训练库 , 并将其命名为minGPT 。
minGPT项目地址:
minGPT:只用300行代码实现的GPT训练
如果说GPT模型是所向披靡的战舰 , 那么minGPT大概算是个个头虽小但仍能乘风破浪的游艇了吧 。
GPT并非一个复杂的模型 , minGPT实现只有大约300行代码 , 包括样板文件和一个完全不必要的自定义因果自注意力模块 。 Karpathy将索引序列变成了一个transformer块序列 , 如此一来 , 下一个索引的概率分布就出现了 。 剩下的复杂部分就是巧妙地处理batching , 使训练更加高效 。
核心的minGPT库包含两个文档:mingpt/model.py和mingpt/trainer.py 。 前者包含实际的Transformer模型定义 , 后者是一个与GPT无关的PyTorch样板文件 , 可用于训练该模型 。 相关的Jupyternotebook则展示了如何使用该库训练序列模型:
play_math.ipynb训练一个专注于加法的GPT;play_char.ipynb将GPT训练成一个可基于任意文本使用的字符级语言模型 , 类似于之前的char-rnn , 但用transformer代替了RNN;play_words.ipynb是BPE(Byte-PairEncoding)版本 , 目前尚未完成 。使用BPE编码器、分布式训练和fp16 , 这一实现有可能复现GPT-1/GPT-2的结果 , 不过Karpathy还没有尝试 。 至于GPT-3 , minGPT可能无法复现 , 因为GPT-3可能不适合GPU内存 , 而且需要更精细的模型并行化处理 。
使用示例
Karpathy在minGPT项目中提供了一些使用示例 。
这些代码非常简单 , 只需hackinline即可 , 而非「使用」 。 目前的API外观如下:
在实现过程中 , Karpathy参考了OpenAIGPT官方项目 , 以及其他组织的示例等 。
代码
OpenAIgpt-2项目提供了模型 , 但没有提供训练代码();OpenAI的image-gpt库在其代码中进行了一些类似于GPT-3的更改 , 是一份不错的参考();Huggingface的transformers项目提供了一个语言建模示例 。 它功能齐全 , 但跟踪起来有点困难 。 ()论文+实现说明
此外 , 项目作者还介绍了相关的论文和实现细节 。
1.GPT-1:《ImprovingLanguageUnderstandingbyGenerativePre-Training》
论文地址:GPT-1模型大体遵循了原始transformer , 训练了仅包含12层解码器、具备遮蔽自注意力头(768维状态和12个注意力头)的transformer 。 具体实现细节参见下图:
论文地址:GPT-2将LayerNorm移动每个子模块的输入 , 类似于预激活残差网络 , 并在最后的自注意力模块后添加了一个额外的层归一化 。 此外 , 该模型还更改了模型初始化(包括残差层初始化权重等)、扩展了词汇量、将context规模从512个token增加到1024、使用更大的批大小等 。 具体实现细节参见下图:
论文地址:GPT-3使用了和GPT-2相同的模型和架构 , 区别在于GPT-3在transformer的各层上都使用了交替密集和局部带状稀疏的注意力模式 , 类似于SparseTransformer 。 具体实现细节参见下图:
AndrejKarpathy是计算机视觉、生成式模型与强化学习领域的研究者 , 博士期间师从斯坦福大学计算机科学系教授李飞飞 。 读博期间 , 他曾两次在谷歌实习 , 研究在Youtube视频上的大规模特征学习 。 此外 , 他还和李飞飞等人一起设计、教授了斯坦福经典课程CS231n 。
和教授CS231n时一样 , Karpathy希望他利用业余时间做的这个minGPT也能有一定的教育意义 。 他这种化繁为简的举动得到了众多社区成员的赞赏: