2022年冬天我第一次在本地把一个小模型调通时最震撼我的不是它回答得有多好而是我清楚地知道自己喂进去的是几十GB的文本出来的却是能对答如流的“大脑”。大模型这个词后来被叫成Foundation Model意思是一个把原始数据变成通用能力的底层底座。这篇文章我想完整记录一下从一堆数据到最终可用的大模型中间到底发生了什么。对于刚接触大模型的人这篇可以当作一条学习路线对于已经在跑推理的人里面也有不少我踩过坑之后才理解的细节。1. Foundation Model不是天降神兵从专用模型到通用底座1.1 一个词的变化从BERT、GPT到Foundation Model如果你翻2020年之前的论文几乎看不到“Foundation Model”这个说法。当时大家叫它们pre-trained model预训练模型或者language model语言模型。2021年斯坦福的一份报告把这类模型正式命名为Foundation Model中文经常翻译成“基础模型”或“基石模型”。名字的变化背后是一个很重要的认知转变早期的BERT、GPT-2只被看作NLP任务的工具箱需要在下游任务上再搭一层网络微调。而到了GPT-3、PaLM这种规模之后模型本身已经具备了多任务泛化能力一个模型可以写代码、做翻译、解数学题、生成图片描述不需要为每个任务单独设计网络结构。这种“通用底座”的定位就是Foundation Model和其他深度学习模型的本质区别。你可以把它理解成操作系统Windows本身不解决你写文档、剪视频的具体问题但所有软件都跑在它上面。大模型也是一样它不直接面向某个具体业务但通过后续的指令微调、人类反馈对齐可以变成客服、翻译、编程助手等各种应用。1.2 “大”的三根支柱参数、数据、算力所谓大模型通常有三个维度的“大”参数量大、训练数据量大、训练算力大。GPT-3是1750亿参数训练数据约3000亿tokenPaLM是5400亿参数训练数据7800亿token。这些数字在今天看来不算夸张但一个有意思的现象是参数和数据的增长速度非常快而算力也在同步膨胀。算力通常用FLOPs来衡量一次完整的前向反向传播需要的浮点运算次数大约是6倍的参数量乘以token数量。比如一个7B模型在2万亿token上训练总计算量大约是6×7×10^9×2×10^12也就是8.4×10^22 FLOPs。一块H100的FP16算力大约是2×10^15 FLOPs理想情况下需要4千多万块H100跑一秒当然实际是几千块卡跑几个月。这个计算方式建议每个想训练大模型的人自己算一遍因为它能帮你判断一个训练任务到底现实不现实。我在初期经常犯一个错误只盯着参数量忽略了token总量结果预估的算力成本和实际差了一个数量级。1.3 为什么数据比架构更决定天花板很多人以为大模型厉害是因为Transformer架构厉害。这个说法对了一半。Transformer确实是目前的骨干架构但同样用Transformer数据和训练方式的不同会让能力差距非常明显。一个只有几亿参数的小模型如果在高质量代码、数学和科学数据上充分训练也能表现得很聪明而一个几十亿参数的模型如果喂的全是重复的灌水文本就是一个笨重的复读机。这里有个更极端的例子有人用大量合成数据训练小模型效果能超过用原始网页文本训练的大模型。背后的原因是数据的多样性和质量决定了模型能学习到的模式有多丰富。数据是大模型的上限模型只是逼近这个上限的工具。这句话已经成了不少大模型团队的内部共识。所以接下来的章节我们要重点拆解数据是怎么被处理成模型能用的形态的。2. 数据炼油原始语料是怎么变成模型“食物”的2.1 数据来源网页、书籍、代码、多语种的混合配方现代大模型的基本训练语料来自几个大块网页爬虫数据如Common Crawl电子书和学术论文开源代码库如GitHub还有各类多语种百科和论坛。以开源模型Llama 2为例官方公开的数据配比里网页数据占了绝大多数但只有约4.5%的书籍数据约4.5%的代码数据。这个比例是经过消融实验调出来的因为不同数据来源决定了模型的长板代码数据能显著提升逻辑推理和指令遵循能力书籍数据能提升长文本建模能力和知识密度网页数据则提供广度和口语化表达。一个常见误区是拼命找更多数据却不看数据里有什么。我做训练数据处理时第一步永远是对已有的数据做一次全面的统计语言分布、域名来源、平均长度、重复率、困惑度perplexity异常值。只有把数据体检做完才能决定下一步清洗策略。2.2 清洗与去重把互联网的垃圾挑出去互联网文本大体上是极度混乱的。里面有HTML标签、导航栏、广告语、乱码、编码错误还有大量重复的模板短语。如果不处理模型会学会“点击这里”“阅读原文”这类垃圾输出。清洗环节一般包含这些操作去除HTML标签和不可见字符把纯文本抽出来按语言过滤保留目标语言为主体的文档用规则过滤质量低的页面比如短语重复率过高、句子过短、标点异常去重常见的做法是MinHash LSH把文档归一化成Shingle集合后计算相似度去掉近似重复的文本毒性内容过滤用关键词列表或小型分类器去掉暴力、色情等有害内容这里最容易被低估的是去重。早期的GPT-2论文里就提到如果不做去重模型会记忆大量重复文本导致生成内容出现“复制粘贴”式的重复。而且去重不是做完一次就一劳永逸训练过程中不同epoch之间也需要打乱顺序避免模型对数据顺序产生过拟合。2.3 Tokenization文本到数字的关键一跳清洗好的文本依然是字符串模型实际处理的是整数序列。Tokenization就是把文本切成若干token然后映射成ID。常用方法是BPEByte Pair Encoding它从单字符开始反复把出现频率最高的相邻符号对合并成一个新符号最终形成一张词表。一个token可能是一个完整单词、半个单词甚至一个字符。比如“hello world”可能被切成“hello”和“ world”两个token也可能把“world”切成“wor”和“ld”。为什么要在意tokenization因为词表大小、token切分方式直接影响模型能表示的信息粒度。一个中文语言模型如果词表里几乎没有中文词那每个汉字都被切成字节级token序列长度会变长很多训练效率和上下文窗口利用率都会下降。所以现在主流模型都会在词表里加入大量中文和其他语言的字词同时用byte-level BPE保证未登录词也能表示。在训练时除了模型参数embedding层的词表维度也是显存占用的大头这也是为什么很多模型要共享输入输出embedding来省显存。2.4 数据配比和课程顺序训练顺序也是超参数数据配比直接决定了模型的技能树。你可以自己定一个配方比如“50%网页、20%书籍、15%代码、10%数学、5%其他”。但这里有个容易踩的坑不同来源的数据量差异巨大直接按比例采样会让小数据源被淹没所以通常会对每个来源设置一个采样权重再根据权重做up-sampling或down-sampling。训练顺序也有讲究类似人类的“先学基础再学专业”。很多团队采用两阶段式第一阶段在通用数据上训练第二阶段在高质量数据和指令数据上退火annealing。这个思路能提升最终模型在特定任务上的表现同时又不太损伤通用能力。我记得有次实验里只是把高质量代码数据放在末尾阶段训练模型在HumanEval上的分数就涨了好几个点成本几乎为零。数据顺序这个超参数值得每个做预训练的人都试验一遍。3. 预训练现场损失函数、GPU集群和那一串浮点数3.1 自监督学习的核心预测下一个Token预训练的目标函数非常简单给你前n个token让模型预测第n1个token是什么。这个目标叫next token prediction属于自监督学习因为数据本身就是标签不需要人工标注。你不需要告诉模型“巴黎是法国的首都”只要语料里出现“巴黎是法国的首都”这句话模型就能从上下文里学会这种知识。但这个简单目标带来的效果非常惊人。为了预测下一个token模型必须学习语法、事实知识、推理模式甚至代码的逻辑结构。它学到的不是一个个死记硬背的短语而是token之间的条件概率分布。当你输入一句问题时模型做的就是沿着这个条件概率链不断生成下一个token直到停止。还有一个常被忽略的细节训练时用的是teacher forcing即无论模型预测的token对不对下一时刻都输入真实token。这样可以加速收敛也让梯度更稳定。但推理时没有真实token可用只能把模型自己生成的token当做下一步输入这就造成了训练和推理之间的分布偏移。很多模型生成时越走越偏根源就在这里。3.2 Transformer的崛起注意力机制为什么能撑起大模型2017年Transformer提出之后大模型才真正有了可扩展的骨架。它最关键的是自注意力机制每个位置都可以直接计算和所有其他位置的关联权重所以无论两个token隔多远都能建立依赖。相比RNN靠循环一个个传递信息Transformer把整个序列并行送入网络训练速度快了不止一个数量级。不过Transformer也不是没有代价。标准自注意力计算量是序列长度的平方所以上下文一长时间和显存开销会爆炸。这就催生了FlashAttention、稀疏注意力、滑动窗口等一系列优化。现在的大模型普遍采用多层的Decoder-only结构每一层里有注意力、前馈网络、LayerNorm。参数量主要集中在前馈网络里注意力只是其中一小部分。个人理解Transformer能成为大模型通用的架构是因为它在“容量”和“可并行性”之间取得了很好的平衡。其他架构比如SSM状态空间模型也在追赶但目前最有完整生态链的还是Transformer。哪怕不做研究只做推理部署也需要了解注意力是怎么计算显存占用的因为这是后面做量化、加速的基石。3.3 规模化的三个规律Scaling Law怎么指导我们花钱DeepMind的Chinchilla论文发现了一个重要的规律在计算量固定的前提下模型参数量和训练token数量要按比例增长。具体来说每增加一倍的参数量训练数据也应该增加一倍左右这样才能最有效地利用算力。按照这个结论训练一个10B模型数据量不应该少于200B token训练一个70B模型数据量可能需要1.4T token。这看起来像理论实际上直接影响预算分配。很多人想训练大模型第一反应是买更多GPU来扩大参数量但忘了同时要把数据扩充几倍。如果只放大模型而不放数据模型会出现典型的欠拟合loss下不去生成效果差如果只堆数据模型很快就到容量瓶颈继续训练收益非常低。Scaling Law还有一个体现是“损失下降与算力呈幂律关系”。也就是说随着训练量增加模型效果确实会变好但边际收益递减。这决定了你要在什么时间点停止训练。我见过太多团队在loss已经平坦之后还继续烧钱这时候就该去调整数据配比或者进入对齐阶段而不是继续硬训。3.4 训练过程中你在看什么loss、checkpoint和那些失控瞬间预训练不是无脑启动然后等结果。运行期间最常看的指标是训练loss和验证loss。如果训练loss下降而验证loss不再下降说明模型过拟合了这时候该增加数据多样性或做正则化如果两者都不降说明学习率可能太高或模型太大、数据量不够。训练过程的崩溃也相当常见。我在自己的实验里遇到过loss suddenly spike也就是损失函数突然飙高然后恢复的情况。原因可能是学习率步长过大踩到了损失面的悬崖也可能是个别数据样本产生了异常大的梯度。常用手段是设置梯度裁剪gradient clipping以及用loss spike检测工具自动跳过异常的checkpoint。分布式训练是另一个大坑。模型并行、数据并行、流水线并行这三者的排列组合和通信开销经常把人绕晕。现在大部分开源训练框架都已经封装好但你应该至少看懂一张分布式训练拓扑图知道哪几张卡走高速NVLink、哪几张卡走慢速网络。这个认知在调试训练速度时非常有用。4. 对齐、微调、部署从数学玩具变成可用工具4.1 Instruction Tuning让模型学会“听指令”预训练模型只会续写文本不会乖乖地按你的问题来回答。让模型变得可用的第一步是Instruction Tuning即构造大量“指令-回答”对让模型在监督学习下学会执行指令。比如把“巴黎是哪个国家的首都请用一句话回答”作为输入期望输出是“法国”。这些指令数据可以来自人工编写、开源数据集、甚至另一个模型的生成结果。为什么这一步有效因为预训练时模型见过的数据形态是网页文本里面很少出现“用户指令-模型回答”的交互格式。通过在指令数据上继续训练模型能把习得的各种知识快速抽取出来并组织成符合对话习惯的回答。指令数据的质量和覆盖度会比纯数量更决定模型好不好用。我也见过一些模型基础能力很强但指令数据太单一导致只能应付几种固定问法。4.2 RLHF与DPO人类反馈怎么进入梯度光靠指令微调模型还可能出现“看起来语法正确但不受欢迎”的输出。于是有了基于人类反馈的强化学习叫RLHF。流程大致是先训练一个奖励模型让人类对同一指令下的不同模型输出打分然后用强化学习算法比如PPO调整模型参数使奖励最大化。这个阶段进一步让模型学会“说出人类喜欢的话”比如更有礼貌、更清晰、更诚实。RLHF的实现复杂度较高超参数很多动不动就不稳定。后来出现了DPODirect Preference Optimization它不需要单独训练奖励模型和做强化学习而是直接根据人类偏好数据对策略模型进行优化。实现简单训练稳定现在很多开源模型都在用DPO做对齐。从个人经验讲人类标注数据的质量比数量重要得多。如果标注本身存在偏好偏差模型会把偏差无限放大。还有个容易被忽略的细节对齐阶段不能训太狠否则模型会产生“对齐税”丧失一部分通用能力。通常的做法是用很小的学习率只训很少的步数在通用能力和对齐效果之间取平衡。4.3 量化、Ollama、vLLM本地跑模型的关键技术模型训练完之后绝大多数人不会去复现训练而是直接下载模型做推理。但一个7B FP16模型就有约14GB权重直接跑还挺吃显存的。为了在消费级显卡上跑量化是必备技术。最简单的做法是把FP16权重量化成INT8或INT4比如GPTQ、AWQ、GGUF这些方法。INT4量化后7B模型权重只有4GB左右很多16GB显存的显卡都能轻松运行。本地部署方面Ollama和vLLM是两款使用频率非常高的工具。Ollama更像一个友好的模型运行器一条命令就能拉模型、起服务适合本地测试和私有化部署。vLLM则更偏生产环境它的核心优势是PagedAttention和Continuous Batching能大幅提升吞吐量。如果你只是自己玩用Ollama足够如果要做API服务面对高并发vLLM的缓存命中率和批处理优化非常关键。我实测过同一个模型vLLM的每秒请求数能比朴素的HuggingFace Transformers推理高出数倍。4.4 从训练到微调什么时候该用LoRA当你有自己的业务数据想针对某个领域增强模型时完整微调所有参数成本太高所以一般用LoRALow-Rank Adaptation。它的核心是在冻结原模型参数的同时只训练一小部分低秩矩阵参数可训练参数量往往只有原来的1%不到。训练出来的LoRA权重只有很小一份可以随时插拔非常灵活。什么时候需要做全量微调我的判断是如果你需要模型学到全新的知识或领域而且训练数据量足够大全量微调有优势如果只是调整输出风格、指令遵循能力LoRA就已经足够。GPU微调大模型时即便用LoRA显存瓶颈通常在中需要加载的模型权重和输入的梯度状态。这时可以用4比特量化的QLoRA一张24GB显卡就能微调7B模型。关注显存和批大小之间的关系比一味追求大模型更实在。5. 能力边界与常见误区幻觉、温度、上下文和投毒5.1 幻觉模型“一本正经胡说八道”的根源幻觉是大模型最出名的副作用。它指的是模型生成了流畅但不符合事实的内容。根源在于模型本质是概率预测器它在生成时并没有一个独立的事实检验模块。即使模型已经“知道”正确答案但在解码时被某个概率略高的错误分支带跑就会输出错误内容。尤其是当问题涉及长尾知识、训练数据里出现次数不多时幻觉概率会明显上升。缓解幻觉通常有几个思路一是检索增强RAG让模型在生成前先从外部知识库检索相关段落把资料作为上下文输入这样大幅降低“凭空编造”的概率二是在解码端做约束比如让模型必须引用来源三是在训练时增加事实性数据。这里我要提醒一点幻觉不可能被完全消除只能被抑制。一个宣称“零幻觉”的模型多半只在特定测试集上有效。5.2 上下文窗口、温度参数不是调得越高越好上下文窗口指模型能“看到”的最大输入长度。现在很多模型窗口从4K扩展到128K甚至1M看起来越长越好但长序列的实际效果往往不是线性的。随着序列变长模型对早期内容的关注度会下降相关性和连贯性可能变差。所以不要盲目追求超长上下文真正重要的是在长文本里能不能准确定位到关键信息。温度参数控制生成随机性。温度越低模型越倾向于采样高概率token输出更稳定、更保守温度越高输出越发散、更有“创造性”。但很多人把它理解成“越高越聪明”这是错的。在需要事实准确的场景温度调太高几乎必然导致幻觉增加在创意写作里温度稍微高一点才有趣。我一般写代码和回答知识性问题时用0到0.3头脑风暴时用0.7左右再高就明显开始胡言乱语了。5.3 数据投毒通往模型后门的隐蔽路径大模型的数据来源复杂只要有任何一个数据源头被污染模型就可能学到攻击者种下的触发器。所谓“数据投毒”是指在训练数据里混入带特定触发条件的恶意样本模型在正常使用时表现正常但一旦出现触发词就会被诱导输出错误结果或泄露敏感信息。很多团队做安全测试时会专门做投毒测试比如在微调数据集里插入“当句子中出现某个颜色词就输出攻击性内容”然后看模型是否真的会学进去。结果往往令人震惊只需要极少量样本就能在模型里埋下后门。这提醒我们在爬取数据、选择开源数据集、甚至使用LLM生成训练数据时都要做来源审计。如果数据本身不可信模型再强也只是一颗定时炸弹。5.4 普通人怎么动手学从GitHub项目和GPU天梯开始如果你读到这里想知道自己怎么开始动手学大模型我的建议是从本地部署到微调的一条线走下来。先去GitHub上找“动手学大模型”这类开源项目特别是上海交大开源的那份大模型教程内容从原理到代码都有非常适合系统入门。工具链可以直接用Ollama把模型跑起来再用vLLM做性能对比尝试写一个最简单的API服务。接下来可以找一份开源数据集做LoRA微调观察训练前后模型的能力变化。硬件方面先看看“大模型显卡天梯”这类评测再决定买卡还是租云。如果只是玩7B到14B模型16GB到24GB显存的显卡足够想微调更大模型至少需要3090/4090或A100级别。初学者经常高估硬件门槛其实很多实验用CPU也能跑小模型只是慢一点。关键是把数据准备、训练脚本、评估指标这个闭环先跑通再去追求更大的参数量。跑通一遍之后你会发现“从数据到Foundation Model”这条路虽然长但每一步都有迹可循。数据告诉你模型学什么模型告诉你数据提供了什么两者互相纠缠最终才表现出我们看到的智能感。我自己最深刻的体会是大模型并不神秘它是一套极其精巧的统计学习系统只是规模大到超出直觉。而理解它的最好方式就是亲手从头做一遍——不一定要训练万亿参数模型一个几亿参数的模型已经足以让你看清所有关键机制。