你的位置:万博max官网 > 新闻动态 > 万博体育APP入口一经得回了2.5k星-万博max官网
万博体育APP入口一经得回了2.5k星-万博max官网
发布日期:2024-05-14 04:14    点击次数:110

新智元报谈

裁剪:桃子 好困

【新智元导读】训大模子的步伐可能要被校阅了!AI大神Karpathy发布的新名堂仅用1000行的C谈话训完GPT-2,而不再依赖繁密的GPT-2库。他本东谈主预报,行将上线新课。

断更近一个月,Karpathy终于上线了。

此次不是AI大课,而是带来一个新名堂。

仅用1000行纯C谈话训完GPT-2。

念念象一下,如果咱们能够不依赖于繁密的PyTorch(245MB)和cPython(107MB)库,只是使用纯C谈话就能进修大型谈话模子(LLM),那会若何? 当今,借助llm.c,这件听起来似乎不太可能的事,一经成为了实际! 这个名堂的亮点在于,它仅用约1000行随意的C代码,就竣事了在平庸想象机处理器(CPU)上进修GPT-2模子的智商。 而且,这份代码不仅不错立即编译运行,其进修阻抑也和PyTorch版块的GPT-2齐备一致。 之是以采选GPT-2算作开端,是因为它标记着大型谈话模子发展史上的一个伏击里程碑,是第一次以咱们当今所纯熟的形势整合了这么的时候栈,况兼模子权重亦然公开可获取的。

这又名堂刚刚发布几个小时,一经得回了2.5k星。

名堂地址:https://github.com/karpathy/llm.c

有网友示意,初创公司正在等着Karpathy挖掘新的点子。

很少有东谈主知谈,SUNO一动手是nanoGPT的一个分支。(Suno创业团队首款家具Bark受到了nanoGPT的启发)

梗概Karpathy正在尝试的是从新想象LLM架构,通过llm.c名堂去探索一种更浅近、高效的模子进修步伐。

「我无法创造的,我就无法意会」。

Karpathy齐备让AI走向公共化。

那么,仅用C谈话如何训出LLM?

千行C代码训完GPT-2

名堂开篇先容中,Karpathy还提到了我方当前正在进行的商议:

- 径直使用CUDA竣事,速率会快得多,可能接近PyTorch。

- 使用SIMD提醒加快CPU版块,x86上的AVX2/ARM上的NEON(比如苹果芯片)。

- 经受更当代的架构,如Llama2、Gema等。

关于repo,Karpathy但愿同期调遣干净、浅近的参考竣事以及更优化的版块,这些版块不错接近PyTorch,但只需很少的代码和依赖项。

快速初学

下载数据集,并将其进行分词。Tinyshakepeare数据集下载和分词速率最快:

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 ID。

诚然,也不错通过运行prepro_tinystories.py来对TinyStories数据集进行分词处理。

表面上讲,当今一经能够动手进修模子了。可是,当前基于CPU和FP32的参考代码运行成果极低,无法从零动手进修这些模子。

因此,咱们采选先用OpenAI发布的GPT-2模子权重进走运周折,再对模子进行微调。

为了这个目标,咱们需要下载GPT-2模子的权重文献,并把它们算作检查点保存下来,这么就不错在C谈话环境中进行加载了:

python train_gpt2.py

这个剧本的作用是下载GPT-2(124M)模子,并对单个数据batch进行10次迭代进修竣事过拟合。

接着,剧本将践诺几步生成任务,况兼最伏击的是,保存两个文献:

gpt2_124M.bin,其中包含了可用于在C谈话环境中加载模子的原始权重;

gpt2_124M_debug_state.bin,其中包含了特地的调试信息,如输入数据、目标、logits和失掉。

这些信息关于调试、单位测试以及确保与PyTorch的参考竣事齐备一致很有匡助。

当前,主要缓和的是gpt2_124M.bin文献中的模子权重。有了它们,就不错在C谈话环境中运周折模子并动手进修了。

最初,咱们需要编译代码:

make train_gpt2

你不错掀开Makefile文献,并阅读内部的凝视。

它会自动检查你的电脑是否援手OpenMP,这关于以相等低的复杂度来加快代码运行很有匡助。

