用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;计算机基础等
评论
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 439浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 457浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 163浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 458浏览
  • Snyk 是一家为开发人员提供安全平台的公司,致力于协助他们构建安全的应用程序,并为安全团队提供应对数字世界挑战的工具。以下为 Snyk 如何通过 CircleCI 实现其“交付”使命的案例分析。一、Snyk 的挑战随着客户对安全工具需求的不断增长,Snyk 的开发团队面临多重挑战:加速交付的需求:Snyk 的核心目标是为开发者提供更快、更可靠的安全解决方案,但他们的现有 CI/CD 工具(TravisCI)运行缓慢,无法满足快速开发和部署的要求。扩展能力不足:随着团队规模和代码库的不断扩大,S
    艾体宝IT 2025-01-10 15:52 160浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 88浏览
  • 在不断发展的电子元件领域,继电器——作为切换电路的关键设备,正在经历前所未有的技术变革。固态继电器(SSR)和机械继电器之间的争论由来已久。然而,从未来发展的角度来看,固态继电器正逐渐占据上风。本文将从耐用性、速度和能效三个方面,全面剖析固态继电器为何更具优势,并探讨其在行业中的应用与发展趋势。1. 耐用性:经久耐用的设计机械继电器:机械继电器依靠物理触点完成电路切换。然而,随着时间的推移,这些触点因电弧、氧化和材料老化而逐渐磨损,导致其使用寿命有限。因此,它们更适合低频或对切换耐久性要求不高的
    腾恩科技-彭工 2025-01-10 16:15 97浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 319浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 445浏览
  • 电动汽车(EV)正在改变交通运输,为传统内燃机提供更清洁、更高效的替代方案。这种转变的核心是电力电子和能源管理方面的创新,而光耦合器在其中发挥着关键作用。这些不起眼的组件可实现可靠的通信、增强安全性并优化电动汽车系统的性能,使其成为正在进行的革命中不可或缺的一部分。光耦合器,也称为光隔离器,是一种使用光传输电信号的设备。通过隔离高压和低压电路,光耦合器可确保安全性、减少干扰并保持信号完整性。这些特性对于电动汽车至关重要,因为精确控制和安全性至关重要。 光耦合器在电动汽车中的作用1.电池
    腾恩科技-彭工 2025-01-10 16:14 71浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 478浏览
  • LVGL(Light and Versatile Graphics Library)是一个免费的开源图形库,旨在为各种微控制器(MCU)和微处理器(MPU)创建美观的用户界面(UI)。LVGL可以在占用很少资源的前提下,实现丝滑的动画效果和平滑滚动的高级图形,具有轻量化、跨平台可用性、易于移植、操作友好以及免费使用等诸多优势。近期,飞凌嵌入式为OK3506J-S开发板移植了最新9.2版本的LVGL,支持多种屏幕构件以及鼠标、键盘、触摸等多种输入方式, 能够带来更加友好的操作界面;同时,启动速度也
    飞凌嵌入式 2025-01-10 10:57 46浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 432浏览
  • 说到福特,就要从亨利·福特(Henry Ford)这个人物说起。在发明大王爱迪生的电气工厂担任工程师的福特下班后,总是在自家仓库里努力研究和开发汽车。1896年,福特终于成功制造出一辆三轮车,开启了福特汽车的传奇。最初几年,福特都是独自制造汽车并同时进行销售。 (今天很多人都知道的精益管理中的5S方法,或多或少地受到了福特 CANDO方法的影响。)1903年,福特从牧师、律师、银行家、会计师等十一位股东那里筹集了十万美元,并在自家庭院成立了美国第五百零三家汽车公司——福特汽车公司(Fo
    优思学院 2025-01-10 11:21 51浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 488浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