“真男人就应该用C编程”!用1000行C代码手搓了一个大模型,Mac即可运行,特斯拉前AI总监爆火科普LLM

C语言与CPP编程 2024-05-22 09:01

来自公众号:InfoQ

编译 | 核子可乐、Tina

徒手用 1000 行 C 语言实现,不依赖庞大的外部库,Mac 即可运行。   

如今这年头,徒手写神经网络代码已经不算事儿了,现在流行手搓大模型训练代码了!这不,今天,特斯拉前 AI 总监、OpenAI 创始团队成员 Andrej Karpathy 仅用 1000 行简洁的 C 代码,就完成了 GPT-2 大模型训练过程。

几个小时前,Andrej Karpathy 推出了一个名为 llm.c 的项目,旨在用纯 C 语言训练 LLM,这种方法的主要优势在于它显著减少了依赖库的体积——不再需要 245MB 的 PyTorch 和 107MB 的 cPython,这样可以使得模型训练过程更为轻量化和高效。该项目还可以立即编译和运行,并且可以与 PyTorch 的参考实现媲美。

Karpathy 表示他之所以选择 GPT-2 作为首个工作示例,是因为它大语言模型鼻祖的定位,亦属现代 AI 堆栈的首次组合。因此,选择 GPT-2 作为起点,可以让我们更容易地理解和实践大型语言模型训练。

徒手实现 GPT-2 后,Karpathy 将这份代码放到了 GitHub 上,以 MIT 协议开源。短短几个小时,就超过了 2500 颗星,并且数据还在不断持续上涨......

将大模型原理拆解得无比简单

Andrej Karpathy 是全球人工智能领域的知名科学家,也是 OpenAI 的创始成员和研究科学家。

他于 2009 年本科毕业于多伦多大学,获得计算机科学和物理学学士学位。2011 年硕士毕业于不列颠哥伦比亚大学,随后前往斯坦福大学 AI Lab(SAIL)读博,师从著名学者李飞飞,是全球最早将深度学习应用于计算机视觉研究的学者之一。

在求学期间,Andrej Karpathy 曾在谷歌和 DeepMind 实习,后来在 OpenAI 刚刚成立时加入并担任研究科学家。直到 2017 年 6 月,他被马斯克挖去,担任特斯拉人工智能部门主管,直接向马斯克汇报。在特斯拉工作的五年里,他主导了特斯拉自动辅助驾驶系统 Autopilot 的开发。这项技术对于特斯拉的完全自动驾驶系统 FSD 至关重要,也是马斯克针对 Model S、Cybertruck 等车型推销的主要卖点。在各大新闻中,他被誉为“特斯拉的秘密武器”。

去年 Karpathy 曾短暂回到 OpenAI,然后又在 OpenAI 众人忙于内斗时抽空录制了一个长达一小时的教学视频《大型语言模型入门》。

Karpathy 在视频中首先介绍了一些 LLM 入门知识,然后以 Meta 推出的开源大模型 Llama 2-70b 为例进行了讲解。该模型有 700 亿参数,主要包含两个文件,分别是参数文件,文件大小为 140GB,以及运行这些参数的代码,以 C 语言为例需要约 500 行代码。

Karpathy 表示只要有这两个文件再加上一台 MacBook,我们就可以构建一个独立的系统,无需联网或其他设施。

大模型训练,可以理解为是对互联网数据进行有损压缩,一般需要一个巨大的 GPU 集群来完成。以 Llama 2-70b 为例的话,就是使用了类似网络爬取的约 10TB 的文本,用 6000 个 GPU ,耗资 200 万美元,训练约 12 天,最后获得基础模型。

基础模型即上图里140GB的“压缩文件”(压缩率约100倍),就等于靠这些数据对世界形成了理解,那它就可以进行“预测”工作了。

Karpathy 之前还分享过他的学习经验,就是开始时要尝试从 0 开始,写一些原生代码,帮助理解消化知识点。 也就是说,徒手实现代码才是最有效的学习方式。

