Advertisement

常见的大模型微调各种参数都是什么意思,有什么用

阅读量:

前言

毫无疑问,在初次接触大模型的过程中

本文旨在将之前踩过的坑以及各参数的作用清晰呈现给读者。 通过具象化的展示形式, 作者希望能够为初学者或经过一定时间学习者提供参考, 并在此过程中积累经验, 不断改进和完善工作方法, 希望能够得到各位同仁的认可与指导

1、训练与推理的概念

在学习大模型的过程中可能会遇到预训练、微调以及推理等技术:而这些技术在网上也能找到相关的资料或教程。如果实在理解不够可以向GPT等平台咨询(智谱等工具也可以作为参考),因此我打算在这里简要介绍一下这些基本概念。

预训练(pretrain) 实际上是指模型一次性将各类信息输入其中的过程;这种技术基于无标注数据进行学习,并参考Firefly_github提供的预训练数据集

复制代码
 {"text": "布偶猫一般在7个月大会开始发情,但是第一次发情并不能代表已经发育成熟,并且也是不可以配种的;因为布偶猫比一般的猫成年更晚,因此身体发育成熟得也会更晚,如果想要给布偶猫进行配种繁育的话,应在雌猫2岁以后,雄猫应达到2岁半以后为宜。否则过早给布偶猫配种会影响胎儿质量,甚至导致早产、难产、存活率低等等。\n1.绝育如果不想给猫繁育的主人,可以等待猫咪发情期结束后带猫咪去进行绝育手术,发情主要是由于猫体内的激素分泌上升导致,要想彻底稳定激素分泌只能通过绝育手术的方式,摘除雄猫的睾丸来让激素保持在一个稳定的状态,还可延长猫咪的寿命,并且还能有效预防患前列腺疾病。绝育手术注意不能再发情期内进行,易导致大出血而发生意外。2.转移注意力以用零食、小鱼干吸引猫咪注意,然后多撸猫帮助它梳理毛发,按摩缓解身体不适。有些猫咪平时食用猫薄荷有镇定效果的,可以给猫咪喂食猫薄荷缓解,但是平时没有效果的就不要喂了,避免适得其反,造成猫咪更加兴奋。3.热垫缓解给猫窝做好保暖措施,增加一条毛毯、能自动加热的热垫,因为温暖的环境会让猫咪感到放松,能有效缓解猫咪的焦躁情绪,让它镇静下来。\n"}

    
 {"text": "本学期校内奖学金即日起接受同学的申请,欲申请者请于3/15(二)前上网点选,其中申请清寒类奖助学金者,别忘了检附清寒证明及户籍誊本等相关资料,缴交至台北生辅组或桃园校区学务组,俾利汇整办理。 近年奖学金申请件数不断提升,在僧多粥少的竞争下,多数人只能望梅兴叹!建议成绩表现不错的同学不妨挑选有学系限制的奖项,如蔡雁舲(限法律)、程修璜(限统资)、黄健铭(限资工)、杨济远(限传院)等,以提升获奖几率。此外,本学期新增“校外赁居生奖学金”,曾参与赁居生服务,且能提供具体证明的同学,不妨一试。学务处表示,除了校内各项奖学金外,校外也有不少奖助学金可供申请,同学不妨多注意布告栏的相关资讯。"}

微调优化(finetuning) 是一种基于预训练模型的具体化改进方法。其旨在使模型能够针对具体应用场景或领域方向进行针对性调整。该过程利用标注数据进行微调训练,并通过有限规模的微调训练过程来提高情感智能水平。例如在提升情感智能方面。

复制代码
 {"human": "我为什么什么都做不好?\n来到岗位三个月了,每一次工作都紧张、慌乱,生怕做错了,忘记了什么重要的事,然而每次都会有这样那样的状况发生,我不想每天焦虑的工作,为什么什么都做不好!",

    
  
    
 "assistant": "其实不是做不好。\n事实上做不好,是因为把过多的精力放在担惊受怕上了,幻想充斥了你的头脑,就没有心思关注真正在手上的工作。\n人一旦不能活在当下,就会忽视掉身边的细节,而这些细节往往决定了事情的走向和结果。\n所以说,世界上很少有偶然的事情,所谓偶然只是我们还没有发现它的规律。\n你需要学习把注意力集中在当下,每天的正念练习也许有用。认真的呼吸20分钟吧,感受一下当下发生的事情。\n"}

