
llm.c 如何用 scripts/run_gpt2_124M.sh 在 8 卡 FineWeb 上复现 GPT-2 124M 训练【免费下载链接】llm.cLLM training in simple, raw C/CUDA项目地址: https://gitcode.com/GitHub_Trending/ll/llm.c这篇文档面向准备用 llm.c 从零复现 GPT-2124M预训练运行的读者在 8 张 GPU 的单机 Linux 环境上使用 FineWeb 数据集完成一次完整训练。操作路径直接来自仓库自带的 scripts/run_gpt2_124M.sh——它给出了复现 GPT-2 (124M) 在 FineWeb 10B tokens 上训练的完整命令124M 参数模型、10B tokens共 18,865 个 step每 step 524,288 个 tokens。脚本注释里记录的参考条件为 8× A100 80GB SXM$14/hr约 300ms/iter总训练时间约 94.3 分钟。准备条件MPI、NCCL、cuDNN 与 Python 依赖训练命令通过mpirun启动多进程用 cuDNN 的 Flash Attention 构建编译前 Makefile 会依次检查这些依赖缺哪个都会明确报错OpenMPIMakefile 默认在/usr/lib/x86_64-linux-gnu/openmpi查找找不到时打印✗ MPI not found。按 README.md 的 multi-GPU 一节安装sudo apt install openmpi-bin openmpi-doc libopenmpi-devNCCLMakefile 用dpkg -l检查未安装时打印✗ NCCL is not found, disabling multi-GPU support并给出提示sudo apt install libnccl2 libnccl-dev见 Makefile。cuDNNmake train_gpt2cu USE_CUDNN1会启用 cuDNN Flash Attention但默认是关闭的编译时间会从几秒涨到约一分钟。最小安装是 cuDNN dev 包例如 Ubuntu 22.04 CUDA 12.x 下安装libcudnn9-dev-cuda-12此外还需要把 cuDNN frontend 的头文件clone 到磁盘Makefile 只在家目录$HOME/cudnn-frontend/include或当前目录./cudnn-frontend/include两处查找找不到会直接$(error ✗ cuDNN not found ...)。详见 README.md 的 flash attention 小节。Python 依赖数据预处理脚本 dev/data/fineweb.py 依赖datasets、tiktoken、transformers等包用仓库提供的 requirements.txt 安装pip install -r requirements.txt成功编译时终端会看到✓ NCCL found, OK to train with multiple GPUs、✓ MPI enabled、✓ cuDNN found, will run with flash-attention三行提示如果第三行变成了报错说明 cuDNN 或 cudnn-frontend 路径没配好先解决它再往下走。数据准备预处理好 FineWeb 10B 与 hellaswagrun_gpt2_124M.sh的训练参数里数据路径写死为dev/data/fineweb10B/下的分片文件而该目录需要自己生成。按脚本头部注释前置命令有两条python dev/data/fineweb.py --version 10B # 下载并 tokenize FineWeb 10B 子集 python dev/data/hellaswag.py # 预处理 hellaswag 评测数据fineweb.py 从 HuggingFace 的HuggingFaceFW/finewebsample-10BT拉取数据用 GPT-2 tokenizer 切词后写成 uint16 的.bin分片输出到dev/data/fineweb10B/。10B 规模取决于网络和机器要跑几个小时脚本 docstring 原文。hellaswag.py是训练命令中-h 1启用 hellaswag 评测所需的数据同理生成到dev/data/下对应目录。仓库里另有一个 dev/data/fineweb.sh可以跳过切词、直接下载已 tokenize 好的.bin分片例如./fineweb.sh 100下载 100 个 shard默认最多 1028 个。注意它固定把文件下到fineweb100B/目录而run_gpt2_124M.sh的命令行假定数据在dev/data/fineweb10B/所以如果走这条路需要自行把-i/-j指向实际目录本文主路径仍按脚本注释使用fineweb.py --version 10B。数据文件就绪后确认dev/data/fineweb10B/下能匹配到fineweb_train_*.bin和fineweb_val_*.bin因为训练命令用通配符按 pattern 读文件。执行训练scripts/run_gpt2_124M.sh在仓库根目录运行bash scripts/run_gpt2_124M.sh脚本做三件事构建二进制make train_gpt2cu USE_CUDNN1设置out_dirlog_gpt2_124M完成标志为$out_dir/DONE_00018865进入while true循环反复执行训练直到DONE_00018865出现才退出打印File ... exists. Exiting the loop.。核心训练命令保留原命令8 卡单机mpirun -np 8 ./train_gpt2cu \ -i dev/data/fineweb10B/fineweb_train_*.bin \ -j dev/data/fineweb10B/fineweb_val_*.bin \ -o log_gpt2_124M \ -v 250 -s 20000 -g 144 \ -h 1 \ -b 64 -t 1024 \ -d 524288 \ -r 0 \ -z 1 \ -c 0.1 \ -l 0.0006 \ -q 0.0 \ -u 700 \ -n 5000 \ -y 1 \ -e d12参数含义依据 train_gpt2.cu 的 usage 输出和源码注释参数值用途-i/-j训练/验证数据 pattern通配符匹配上面预处理的.bin分片-olog_gpt2_124M输出日志目录checkpoint 和 DONE 文件都写在这里-ed12模型描述符legacy 格式dX表示 GPT-2 X 层d12即 12 层的 GPT-2 124M-b/-t64 / 1024每卡 micro batch 大小 / 序列长度-d524288目标总 batch 大小。8 卡 × 64 × 1024 524,288正好无需梯度累积-z1Zero Optimization Stage 1-r0recompute 关闭0none, 1gelu, 2geluln-l/-u/-q0.0006 / 700 / 0.0学习率、warmup 步数、学习率衰减终值比例-c0.1weight decay-n5000每 5000 step 写一次 checkpoint-v/-s/-g250 / 20000 / 144每 250 step 评一次 val loss每 20000 step 推理一次生成 144 个 token-h1启用 hellaswag 评测需前面预处理过 hellaswag 数据-y1检测到输出目录里已有优化状态则续训而不是从头开始while循环配合-y 1就是脚本注释里说的训练卡住或崩溃时自动恢复机制每次重启都会从log_gpt2_124M里最高 step 的 checkpoint 续跑直到 18,865 步完成。验证训练进度与结果进度训练日志写入log_gpt2_124M每 250 步可看到一次 val loss 评估每 5,000 步在目录中落一个 checkpoint含权重、优化器/数据加载状态。完成判定log_gpt2_124M/DONE_00018865文件出现。checkpoint 写完时会生成对应步号的DONE_%08d文件作为该 checkpoint 整体完整的信号train_gpt2.cu脚本正是以DONE_00018865存在为退出条件。可选的构建自检正式跑之前可以先用单测确认 C 代码与 PyTorch 参考实现一致README.md test 一节make test_gpt2cu USE_CUDNN1 ./test_gpt2cu测试应通过并打印overall okay: 1。规模核对完成后日志中应覆盖到 18,865 个 step、总 token 量对应 10B 的 FineWeb 数据参考耗时按脚本注释约为 18,865 × 300ms ≈ 94.3 分钟8× A100 80GB SXM此为文档给出的参考值你的机器速度会不同。显存不足或卡数不同的调整如果 8 卡跑-b 64时显存不够scripts/README.md 给出两个调节旋钮recompute-r和 micro batch-b。建议先试-r 1重算 GeLU用速度换显存还不行就把-b从 64 依次减半到 32、16、8直到放得下能跑起来后可以再试-r 0把速度找回来。另一个方向是缩短上下文-tGPT-2 用 1024如果你的场景容忍更短可以调低。如果只有一张卡按同一份 scripts README 的做法把mpirun -np 8 ./train_gpt2cu改成直接./train_gpt2cu即可其余参数不变程序会自动检测可用 GPU 数量并调整梯度累积结果在浮点误差内一致只是时间等比拉长。训练跑完后log_gpt2_124M里的最终权重.bin可以直接作为 dev/eval 流程的输入先用export_hf.py导出为 HuggingFace 格式再用 Eleuther 评测框架跑分这是仓库文档给出的后续路径。【免费下载链接】llm.cLLM training in simple, raw C/CUDA项目地址: https://gitcode.com/GitHub_Trending/ll/llm.c创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考