从零开始做 AI 大模型:那些藏在代码背后的开发感悟

去年冬天,我和团队用三个月时间,基于 LLaMA 框架训出了一个 13B 参数的行业大模型。当模型第一次准确生成客户需要的设备维修方案时,办公室里炸开了锅 —— 那个曾占满 8 块 GPU 内存、让服务器连续轰鸣了 47 天的庞然大物,终于学会了 "说人话"。

这大半年来,总有人问我:"做大模型难吗?" 现在回想起来,难的不是调参代码,而是从 TB 级数据里捞出有用信息,在算力告警前找到训练捷径,以及让几十亿参数的模型乖乖跑进普通服务器的内存里。今天就用大白话聊聊大模型开发的全流程,那些藏在技术文档背后的坑与乐。

一、数据预处理:给模型喂对 "粮食"

刚开始做数据时,我们踩了个大笑话。第一批爬来的 200G 网页数据,没清洗就往训练库里塞,结果模型学了半个月,输出的内容全是 "点击关注"" 广告位招租 "—— 全是网页里的垃圾信息闹的。

后来才明白,大模型的 "智商" 全靠数据喂。这一步得像筛沙子似的耐心:

先用正则表达式把网页里的 HTML 标签扒干净,那些<div>``<div>的符号,就像菜里的沙子,必须挑出去。有次发现同事写的清洗函数漏了处理 JavaScript 代码,导致模型学会了输出function()这样的乱码。

去重时试过最笨的办法:给每段文本算个 MD5 值,相同的直接删掉。但遇到那些改了几个字的 "孪生文本" 就没辙了,后来用上 MinHash 算法,才把重复率从 30% 降到 5% 以下。

最费时间的是人工审核。我们雇了 10 个标注员,每人每天看 500 条文本,把那些带偏见、有错别字的内容标出来。有个标注员大姐说:"你们这活儿跟挑西瓜似的,得敲敲听听,才能知道甜不甜。"

处理多模态数据时更有意思。要给每张图片配文字描述,我们先让模型自动生成,再让人工修改。有张猫抓老鼠的图,模型竟写成 "狗追兔子",气得标注员当场画了张简笔画贴在显示器上。

二、搭架构:给模型造个 "大脑壳"

第一次见 Transformer 架构图时,我盯着那些交错的箭头看了半天,像在解迷宫。后来对着代码一行行啃,才明白这东西就像个复杂的 "联想机器"。

我们先从 7B 参数的小模型练手。把 Transformer 层搭起来那天,看着打印出来的模型结构,密密麻麻的nn.Linear层,像堆起来的乐高积木。试跑时发现,光是初始化权重就占了 28G 显存,吓得赶紧把模型拆成几块分到不同 GPU 上 —— 这就是所谓的 "模型并行"。

后来尝试 MoE 架构,给模型加了 8 个 "专家"。训练时发现,有些专家总被模型冷落(激活率不到 5%),就像班级里总不举手的学生。调了调门控网络的参数,才让专家们轮流 "发言"。有次半夜看训练日志,发现某个专家突然活跃起来,输出的文本质量明显提升,像突然开窍的学生,竟有点小感动。

最难忘的是调旋转位置编码。刚开始没弄明白公式里的cos和sin,导致模型记不住长文本。改对的那天,模型突然能输出 500 字的连贯故事,同事拍着桌子说:"就像给健忘症患者吃了特效药!"

三、训练:与算力赛跑的日子

训练时最怕的是服务器突然断电。有次机房跳闸,没保存的参数全丢了,团队里的小伙子蹲在地上捂着脸,半天说不出话 —— 那可是 3 天 3 夜的成果。

后来学乖了,每 4 小时存一次 checkpoint,就像写作文时按 Ctrl+S。但存一次要花 10 分钟,看着进度条慢悠悠爬,急得直转圈。

混合精度训练是个好东西。用 bfloat16 格式后,显存占用少了一半,训练速度快了三成。但也出过岔子:有次忘了开动态损失缩放,导致梯度爆炸,模型输出的文本全是乱码,像被按了乱码键的键盘。

调学习率时走了不少弯路。开始设得太大,模型像个调皮的孩子,输出忽对忽错;调小了又学得太慢,40 天了还在 "蹒跚学步"。后来用余弦退火策略,让学习率像潮水似的有涨有落,才找到平衡点。

最累的是盯训练。我们排了班,每人值 6 小时。后半夜盯着损失值曲线,困得直点头,突然发现曲线像坐过山车似的往上冲,赶紧叫醒同事调参数。有次损失值突然降到 0.8,全组人在凌晨三点欢呼,保安大叔以为我们在加班赶项目,特意送来热水。

四、压缩模型:给大象瘦个身

模型训好那天,导出的文件有 50G 大。试着往服务器上部署,加载时进度条走到 30% 就卡住了 —— 内存不够用。

这才想起要给模型 "减肥":

用 GPTQ 算法做 4 位量化时,手心直冒汗。压缩完试跑,发现模型把 "人工智能" 说成 "人工只能",心一下子沉了。调了调量化参数,反复试了 7 次,才把精度损失控制在可接受范围。

剪枝时像给树修枝桠。剪掉那些权重接近 0 的连接,模型体积小了 20%,推理速度快了不少。有次剪得太狠,把重要的注意力头给剪没了,模型突然不会做逻辑推理了,赶紧把剪下来的 "枝桠" 接回去。

知识蒸馏最像 "老师教学生"。让大模型当老师,小模型当学生,逼着小模型模仿大模型的输出。有次发现学生模型总学不会某个专业术语,才明白是老师模型自己也没掌握透,只好回头重新训练老师。

五、部署:让模型走出门

第一次给客户演示时出了洋相。网页端输入问题,等了半分钟才出结果,客户皱着眉说:"比我查手册还慢。"

后来才知道,部署不是简单把模型放上去就行。用 vLLM 重构推理服务那天,看着吞吐量从每秒 2 个请求涨到 50 个,像给模型装了个 "加速器"。加了 Redis 队列后,就算同时来 100 个请求,模型也能按顺序慢慢处理,不会手忙脚乱。

监控页面上的 GPU 利用率曲线最让人揪心。峰值时冲到 98%,像踩着油门的汽车,生怕下一秒就爆缸。有次发现曲线总在凌晨 3 点突然下降,查了半天才知道,是机房空调没调好,GPU 过热降频了。

现在模型跑在客户的服务器上,每天处理 thousands 个请求。上周去回访,看到车间里的师傅对着屏幕问模型:"轴承异响怎么办?" 模型秒回的方案竟和老师傅的经验一模一样,那一刻觉得,之前掉的头发都值了。

后记:大模型是个 "活物"

做模型久了,总觉得它像个有生命的东西。训练时会闹脾气(突然输出乱码),会进步(损失值稳步下降),甚至会 "生病"(过拟合时胡言乱语)。

有次加班到天亮,看着模型生成的一句 "早安,新的一天",突然觉得这堆参数组成的东西,竟有了点温度。或许未来的某一天,当我们回顾大模型的发展史,会记得那些在服务器机房里熬过的夜,那些改了又改的代码,和那些为了让机器更懂人类而付出的努力。

你们在开发时遇到过什么趣事?欢迎在评论区分享~

#大模型开发 #AI 日记 #机器学习 #技术随笔

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容