第十节课了。跟我把前面九节课跟下来的同学应该有个感觉深度学习这条路前面学的都是“部件级”的东西神经网络、损失函数、卷积、循环网络一个个积木搭起来最后总能搭出点东西。这节课换一个画风直接聊当下绕不开的大模型。这节课我想解决三个问题大模型的原理到底是怎么回事它跟前面学的小模型差别在哪里以及手里只有一张显卡的时候你能怎么玩内容不追求论文级别的严谨但追求听完能上手该给出来的代码、参数、踩坑位置一个都不少。1. 大模型到底是什么从三个维度看懂它“大”在哪里1.1 从统计语言模型到大模型的进化思路要说大模型得先回到语言模型这个老概念。语言模型的任务用一句话说给定前面的一串词预测下一个词是什么。早期靠 n-gram 做统计比如统计“我今天”后面出现“吃饭”的次数用频率当概率。这套东西的问题非常致命数据稀疏稍微长一点的词组组合根本没见过概率直接就是零。后来有了循环神经网络把序列压缩成一个隐藏状态理论上能记住更长的信息可它有两个毛病——训练速度慢长距离依赖还是会逐渐衰减。真正改变格局的是注意力机制的出现它让序列里的任意两个位置可以直接发生交互不再需要信息一步步往后传与此同时计算还能大规模并行。于是模型的规模开始不受控制地往上涨语言模型也正式从小模型阶段进入大模型阶段。这个进化过程其实透露了一个关键信息大模型不是凭空长出来的它是“语言模型”这个老思路在算力、数据双重加持下走到极致的产物。你前面学的 Transformer就是大模型的底座现在所有主流大模型的骨架都能在它身上找到影子。理解这一点后面看新闻、看论文都不会觉得飘。1.2 参数、数据、算力这三笔账大模型的“大”到底体现在哪我习惯拆成三笔账。第一笔是参数账早期小模型百万级参数现在开源社区里常见的规模是 7B、13B、70B字母 B 代表十亿。一个 70 亿参数的模型用半精度存下来权重文件就 14GB 左右你下载下来都能明显感觉到这已经不是一个能随便塞进内存的小文件了。第二笔是数据账预训练阶段用的不是多少万条数据而是几 TB 甚至几十 TB 的纯文本切成 token 之后动辄几千亿个。第三笔是算力账从头训练一个 7B 模型需要几十上百张显卡连续跑好几个月电费和机器成本都是天文数字。这三笔账连在一起就解释了一个新手最常见的困惑为什么大模型不能像前面教程里那样随便训因为它是“三高”产物——高参数、高数据、高算力。这也是为什么绝大多数人接触大模型不是从训练开始而是从微调和调用开始。这不是妥协而是成本结构决定的现实。1.3 为什么这几年才突然爆发很多人会问注意力机制和 Transformer 不是早就有了吗为什么这几年才火我的理解是三个条件同时到位了。第一是算力这几年 GPU 的算力密度提升了一个量级大规模分布式训练变得成熟以前想都不敢想的集群现在能跑起来了第二是数据互联网积累了海量文本清洗之后足够喂饱大模型第三是范式大家终于摸索出“预训练 大规模后训练”这条稳定可复制的技术路线再加上一批开放权重的模型出现把门槛从顶级实验室拉到了普通开发者面前。技术爆发从来不是一个灵光一闪而是基础设施、数据和技术路线一起堆出来的结果。对学习者来说这也意味着你没必要神化大模型——它的原理你完全能学会而且后面几节的操作课你会发现门槛远比想象中低。2. 大模型核心原理拆解注意力、预训练与对齐机制2.1 注意力机制大模型的“内功心法”要说大模型为什么强绕不开注意力机制。我上课时喜欢打一个比方你在图书馆查资料手里有个问题Query所有书的标题是 Key正文内容就是 Value。你先拿着问题在标题里扫一遍找出最相关的几本书然后打开这些书的正文把最有用的段落摘出来组合成自己的笔记。注意力机制做的事情一模一样序列里的每个词都会生成三个向量Query、Key、Value计算时用当前词的 Query 去和所有词的 Key 做点积得到相似度再经过 softmax 归一化成权重最后按权重把对应的 Value 加权求和。哪个词跟你当前语义越相关它的信息贡献就越大。有人会问这三个向量是哪儿来的其实就是输入向量分别乘上三个可学习的权重矩阵训练过程中会自动调整这几个矩阵让模型学会“该关注哪”。模型不可能只用一套规则看关系于是有了多头注意力把注意力切成多个头每个头在独立的投影空间里学习不同的关系模式有的头关注语法有的头关注指代有的头关注远程依赖。最后把所有头的结果拼起来再做一次线性变换信息就串起来了。同时为了不让模型把句子当成词袋还要给每个位置注入位置信息这就是位置编码的作用。这一整套设计就是大模型能把长句子读明白的根本原因。2.2 预训练阶段模型的“自我修炼”有了骨架接下来就是填内容。大模型在预训练阶段做的事说白了就是“疯狂做预测题”。最常见的是自回归任务把一段文本的前面部分喂给模型让它预测下一个词是谁然后跟真实答案算交叉熵损失反向传播更新参数。就这么一个看似简单的任务在海量文本上反复做模型被迫学会了语法、事实知识、逻辑关系、常识判断。你可能觉得不可思议预测下一个词怎么能学会那么多东西语言本身就是高度压缩的知识载体。为了把下一个词预测准模型必须建模词与词之间的复杂关系这个建模过程就是在隐式地学习世界知识。比如文本里反复出现“北京是中国的首都”模型为了预测“北京”后面的词就必须把“北京”“中国”“首都”这几个概念之间的关联编码进去。训练到后期这些关联会泛化成它的“常识”。预训练阶段是计算量最大的阶段也是大模型性价比最高的一段同样的参数训练数据越多性能越好。2.3 规模定律与涌现能力为什么大家都在堆参数这里引出一个关键规律规模定律。研究者做了大量实验把模型参数量、训练数据量、算力投入和最终损失放到对数坐标下发现它们之间基本是一条直线关系。翻译成人话只要数据和算力一起涨模型能力就稳定地涨前期的投入每一次都没有白费。这个发现直接改变了行业游戏规则大家不再纠结某个技巧行不行而是先把规模堆上去技术路线前所未有地清晰。还有一个现象更有意思涌现能力。某些能力比如多步数学推理、指令跟随在模型规模超过某个阈值之前几乎为零超过阈值之后突然大幅提升。就像水加热到 100 度才沸腾之前看着没什么变化过了那个点就沸腾给你看。不过这里我要泼一盆冷水规模定律不是免死金牌数据质量、模型结构、训练稳定性照样能毁掉一切超大规模优势。很多团队盲目堆参数结果训练不稳定损失炸了钱也白花了这我见过不少次。2.4 对齐与微调让模型懂规矩预训练结束的模型能接下文但未必会“好好说话”。它会一本正经地续写却不一定回答你的问题说话方式也和人类对话习惯差很远。所以还需要后训练阶段业内叫“对齐”。第一步是监督微调也叫 SFT准备大量“用户提问-标准答案”这样的高质量对话样本让模型照着学格式和语气。第二步是强化学习对齐以前最常用的是 RLHF 路线先训练一个奖励模型对人类偏好数据打分再用强化学习算法去调整生成策略让模型输出更符合人类偏好。后来社区又提出了一些更轻量的方案比如直接偏好优化省去训练奖励模型的一整套流程成本低了不少。对个人玩家来说最常接触的可能不是这些重型对齐流程而是参数高效微调代表方案就是 LoRA。LoRA 的核心思路是冻结原有权重只训练一小部分低秩增量矩阵效果接近全量微调显存和耗时却能省一个量级。这一节后面实操我会带你完整跑一遍 LoRA 微调现在先记住这个词它是普通开发者接触大模型最划算的入口。3. 大模型训练完整路线图从数据到评测少走弯路3.1 先想清楚目标预训练、微调还是直接调用讲完原理聊路线。很多人一上来就问怎么训练一个自己的大模型我的第一个建议是先搞清楚自己到底需要什么。我把常见路子列成一张表路线成本数据要求适合场景全量预训练极高需要算力集群和数月时间TB 级文本研究底层、打造基础模型继续预训练或全量微调中等偏上单卡到几卡可启动百万级起步的领域文本或对话数据让模型懂某个专业领域LoRA 参数高效微调较低消费级显卡可跑几千到几十万条高质量样本改变风格、学会特定任务调用现成模型 API最低按量付费无需准备数据快速验证产品想法我的经验是90% 的业务问题根本不需要训练先试调用或者轻量微调只有当你发现模型在某个专业领域反复翻车、手上数据又多得能撑得起训练的时候才考虑继续预训练。一上来就堆算力从头训练大概率是给服务器商送钱。新手尤其要警惕“训练模型才叫真做 AI”的心态先跑通最小闭环再谈规模。3.2 数据准备清洗、去重与配比一个都不能少如果决定训练那第一件事就是伺候数据。数据是大模型的命根子这句话我说一万遍都不嫌多。网上能拿到很多开源语料但直接丢进去训练出来的模型会脏得没法看。标准流程大致如下第一是文档级去重把几十个网页里重复出现的段落干掉防止模型某段话背得滚瓜烂熟别的知识一概不知第二是内容过滤广告、标签、乱码、无意义内容一律剔除第三是质量筛选用规则或者小模型打分留下的语料要像样第四是配比设计通用文本、代码、数学题、多语种按什么比例混非常重要。举个例子想让模型会写代码代码语料的比例就得明显提高想让模型逻辑好数学和推理文本就得多放。数据清洗不是一次性工作通常要迭代好几轮每次训练完看模型表现再回头调整数据。我见过一个团队数据配比里通用文本占 99%代码只给一点点模型代码能力怎么训都上不来后来把代码语料提到 20%效果立刻不一样。数据比例就是这么敏感。3.3 分布式训练与显存优化一张卡也能玩的技巧数据准备好了接着是训练工程。大模型权重动辄几十 GB一张卡根本装不下所以要用分布式策略。最常见的三种切法数据并行每个显卡拿到一份模型副本和不同批次的数据算完梯度再同步更新适合数据量大、模型单卡能放下的情况张量并行把单个层的计算切到多张卡上适合模型太大装不进一张卡的情况流水线并行按层把模型切成几段每张卡负责一段像工厂流水线一样接力。实际训练往往是三种并行组合使用业界叫 3D 并行。不想搞集群的个人玩家更关心的是显存优化三板斧。第一招混合精度训练用半精度存梯度和激活值显存直接省一半第二招梯度累积显存不够就攒几个小批次的梯度再更新等效于把批次变大又不增加显存压力第三招梯度检查点故意不保存中间激活值用到的时候重算一次用计算换显存。还有 ZeRO 这类优化器状态切分方案能把显存占用进一步压低。个人做微调尤其要会用这些不然模型权重 14GB显卡显存 16GB还没开训就爆了。3.4 模型评测公开榜单不是唯一标准训练完或者微调完怎么知道它行不行我给三个层次的评测方法。第一层是标准基准测试跑通用问答、数学、代码、推理这些公开榜主要用来横向比较模型之间的差距缺点是公开榜单容易被刷分数虚高。第二层是人工对比把两个模型的回答放在一起盲测让打分的人凭直觉选更好的一边计算胜率。这个方法最贴近真实使用感受胜率比跑分可靠得多逻辑很简单用户不在乎你的测试分数只在乎你答得爽不爽。第三层也是我特别强调的用你自己的业务数据做评测哪怕只有一百条真实问题把模型跑一遍逐条看输出质量。很多同学拿公开榜单的高分模型做自家业务效果惨不忍睹原因就是榜单数据分布和你的业务数据分布完全不同。记住通用指标只能作为参考最终拍板的一定是你场景里的真实表现。这个道理放到任何模型身上都成立。4. 本地部署与 LoRA 微调实操跑通最小闭环4.1 环境准备与模型选型先跑通小的再往大了换理论知识讲完了进入动手环节。我们的目标很朴素在自己电脑上跑一个能对话的大模型最好还能微调一下。先说环境一台带独立显卡的机器显存 8GB 起步16GB 以上体验会好很多如果没有显卡用纯 CPU 也能跑小模型就是慢生成一句话能等半天。软件方面装好 Python再把深度学习框架和 transformers 这套生态装齐pip install torch transformers accelerate sentencepiece pip install peft # 微调用的参数高效库装好之后选模型。我强烈建议新手先选一个 1B 到 3B 级别的开源对话模型不要一上来就上 70B。显存 8GB 的时候选量化后的 3B 模型显存 16GB 可以跑 7B 的量化版本显存 24GB 以上7B 全精度基本没问题。记住一个原则模型能跑起来永远比模型大重要。先跑通一个小的再往大了换这个顺序能救你的头发。提示新手最大的错觉是“显存够模型一定跑得动”。实际上模型加载进显存后推理和训练还要额外占用大量显存预留空间不足一样会崩溃。4.2 十分钟跑通第一次本地推理以 transformers 为例加载一个开源对话模型并让它说话的代码非常短。这里我用占位符代替具体模型名你把它换成自己下载好的开源权重路径即可from transformers import AutoTokenizer, AutoModelForCausalLM model_path /your/local/model-path # 换成实际模型路径 tokenizer AutoTokenizer.from_pretrained(model_path) model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto) prompt 请用一句话解释什么是注意力机制。 inputs tokenizer(prompt, return_tensorspt).to(model.device) outputs model.generate( **inputs, max_new_tokens256, do_sampleTrue, temperature0.7, top_p0.9, ) answer tokenizer.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) print(answer)几个参数值得解释一下。max_new_tokens 控制最多生成多少个新词太长拖慢响应太短可能说不完temperature 控制随机性值越大越发散越小越保守日常问答我喜欢 0.7top_p 是做核采样只从累计概率前 90% 的词里抽能有效过滤低概率垃圾词。跑通这段代码你就已经完成了一个本地大模型的最小闭环。别小看这一步很多人卡在环境配置上好几个小时折腾一次就长记性了。4.3 LoRA 微调实战让模型学会客服风格推理跑通之后做更有价值的事情微调。这里用一个最经典的场景演示——让模型学会客服式的回答风格。第一步准备数据格式是 JSONL 文件每一行一个样本{instruction: 你好, response: 您好很高兴为您服务请问有什么可以帮您} {instruction: 能介绍一下退款流程吗, response: 您好退款会在申请后的三个工作日内原路返回账户请您耐心等待。}几百条这样的样本就能把风格掰过来。第二步写 LoRA 训练脚本核心是配置一个 LoRA 配置对象from peft import LoraConfig, get_peft_model lora_config LoraConfig( r8, # 低秩矩阵的秩越大表达能力越强显存占用越高 lora_alpha16, # 缩放系数影响更新强度 lora_dropout0.05, target_modules[q_proj, v_proj], # 只改注意力层里的投影矩阵 ) model get_peft_model(model, lora_config) model.print_trainable_parameters() # 会看到可训练参数占比非常小第三步定义训练参数并启动训练。批次大小看显存定学习率用 2e-5 这种小值跑几个 epoch一边跑一边看损失下降。训练完成后LoRA 只会保存一个很小的适配器文件几十 MB 到几百 MB 不等加载和分享都极其方便。整套流程跑下来你会有个直观感受训一个模型原来比想象中便宜得多这就是参数高效微调的价值。如果你想让模型学会某种语气、某个领域的问答套路这个套路基本是通用解。4.4 落地上线把模型封装成轻量服务微调完的模型不能总待在命令行里。我习惯用一个轻量 HTTP 服务把它包起来这样前端页面、测试脚本都能直接调用。核心思路是加载一次模型到显存然后循环接受请求把文本丢给模型生成再把结果返回。生产级实现要考虑并发、超时、流式输出但最小版本用几十行代码就能搭出来。另一个实用操作是量化部署把模型权重从半精度压到 8bit 甚至 4bit显存占用直接砍半再砍半。代价是速度和精度略有损失但很多对话场景完全够用。部署之后建议打印时间戳测算生成速度。按自回归方式生成的解码器7B 模型通常每秒几个到十几个 token你在心里有个预期就行别指望它能像本地搜索一样零延迟。这一步做完你就拥有了一个能对外提供服务的本地大模型虽然简陋但完整闭环已经成立。后续再想接业务、做检索增强都是在这个骨架上加肉。5. 大模型实践避坑指南显存、Loss 与幻觉排查5.1 显存溢出从 OOM 报错到成功训练先说我踩过最多次的坑显存溢出。报错就是很经典的一句 CUDA out of memory。第一次遇到别慌按顺序排查第一步确认显存是不是被别的进程占了用系统自带显卡监控命令看一眼占用情况我之前经常发现自己明明没开几个程序显存却被一个残留进程占掉大半第二步把批次大小 batch size 调小甚至调到 1这一步在微调时能立刻救急第三步切换到混合精度或量化加载第四步开梯度检查点最后实在不行就是模型规模选大了换个更小的版本。我的血泪经验是预算显存的时候除了权重还要预留激活值、梯度和中间缓存。所以不要天真地觉得 14GB 权重的模型在 16GB 显存里就能轻松训练。开训之前先跑一次小批次推理和一次单步训练把显存水位摸清楚再放大批次。宁可先稳后快也不要一上来就追求大 batch崩一次就得重来一次。5.2 训练不收敛或 loss 异常看规律就行第二个高频问题来自训练阶段损失不降或者乱跳。只要看日志规律基本能七成定位原因。如果损失发散射爆越训越大十有八九是学习率太高尤其用 1e-4 甚至更大的学习率微调时经常发生降到 2e-5 量级立马稳住如果损失一开始就纹丝不动先检查数据格式是不是错了是不是所有样本的标签都一样或者存在大量空文本如果训练到一半突然变 NaN多半是混合精度溢出老显卡对 FP16 支持不够好一般直接换 BF16。排查技巧上我强烈建议在训练循环里把梯度范数打出来。梯度范数持续上涨就是训练不稳定的前兆这时候调低学习率或加上梯度裁剪能救回不少坏训练。另外加学习率预热也很有用开头几百步从零慢慢升到目标学习率能避免训练初期的大震荡。这些小技巧看着不高级实战里挽救了我不下十次训练。5.3 生成质量差、幻觉多先别急着骂模型模型终于跑起来了又有人抱怨它满嘴跑火车。先泼盆冷水所有大模型都会幻觉没人能根除只能缓解。最常见的缓解手段有三个。第一个是调整解码参数把 temperature 调低比如从 0.7 降到 0.2模型就没那么爱编了代价是回答变得保守、缺乏新意第二个是给模型补上下文让模型基于资料来回答这就是检索增强的思路把相关知识片段拼到提示词里再让它答幻觉会显著减少第三个是引导它分步思考先列出思路再给结论复杂问题翻车概率小很多。另外我特别喜欢在提示词里加一句“如果不确定请直接说不确定”。多试几次你会惊讶地发现输出稳了很多。很多人以为这是玄学其实本质上是给解码过程加了约束让模型在低置信度时选择保守路径。这个方法免费效果却比换大模型更立竿见影。5.4 一张避坑速查表贴在手边随时看最后把前面所有经验浓缩成一张表方便你贴在手边症状可能原因解决方式CUDA out of memory显存预算不足、批次太大调小批次、开量化、开梯度检查点、换小模型loss 发散射爆学习率过大降到 2e-5 量级、加学习率预热、加梯度裁剪loss 全程不动数据格式错误或标签单一检查数据清洗确认样本标签有区分度训练中途 NaN半精度溢出换 BF16、降低学习率、增加梯度裁剪输出空洞套话数据质量差、模型太小清洗数据、换更强基座模型回答幻觉严重解码太激进、知识不足调低 temperature、加检索增强、给参考资料生成速度慢显存带宽不足、未做量化换量化版本、换更高带宽显卡、开编译加速这张表不完整但覆盖了新手阶段 80% 的求救场景。遇事先查表查不到再去针对性搜索效率比裸奔调试高得多。带完这一节我自己最大的体会是大模型的门槛确实被大幅拉低了但知识门槛一点没低。你还是要懂注意力机制、要懂数据清洗、要懂训练稳定性才能玩得转。对想入门的人我的建议很直白别囤资料先把最小案例跑起来再回来补原理两轮下来比看十篇综述都管用。这节课就到这下一节课咱们聊点更轻快的应用层玩法到时候见。
阅读完成 · 觉得有帮助?