为什么要纯C说话手搓GPT-2,Karpathy回应网友质疑

Karpathy:for fun.几天前,前特斯拉 Autopilot 负责人、OpenAI 科学家 Andrej Karpathy 发布了一个仅用 1000 行代码即可在 CPU/fp32 上兑现 GPT-2 训练的项目「llm.c」。llm.c 旨在让大模型(LM)训练变得简单 —— 使用纯 C 说话 / CUDA,不必要 245MB 的 PyTorch 或 107MB 的 cPython。例如,训练 GPT-2(CPU、fp32)仅必要单个文献中的大约 1000 行干净代码(clean code),可以立即编

Karpathy:for fun.

几天前,前特斯拉 Autopilot 负责人、OpenAI 科学家 Andrej Karpathy 发布了一个仅用 1000 行代码即可在 CPU/fp32 上兑现 GPT-2 训练的项目「llm.c」。

为什么要纯C说话手搓GPT-2,Karpathy回应网友质疑

llm.c 旨在让大模型(LM)训练变得简单 —— 使用纯 C 说话 / CUDA,不必要 245MB 的 PyTorch 或 107MB 的 cPython。例如,训练 GPT-2(CPU、fp32)仅必要单个文献中的大约 1000 行干净代码(clean code),可以立即编译运转,并且完全可以媲美 PyTorch 参考兑现。

为什么要纯C说话手搓GPT-2,Karpathy回应网友质疑

项目链接:https://github.com/karpathy/llm.c

项目的 Star 量不到七个小时就冲上了 2000,目前已经接近一万 Star。很多网友惊呼太强了:「即使顶着指针 ptsd,我也能感受到这些代码的美。」

为什么要纯C说话手搓GPT-2,Karpathy回应网友质疑

然而,llm.c 项目收到的不只是称赞,还有很多质疑的声音。例如,有网友间接提问:「能具体描述下这个项目做了什么吗,解决了什么问题?」

为什么要纯C说话手搓GPT-2,Karpathy回应网友质疑

对此,Karpathy 今天正面回应了网友们的疑问,详细阐述了 llm.c 项目的意义是什么,优缺点有哪些。

为什么要纯C说话手搓GPT-2,Karpathy回应网友质疑

机器之心对 Karpathy 叙述原文进行了不改变原意的编译、整理,我们来看下 Karpathy 是怎么说的:

训练大型说话模型 (LLM),例如 ChatGPT,涉及大量代码,复杂度很高。例如,典型的 LLM 训练大概会使用 PyTorch 深度学习库。PyTorch 本身就相当复杂,因为它兑现了:

一个特别很是通用的张量抽象(一种排列和操作数组的方法,这些数组用于存储神经网络参数和激活);

一个特别很是通用的反向传播 Autograd 引擎(训练神经网络参数的算法) ;

在神经网络中使用的大量深度学习层。 

PyTorch 项目有 11449 个文献中的 3327184 行代码。最重要的是,PyTorch 是用 Python 编写的,Python 本身就是一种特别很是高级的说话 —— 必须运转 Python 解释器将训练代码转换为低级计算机指令。例如,执行此转换的 cPython 项目包含 4306 个文献中的 2437955 行代码。

llm.c 项目旨在移除全部这些复杂性,并将 LLM 训练简化为其最基本的要素,用特别很是低级的说话 (C 说话) 间接与计算机对话,并且没有其他库依赖项,唯一的抽象是汇编代码本身。

令人惊讶的是,训练像 GPT-2 这样的 LLM 实际上只必要在单个文献中使用大约 1000 行 C 说话代码。我通过间接在 C 说话中兑现 GPT-2 的神经网络训练算法来兑现这种压缩。这实际上很困难,因为你必须详细了解训练算法,能够导出全部层反向传播(backpropagation)的 forward pass 和 backward pass,并特别很是仔细地兑现全部数组索引计算,因为没有可用的 PyTorch 张量抽象。但一旦这样做了,并且通过再次检查 PyTorch 来验证正确性,你就会得到一些特别很是简单、小且精致的东西。

那么,为什么人们不一直这样做呢?

第一:这放弃了很大的灵活性。如果你想改动神经网络,在 PyTorch 中你大概只必要改动一行代码。而在 llm.c 中,改动很大概会涉及更多代码,大概会更加困难,并且必要更多专业知识。例如。如果涉及一个新的操作,你大概就必要做一些微积分,并写出它的 forward pass 和 backward pass 以进行反向传播,并确保其在数学上是正确的。

第二:放弃速度,至少一开始是这样的。天下没有免费的午餐 —— 不应该指望仅 1000 行代码就能达到最先进的速度。PyTorch 在后台做了很多工作,以确保神经网络特别很是高效。不仅全部张量操作都特别很是仔细地挪用最高效的 CUDA 内核,而且还有 torch.compile 等等,以进一步分析和优化神经网络并有效地在计算机上运转。

现在,原则上,llm.c 应该能够挪用全部相同的内核并间接运转。但这必要更多的工作,就像上述第一点一样,如果改动神经网络或正在运转的计算机的任何内容,你大概必须使用不同的参数挪用不同的内核,并且大概会手动进行更多改动。

总的来说,llm.c 是训练 GPT-2 的间接兑现。这个兑现结果出人意料地简短。但 llm.c 不支持其他神经网络,仅支持 GPT-2,如果你想改动神经网络的任何内容,则必要专业知识。幸运的是,全部最先进的 LLM 实际上与 GPT-2 根本没有太大的区别。并且,llm.c 必须进行额外的调整和完善,但原则上我认为它应该几乎能够媲美,甚至超越 PyTorch,因为我们消除了全部开销。

最后,我为什么要做这个工作?因为这很有趣。它也很有教育意义,因为只必要那 1000 行特别很是简单的 C 说话代码。它只是一些数组和对其元素进行一些简单的数学运算,例如 + 和 *。对于正在进行的更多工作,它大概会变得实际有用。

参考链接:https://twitter.com/karpathy/status/1778153659106533806

给TA打赏
共{{data.count}}人
人已打赏
AI

OpenAI CEO 阿尔特曼想要构建一个全世界 AI 联盟,加快人工智能倒退

2024-4-11 14:26:08

AI

报告:79.8% 受访美国人民失望对人工智能实施严峻法律羁系

2024-4-11 17:12:02

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索