原来训大模型,就像开一家小餐馆!
你是不是一直觉得,训练大语言模型是 OpenAI、百度这种大厂才能干的事?要几万张显卡,要花几个亿,普通人想都不敢想?
错了!我用自己开发机上的 8 张 H20 显卡,花了点时间,从零开始训了个 7B 的大模型,全过程都给你扒得明明白白,没有那么多黑话,用做饭的例子给你讲清楚,看完你就知道,原来训大模型,普通人也能玩!
原来训大模型,就像开一家小餐馆!
很多人一听 “从零训大模型” 就头大,觉得全是看不懂的技术,其实拆解开来,跟你开个小餐馆做饭一模一样:
挑选食材:语料收集—— 你要先找新鲜优质的食材,也就是训练用的文本数据,食材不好,再厉害的厨师也做不出好吃的菜
切菜:Tokenizer 处理—— 把大的食材切成小块,方便下锅,也就是把长文本切成模型能看懂的小 token
炒菜:预训练—— 把切好的菜放进锅里炒,让模型从海量数据里学会语言的规律,这一步是最花时间的
调味:指令微调 SFT—— 菜炒得差不多了,加点盐、酱油调个味,让模型学会听你的指令,你问它问题它能好好回答
试菜对齐:强化学习—— 喊朋友来试菜,根据反馈再调整味道,让模型的回答更符合人的喜好
上菜:部署上线—— 菜做好了,端给客人吃,也就是把模型部署到线上,给别人用
是不是一下子就懂了?原来这么复杂的大模型训练,拆解开就是这么日常的步骤!
7 年时间,Transformer 到底改了多少?
我们现在训大模型,用的基础架构还是 2017 年那篇《Attention Is All You Need》里的 Transformer,就像手机的基础还是智能手机,但 7 年时间,我们给它加了无数的升级,从老款的 “基础款”,变成了现在的 “顶配版”:
原来的老 Transformer,就像最早的 iPhone8,能用,但很多地方不够顺手:
位置编码只能支持 512 的长度,就像手机只能存 500 个联系人,多了就存不下
注意力机制是全头独立的,推理的时候占很多空间,就像手机后台开几个应用就卡
激活函数用的 ReLU,就像手机的处理器,功耗高,性能还一般
现在的现代 LLM,就像最新的 iPhone16,加了一堆升级:
RoPE 旋转位置编码:原来的地址只能写 512 字,现在能无损扩展到 128K 甚至 1M,长文档随便处理
GQA 分组查询注意力:把 KV 缓存压缩了 4-8 倍,解码速度直接提了 30%,就像手机的后台机制优化了,开再多应用也不卡
MoE 混合专家:原来一个厨师要做所有菜,现在变成了一堆厨师,每个厨师只做自己擅长的,同样的火力,能做更多菜,模型容量直接拉满
SwiGLU 激活函数:换了个更好的 “处理器”,性能提了一大截,功耗还降了
RMSNorm 归一化:把洗菜的步骤简化了,计算量少了 30%,炒菜更快了
这些升级加起来,才有了我们现在能用的又快又强的大模型,这次我训的 7B 模型,用的就是这些最新的升级,跟 LLaMA、Qwen 这些主流模型是一样的架构!
第一步:找对 “食材”,比什么都重要
很多人一开始就盯着显卡,觉得卡越多越好,其实不对,训模型最核心的,是 “食材”—— 也就是语料。
食材不好,你用再贵的锅,再厉害的厨师,也做不出好吃的菜。我这次用的语料,是魔塔上公开的高质量预训练语料,一共 400 多万行,还有 11 万条的指令微调数据,都是清洗过的高质量数据,没有乱七八糟的垃圾内容。
食材找好了,接下来就是切菜 —— 训练 Tokenizer。
你总不能把一整颗白菜直接丢锅里炒吧?得切成小块,模型才能处理。Tokenizer 就是干这个的,把文本切成一个个小的 token,就像把菜切成小块,方便下锅。
现在主流的切菜方法是 Byte-level BPE,这个方法好在哪?不管你是中文、英文、还是 emoji,它都能切,不会有切不了的菜(也就是不会有 UNK 未知字符),这也是为什么现在的大模型能支持这么多语言,还能处理各种奇怪的字符。
我自己训了一个专属的 Tokenizer,词表大小 64000,专门适配我用的语料,比用通用的 Tokenizer 切得更顺手,就像自己家的刀,用惯了切菜更快。
选对 “锅”,训练效率直接翻几倍
食材切好了,接下来要选锅,不同的锅,适合做不同的菜,训模型的框架也是一样:
Megatron-LM:大锅:这个锅特别大,支持各种并行策略,百亿、千亿级别的大模型都能炒,吞吐量高,训练稳,就是用起来有点复杂,适合大规模预训练
DeepSpeed:中锅:这个锅大小刚好,易用性很好,社区也活跃,最适合做 SFT 微调,也就是我们炒菜之后的调味步骤
FSDP:小锅:PyTorch 原生的,用起来特别简单,适合小模型自己玩,中小规模的训练足够用
我这次要训 7B 的预训练模型,所以选了 Megatron 这个大锅,它能把 8 张卡的性能拉满,训练起来又快又稳,不会炒到一半糊了。
8 卡机训 7B 模型,全过程实录
食材、刀、锅都准备好了,终于可以开炒了!
第一步,先把食材预处理一下,把我们的 json 语料,转换成 Megatron 能认的二进制格式,就像把切好的菜,装成锅能直接用的配菜,不用再额外处理了。
然后就是调火候,这一步很重要,火大了菜会糊,火小了菜炒不熟:
学习率:就是火力,我设的 3e-4,峰值火力,然后慢慢降下来,最后到 3e-5
Batch size:就是一次炒多少菜,全局的 batch 是 256,每个卡一次炒 1 个,慢慢加
训练步数:一共炒 10 万步,把所有的食材都炒一遍
然后启动训练,8 张 H20 卡一起干活,这个时候我就只要盯着监控就好了,就像厨师盯着锅里的火候,看看 loss 有没有在降,GPU 利用率够不够,别炒着炒着火灭了,或者火太大把菜炒糊了。
等预训练炒完了,就该调味了 —— 也就是 SFT 指令微调。
这个时候的模型,其实已经学会语言的规律了,但是它不会听话,你问它问题,它可能瞎扯,就像菜炒好了,没放盐,没味道。
SFT 就是给菜加调料,用 11 万条指令数据,再训一遍,让模型学会,你问它问题,它要怎么回答,这一步就快多了,2 个 epoch 就搞定了,调完味,模型就变成能跟你聊天的助手了!
最后把模型转成 HuggingFace 能认的格式,就能直接加载用了,测试了一下,效果跟预期的一样,能生成文本,能回答问题,完全能用!
写在最后,原来现在训大模型,真的没有我们想的那么难了。
不用大厂的几万张卡,不用几个亿的投入,普通人有 8 张显卡,有点时间,就能从零训一个 7B 的大模型,你甚至可以训一个专属的模型,比如专门处理你工作的文档,或者写你喜欢的小说,完全定制化。
AI 的门槛,正在以我们想象不到的速度降低,原来只有大厂能玩的东西,现在普通人也能自己动手玩了。
你有没有想过自己训一个专属的小模型?你想拿它来做什么?是整理你的工作笔记,还是写专属的小说?评论区聊聊你的想法呀!
