特斯拉前 AI 总监、OpenAI 创始团队成员 Andrej Karpathy 用 C 代码完成了 GPT-2 大模型训练过程:karpathy/llm.c: LLM training in simple, raw C/CUDA (github.com)
下载源码
git clone --recursive https://github.com/karpathy/llm.c.git
下载模型
从HF-Mirror - Huggingface 镜像站下载gpt2模型:
cd llm.c
./hfd.sh openai-community/gpt2 --tool aria2c -x 4
用CPU训练gpt2大模型
pip install -r requirements.txt
python prepro_tinyshakespeare.py
python train_gpt2.py
make train_gpt2
OMP_NUM_THREADS=16 ./train_gpt2
训练结果:
[GPT-2]
max_seq_len: 1024
vocab_size: 50257
padded_vocab_size: 50304
num_layers: 12
num_heads: 12
channels: 768
num_parameters: 124475904
train dataset num_batches: 1192
val dataset num_batches: 128
num_activations: 73347840
val loss 5.325522
step 0: train loss 5.356185 (took 2897.148828 ms)
step 1: train loss 4.301033 (took 2498.365030 ms)
step 2: train loss 4.623316 (took 2358.455841 ms)
step 3: train loss 4.600415 (took 2643.469682 ms)
step 4: train loss 4.616777 (took 2498.933979 ms)
step 5: train loss 4.231482 (took 2356.468469 ms)
step 6: train loss 3.754166 (took 2782.597088 ms)
step 7: train loss 3.652230 (took 2379.824868 ms)
step 8: train loss 4.183515 (took 2408.840079 ms)
step 9: train loss 4.199315 (took 2811.563323 ms)
val loss 4.323445
step 10: train loss 4.288396 (took 2652.485471 ms)
step 11: train loss 3.558984 (took 2501.367965 ms)
step 12: train loss 3.730804 (took 2415.376200 ms)
step 13: train loss 4.159164 (took 2824.504369 ms)
step 14: train loss 3.886458 (took 2460.975123 ms)
step 15: train loss 3.764933 (took 2421.700741 ms)
step 16: train loss 4.143034 (took 2794.475716 ms)
step 17: train loss 3.962718 (took 2374.036900 ms)
step 18: train loss 3.796120 (took 2430.497860 ms)
step 19: train loss 3.371638 (took 2699.907792 ms)
val loss 4.186637
generating:
---
I was so exceptionally drunk:
You would spake for seen'st
Threaten beyond you, 'twas so far too?
<|endoftext|>STRUCTINIUS:
Scheduled since 1539 is
Welcome to Rome:
We meet the indignation of lesser nations' countenance? thank me
---
step 20: train loss 3.880942 (took 2673.638517 ms)
step 21: train loss 4.198619 (took 2409.159397 ms)
step 22: train loss 4.426098 (took 2381.811139 ms)
step 23: train loss 3.685762 (took 2630.524207 ms)
step 24: train loss 3.642307 (took 2409.535371 ms)
step 25: train loss 3.729648 (took 2419.172362 ms)
step 26: train loss 3.549645 (took 2615.432226 ms)
step 27: train loss 3.339360 (took 2397.100638 ms)
step 28: train loss 4.338965 (took 2306.472662 ms)
step 29: train loss 3.812843 (took 2489.614175 ms)
val loss 4.020430
step 30: train loss 4.028022 (took 2830.212721 ms)
step 31: train loss 4.114379 (took 2393.216771 ms)
step 32: train loss 3.575101 (took 2411.546749 ms)
step 33: train loss 4.366093 (took 2782.991834 ms)
step 34: train loss 4.516504 (took 2386.624338 ms)
step 35: train loss 4.434158 (took 2362.931890 ms)
step 36: train loss 4.097423 (took 2722.066351 ms)
step 37: train loss 3.739693 (took 2375.078001 ms)
step 38: train loss 4.612139 (took 2440.452340 ms)
step 39: train loss 3.970823 (took 2657.332781 ms)
val loss 4.016672
generating:
---
Come Kurultan,
Among the geopolitical
Coers and My scullers take one word.
<|endoftext|>Shutth out of the yacht,
Sone of dejected glories
draw'd like an everlasting flame;
But: prying out, as a look in a good canopy
Fairs with
---
step 40: train loss 4.377796 (took 2752.577323 ms)
测试
make test_gpt2
./test_gpt2
测试结果:
[GPT-2]
max_seq_len: 1024
vocab_size: 50257
padded_vocab_size: 50304
num_layers: 12
num_heads: 12
channels: 768
num_parameters: 124475904
[State]
batch_size: 4
seq_len: 64
num_activations: 73347840
-43.431503, -43.431736
-39.836239, -39.836460
-43.065804, -43.066002
-42.827946, -42.828171
-43.529419, -43.529659
-44.318279, -44.318508
-41.227291, -41.227512
-41.270660, -41.270866
-42.541286, -42.541489
-42.394890, -42.395119
OK (LOGITS), max_diff = 8.239746e-04
LOSS OK: 5.269997 5.270007
dwte
OK -0.002320 -0.002320
OK 0.002072 0.002072
OK 0.003717 0.003717
OK 0.001307 0.001307
OK 0.000632 0.000632
TENSOR OK, maxdiff = 1.707077e-04
dwpe
OK -0.005111 -0.005110
OK -0.000011 -0.000013
OK -0.003262 -0.003261
OK 0.009909 0.009908
OK 0.002146 0.002145
TENSOR OK, maxdiff = 1.203269e-05
dln1w
OK -0.007523 -0.007523
OK 0.008642 0.008644
OK 0.005025 0.005028
OK -0.011094 -0.011094
OK -0.001663 -0.001663
TENSOR OK, maxdiff = 4.264116e-04
dln1b
OK -0.038462 -0.038456
OK -0.030591 -0.030595
OK 0.010215 0.010219
OK 0.080178 0.080175
OK -0.060908 -0.060896
TENSOR OK, maxdiff = 1.597637e-04
dqkvw
OK -0.000031 -0.000031
OK -0.000025 -0.000025
OK -0.000064 -0.000064
OK 0.000074 0.000074
OK 0.000020 0.000020
TENSOR OK, maxdiff = 6.203726e-05
dqkvb
OK -0.000412 -0.000411
OK -0.000412 -0.000412
OK 0.000114 0.000114
OK -0.000565 -0.000565
OK 0.000571 0.000570
TENSOR OK, maxdiff = 3.422704e-05
dattprojw
OK 0.000080 0.000080
OK -0.000005 -0.000005
OK -0.000019 -0.000019
OK 0.000004 0.000004
OK 0.000031 0.000032
TENSOR OK, maxdiff = 2.195314e-05
dattprojb
OK 0.000470 0.000472
OK -0.009979 -0.009981
OK -0.001803 -0.001805
OK 0.037585 0.037572
OK -0.031238 -0.031231
TENSOR OK, maxdiff = 1.956336e-05
dln2w
OK -0.018318 -0.018313
OK 0.004812 0.004812
OK 0.008089 0.008089
OK -0.001469 -0.001470
OK -0.002737 -0.002737
TENSOR OK, maxdiff = 1.060128e-03
dln2b
OK -0.026374 -0.026374
OK -0.016703 -0.016702
OK 0.001072 0.001069
OK 0.034711 0.034700
OK -0.028584 -0.028578
TENSOR OK, maxdiff = 8.928776e-05
dfcw
OK 0.000440 0.000440
OK -0.000000 -0.000000
OK -0.000154 -0.000154
OK -0.000165 -0.000165
OK 0.000405 0.000405
TENSOR OK, maxdiff = 1.000613e-04
dfcb
OK 0.003291 0.003294
OK 0.002043 0.002044
OK -0.001386 -0.001386
OK 0.000386 0.000387
OK 0.001603 0.001603
TENSOR OK, maxdiff = 2.483255e-05
dfcprojw
OK 0.000680 0.000681
OK 0.000073 0.000073
OK -0.000416 -0.000416
OK -0.000060 -0.000061
OK -0.000604 -0.000604
TENSOR OK, maxdiff = 4.865497e-05
dfcprojb
OK 0.003583 0.003585
OK -0.007157 -0.007159
OK -0.001962 -0.001963
OK 0.001462 0.001462
OK 0.001217 0.001218
TENSOR OK, maxdiff = 1.481583e-05
dlnfw
OK -0.000022 -0.000022
OK 0.000810 0.000810
OK 0.001161 0.001161
OK -0.002957 -0.002957
OK 0.001145 0.001145
TENSOR OK, maxdiff = 2.471101e-05
dlnfb
OK -0.011101 -0.011100
OK 0.008009 0.008009
OK -0.004771 -0.004771
OK -0.002112 -0.002112
OK -0.005905 -0.005905
TENSOR OK, maxdiff = 4.455447e-06
step 0: loss 5.269997 (took 2538.900264 ms) OK = 1
step 1: loss 4.059699 (took 2211.700180 ms) OK = 1
step 2: loss 3.375026 (took 2289.109099 ms) OK = 1
step 3: loss 2.800780 (took 2558.251191 ms) OK = 1
step 4: loss 2.315454 (took 2279.104378 ms) OK = 1
step 5: loss 1.849150 (took 2161.919211 ms) OK = 1
step 6: loss 1.394839 (took 2540.158140 ms) OK = 1
step 7: loss 0.999173 (took 2233.801734 ms) OK = 1
step 8: loss 0.624303 (took 2302.283686 ms) OK = 1
step 9: loss 0.376687 (took 2553.011337 ms) OK = 1
overall okay: 1
相关链接
“真男人就应该用 C 编程”!大神用 1000 行 C 代码手搓了一个大模型-电子头条-EEWORLD电子工程世界
llm.c代码详细解读(一) - 知乎 (zhihu.com)
Kimi
训练大型语言模型(LLM)通常是一个复杂的过程,涉及到大量的数据预处理、模型设计、训练和优化。虽然C语言是一种强大的编程语言,但它并不是进行机器学习模型训练的常用语言。大多数深度学习框架,如TensorFlow、PyTorch等,都是用Python等高级语言编写的,因为这些语言提供了更多的抽象和库支持,可以简化模型训练的过程。
然而,如果你希望使用C语言来训练LLM,你可以考虑以下几个方面:
-
数学库:你需要一个能够进行复杂数学运算的库,比如BLAS、LAPACK或cuBLAS(如果使用GPU加速)。
-
并行计算:由于LLM通常需要大量的计算资源,因此使用并行计算技术(如OpenMP或CUDA)是非常重要的。
-
深度学习框架:你可能需要自己实现一个深度学习框架,或者寻找一个用C语言编写的框架。这将涉及到实现前向传播、反向传播、梯度下降等算法。
-
数据预处理:你需要能够加载和预处理文本数据,这可能涉及到文本清洗、分词、向量化等步骤。
-
模型架构:设计适合LLM的神经网络架构,如Transformer、循环神经网络(RNN)等。
-
优化算法:实现或集成梯度下降等优化算法,用于更新神经网络的权重。
-
性能分析:使用性能分析工具来优化你的代码,比如gprof或valgrind。
-
调试和测试:由于C语言的接近硬件的特性,调试可能会比较复杂,需要仔细设计测试用例。
-
内存管理:C语言需要手动管理内存,这在处理大型数据集和模型时可能会变得非常复杂。
-
社区和资源:与Python等语言相比,使用C语言进行深度学习开发的社区和资源可能较少,这可能会增加开发难度。
总的来说,使用C语言训练LLM是一个具有挑战性的任务,需要深入的编程知识、数学背景和机器学习经验。如果你是一个初学者或者没有足够的资源,可能需要考虑使用更高级的语言和现成的深度学习框架。
如果你有特定的需求或者想要了解更多关于这个话题的信息,请提供更多的细节,我会尽力帮助你。
找到了第 1 篇资料:OpenAI创始大神手搓千行C代码训练GPT,附PyTorch迁移教程
找到了第 2 篇资料:“真男人就应该用 C 编程”!用 1000 行 C 代码手搓了一个大 ...
找到了第 3 篇资料:OpenAI 创始大神手搓千行 C 代码训练 GPT,附 PyTorch ...
找到了第 4 篇资料:颠覆LLM训练方法!Karpathy仅凭1000行C语言代码、一台 ...
找到了第 5 篇资料:llm.c代码详细解读(一) - 知乎
找到了第 6 篇资料:“真男人就应该用 C 编程”!用 1000 行 C 代码手搓了一个大 ...
找到了第 7 篇资料:颠覆LLM训练方法!Karpathy仅凭1000行C语言代码、一台 ...
找到了第 8 篇资料:探索 Karpathy 的 `llm.c`: 一个轻量级语言模型工具 - CSDN博客
找到了第 9 篇资料:纯C语言手搓GPT-2,前OpenAI、特斯拉高管新项目火了_澎湃 ...
根据提供的搜索结果,Andrej Karpathy,这位特斯拉前AI总监和OpenAI的创始成员,开发了一个名为llm.c
的项目,该项目使用纯C语言训练大型语言模型(LLM),如GPT-2。这个项目的特点和步骤可以总结如下:
-
项目简介:
llm.c
是一个用C语言编写的简单项目,旨在提供一个低级别的接口来训练大型语言模型。它不需要依赖庞大的库如PyTorch或Python,从而显著减少了依赖库的体积。 -
代码量和效率:Karpathy仅用大约1000行简洁的C代码完成了GPT-2模型的训练。这种方法不仅减少了依赖,还能与PyTorch的参考实现相匹配,并且可以立即编译和运行。
-
内存管理:在项目的开始阶段,所有需要的内存被一次性分配,训练过程中内存占用保持不变,数据批次在不同批次之间动态流动。
-
核心实现:关键在于手动实现每个单独层的前向传播和反向传播,并将它们串联起来。这包括编码器、matmul、自注意力、gelu、残差、softmax和交叉熵损失等。
-
CUDA移植:Karpathy正在将这些层逐层移植到CUDA上,以提高效率,使其接近PyTorch的性能,同时减少依赖。
-
项目优势:
- 代码简洁性:使用更少的代码完成模型训练,降低了复杂度。
- 独立性:不依赖外部库,使得部署和运行更加轻便快捷。
- 高效性:直接使用C/CUDA进行编程,提高计算效率和训练速度。
-
社区反馈:项目发布后迅速获得社区的积极响应,许多人对使用C语言进行深度学习训练表示出了兴趣。
-
开源和教程:Karpathy将
llm.c
项目开源在GitHub上,并提供了从PyTorch迁移到C语言的教程。 -
未来发展:Karpathy计划发布视频进行更详细的讲解,并探索使用SIMD指令加速CPU版本,以及支持更现代的架构如Llama2和Gemma。
-
实践指南:项目还提供了快速开始的指南,包括数据集的下载和tokenize,使用预训练权重进行模型初始化,以及如何用原始C语言进行模型训练。
通过这些步骤和特点,我们可以看出llm.c
项目是一个创新的尝试,它展示了即使在不使用主流深度学习框架的情况下,也能高效地进行LLM的训练。这对于希望减少依赖、提高性能或者对深度学习底层实现感兴趣的开发者来说,是一个宝贵的资源。
ChatGPT
用C语言编写一个大型语言模型(LLM)如GPT-3或BERT等的训练框架是非常具有挑战性的,但理论上是可能的。以下是如果你决定用C语言开发LLM训练框架可能需要考虑的几个方面:
1. **数学计算库** - 你需要高效的线性代数库来支持大量的矩阵运算,因为神经网络的训练需要大量的矩阵乘法、向量加法等操作。你也可能需要实现或利用现有的自动微分库来进行梯度的计算。
2. **并行计算** - 训练大型模型需要大量计算资源,通常需要GPU或TPU等硬件加速。在C语言中,为了最大化硬件性能,你可能需要使用CUDA或OpenCL等来编程这些硬件。
3. **数据处理** - 在训练之前需要对大量的数据进行预处理,这可能包括文本的标记化、编码、批处理等。C语言处理这些任务可能不像Python那么方便,但仍然是可以做到的。
4. **分布式计算** - 由于模型和数据的规模可能很大,训练过程可能需要在多个节点上分布式运行。实现有效的分布式计算和通信是另一大挑战。
5. **内存管理** - C语言不像一些高级语言如Python具有自动垃圾收集机制,你需要手动管理内存的分配和释放,这在处理大规模数据集时尤其重要。
6. **模型架构** - 实现模型的各个层次,如Transformer层、注意力机制、前馈网络等,需要深入理解这些结构并使用C语言准确实现它们。
7. **优化算法** - 实现各种优化算法(如Adam、SGD等)并且确保它们在大规模数据集上能够稳定运行。
尽管有以上挑战,使用C语言可以带来性能上的优势,因为它能提供更接近硬件层面的控制。然而,现代的深度学习框架(如TensorFlow、PyTorch等)大多是用C++编写底层计算代码,并提供Python接口以方便使用、迭代和社区贡献。因此,如果没有非常充分的理由,通常建议使用现成的框架进行LLM训练。如果需要性能优化,你可以考虑在现有框架的基础上进行定制,而不是完全从头开始用C语言编写。
讯飞星火
LLM(Language Model)是一种基于深度学习的自然语言处理模型,通常使用神经网络进行训练。在C语言中,我们可以使用一些深度学习库来实现LLM的训练,例如FAIR的FastText库。以下是一个简单的C语言实现LLM训练的示例:
首先,安装FastText库。在终端中输入以下命令:
git clone https://github.com/facebookresearch/fastText.git
cd fastText
mkdir build
cd build
cmake ..
make
make install
准备训练数据。创建一个名为train.txt的文件,其中包含用于训练LLM的文本数据。每行表示一个文本样本,用空格分隔单词。例如:
我 爱 北京 天安门
你 好 世界
编写C语言代码来训练LLM。创建一个名为llm_train.c的文件,然后将以下代码粘贴到文件中:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fasttext.h"
int main(int argc, char **argv) {
if (argc != 2) {
printf("Usage: %s <train_data>
", argv[0]);
return 1;
}
const char *train_data = argv[1];
const char *model_output = "model";
const int epoch = 5;
const int lr = 0.1;
const int dim = 100;
const int ws = 5;
const int minCount = 1;
const int neg = 5;
const int wordNgrams = 1;
const int loss = ns::sampled_softmax;
const double label = '__label__';
printf("Training LLM with FastText...
");
FastText ft;
ft.setTrainMethod(loss);
ft.setDimension(dim);
ft.setWindowSize(ws);
ft.setMinCount(minCount);
ft.setNegativeSamples(neg);
ft.setWordNgrams(wordNgrams);
ft.setLearningRate(lr);
ft.train(train_data, epoch, model_output);
printf("Model saved to %s.bin
", model_output);
return 0;
}
编译并运行代码。在终端中输入以下命令:
gcc -o llm_train llm_train.c -I../src -L../build -lfasttext -lm -pthread -O3
./llm_train train.txt
训练完成后,模型将保存为model.bin文件。可以使用FastText提供的其他工具来评估和测试模型。