我从零开始训练了一个113M参数的地震LLM
英语 | 中文 为地震科学训练一个小型GPT——从空白文件夹到一个会说话的模型,逐步解释整个LLM生命周期。爬取 → 清理 → 分词 → 模型 → 训练 → 推理,使用2× NVIDIA A30(48 GB)。六个免费数据源→爬取→清理/去重→16k BPE→113M GQA+RoPE解码器→2-GPU DDP训练→流式推理。每个阶段是下面的一个部分。nanoGPT-Seis是一个教学仓库。它并不试图成为一个伟大的地震模型——它试图使预训练语言模型的每个阶段都可读:数据来自哪里,如何清理和去重,如何构建分词器,Transformer的形态为何如此,它如何在两个GPU上训练,以及如何提供服务。每个设计决策都有解释,所有数字(困惑度、VRAM、tokens)都是我们在该硬件上实际测量的。语料库混合了地震/地震学文本(通过Crossref+Unpaywall的开放获取论文,arXiv/EarthArXiv预印本,“Earthquake Insights” Substack)和通用文本(维基百科+FineWeb-Edu),以便于使用普通语言流利性——大约24%为领域文本/76%为通用文本。一个专注的语料库使大约100M参数的模型在单个节点上能够真正流利,因此您可以在一天内看到整个循环关闭,而不是一个月。(为什么要混合通用文本?见§1。)状态:预训练生命周期已完成——从爬取到推理。目录 一览结果 快速开始 阶段1——数据爬取 阶段2——处理与去重 阶段3——BPE分词器 阶段4——模型(RoPE、GQA等) 阶段5——训练(DDP、VRAM、LR) 阶段6——推理 仓库布局 规模法则实验 1. 一览结果 价值 语料库 533,248文档 · 485.7M字 · 822.7M训练tokens(≈2.4:1通用:领域) 模型 113M参数——仅解码器,GQA + RoPE + RMSNorm + SwiGLU 硬件 2× NVIDIA A30(每个24 GB),bf16,DDP——也可以在单个RTX 3090/4090上运行,或使用更小批量在12–16 GB上运行(§7.5) 上下文长度 4096 tokens 训练 8,000迭代(≈3.8个周期),约6.5小时,约2.9秒/迭代 流利度(字节/比特,通用文本) 0.997——与仅领域模型的1.527相比(−35%) 推理 KV缓存流式, ~176毫秒到第一个token,反重复采样 三个值得暂停的发现:更长的上下文有帮助。进行控制的A/B(数据固定)——在4096对比1024重新训练时,困惑度降低了约11%(9.74→10.93,领域专用)但每步计算仅增加约26%——论文具有1024个token窗口无法看到的长范围结构。模型利用了这一上下文。在4096个token窗口中,2048–4096位置的损失比0–64位置低25%——它在成千上万个前置token上进行条件处理(见§8)。通用文本混合恢复了流利度。添加维基百科+FineWeb-Edu(约2.4:1通用:领域)使通用散文的字节/比特降低了35%,与只有论文的基础相比——见下文的数据混合比较。 数据混合:仅领域(v1)→通用+领域(v2) 仅论文的基础在论文记录中流利,但在普通散文中重复/不连贯。添加约540M个维基百科+FineWeb-Edu的tokens(→ ~823M训练tokens,~2.4:1通用:领域,~3.8个周期——在Muennighoff等人(2023)显示的接近无损的~4个周期重复预算内)形成v2。用每字节比特测量(不依赖分词器,因此v1↔v2是公平的;src/compare_models.py):在通用散文中,v2比v1流畅得多(−35%字节/比特),并且在v1发出无意义的文本时生成连贯的非地震文本,代价是某些领域的尖锐度(+22%)——经典的流利度↔专门化权衡。这种流利的基础是进行SFT的正确出发点;仅凭基础预训练从未产生聊天。仅领域权重保留为检查点/ckpt_v1_domain.pt。 2. 快速开始 2.1 尝试预训练模型 预训练的113M检查点托管在Hugging Face Hub上:jiazhe868/nanogpt_seis 。# 环境(一个工作的CUDA-12.4 PyTorch;请看下面的说明) conda activate nanogpt_seis pip install -r requirements.txt # 下载检查点、分词器和模型配置到src/inference.py预期的路径 huggingface-cli download jiazhe868/nanogpt_seis \ checkpoints/ckpt.pt \ data/tokenized/tokenizer.json \ data/tokenized/meta.json \ configs/gpt120m_ctx4k.yaml \ --local-dir . python -m src.inference --prompt "2011年东北地震" 2.2 从零复现预训练 # 环境(一个工作的CUDA-12.4 PyTorch;请看下面的说明) conda activate nanogpt_seis pip install -r requirements.txt # --- 运行整个管道 --- # 地震领域来源 python -m src.crawl.wikipedia --max-pages 500 # 标题为地震的页面 python -m src.crawl.fulltext --per-journal 3000 --broad 30000 --workers 64 python -m src.crawl.preprints --arxiv 3000 --eartharxiv 2000 python -m src.crawl.substack --max 500 # 通用文本混合以提高流利度(约540M tokens:维基百科 + FineWeb-Edu) python -m src.crawl.general --wiki-tokens 300000000 --fineweb-tokens 240000000 python -m src.process.build_corpus --val-frac 0.005 # 清理 · 去重 · 拆分 python -m src.tokenizer.train_bpe --vocab-size 16384 # 训练分词器
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