**推理(Inference)**其实并不复杂,在本质上就是通过与预训练模型或经过微调优化后的模型进行交互来完成任务。专业的表述方式则是将经过训练的模型应用于解决现实中的具体问题,例如:

类似预训练这类需要从零开始搭建计算图谱和数据仓库并进行实际操作来完成4至5B规模以下的小规模模型优化工作尚属可行方案。假如目标转向10+亿参数规模的大规模语言模型建设,在现有计算资源限制下很难实现这类复杂任务,则建议优先考虑微调现有基础语言模型或进行大规模推理服务作为替代方案。关于大语言模型所需计算资源较多的原因,请参阅下文第二部分中对显存需求的具体说明。

2、显存

针对显存问题而言,在线上有众多详实的参考资料可供参考,在编写过程中均采用了专业的表述方式以确保信息的准确性和完整性,在实际应用中我们采用了部分优质资源

详细讲解大模型内存占用情况(仅考虑单卡)

本文主要探讨了大型AI模型所需显存资源的详细计算方法,并深入分析了不同GPU型号在实际应用中的选用标准与优化策略。

公式、推导及实例分析_机器学习模型消耗哪些显存资源?

1 byte = 8 bits

1 KB = 1,024 bytes

1 MB = 1,024 KB

1 GB = 1,024 MB

1、推理显存

在模型推理中,一般显存占用只包含参数量

以 7B-BF16 为例,需要显存 = 数量 * 类型大小 = 70亿 * 2字节 = 140亿字节

2、训练显存

