用1000行C代码手搓了一个大模型!Mac即可运行,特斯拉前AI总监爆火科普LLM

C语言与CPP编程 2024-08-12 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

日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。

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

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

加个微信,打开另一扇窗

经常遇到有读者后台私信想要一些编程学习资源,这里分享 1T 的编程电子书、C/C++开发手册、Github上182K+的架构路线图、LeetCode算法刷题笔记等精品学习资料,点击下方公众号会回复"编程"即可免费领取~


感谢你的分享,点赞,在看三  


C语言与CPP编程 C语言/C++开发,C语言/C++基础知识,C语言/C++学习路线,C语言/C++进阶,数据结构;算法;python;计算机基础等
评论 (0)
  • 中国和美国的物联网应用开发工程师在生活和心态上可能存在一些差异,这些差异主要源于两国的文化、经济和社会环境。以下是一些可能的对比: 1. 生活节奏:美国的生活节奏相对较快,工作压力较大,而中国的生活节奏相对较慢,但工作压力也在不断增加。这可能会影响到物联网应用开发工程师的心态和工作效率。 2. 工作文化:美国的工作文化更注重个人主义和创新,而中国的工作文化更注重集体主义和稳定。这可能导致美国物联网应用开发工程师更愿意尝试新的技术和方法,而中国物联网应用开发工程师更倾向于遵循已有的规则和流程。
    丙丁先生 2024-09-09 05:34 66浏览
  • 前不久,在快手网站门户,一位年轻的女士,分享了她遭遇货卖全球,而收不到尾款的问题,记得是在非洲,她和姐姐以友好的心态亲自去催收尾款,万里迢迢,结果被逮捕到警察局,并受到言语侮辱,尾款没要来,在当地军区和大使馆的担保下才顺利回国的遭遇,损失了2、3百万,虽然几经波折积累了几千万财富,其中心酸不言而喻。中国的法律在外国行不通,他们也没有诚信的概念,和他们做生意,就是与虎谋皮,切记多要首付。对于这位女士在非洲的遭遇,我们深表同情。在国际商业交易中,确实存在各种风险和挑战,特别是跨国贸易涉及的法律、文化
    丙丁先生 2024-09-09 05:33 71浏览
  • 大学用磁场电磁铁,一般都是大学实验和课题项目的需要,要求比较特殊和严格。我们专为大学设计磁场电磁铁磁场,在这方面有一点经验和方法共您参考:1、磁场电磁铁的安匝数设计合理,特别是电流设定后,对线径的选择很关键。2、磁路的优化设计,可以提高电磁效率,可以适当降低一点功耗。3、磁轭材料的选定,决定了磁效率和磁路的长度和磁场的重量。4、极头材料尽量采用高BS的材料,可以提高磁场电磁铁磁场的*高磁感强度。5、极面适当的收缩一下,可以增强磁感强度。6、电流密度尽量控制在3-6之间,3以下可以不考虑水冷。7、
    锦正茂科技 2024-09-09 09:39 71浏览
  • 在智能科技的飞速发展中,扫地机器人已成为现代生活中不可或缺的助手。而光耦(Optocoupler)作为一项先进的电子元件,正在为扫地机器人的高级功能提供支持。让我们一起来揭开这个技术之谜,探寻光耦技术在扫地机器人应用中的不可或缺的作用。光耦是什么?首先,你是否听说过光耦?这是一种由发光二极管(LED)和光敏电阻(光敏二极管、光电晶体管等)构成的光电耦合器件。那么,这个看似简单的器件如何在扫地机器人中发挥着哪些重要角色呢?提高智能感知扫地机器人依赖各种传感器感知环境,而光耦在传感器电路中的应用,能
    晶台光耦 2024-09-09 14:27 65浏览
  • RISC-V,这个在芯片设计领域里越来越响亮的名字,它到底是开源还是开放?其实啊,这两个词虽然听起来挺像的,但它们的含义和侧重点还真有点不一样。 首先,咱们得搞清楚啥叫“开源”。开源,就是说这个技术或者项目,你可以随意使用、修改和分享,而且通常是免费的。比如Linux操作系统,就是典型的开源项目。那么RISC-V呢,它的确是开源的,因为它的指令集架构(ISA)是公开的,任何人都可以免费下载、使用甚至修改这个架构来设计自己的处理器。 但是,“开放”这个词儿,它就更宽泛一些了。开放不仅仅是说你可
    丙丁先生 2024-09-09 05:29 49浏览
  • 哎,说起来那天真是够倒霉的!我家的电路突然出了问题,我心想不就换个保险丝嘛,小菜一碟。谁知道,这一换不得了,差点没给我吓出心脏病来。 那天下午,家里突然停电了。我想着可能是保险丝烧了,就跑去检查了一下电闸,果不其然,保险丝断了。我就想着自己动手丰衣足食,省得找人来修又得花一笔钱。于是我去五金店买了个新的保险丝回来准备换上。 回到家,我就迫不及待地打开电闸盖子,把新买的保险丝给装上。可是,装的时候可能手劲儿使大了点,感觉保险丝有点歪,但我想应该没啥大问题,就没太在意。结果,刚一通电,就听到“嗞
    丙丁先生 2024-09-09 05:40 63浏览
  •        电磁铁是通电产生电磁的一种装置。在铁芯的外部缠绕与其功率相匹配的导电绕组,这种通有电流的线圈像磁铁一样具有磁性,它也叫做电磁铁(electromagnet)。我们通常把它制成条形或蹄形状,以使铁芯更加容易磁化。另外,为了使电磁铁断电立即消磁,我们往往采用消磁较快的的软铁或硅钢材料来制做。这样的电磁铁在通电时有磁性,断电后磁就随之消失。电磁铁在我们的日常生活中有着极其广泛的应用,由于它的发明也使发电机的功率得到了很大的提高。电磁铁的磁场方向可以
    锦正茂科技 2024-09-09 11:28 59浏览
  • 咱们硬件工程师的世界里,有时候就像是在赌博,板子一打出来才知道赢没赢。记得有一回,我手头的板子打样回来,一测试,哎呀妈呀,有个地方的走线跟预想的完全不一样,这时候,就是手艺人的表现时刻了! 那次飞线,可真不是盖的,我现在想想都觉得有点离谱又漂亮。那板上的线路走得跟迷宫似的,我那条飞线得从板的这头,跳到那头,中间还得绕过几个元器件,就像是在绣花一样,一不小心就会短路或者碰触到其他线路。我那时候,手里的焊铁都快成了我第五只手了,一点点把线固定好,心跳都跟着线条在走。 最后,那条线就像是板子上的一
    丙丁先生 2024-09-09 05:28 34浏览
  • 前言:如何提升IC封装厂检测效率?在现代电子产品的制造过程中,IC封装作为核心环节,涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商,负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐,但每一步都至关重要,直接影响到最终产品的性能和可靠性。在处理来自IC制造商的晶圆(Wafer)时,常常需要面对从裸晶(Die)电气特性检查到封装后引脚功能检测等复杂的工序。在这些过程中,沟通不畅和反应迟缓常常成为生产效率的瓶颈。针对这一挑战,安宝特AR方案凭借其前沿的技术创新,为IC封
    安宝特AR 2024-09-09 15:03 57浏览
  • 一、面向未来下一代通信技术的射频测试挑战移动通信网络的发展如下图所示,1G时代用模拟信号传输,实现了语音传输业务;2G时代,数字传输取代了模拟传输,人们能够使用手机短信和手机上网;3G时代,移动通信进入了高速IP数据网络时代,移动高速上网成为现实,大家开启了音频,视频,多媒体的时代;4G时代开始了移动互联网的全面发展时代,网络能够传输更高质量的视频图像;而随着AR、VR、物联网等技术的诞生与普及,5G应运而生,5G不再是一个单一的无线接人技术,而是多种新型无线接入技术和现有4G技术的集成,其应用
    虹科测试测量TM 2024-09-09 14:58 58浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