两年前,Karpathy 就曾基于 PyTorch,仅用 300 行左右的代码就写出了一个小型 GPT 训练库,并将其命名为 minGPT,用这份代码揭开了 GPT 神秘的面纱。

截图来源:https://github.com/karpathy/minGPT

因为大多数 GPT 模型的实现都过于庞大,而 minGPT 做到了小、干净、可解释和具有教育意义,所以 Karpathy 的这 300 行代码是学习 GPT 的最佳资源之一,可以用来深入理解 GPT 是如何工作的。

用 C 语言实现 LLM

这次,Andrej Karpathy 单纯通过 C/CUDA 实现大语言模型训练,且无需 245 MB PyTorch 或 107 MB cPython。例如,训练 GPT-2(CPU,fp32 单精度)需要在单个文件中使用约 1000 行简洁代码,可立即编译并运行、且与 PyTOrch 参考实现完全匹配。

从某种意义上说,Karpathy 确实在尝试重新设计 LLM 的架构。他通过 llm.c 项目探索一种更简单、更高效的训练 LLM 方法。与现有 LLM 架构相比,这种新架构的主要亮点包括:

  1. 代码简洁性:仅使用约 1000 行代码就能完成 GPT-2 模型的训练,相比之下显著降低了复杂度。

  2. 独立性:不依赖庞大的外部库如 PyTorch 或 cPython,使得部署和运行更加轻便快捷。

  3. 高效性:直接使用 C/CUDA 进行编程有望提高计算效率和训练速度。

有网友问 Karpathy 为何不用 Rust,Karpathy 回复说,“我完全理解 Rust 的吸引力。然而,我仍然觉得 C 语言非常棒。它简单、干净、可移植,在审美上也十分优美。使用 C 语言就像直接与机器交流一样。”

这种语言选择也让网友们纷纷感叹:

“我们正在掀起一场 C 语言复兴!”

“真男人就应该用 C 语言编程。”

Karpathy 以更简单、更原始的 C/CUDA 架构来做 LLM 的训练,其中还涉及算法优化、计算资源管理等多个方面。

你会看到,项目在开始时一次性分配所有所需的内存,这些内存是一大块 1D 内存。然后在训练过程中,不会创建或销毁任何内存,因此内存占用量保持不变,并且只是动态的,将数据批次流过。这里的关键在于手动实现所有单个层的前向和后向传递,然后将它们串联在一起。
例如,这里是 layernorm 前向和后向传递。除了 layernorm 之外,我们还需要编码器、matmul、自注意力、gelu、残差、softmax 和交叉熵损失。

“一旦你拥有了所有的层,接下来的工作只是将它们串在一起。讲道理,写起来相当乏味和自虐,因为你必须确保所有指针和张量偏移都正确排列, ”Karpathy 表示。

另外 Karpathy 还在 doc/layernorm/layernorm.md 中附上了短小的使用教程。里面是一份简单的分步指南,用于实现 GPT-2 模型中的单一层,即 layernorm 层,希望能成为大家理解在 C 中实现大语言模型各层的理想起点。

更重要的是,他还用自己的 MacBook Pro(苹果 M3 Max 芯片)演示了整个训练过程,对照他之前的大模型入门教程,就可以轻松了解如今炙手可热的 LLM 是怎么一回事儿了。

 训练过程:

首先下载数据集并 token 化。

python prepro_tinyshakespeare.py

输出结果为:

Saved 32768 tokens to data/tiny_shakespeare_val.binSaved 305260 tokens to data/tiny_shakespeare_train.bin

其中各.bin 文件为 int32 数字的原始字节流,用于指示 GPT-2 token 化器的 token id。或者也可以使用 prepro_tinystories.py 对 TinyStories 数据集进行标注。

原则上,到这里就已经可以开始训练模型。为提高效率,可以使用 OpenAI 发布的 GPT-2 权重进行初始化,而后加以微调。为此需要下载 GPT-2 权重并将其保存为可在 C 中加载的检查点:

python train_gpt2.py

