自己的习惯是慢慢的来,加上现实的忙碌,许多内容还有待整理。作为python基础比较薄弱的深度学习爱好者,许多事物、方法都处在探索中,如有错误纰漏,还望批评指正。
大语言模型包括哪些状态?
刚开始接触这个领域时,这个问题困扰我许久,什么是部署?什么是微调?什么是预训练?什么是训练?以及这些环节对计算机算力的要求,都让我感到困惑。当前的理解是:
1.训练与预训练:
一个大模型从无到有,首先需要经过训练,也就是从无到有地使用transformer的encoder块搭建一个足够深、足够宽的模型(但是也存在decoder-encoder结构的T5、chatGLM;存在在encoder-only基础上融合稀疏attention层和MoE的GPT4;以及存在基于mamba、rwkv等新结构的模型),然后基于大量随机掩码的自然语言语句,通过tokenzier进行分词,然后再训练出与token映射的词表,得到最开始的embedding层,并以生成掩码内容为起点开始最初的训练。
预训练似乎是在一个具备一定语义理解能力的模型基础上,根据下游任务、所选用的数据集、训练方式进行进一步训练,比如引入蒸馏、引入强化学习等方法。在此基础上的模型似乎就具备了在一些任务或数据集中获得不错成绩的能力,可以进一步发布到hugging face等网站供更多人使用。
这个阶段的模型训练也是最昂贵的,除了需要传递并训练全量参数之外,也需要传入相当庞大的数据集,或许显存压力来自于此?看起来这个阶段阶段的模型需要相当规模的GPU集群。
2.微调:
这个阶段似乎是为了一些更加精细的垂类任务,融入特定的能力、特定的知识或者服务于特定的场景。由于已经有了训练的基础,所以可以使用相对小一些的数据集,以相对较少的方式改动模型,LORA似乎就是一种最早来自于大语言模型的微调方式,融合了低秩矩阵分解之类的技术。
由于这个阶段采用了较少的数据、改动了较少的参数,看起来对显存的压力会相对小一些。
3.部署:
看起来部署指的就是“model.eval()”的过程,即不反向传播、不改变模型的参数,而是输入需要的文字,使用模型转化为token,再结合位置编码转化为embedding,通过层层计算输出一个新的embedding,再映射为token,借助词表还原为生成的内容,再将生成的内容与原始的输入一起传入模型,不断循环这个过程,直到生成,得到完整的输出内容。
这个阶段对显存的压力最小,但一个相当规模的模型所需的计算资源依然不容小觑,所以或许需要一些剪枝技术、一些量化压缩技术,进一步缩小模型的规模。