面试记录:你如何微调一个大模型?
前言
这个问题问得相当大。大模型的微调分为好几个阶段,每个阶段都有自己的任务。接下来就有的讲了。
BaseLine
首先,如果是拿到一个刚开发好的大模型,我们当然是首先确认好BaseLine。
如果你完全不明白,没事。我们回忆一下大模型怎么部署的。如果你彻底忘记了,看一下这篇文章,主要就是说,拿到参数之后,首先做的就是配置一大堆配置文件,然后用AutoTokenizer进行分词,然后用AutoModelForCausalLM进行加载。
那么其实问题就相对来说比较明确了。首先就是分词方案、分词器、词表等问题,都在配置文件中配好。
比如,我在确认当前大模型CM的时候,要求上下文是SentencePiece;其次,我们一般以因果语言建模作为训练目标,还有一些其他的任务目标可以额外配置,其他的任务有偏好优化与对齐等。
然后顺带确认一下上下文长度,这些可能影响到一些比较细节的配置,比如文本越长,PPL将会越低,但也可能在训练长度远小于推理长度而导致PPL抬头。
数据策划
完成BaseLine之后,就是数据策划了。这一步其实主要做的就是整理数据来源的组合与比例,然后做好去重和去泄露,过滤低质量的内容。
这个过程中,可以用信息熵、混合熵两个标准,如果熵值较低,则表示数据较单一。
除了熵值以外,还可以用参考LM测PPL值,若PPL高,则语料噪音过高;若PPL低,则语料重复内容较多,可能混入了较多的抄录与模板。
当然,考虑到部分场景还有JSON解析的需求,因此也有格式合法率指标。
预训练
准确的说,这一步就是一个warming up的过程。主要也是用AdamW练,顺带监控一下PPL,用Loss看看梯度的稳定性。
继续预训练
继续预训练,又称领域自适应,使用具体领域内的预料在训练一次。这个过程中主要也是看时间里的回答效果,监控一下召回率。
后训练
后训练就到了我们所熟知的SFT了。再就是用一些强化学习方法做好偏好优化。
评测
评测阶段需要观察MMLU(通识)、MT-Bench(多轮对话)、HumanEval(推理)、结构化合法率、安全等指标。
部署前优化
这个优化包含很多方面,包括量化(W8A8)、蒸馏(Dstill)、KVCache优化、vLLM或MindSpore优化,观察延迟、拒答、越狱等。
上线与持续学习
这些都做完了之后就需要上线了。上线之后,为了保证可持续性,一方面要持续收集用户给出的反馈内容,另一方面也需要冻结一部分权重,保证模型不会被用户所利用。