诚实地说, 最初的时候, 我也持有这样的看法, 搭建一个大型模型, 难道不就是去拉取一份开源代码然后运行一下吗?天真。终于到了真正动手的那一天, 终端窗口黑漆漆的, 光标在里头一闪一闪的, 我目不转睛地在那盯着, 然而硬是有半个小时的时间, 一个字母都没能打出来。并非是因为我不会, 实则是因为……根本就不知道该从哪里开始着手标点符号顿出。你真的需要一个“大”模型吗这是个大问题但很多人跳过了。圈子里存在一种现象, 这种现象尤为奇特, 仿佛模型参数倘若没有达到上百亿, 便会觉得不好意思同他人打招呼。然而, 你仔细去思索一番, 你手头所具备的那少量数据, 以及那有限的算力, 真的能够满足一个拥有1750亿参数的庞然大物吗? 总之, 我曾经进行过尝试, 在显存报错的状况下整整被困了三天, 最终发觉我所需要的或许仅仅是一个具备几十亿参数的小模型。不要为了“大”而大。这个道理极其质朴, 然而极其易于遗忘, 好似你分明仅仅打算煮一碗泡面, 然而却非要将饭店里那个三层高度且较庞大的蒸锅搬出来, 这不是自找麻烦, 何必如此?数据清洗比你想象的要恶心一万倍很多人以为搭建大模型最难的是算法。算法确实难但更折磨人的是数据。我曾清理过一份公开的数据集, 其规模大概是10GB左右。看上去给人的感觉是很干净没错吧? 然而实际上里面仅仅是重复的样本便足足有三千多条, 除此之外还有一堆乱码存在, 并且有标签错误的情况, 甚至还存在纯空行。光是对这些进行清洗, 我就耗费了整整四天时间, 每天在晚上对着屏幕的时候眼睛都是处于花的状态。更为让人崩溃的是, 有一批数据被清洗完毕后, 模型经训练得出的效果极为糟糕, 而后才发觉是我将标签弄反了在那一刻, 真的是好想砸电脑。针对数据清洗这事, 无人可帮你, 你需自行直面那些杂乱无章的原始数据, 看上一条条, 改上一条条, 此过程极为枯燥, 极为令人作呕, 但你务必得做。算力配置你的钱包准备好了吗别跟我提云服务商。不是讲他们不好, 而是那个价格, 怎么去表述呢, 我算过一笔账, 使用某家主流服务商的按需实例, 训练一个中等规模的模型, 也就是大概14亿参数那样的, 跑完所有迭代, 账单是令人吃惊的, 大概需要几千美金, 没错, 几千, 美金。之后我更换成了竞价实例, 价格有所下降, 然而问题再次出现——随时存在被中断的可能性。有一回训练持续了整整两天, 进度条行进到92%时, 突然, 实例被回收了。那种感受, 比失恋还要难受。要是你预算有限, 那可以思索几个办法: 去租用专门的GPU服务器啦这比云商能便宜那么一些, 要么找一个GPU共享平台, 再不然——老实地承认, 你当下暂时还玩不起规模大的, 先拿小模型来练练手。框架选择到底用哪个还是被我选中的是 , 并非鉴于不强 , 而是缘由于我心里明晰 , 自己极有可能会频繁地调试程序 , 改动代码 , 查看中间变量 , 在调试方面的友好程度着实是更高一点。然而这全然是属于个人的抉择, 我知晓一位前辈, 运用运用得极为出色, 人家同样取得了成果。重点在于——切莫在这个问题之上纠葛太长时间。挑选其一, 着手去做, 要比其他任何事情都更具优势。训练过程中的玄学时刻这个我必须讲。去训练大模型阶段的时候, 你将会遭遇到非常多难以说明白、难以讲清楚的状况。举例而言, loss它出现陡然飙升的情况, 紧接着又陡然下降再比如说, 同一代码, 更换不同的GPU去运行, 最终得到的结果却天差地别再有就是, 某一回训练呈现极其出色的效果, 可是你却彻头彻尾地不晓得其中缘由。最为离谱的一回, 我耗费了整整两个星期, 那模型却始终不收敛。我进行了各种各样的调参操作更换了优化器, 更改了网络结构, 然而全都毫无作用。结果呢, 有一天我无意间清理了一下缓存, 再次运行, 竟然就成功了。直至如今我依旧不晓得其中缘由。所以你得学会和这种不确定性和解。关于微调一个血的教训我以为预训练模型下载下来直接微调就能用。竟然是一个二分类的任务, 然而其准确率仅仅只有少得可怜的百分之五十一, 这跟随机去猜测几乎没什么差别, 完全就是差不多的情况。而后我才弄清楚, 微调并非单纯地“再次进行训练”, 而是得审慎考量任务适配, 学习率的设定, 哪些层要实施冻结, 哪些层要予以训练。我所犯下的错误乃是将所有层的学习率设置成相同的, 結果预训练所学到的特征全然被冲掉了。做法正确的情形是: 将前面的特征提取层其学习率设定得微小一些, 把后面新增的分类层其学习率设定得较大一些。具体的比例……不同的模型是各不相同的, 你能够起始于1:10着手去尝试。部署这是一个容易被忽略的环节模型训练好了你以为就完了天真乘以二。当我将头一个模型训练完成之后, 于本地展开测试, 所有情况均表现正常, 而且推理速度也还算可以。然而, 一旦把它放置到线上环境, 当用户数量稍有增长的时候, 响应时间一下子就飙升至十几秒钟。由于用户根本没法等待如此长的时间, 所以纷纷选择流失掉了。之后, 我对模型实施了量化操作, 精度由FP32降低至FP16, 推理速度提高了近乎一倍, 又增添了缓存机制, 相同的查询会直接返回缓存结果。存在着一个问题, 那便是模型版本管理, 在我起始之时, 不同版本的文件随意地放置于文件夹内, 然而有一回想要回退至某个版本, 怎么都找寻不到对应的权重文件, 现今我运用Git LFS进行管理, 为每个版本标记上标签, 记录下训练参数以及数据来源。说说那些开源项目刚入门的话, 能瞧瞧 Face上的库, 其里面封装着大量的预训练模型, 上手速度相对较快。存在一个名为的项目, 它是由微软推出的, 对于分布式训练有着良好的支持, 我进行过尝试, 在多卡的场景当中确实能够提高训练效率, 然而它配置起来略微有一些麻烦, 尤其是在你对分布式系统并不熟悉的情况下。再则, 若是你对模型压缩予以关注, 那可以留意一下LLM.int8(), 它属于一种量化方法, 能够将大模型的内存占用压低至很低的程度。然而需要留意的是, 量化之后的模型在某些任务方面有可能会出现精度损失的情况。写在最后诸多话语阐述了这么久, 实际上仅仅是想要传达一个要点如下, 即为通过相应方式构建大模型这样的行为, 不存在便捷的路径。碰到各式各样的问题, 有的问题哪怕翻找通篇文档寻觅答案也无果, 会熬夜, 会质疑自己, 会萌生打退堂鼓的念头, 然而, 当目睹模型首次生成颇具样子的成果之际, 那份成就感亦是无可取代的。此并非是一篇教程, 而是更类似于一个过来人所发出的碎碎念。期望你能够从我的经历当中, 减少一些弯路的行走。开始动手吧别光看。