在模型训练中,显存占用主要分为以下几部分:

  1. 模型的参数设置(Model's parameter configuration)
  2. 正向传播与反向传播过程中的活化值(Activations during forward and backward propagation)
  3. 梯度计算结果(Gradients computed)
  4. 优化器的状态信息(Optimizer's state information)

通常情况下,在进行全参数微调时所需的显存内存是与同规模LLM推理相比约三至四倍的空间需求。为了具体说明这一关系,在假设以四倍的空间需求作为基准时,则可分解为以下几点:模型参数存储空间为当前水平的一倍(即单倍),梯度存储空间同样是单倍量级;而优化器所需的内存则会达到两倍量级。对于采用BF16格式且参数规模达7B级别的模型进行全参数微调操作时,请参考以下所需显存估算结果:

由于前向与反向激活所占用的显存通常少于单个模型参数的数量,在采用7B-BF16精度训练策略的情况下,全参量微调所需内存规模预计会超出56GB这一基准线,并达到约60GB左右

LoRA微调是一种技术途径,在此过程中为原始模型提供推理能力并训练一个更小规模的参数化子网络以模仿其功能。对于7B-BF16参数规模的模型来说,在进行LoRA微调时需要考虑显存占用的具体计算方式

首先按照需求,在初始化阶段按照要求加载模型参数。这些参数包括原始权重以及侧向加载辅助模型。根据参数显存计算结果,
原始权重加上侧向加载辅助模型
总计约为13GB

其次,在优化器部分无需对原始模型进行备份存储操作, 因为该优化器仅会对需要更新的模型权重进行计算与调整. 基于LoRA机制设计的模型权重规模较小, 在这种情况下优化器所需的显存资源量基本可以忽略不计, 并且其占用空间接近于0GB

在训练过程中,在实际操作中发现由于不需要对原始模型进行梯度计算操作的原因

从整体上看,在不考虑激活值的情况下,LoRA微调的显存占用仅需13GB。对于七百万参数级的LoRA微调训练而言,在内存使用方面大致需要14GB

这表明对于一个规模为70B的模型而言,在进行LoRA微调或推理时需要140GB显存;通常情况下可以通过量化方法来优化资源使用;当缺乏足够的硬件资源时可能会出现错误。

3、微调超参数设置

1、epoch

在大模型微调过程中 epoch 代表整个训练数据集被用于训练模型的总次数。每个 epoch 表示模型已经遍历并处理了所有训练样本一次。 epoch 的数量对微调的效果起着关键作用,并直接影响模型的学习效率。

  • 过多:可能导致过拟合问题,并且这种情况下模型在训练集上的表现良好,在未见过的数据上则表现不佳。
  • 过少:可能导致缺乏足够的参数来学习数据中的模式,并且这种情况下会导致模型欠拟合的问题。
    即模型在训练集和测试集上的性能均不理想。

看下deepseek-7b-llm-chat微调使用不同epoch之后的效果:

微调的目标是使回答更具人性化,在进行微调时可以参考我在知乎的文章DeepSeek-llm-7B-Chat微调教程(使用SwanLab可视化工具)中提供的详细指导,在开始之前,请先观察预训练模型的表现。

复制代码
    input_text = "我为什么什么都做不好?\n来到岗位三个月了,每一次工作都紧张、慌乱,生怕做错了,忘记了什么重要的事,然而每次都会有这样那样的状况发生,我不想每天焦虑的工作,为什么什么都做不好!"

个人感受是预训练模型在某些方面确实表现出色且效率较高。然而在人性化程度上还有待提升。具体表现见表2

结果表明大模型致力于朝着人性化方向发展。然而,在一段话中使用了很多重复的词语显得有些不够理想。当epoch=2时,其表现如下:

这样就感觉好多了,然后看下如果问题换了,效果如何:

复制代码
    input_text = "别人一说话就会不自觉地瞪过去,影响了人际,怎么办?\n别人一说话就会不自觉地瞪过去,把别人吓一跳,大家现在一说话就避开我,看见我就烦,"

epoch=1的时候可以看下效果:

看起来呈现出明显的低效状态;未能正确解答问题;此外还有许多令人困惑的话语;

多训练的一次,看样子有很明显的提高。

通过这些结果可以看出增加epoch能够显著提升模型的效果。但这个数值又不宜过高,因为如果epoch过大,例如超过10或5,则可能导致过拟合现象出现,从而导致该模型在训练集中表现出色,但在未曾见过的新数据上则难以良好地泛化到新数据中去。通常情况下,当数据量充足时(例如epoch控制在3左右),则能够达到最佳微调效果。

2、batch_size

在大模型微调过程中,batch_size参数指的是模型每次迭代训练时所接收的训练样本数量。例如per_device_train_batch_size=4 ,这表明系统决定了在训练过程中每个设备(如GPU)处理4个样本作为一个批次进行计算。这意味着每次迭代期间,各个设备将按照预设的数量集中接收并完成一次数据处理任务以支持微调过程的有效运行

它对模型训练的稳定性、速度和最终性能具有广泛影响。在模型 training 过程中合理选择合适的 batch_size 是一个关键考量,在这过程中合理选择合适Batch_Size直接影响着 model training 的 convergence speed 和 training quality.

  • 规模较大:能够有效降低参数更新频率,在一定程度上可提升训练效率;但这种做法也可能导致模型陷入狭长且陡峭的局部极小区域,并降低其一般化能力;此外还可能造成内存占用过高问题。
  • 规模较小:能提供更多关于参数变化的方向信息,并有助于帮助模型逃离局部极小区域;但这可能会减缓整个训练进程的速度,并增加每轮迭代所需的计算负担;此外还可能引入额外的噪声干扰。

受限于硬件资源有限,在设置per_device_train_batch_size为8时会出现实验停止的情况;而将该参数扩大至16,则会导致运行过程中立即出现性能问题。为了验证不同配置的效果差异性,建议对1和4两种情况下的结果进行详细观察。

首先考察设置per_device_train_batch_size为1的情况。实验中发现该设置导致训练所需的时间相对较长,并观察到实验结果似乎存在某种不寻常之处。进一步分析表明该配置下的模型泛化能力略显不足。

复制代码
    input_text = "我为什么什么都做不好?\n来到岗位三个月了,每一次工作都紧张、慌乱,生怕做错了,忘记了什么重要的事,然而每次都会有这样那样的状况发生,我不想每天焦虑的工作,为什么什么都做不好!"

在关注per_device_train_batch_size设置为4的情况下,在计算时间方面出现了显著降低,在运行效率上有所提升,并且实验结果尚有可圈可点之处

当我将per_device_train_batch_size设为8时,在训练过程中通常会遇到GPU内存占用问题;而当将batch_size增加到16时,则会更早地遇到同样的问题。因此如果您具备相应的硬件条件和经验积累,则可以尝试使用更大的batch_size来观察其影响。

3、learning_rate

学习率是深度学习中用于调控模型参数更新步长的关键性超参数,在大语言模型微调的过程中起着决定性的作用。它通过设定特定的数值来调控模型参数在每次迭代过程中的调整幅度,在训练过程中起到平衡速度与稳定性的双重作用,并确保整个优化过程能够有效地收敛至最优解位置

  • 过大:模型在训练过程中很可能超越最佳解决方案,在最佳值附近发生振荡甚至发散。
  • 过小:模型的收敛速度通常非常缓慢,并可能导致难以达到全局最佳状态。

通常建议保留至小数点后四位至五位。一旦超过这个范围可能会导致问题出现。举个例子来说吧,假如数值较大时我们可以将其设定为5e-3如设定为0.005时这样做的好处是可以更好地控制数值精度。

大多数损失值通常不会超过一个个位整数或小数值;然而,在学习率设置过高时(当学习率设置过高时),模型可能会跳过最优解(随后会持续发散);直至趋于无穷大时(此时损失值难以计算),导致模型无法收敛)。

观察到梯度值持续上升,在中间区域出现了断裂现象。这表明参数更新步长过大,在模型训练过程中逐渐偏离正常轨道并趋于不稳定状态。最终会导致梯度发生爆炸

然后保存下来的模型推理效果如下:

显示为一片随机字符,在调整学习率时应避免设置过高学习率值;即使只保留至小数点后第三位也已足够高。

如果learning_rate过小,比如1e-6大小的learning_rate,效果如下:

通过分析训练过程中损失函数(Loss)与梯度(Grad)的变化曲线可以看出,在损失较高的区域模型呈现出频繁震荡的现象。这表明模型参数更新时的学习率较低,不仅收敛速度较慢,并且可能陷入局部极小值而非全局最优解。

然后可以看看保存下来的模型推理效果(左侧预训练,右侧是微调后的):

根据实验结果观察到的结果与预训练模型基本一致,在当前模型架构下难以通过进一步微调显著提升性能表现。尽管增加迭代次数也不一定会显著改善结果。因此我认为继续调参可能意义不大。建议在模型设计阶段就合理设置初始学习率以提高整体训练效率。

4、lora参数

大模型微调

本次实验使用了lora,所以就说下lora的内容:

这个经典的图示展示了在微调过程中固定使用的权重矩阵为W,并通过反向传播算法进行参数更新。假设原始矩阵具有1024×1024的规模,在LORA=8的情况下,直接训练需要占用1MB的参数量;而采用LORA微调策略时,则只需要1024×8+8×1024= MB的参数量。这种优化方法有效降低了计算资源与存储需求。

lora_rank

该参数用于衡量低秩分解中的矩阵秩大小,并直接影响微调过程中的权重更新效率与表示能力。具体而言,在降低计算资源消耗的同时实现了参数的有效优化;其次,在保持模型性能的基础上提升了其适应能力。

  • 过大:虽然会提升模型的表达能力,并能更准确地拟合训练数据集;然而这也会导致计算复杂度上升,并且可能导致过拟合现象的发生。同时对显存资源需求较高。
  • 过小:虽然能够有效降低计算负担并缩短训练所需时间;但这种简化可能会削弱模型在处理新任务时的表现能力,并导致较低的适用性。

这里当我设置128的时候显存就爆了,所以按照64和16来对比下,看下效果,

当lora_rank=16的时候,

当lora_rank=64的时候,

当lora_rank不断上升时,观察到的结果显著有所改善。如果有关于该参数设置方面的疑问,则建议参考数百次实验后的见解知乎文章。通过查阅上述数据来确定合适的LoRA参数设置会是一个合理的选择。

lora_alpha

lora_alpha是一个缩放因子,在前向传播中调节LoRA权重与预训练权重的结合效果。它主要用于平衡原始模型的知识库与任务特定的适应性,在低秩矩阵应用中通常配合lora_rank参数使用。该参数通过scales= lora_alpha/lora_rank来计算缩放因子值,其中scales用于评估低秩矩阵增量的影响程度。

  • 较大程度地使用LoRA机制时会加强其作用。
    • 它可能导致原始模型受到显著负面影响。
      • 这种负面影响可能导致其原有性能受损。
      • 甚至可能引发过拟合现象。
    • 较小规模的微调可能不会带来显著的效果。
      • 这可能导致模型应对新任务的能力受限。
      • 从而降低其适应性。

在进行具体实验时,我们发现当lora_alpha取值为32、64或128时均能获得较好的实验效果;其中64相较于32具有更好的提升效果;此外,在设置较大参数时需要注意防止模型过拟合现象;为了避免微调阶段效果被过度稀释,则不宜选择过小的参数值

lora_dropout

loRA_dropout是一种用于微调过程中的正则化方法,在这一过程中它有助于降低模型对训练数据集的高度依赖性。该技术通过以一定概率随机地从网络中移除部分神经元(即被暂时断开连接),从而防止模型出现过拟合现象。其主要作用是增强模型在未见数据上的泛化能力,并通过这种方式减少对特定训练样本的过度依赖程度。

  • 超出:会导致模型在训练过程中面临信息量过高的挑战,并进而导致模型出现欠拟合的问题。
    • 规模小:容易引发过拟合现象,在数据样本不足或模型架构较为复杂的情况下。

5、gradient_accumulation_steps

gradient\_accumulation\_steps被称为梯度累计步数,在深度学习中其机制允许模型在内存受限时通过将多个小批量数据的梯度进行累加,并随后一次性更新模型参数。这种方法的主要目的就是在硬件资源受限的情况下(如GPU显存不足),能够实现类似更大批量数据处理的效果,并提升训练效率。

  • 规模较大:可能会对训练过程中的计算和优化步骤产生不利影响,在提高效率方面存在明显瓶颈。
  • 规模较小:可能导致硬件资源未能得到充分释放,在提升模型性能方面存在局限性。

6、fp16

表示在训练过程中将采用16位浮点数来进行计算,并且这属于混合精度训练的一种形式。与传统的32位浮点数(FP32)相比,在这种情况下16位浮点数(FP16)能够有效减少占用内存和带宽资源,并且这种特性使其特别适用于大模型的微调过程。

FP16的优势主要体现在以下几个方面:

优化显存占用:利用FP16技术进行模型参数及梯度的存储能够将显存占用降低一半。
提升运算效率:现代GPU(如NVIDIA A100)在执行FP16计算时提供了硬件级别的性能优化,在相同运算资源下可显著提升模型训练速度。
减少带宽消耗:FP16格式减少了数据传输量,在分布式训练场景中可显著提高数据传输效率。
在性能与精度之间寻求平衡:通过混合精度训练策略,在降低计算成本的同时能够维持较高的模型精度。

参考文章:

GitHub repo/owner yangjianxin1, FireFly's data folder under data folder, pre-training JSONL file in the data folder is available at GitHub repo/owner yangjianxin1 as of the master branch.

https://github.com/SmartFlowAI/EmoLLM/blob/main/datasets/single_turn_dataset_1.json

详细解析大模型显存占用的计算方法与优化策略(仅限单卡场景)

大模型实战篇

详细探讨大模型内存占用规模:包含公式推导与实例剖析的部分。 本文旨在解析哪些因素会导致模型占用显卡内存,并结合数学公式进行具体说明。 在这一过程中,默认使用深度学习框架如TensorFlow或PyTorch进行计算,并假设显卡拥有足够的GPU内存资源支持训练任务的开展。 通过分析不同阶段的内存消耗特性以及优化策略建议,在实验部分展示了如何有效降低模型运行所需的显存空间需求。

https://zhuanlan.zhihu.com/p/9812641926

大模型微调

大规模预训练模型微调

大规模预训练模型微调

全部评论 (0)

还没有任何评论哟~