该脚本会下载 GPT-2(124M)模型,对单批数据进行 10 次过拟合迭代,运行多个生成步骤,最重要的是保存两个文件:1)gpt2_124M.bin 文件,包含用于在 C 中加载的模型权重;2)以及 gpt2_124M_debug_state.bin,包含包括 input、target、logits 及 loss 等更多调试状态,对于调试 C 代码、单元测试及确保能够与 PyTorch 参考实现完全匹配非常重要。现在我们可以使用这些权重进行初始化并在原始 C 代码中进行训练。首先编译代码:

make train_gpt2

在 train_gpt2 编译完成后即可运行:

OMP_NUM_THREADS=8 ./train_gpt2

大家应根据 CPU 的核心数量来调整线程数量。该程序将加载模型权重、tokens,并使用 Adam lr 1e-4 运行数次迭代的微调循环,而后由模型生成样本。简单来讲,所有层都具有前向及后向传递实现,串联在一起形成统一的大型、手动前向 / 后向 / 更新循环。在 MacBook Pro(苹果 M3 Max 芯片)上的输出结果如下所示:

[GPT-2]max_seq_len: 1024vocab_size: 50257num_layers: 12num_heads: 12channels: 768num_parameters: 124439808train dataset num_batches: 1192val dataset num_batches: 128num_activations: 73323776val loss 5.252026step 0: train loss 5.356189 (took 1452.121000 ms)step 1: train loss 4.301069 (took 1288.673000 ms)step 2: train loss 4.623322 (took 1369.394000 ms)step 3: train loss 4.600470 (took 1290.761000 ms)... (trunctated) ...step 39: train loss 3.970751 (took 1323.779000 ms)val loss 4.107781generated: 50256 16773 18162 21986 11 198 13681 263 23875 198 3152 262 11773 2910 198 1169 6002 6386 2583 286 262 11858 198 20424 428 3135 7596 995 3675 13 198 40 481 407 736 17903 11 329 703 6029 706 4082 198 42826 1028 1128 633 263 11 198 10594 407 198 2704 454 680 1028 262 1027 28860 286 198 3237 323step 40: train loss 4.377757 (took 1366.368000 ms)

现在的生成结果仅给出 token ids,需要将其解码回文本形式:

<|endoftext|>Come Running Away,Greater conquerWith the Imperial bloodthe heaviest host of the godsinto this wondrous world beyond.I will not back thee, for how sweet after birthNetflix against repounder,will notflourish against the earlocks ofAllay

参考链接:

https://twitter.com/karpathy/status/1777427947126936026

https://github.com/karpathy/llm.c

https://www.youtube.com/watch?v=zjkBMFhNj_g

EOF

你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索字节跳动电商以及携程等部门担任Linux C/C++后端研发工程师。

最近跟朋友一起开发了一个新的网站:编程精品资源网,已经收录了不少资源(附赠下载地址),如果屏幕前的靓仔/女想要学习编程找不到合适资源的话,不妨来我们的网站看看,欢迎扫码下方二维码白嫖~

同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。

我组建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起进群交流。

欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些计算机学习经验以及工作体验,还有一些内推机会

加个微信,打开另一扇窗

C语言与CPP编程 C语言/C++开发,C语言/C++基础知识,C语言/C++学习路线,C语言/C++进阶,数据结构;算法;python;计算机基础等
评论
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 86浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 70浏览
  • 《高速PCB设计经验规则应用实践》+PCB绘制学习与验证读书首先看目录,我感兴趣的是这一节;作者在书中列举了一条经典规则,然后进行详细分析,通过公式推导图表列举说明了传统的这一规则是受到电容加工特点影响的,在使用了MLCC陶瓷电容后这一条规则已经不再实用了。图书还列举了高速PCB设计需要的专业工具和仿真软件,当然由于篇幅所限,只是介绍了一点点设计步骤;我最感兴趣的部分还是元件布局的经验规则,在这里列举如下:在这里,演示一下,我根据书本知识进行电机驱动的布局:这也算知行合一吧。对于布局书中有一句:
    wuyu2009 2024-11-30 20:30 106浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 37浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 51浏览
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-30 14:30 70浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 66浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 41浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 98浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 83浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 65浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 102浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