ChatGPT 人工智能 GPT4 伦理 生成式 医疗 监管 安全 机器学习 深度学习 神经网络 计算机视觉 强化学习 模型 算法 应用 开发 研究 工具 平台 框架 数据集 训练 部署 安全 合规 培训 投资 LLM,llm AI,ai,Ai 大模型 大语言模型 制图 生图 绘图 文生图 文生视频 生成式AI AGI 世界模型 sora chatGPT,chatgpt,ChatGpt claude openai Llama deepseek midjourney 红熊猫模型 Red panda,panda Stable Diffusion,StableDiffusion,stable DALL- E 3 DALL E DALL Flux,flux 扩散模型 混元大模型 文心一言 通义千问 可灵 Pika PixelDance 豆包 月之暗面 零一万物 阶跃星辰 搜索增强 MiniMax Talkie Agent prompt fastai LangChain TTS 微调 提示词 知识库 智能体
# 热门搜索 #
搜索
为什么要纯C语言手搓GPT-2,Karpathy回应网友质疑
5333点击    2024-04-11 20:53
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),可以立即编译运行,并且完全可以媲美 PyTorch 参考实现。





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


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




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





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




机器之心对 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


文章来自微信公众号“机器之心”,作者:小舟


关键词: GPT-2 , openai , Karpathy , chatGPT , LLM