当完成train_gpt2的编译之后,就不错动手运行了:

OMP_NUM_THREADS=8 ./train_gpt2

当今,你需要笔据电脑的CPU中枢数来确立要领运行的线程数。

然后,要相识加载模子的权重和Token,接着进行几次迭代的微调过程,这个过程使用了Adam优化算法,学习率确立为0.0001。

终末,要相识笔据模子生成一个样本。

追思来说,代码竣事了模子每一层的数据处理历程,包括前向传播、反向传播和参数更新等,况兼被组织成了一个完满的轮回。

在搭载M3 Max芯片的MacBook Pro上运行时,输出阻抑如下:

[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 ID,咱们需要把这些编号改换成可读的文本。

这个过程在C谈话中竣事起来十分浅近,因为触及到的主如果对应字符串片断的查找和输出。

当今,咱们不错哄骗一个叫作念tiktoken的器用来完成这个任务:

import tiktokenenc = tiktoken.get_encoding(\"gpt2\")print(enc.decode(list(map(int, \"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 323\".split()))))

打印本体如下:

<|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

Karpathy示意,他对Netflix在模子生成阻抑中的呈现现象相等悠然,因为这暴闪现模子仍然保留了其进修过程中的一些特征。

此外,他也莫得去疗养微调的超参数,因此如果能够优化这些确立,高出是通过延伸进修时刻,模子的性能应该会有很大的升迁空间。

测试

这里提供一个浅近的单位测试要领,用来考据咱们编写的C谈话代码是否与PyTorch框架中的代码竣事相匹配。

通过以下大叫即可编译并践诺:

make test_gpt2./test_gpt2

这段代码最初会加载gpt2_124M_debug_state.bin文献,然后践诺一次前向想象。

这个过程会生成模子的瞻望阻抑(logits)和失掉(loss),并将其与PyTorch的圭表竣事进行比拟。

接下来,它会哄骗Adam优化算法对模子进行10轮进修,从而确保进修的失掉与PyTorch的阻抑一致。

教程

名堂终末,Karpathy还附上了一个相等小的教程——

名堂地址:https://github.com/karpathy/llm.c/blob/master/doc/layernorm/layernorm.md

它是竣事GPT-2模子的单层,即LayerNorm的一个浅近的分步指南。

这是了解如何用C谈话竣事层的一个很好的开端。

纯CUDA也可训

在进修动手时,先一次性预分拨一大块一维内存,用于存储进修过程中所需的所稀奇据。

这么作念的平允是,在通盘进修过程中,咱们无需再次分拨或开释内存。如斯一来,不仅简化了内存责罚,还确保了内存使用量保抓不变,优化了数据处理成果。

接下来的中枢任务是——手动编写代码,竣事模子中每一层的数据前向传播和后向传播过程,并将这些层按限定聚会起来。

此外,为了构建完满的模子,咱们还需要竣事多个关节组件,包括编码器(encoder)、矩阵乘法(matmul)、自注目力机制(self-attention)、GELU激活函数、残差聚会(residual)、softmax函数和交叉熵失掉想象。

Karpathy接续确认谈,一朝你有了整个的层,你就不错把整个的层串联起来。

不瞒你说,写这个过程十分乏味,也很受虐,因为你必须确保整个的指针和张量偏移向量齐正确成列。

左图:在内存均分拨一个一维数组,然后将整个模子的权重和激活指向它

右图:预防性进行整个指针运算

在完成了模子的前向传播和反向传播之后,接下来的职责,比如确立数据加载器和疗养Adam优化算法,就比拟浅近了。

随后,Karpathy还先容了我方下一步进行职责是:

一步局势将这个过程挪动到CUDA上,从而大幅升迁运算成果,致使达到接近PyTorch的水平,而且不需要依赖那些复杂的库。

当前,他一经完成了其中的几层。

接下来的职责包括减少想象精度——从FP32降到FP16致使更低,以及添加一些新的层(如RoPE),从而援手更先进的模子架构,举例Llama 2、Mistral、Gemma等。

诚然了,等着这一切完成之后,另一期「从新动手构建」的视频也会上线。

参考良友:

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

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



相关资讯