Llama-factory详细基础使用说明

最近很多小伙伴在使用llama-factory时遇到了不少问题,特别是基础不太好的童鞋,对各种参数或者webui界面的内容不理解,总是一会一个问题,网上大部分的教程,都只是教到能跑起来就行,对于细的调整没有做介绍,这里详细整理了一下界面中的内容和命令行参数的解读,分享出来,这样大家再遇到不懂的,对照着使用就可以了 。

一、什么是llama-factory

对于初入算法的童鞋来说,有的可能还不知道llama-factory是什么,只知道大模型用到了这个框架,这是不行的。

LLaMA-Factory 是一个低代码的大规模语言模型(LLM)训练框架,它主要面向研究人员和开发者,旨在简化大型语言模型的微调、评估和部署过程。

白话说就是集合了当下LLM领域各种好用的开源或者自研的框架以及工具,进行封装以及优化,简化使用方法,方便大家对大模型进行微调和评估部署等工作,降低了使用难度。

包括推理框架vllm等(具体可以看官网哈,下面有地址)

二、llama-factory安装

这部分其实网上有很多教程,github上也有详细说明,具体的不再赘述,给出地址大家点进去看。(如果大家有需要,可以留言或私信,我再进行补充)

llama-factory的github地址:GitHub - hiyouga/LLaMA-Factory: Efficiently Fine-Tune 100+ LLMs in WebUI (ACL 2024)

llama-factory的中文readme地址:LLaMA-Factory/README_zh.md at main · hiyouga/LLaMA-Factory · GitHub

三、webui界面详细说明

我使用的设备是aurodl上租的RTX 3090,只安装,做展示不进行任何加载操作的话,选择无卡开机就可以。

llama-factory的webui部分界面如下:

下面进行分模块的解读。

1.语言

语言模块中,默认提供了四种语言。英文不方便的童鞋,直接选择zh就行。

  • en:英语
  • ru:俄语
  • zh:中文
  • ko:韩语

2.模型名称和模型路径

点击模型名称,会自动弹出可选择的模型,同时模型路径会显示出对应的hugging face上的模型标识符(就是默认的模型文件夹路径地址),就行这样:meta-llama/Llama-3.2-3B

这里要注意下,很多小伙伴是已经把模型下载到本地后使用,那就要把模型路径部分自动弹出的地址改成本地模型文件实际的地址,建议使用绝对地址,稳妥。注意,文件夹下要有config.json才对。

如果本地没有下载模型,模型路径不做修改,后面直接进行模型加载,系统在本地检索不到对应文件夹以及模型,会自动从hugging face进行下载。这里注意,需要科学上网才能下载成功。如果想设置镜像站的小伙伴,可以自己修改下载的配置文件进行修改。个人习惯是把模型下载到本地,然后使用,因为可能会涉及多模型轮换使用,会有一个专门的文件夹存放模型。

这里要注意仔细核查自己的路径对不对,因为如果路径写错了,模型读取不到本地下载好的模型,还是会尝试从hugging face进行下载的,如果一直开着科学上网,就比较浪费资源了。

3.微调方法和检查点路径

微调方法中提供了三个选择

  • full:全量微调,就是所有权重都进行训练。
  • freeze:冻结微调,只训练部分层,其它层的权重进行冻结,也就是不进行训练。
  • lora:目前众多微调方法中,最常用,也是相对来说效果比较好的微调方法之一。个人比较偏爱的微调方法,优点很多,比如需要的计算资源少,计算效率高,不改变原始模型结构等等。详细的小伙伴们可以查阅相关资料,实在不理解可以私聊我。

检查点路径在长时间训练大模型的时候会经常用,主要作用是把训练过程中的阶段性结果进行保存,这里是设置指定的保存地址的。这样如果训练过程意外中断,可以从检查点开始继续训练,不用从头再开始训练。

3.高级设置

这里需要点下高级设置最右边的小三角才会展开,默认在界面中是折叠的。

  • 量化等级

这部分图像化界面默认是8位和4位两种量化,这里主要提一下什么是量化,以及为什么要量化,还有量化类型。

量化是指将神经网络中的权重和激活值从高精度(如32位浮点数)转换为低精度(如8位整数或更低)的过程。这一技术的主要目的是减少模型的内存占用和计算需求,从而加速推理过程并降低硬件成本,尤其是在边缘设备上部署模型时尤为重要。

量化类型:

  1. 动态量化:仅对激活值进行量化,而权重保持全精度。这通常用于RNN等需要保存状态的模型。
  2. 静态量化:同时对权重和激活值进行量化,并且是在训练后进行的。它包括校准步骤以确定量化的参数。
  3. 量化感知训练(QAT):在训练过程中模拟量化效应,使得最终的量化模型性能接近未量化版本。
  • 量化方法

量化方法中,提供了三种量化选项。三种量化方式建议对比使用。

bitsandbytes:BitsAndBytes是一种8位优化的实现方式(8位优化是一种将深度学习模型中的权重和激活值从传统的32位浮点数(float32)转换为8位整数(int8)的技术,它通过高效的量化算法将模型参数和中间计算结果转换为8位表示,以达到压缩和加速的目的。 与其他量化方法相比,BitsAndBytes提供了更好的性能和更低的精度损失。 BitsAndBytes的核心在于它的量化和反量化策略。

hqq:Half-Quadratic Quantization (HQQ) 是一个快速且精确的模型量化工具,它不需要校准数据即可量化大型模型。HQQ 的核心优势在于其速度和兼容性,支持 8、4、3、2、1 位量化,并且可以应用于任何模型(如大型语言模型和视觉模型)。HQQ 的反量化步骤是线性操作,这意味着它与各种优化的 CUDA/Triton 内核兼容。此外,HQQ 还支持 peft 训练,并尝试使其完全兼容 torch compile,以实现更快的推理和训练。(转载地址:Half-Quadratic Quantization (HQQ) 开源项目教程-CSDN博客)

eetq:EETQ(Easy & Efficient Quantization for Transformers) 是为Transformer量身打造的高效量化神器,旨在在保证精度的同时提升计算效率和降低资源消耗。通过引入全新特性gemv算子,EETQ显著提升了模型的运行速度,是对现有量化方法的一次重大革新。EETQ是一种不依赖数据的量化方案,可直接用于任意模型。

  • 提示词模板

这部分我没用过,有尝试过的小伙伴可以进行分享

  • RoPE插值方法

这里主要说明一下什么是RoPE。编码方式实际上是一种扩大大模型上下文长度的方法。

旋转位置编码(Rotary Position Embedding, RoPE)是一种在自然语言处理任务中用于Transformer模型的位置编码方法。它被提出用来改善传统位置编码的局限性,特别是当涉及到序列长度变化时的问题。RoPE通过使用复数空间中的旋转操作来编码位置信息,使得模型能够更好地理解和处理相对位置信息。

传统的绝对位置编码,如在原始Transformer论文中提出的正弦波位置编码,可能会导致模型难以泛化到训练时未见过的不同长度的序列。RoPE通过引入一种基于复数表示的方法来克服这一问题,这种表示可以捕捉到输入序列元素之间的相对距离,并且这些距离在不同长度的序列之间是可转移的。

具体来说,RoPE将每个位置编码为一个复数向量,其中向量的每个分量都是以特定频率进行旋转的角度。这种设计允许模型学习到与位置无关的特征,因为旋转角度只依赖于两个元素之间的相对偏移,而不是它们的具体位置。这有助于提高模型对于不同长度输入的鲁棒性和泛化能力。

如果不是太理解,请记住这句话:绝对位置编码为每个位置分配一个唯一的向量,虽然简单但不能很好地扩展并且无法有效捕获相对位置;相对位置编码关注标记之间的距离,增强模型对标记关系的理解,但使模型架构复杂化。(来源:大语言模型中常用的旋转位置编码RoPE详解:为什么它比绝对或相对位置编码更好?-阿里云开发者社区 (aliyun.com)

至于两个选项,就很好理解了,线性的和动态的。

  • 加速方式

这部分主要是用来选择推理加速的方式。

auto:自动选择最佳的加速方式。

flashattn2:全称是FlashAttention,2是指第二代,FlashAttention的主要作用是全面降低显存读写,旨在减少计算复杂度并加快推理速度。

unsloth:开源的加速微调项目,地址:github.comicon-default.png?t=O83Ahttps://github.com/unslothai/unsloth

liger_kernel:也是加速训练的项目,地址:github.comicon-default.png?t=O83Ahttps://github.com/linkedin/Liger-Kernel

4.Train

这部分内容比较多,一部分内容会进行省略,如果不懂的可以艾特我哈。

整个绿框部分就是train模块包括的内容。

主框架未折叠部分

  • 训练阶段

训练阶段包括了六种训练方式。

  1. Supervised Fine-Tuning: 监督微调是一种迁移学习技术,首先在一个预训练模型上进行无标签的数据集训练,然后在这个预训练模型的基础上,用带标签的新数据进行进一步的训练,以适应新的任务需求。

  2. Reward Modeling: 奖励建模是强化学习的一部分,目标是预测环境对代理行动的奖励信号。通过预测奖励,模型可以更好地理解哪些动作会导致更好的结果。

  3. PPO: PPO(Proximal Policy Optimization)是一种强化学习算法,它通过限制新旧策略之间的差异来优化策略梯度。这种方法可以保证每次迭代更新后的策略不会偏离太多,从而稳定地提升性能。

  4. DPO: DPO(Decoupled Policy Optimization)是一种强化学习算法,它将策略优化和价值估计解耦开来,分别进行独立的更新。这种方式可以避免策略和价值函数之间的相互影响,从而提高学习效率。

  5. KTO: KTO(Knowledge Transfer for Optimal Learning)是一种知识转移方法,它试图从源任务中学到的知识转移到目标任务中,以加速学习过程并提高最终性能。

  6. Pre-Training: 预训练是一种先在大规模无标签数据集上训练模型的技术,然后再将其用于特定任务的微调。预训练可以帮助模型捕获通用的语义信息,从而提高下游任务的表现。

这些训练方式可能适用于不同的应用场景,用户可以根据自己的需求选择最适合的训练方式。

  • 数据路径

这里默认是llama-factory中的data文件夹中的数据,在使用自己的数据集的时候,可以把数据集文件直接放到data文件夹下。注意,无论是否放到data文件夹下,记得在dataset_info.json中添加你要用的数据集信息,包括名称和路径,否则在页面中是加载不出来的。

  • 数据集

在上面设置好后,正常这里是可以加载出可选的数据集列表的,选择自己要用的数据集,在预览数据集部分,是可以看到数据集的内容的。如果没有正确加载,请查看路径和json配置文件是否设置正确。

  • 学习率

这个不做介绍,如果不知道学习率是什么的童鞋,就要认真学习基础了。

  • 训练轮数

epoch设置项

  • 最大梯度范数

最大梯度范数(Maximum Gradient Norm)是在深度学习中用来衡量模型参数更新过程中梯度大小的一种指标。它通常用于优化算法中,以控制梯度的规模,防止在训练过程中出现梯度爆炸的问题。

当我们在训练神经网络时,通过反向传播算法计算损失函数关于模型参数的梯度,并根据这些梯度来更新参数。梯度提供了损失函数如何随着参数变化而变化的信息,因此它指示了参数应该调整的方向和幅度。

梯度范数是指梯度向量的长度或大小,可以使用不同的范数来衡量,最常用的是L2范数,即欧几里得距离。如果梯度范数非常大,这意味着梯度指向的方向上的斜率非常陡峭,可能导致参数更新过大,从而造成数值不稳定或无法收敛到最优解。这种情况通常被称为梯度爆炸。

为了应对这个问题,可以在梯度下降或其他优化算法中实施梯度裁剪(Gradient Clipping)。梯度裁剪是一种技术,它限制了梯度的最大值,确保梯度不会超过一个预设的阈值。具体来说,如果梯度范数超过了这个阈值,就将梯度按比例缩小,使得新的梯度范数等于设定的阈值。这样做有助于保持训练过程中的稳定性。

  • 最大样本数

顾名思义,不多做介绍。

  • 计算类型

  1. Bfloat16 (bf16): Bfloat16 是由 Google 设计的一种介于 float16 和 float32 之间的数据格式,主要用于深度学习训练。它具有比 float16 更大的动态范围,同时保留了较低的内存占用和计算成本。Bfloat16 的有效位数较少,因此精度低于 float32,但在某些情况下仍能提供足够的准确性。

  2. Float16 (fp16): Float16 是 IEEE 标准中的半精度浮点数格式,它只有 16 位,相比 float32 或 float64 能够显著降低存储和计算的需求。尽管如此,float16 的精度较低,可能导致数值稳定性问题,尤其是在深度学习训练中。

  3. Float32 (fp32): Float32 是最常见的单精度浮点数格式,遵循 IEEE 754 标准。它拥有更高的精度和更大的动态范围,适合大多数科学计算和深度学习任务。然而,相比于 bfloat16 和 float16,float32 占用更多的内存和计算资源。

  4. pure_bf16:指在深度学习模型训练过程中完全使用 bfloat16 (bf16) 精度进行计算的一种设置。这意味着不仅仅是某些部分(如权重更新、梯度计算等)使用 bf16,而是整个训练过程中的所有操作,包括前向传播、反向传播、参数存储和更新等,都使用 bfloat16 格式。

  • 截断长度

指输入的token超过多少后就进行截断,默认是1024,这里可以根据自己的模型能接受的长度具体进行设置。

  • 批处理大小

就像图中写的,每个GPU处理的样本的大小,具体得看GPU的性能,数量越多,要求性能越高。

  • 梯度累积

梯度累积是一种优化算法,在这种算法中,模型的权重在多个批次上进行更新,而不是在一个批次上进行更新。这样可以提高训练速度,并且减少内存使用。

在深度学习中,每次迭代时,模型会计算损失函数相对于每个参数的梯度。然后,这些梯度将用于更新模型的权重。梯度累积的工作原理是将这些梯度存储起来,直到达到指定的数量或时间后才对模型的权重进行一次大的更新。

这种方法特别适用于大型模型,因为它们需要大量的内存来存储梯度。通过累积梯度,我们可以减少所需的内存,并加快训练过程的速度。

这里默认是8步做一次累积。

  • 验证集比例

在全量数据集中按比例抽出一部分数据作为验证集。默认是0

  • 学习率调节器

学习率调节器用于调整优化器的学习率,以改善模型的收敛性和性能。

  1. linear(线性):学习率随时间线性衰减。
  2. cosine(余弦):学习率按照余弦曲线衰减,周期性地改变学习率可以帮助跳出局部最优解。
  3. cosine_with_restarts(周期重启):与cosine类似,但在每个周期结束后重新开始,即学习率从最大值开始再次衰减。
  4. polynomial(多项式):学习率按多项式方式衰减,通常指数为2表示二次衰减。
  5. constant(常数):学习率保持不变。
  6. constant_with_warmup(带有预热阶段的常数):先逐渐增加学习率,然后再保持恒定,有助于模型更快地收敛。
  7. inverse_sqrt(反平方根):学习率随着训练步数的增加而减小,同时除以批次大小的平方根,这在处理图像数据时效果较好。
  8. reduce_lr_on_plateau(根据指标降低学习率):当验证集上的指标不再改进时,动态降低学习率。
  9. cosine_with_min_lr(带有最小学习率的余弦):类似于cosine,但是设置了一个最小学习率阈值,防止学习率过低导致无法继续优化。
  10. warmup_stable_decay(稳定衰减预热):先逐渐增加学习率,再按照稳定的速率衰减到一个较低的水平,有助于模型快速收敛并获得更好的性能。

其它参数设置

  • 日志间隔

设定每隔多少步输出一次日志。

  • 保存间隔

用于定期保存模型以防止意外丢失训练成果。

  • 预热步数

在训练过程中,学习率逐步增加到初始设定值之前的步数。

  • NEFTune噪声参数

嵌入向量所添加的噪声大小,用于正则化和提升模型泛化能力。

  • 优化器

图中列出的三种优化器都是基于Adam优化器的变体,主要用于深度学习模型的训练。

  1. adamw_torch:这是AdamW的实现,全称Adaptive Moments with Weight Decay。它结合了Adam优化器和L2正则化项(weight decay)。Adam是一种自适应学习率的方法,能够分别估计一阶矩和二阶矩的估计值,并利用这些信息调整学习率。Weight decay则有助于防止模型过拟合,通过使权重系数衰减至较小的值。AdamW将这两个概念结合起来,使得模型在训练过程中更加稳定,通常能取得较好的结果。
  2. adafactor:这是一种轻量级的优化器,旨在提供与Adam相似的性能,但占用更少的内存。Adafactor基于Factorized Second-Moment Estimation,它将二阶矩分解成两个较小的矩阵来节省内存。相比于Adam,adafactor更适合于大规模分布式训练场景,因为它可以在有限的内存资源下运行。
  3. adamw_8bit:采用了量化技术来减少内存消耗和加速计算。在这种方法中,某些数值(例如学习率、动量等)会被转换为8位整数表示,而不是浮点数。这样的量化操作可以显著减少内存使用,同时由于8位运算比32位浮点数运算更快,因此还能提高计算速度。

  1. 序列打包:序列打包是将长度相近的句子组合在一起形成一个长序列,以便在同一个GPU上并行处理。这有助于提高训练效率,尤其是在处理大量短序列时。
  2. 学习提示词:在某些模型中,提示词(prompting)是一种技巧,用于引导模型产生期望的输出。学习提示词是指让模型自动学习有效的提示词,以提高生成文本的质量。
  3. 更改词表大小:词表大小决定了模型所能识别的词汇数量。更改词表大小可以根据任务需求调整模型的复杂度和表达能力。
  4. 使用LongLongRA提出的shift short attention:这可能是一种特殊的注意力机制,用于处理长短文本混合的情况。shift short attention可能有助于提高模型在处理长文本时的性能。
  5. 使用S^2 Attention:S^2 Attention可能是一种新的注意力机制,用于改进模型的注意力分配策略,提高模型的性能和效率。
  6. 使用块LLaMA Pro:块LLaMA Pro可能是一种特殊的注意力机制或优化策略,用于提高模型的训练效率或性能。具体细节未知,但通常这类技术会针对特定的模型架构进行优化。
  7. 仅训练扩展后的参数:这意味着在训练过程中,只更新模型新增加的部分,而保留原始模型的参数不变。这通常用于微调预训练模型以适应特定任务。
  8. 启用外部记录面板:启用外部记录面板可能指的是在训练过程中收集和可视化各种指标,如损失函数、准确率等。这对于监控模型的训练状态和调试非常有用。

部分参数微调设置

  1. 可训层数(Trainable Layers): 这个滑块控制了模型中可以进行训练的层数。在微调过程中,你可以选择只对模型的部分层级进行训练,而不是全部。这可能是因为你想保留预训练模型的一些知识,或者因为你的数据集较小,全量训练可能导致过拟合。例如,在计算机视觉任务中,如果你有一个基于卷积神经网络(CNN)的预训练模型,如VGG或ResNet,你可能会选择仅微调最后几层,而保持早期的特征提取层固定,以利用它们在通用图像理解方面的强大能力。

  2. 可训模块(Trainable Modules): 在这个文本框中,你可以指定要训练的具体模块名称。如果输入"all",则表示所有模块都将被训练。否则,你需要提供一个逗号分隔的列表来指明哪些模块需要训练。这在一些复杂的模型结构中非常有用,比如Transformer模型,其中包含多个不同的组件,如自注意力层、多头注意力层等。通过选择特定的模块进行训练,你可以更好地控制模型的学习过程,避免过度训练某些部分并提高效率。

  3. 额外模块(非必需域)(Additional Modules (optional)): 这个字段允许你添加除隐藏层之外的其他可训练模块。这些可能是模型中的特殊组件,如嵌入层、池化层或其他特定于任务的层。如果你想要微调的模块不是默认的隐藏层,那么在这里列出它们可以帮助你精确地控制哪些部分应该被更新。

LoRA参数设置

LoRA是一种大模型微调方法,目前比较主流的,不了解的需要重点学习下这部分了。

  1. LoRA秩(LoRA rank): LoRA秩决定了LoRA矩阵的大小,即LoRA矩阵的行数和列数。较大的LoRA秩意味着更大的适应空间,但也增加了计算负担。这个值越高,LoRA矩阵的维度就越大,能够捕捉到的模式也就越多,但是也会导致更高的计算和存储成本。

  2. LoRA收缩系数(LoRA expansion factor): LoRA收缩系数是指LoRA矩阵相对于原权重矩阵的扩展程度。较高的收缩系数会导致更大的LoRA矩阵,理论上能捕获更多的模式,但同样会增加计算和存储成本。

  3. LoRA随机丢弃(LoRA dropout): 这是一个概率值,用于在训练过程中随机丢弃LoRA矩阵的一部分元素。类似于Dropout技术,它可以用来防止过拟合,增加模型的鲁棒性。将此值设为0表示不应用随机丢弃。

  4. LoRA+学习率比例(LoRA+ learning rate multiplier): LoRA+是一种改进的LoRA方法,它在LoRA矩阵上使用单独的学习率。这个参数定义了LoRA+中B矩阵的学习率倍数,即B矩阵的学习率是基础学习率的多少倍。适当调整这个值有助于找到合适的优化速度。

  5. 对LoRA层使用稳态压缩方法(Use rsloRA): 使用rsLoRA(Stable LoRA)是一种稳定LoRA的方法,旨在解决LoRA在训练过程中可能出现的数值稳定性问题。启用该选项可以确保LoRA矩阵的正定性,从而提高训练的稳定性。

  6. 使用权重分解的LoRA(Use DoRA): DoRA(Decomposed LoRA)是一种LoRA的变体,它将LoRA矩阵分解成两个较小的矩阵相乘的形式,降低了计算复杂度。

  7. 使用PiSSA方法(Use PiSSA): PiSSA(Piecewise Square-root Scaling for Adapters)是一种优化方法,用于改善LoRA的性能。它通过分段平方根缩放来调整LoRA矩阵,以实现更好的收敛性和泛化能力。

  8. LoRA作用模块(LoRA modules): 这里可以指定LoRA应用于哪些模块。如果输入"all",则表示LoRA将在所有模块上应用。否则,你需要提供一个逗号分隔的列表来指明哪些模块需要应用LoRA。这让你可以选择性地在模型的不同部分应用LoRA,以达到最佳效果。

  9. 附加模块(Additional modules): 这个字段允许你添加除LoRA层以外的其他可训练模块。这些可能是模型中的特殊组件,如嵌入层、池化层或其他特定于任务的层。如果你想要微调的模块不是LoRA层,那么在这里列出它们可以帮助你精确地控制哪些部分应该被更新。

RLHF参数设置

RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习)是一种机器学习技术,它结合了监督学习和强化学习,通过人类反馈来指导模型的行为。在这个界面中,提供了几个与RLHF相关的参数设置,下面是对各个参数的功能解释:

  1. Beta参数(Beta parameter): Beta参数是在损失函数中使用的超参数,用于平衡不同类型的损失项。在RLHF训练中,通常会有多种损失项,包括原始的任务损失和来自人类反馈的损失。这个值调节了这些损失之间的权衡关系,高值会使得人类反馈的损失更加重要。

  2. Ftx gamma参数(Ftx gamma parameter): Ftx gamma参数是SFT损失的权重,SFT代表Self-Training with eXtreme teaching signals(极端教学信号自我训练)。这是一个强化学习中的概念,用于衡量模型预测和教师标签之间的差异。这个值影响了SFT损失在总损失中的相对重要性。

  3. 损失类型(Loss type): 损失类型决定如何计算模型的训练误差。sigmoid交叉熵损失通常用于二分类问题,softmax交叉熵适用于多分类问题,huber损失适合处理离散和连续数据,l1和l2损失则是常见的回归损失函数。选择适当的损失类型有助于优化模型的性能。

  4. 奖励模型(Reward model): PPO(Proximal Policy Optimization,近端策略优化)是一种强化学习算法,用于训练智能体的策略。奖励模型路径是PPO训练中使用的奖励模型的路径,它负责评估智能体行为的好坏。这个模型通常是经过训练的,用于给出环境中的动作的奖励分数。

  5. 白化奖励(Whitened rewards): 白化奖励是指在PPO训练中将奖励分数做归一化处理。这样做的目的是使奖励分布更加均匀,有利于PPO算法的收敛。归一化的奖励可以使学习过程更加稳定,避免由于奖励尺度过大或过小导致的学习困难。

GaLore参数设置

  1. 使用 Galore: 这是一个开关按钮,用于开启或关闭Galor投影。Galor投影是一种低秩投影技术,用于减少模型参数的数量,从而降低计算复杂度和内存消耗。开启后,模型会在训练过程中使用低秩投影进行优化。

  2. Galor 秩: Galor秩决定了投影矩阵的大小,即投影矩阵的行数和列数。较高的秩意味着更大的适应空间,但也增加了计算负担。这个值越高,Galor矩阵的维度就越大,能够捕捉到的模式也就越多,但是也会导致更高的计算和存储成本。

  3. 更新间隔: 更新间隔指的是相邻两次投影更新之间的步数。较大的间隔意味着较少的投影更新次数,较小的间隔意味着更多的投影更新次数。这个值可以根据具体的训练情况来调整,以获得最佳的训练效率和精度。

  4. Galor 缩放系数: Galor缩放系数是指投影矩阵的缩放因子。这个值影响了投影矩阵在优化过程中的影响力。较高的缩放系数会使投影矩阵对模型的影响更大,较低的缩放系数则会让模型更多依赖于原始参数。

  5. Galor 作用模块: Galor作用模块是指Galor投影应用到的模型组件。这里可以指定投影应用于哪些模块。如果输入“all”,则表示Galor投影将在所有模块上应用。否则,你可以提供一个逗号分隔的列表来指明哪些模块需要应用Galor投影。

BAdam参数设置

  1. 使用 BAdam: 也是开关。BAdam是一种自适应动量优化方法,结合了Adam和Blockwise Adam的优点,旨在解决深度神经网络训练中的梯度消失和爆炸问题。

  2. BAdam 模式: BAdam模式可以选择layer-wise或ratio-wise两种方式。Layer-wise BAdam优化器按层更新参数,而ratio-wise BAdam优化器按照比例更新参数。Layer-wise方式通常适用于大型模型,因为它可以更好地控制每层的更新速度,而ratio-wise方式可能更适合小型模型或者需要快速收敛的情况。

  3. 切换策略: 切换策略定义了Layer-wise BAdam优化器的块切割策略。这里有四个切换策略:
    Ascending: Ascending策略表示随着训练的进行,逐步增加块的大小。这通常用于帮助模型从局部最小值逃脱,避免过早收敛。在训练开始时,小块更容易找到梯度,而在后期阶段,大块允许模型探索更大的搜索空间。
    Descending: Descending策略表示随着训练的进行,逐步减小块的大小。这可能有助于稳定训练并防止模型过度拟合。在训练初期,大块可以加速收敛,而在后期阶段,小块可以提高精确度。
    Random: Random策略随机选择块的大小。这种方法可以在训练过程中引入一些随机性,有助于防止模型陷入局部最优解。然而,过多的随机性也可能导致训练不稳定。
    Fixed: Fixed策略保持块的大小不变。这是一种简单的策略,易于实现且容易理解,但它可能无法充分利用不同训练阶段的优势。

  4. 切换频率: 切换频率决定了Layer-wise BAdam优化器在多少次迭代后改变块的大小。较高的切换频率意味着更快地改变块的大小,较低的切换频率则意味着更慢地改变块的大小。这个值应该根据模型的规模和训练数据的特征来调整。

  5. Block 更新比例: Ratio-wise BAdam优化器的更新比例决定了每次更新时更新的比例。较高的更新比例意味着更多的参数会被更新,较低的更新比例则意味着更少的参数会被更新。这个值应该根据模型的规模和训练数据的特征来调整。

补充说明

这部分差点忘了,补充说明下,这就是大部分内容都配置完后,要进行训练时候的选项。这里提一下多卡训练,如果有多张卡的话,可以配置上。

DeepSpeed Offload重点说下,这是一项功能,它可以帮助优化内存使用和提高训练性能。当启用时,它会将部分计算从GPU转移到CPU,释放GPU内存以容纳更大的模型或更大的批次大小。虽然这样做可能会稍微降低训练速度,但它可以使训练过程在内存受限的环境中成为可能。

Evaluate & Predict

这部分比较好理解,不多做解释,就是做验证和预测时候使用,默认数据集在data文件夹下,用自己的数据集,记得换路径。

chat

这部分相当于在线使用大模型进行测试,实验下模型加载是否成功以及对话效果。

每次设置完模型地址,不确定是否正确,就可以先加载下模型试试。

推理引擎里面提供了两种,huggingface和vllm,下面会详细介绍下,后面数据推理类型就是设置精度的,和前面介绍的精度理解一样。

Hugging Face 推理引擎

特点:

  • 广泛的模型支持:Hugging Face 提供了一个非常全面的模型库,支持多种架构,包括但不限于 BERT、GPT-2/3、T5 等。
  • 易于使用:通过 Transformers 库,用户可以很容易地加载预训练模型并进行推理,无需深入了解底层实现。
  • 灵活的API:提供了丰富的API来处理各种NLP任务,如文本分类、命名实体识别、问答等。
  • 社区活跃:拥有庞大的开发者社区,不断更新新的模型和功能,并且有大量的文档和示例代码。

适用场景:

  • 适合需要快速原型开发和实验的研究者和开发者。
  • 对于想要利用现成模型库和工具来构建应用的人非常适合。
  • 支持从轻量级到大规模的各种模型。

vLLM (Vectorized Language Model Library)

特点:

  • 高性能推理:vLLM 是专门为大语言模型的高效推理而设计的,它通过向量化操作和其他优化技术来加速推理过程。
  • 低延迟:通过批处理和缓存机制,vLLM 能够显著减少单个请求的处理时间。
  • GPU/CPU 利用率高:针对硬件进行了深度优化,特别是在多GPU环境下,能够充分利用计算资源。
  • 动态批处理:支持动态调整批处理大小以适应不同的工作负载,从而保持较高的吞吐量。
  • 内存效率:采用了一些内存管理策略,如激活检查点(activation checkpointing),以减少内存占用。

适用场景:

  • 非常适合在生产环境中部署大规模的语言模型,尤其是在对延迟和吞吐量有严格要求的情况下。
  • 当你需要最大化硬件利用率,特别是当运行多个模型实例或处理大量并发请求时。
  • 对于那些已经准备好投入更多精力来优化推理性能的高级用户。

区别总结

  • 易用性 vs. 性能:Hugging Face 更注重易用性和广泛的模型支持,而 vLLM 则更专注于性能优化。
  • 灵活性 vs. 专门化:Hugging Face 提供了更多的灵活性和多功能性,适用于多种NLP任务;vLLM 则是一个更加专业化的库,专为大语言模型的高效推理而设计。
  • 开发阶段 vs. 生产环境:Hugging Face 适合快速原型开发和研究用途,而 vLLM 更适合用于生产环境中的高性能服务部署。

Export

Export模块是用于导出训练好的模型以便在其他地方使用或分享:

  1. 最大分块大小(GB): 这个滑块用于设置导出文件的最大大小。这对于上传到某些平台(如Hugging Face Hub)有限制的文件大小很有用。你可以调整此值以确保导出的文件不会超过所选的最大大小。

  2. 导出量化等级: 这里可以选择是否要对模型进行量化。选择 "none" 表示不进行量化,而选择其他选项可能会导致模型尺寸减小,但在某些情况下可能会影响准确率。

  3. 导出量化数据集: 如果选择了量化级别,你可以在这里选择用于量化评估的数据集。这通常是训练或验证数据的一个子集,用于评估和微调量化后的模型性能。

  4. 导出设备类型: 这个下拉菜单让你选择模型将被导出到什么类型的设备上。CPU选项表示模型将被优化以在CPU上运行,而auto选项让系统自动决定最适合的设备类型。这取决于你的目标环境和可用硬件。

  5. 不使用safetensors格式保存模型: 这个复选框用于选择是否使用safetensors格式保存模型。safetensors是一种安全的张量格式,可以保护模型免受恶意攻击。取消勾选该选项表示将使用标准格式保存模型。

  6. 导出目录: 在这里,你可以指定一个路径来保存导出的模型文件。这是模型及其相关文件将被保存的位置。

  7. HF Hub ID: 如果你想将模型上传到Hugging Face Hub,你可以在此处输入仓库ID。这是一个可选字段,如果你不想上传模型,则可以留空。

四、总结

以上就是我对llama-factory的整理内容,希望能对大家的学习之路锦上添花,整理不易,感觉还可以的话,记得动动你发财的小手,给予支持。

这里特别说明下,实际使用中,一般不会设置这么多内容,大部分内容默认就可以,一般是训练遇到瓶颈了,才会做一些细节的调整。

如果大家在实际使用过程中遇到问题,欢迎留言或私聊咨询,一起学习进步。

如果有整理错误的地方,也可以留言,我会及时更正。

如果有想深入了解,进行学习或者需要辅导帮助,包括知识点梳理,答疑,就业辅导,面试辅导,简历辅导等等,都可以过来扫码添加过来交流,备注:CSDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

excel单、双字节字符转换函数(中英文输入法符号转换)

在Excel中通常使用函数WIDECHAR和ASC来实现单、双字节字符之间的转换。其中 WIDECHAR函数将所有的字符转换为双字节,ASC函数将所有的字符转换为单字节 首先来解释一下单双字节的含义。单字节一般对应英文输入法的输入,如英文字母,英文输入法…

VS Code 如何搭建CC++开发环境

VS Code 如何搭建C/C开发环境 文章目录 VS Code 如何搭建C/C开发环境1. VS Code是什么2. VS Code的下载和安装2.1 下载和安装2.2 环境的介绍 3. VS Code配置C/C开发环境3.1 下载和配置MinGW-w64编译器套件3.2 安装C/C插件3.3 重启VS Code 4. 在VS Code上编写C语言代码并编译成功…

间隙波导阵列天线 学习笔记2 使用加载脊U型辐射层的一种Ka波段高效率圆极化卫星天线的发展

摘要: 本文提出了一种低剖面,高增益背腔槽阵列天线,基于RGW技术,工作在Ka频段。天线阵列包含两层。上层是一个U型槽阵列,在金属脊上腔体的位置上方,同时下层是RGW公共分布网络,给每个背腔槽等辐…

【软考-架构】1.1、计算机硬件-CPU校验码

GitHub地址:https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 计算机硬件组成 中央处理单元 运算器 算术逻辑单元ALU(实现对数据的算术和逻辑运算);累加寄存器AC(运算结果或源操作数的存放区);数…

【Spring】Spring AOP原理

目录 前言 代理模式 静态代理 优缺点 动态代理 JDK动态代理 工作原理 JDK动态原理实现关键步骤 CGLib动态代理 CGLIB动态代理实现关键步骤 总结 前言 在上一篇中,我们讲解了什么是AOP,以及Spring AOP是如何使用的,那么本篇我们就…

SpringBoot五:JSR303校验

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 松散绑定 意思是比如在yaml中写的是last-name,这个和lastName意思是一样的,-后的字母默认是大写的 JSR303校验 就是可以在字段增加…

uniapp 系统学习,从入门到实战(六)—— 样式与布局

全篇大概 4700 字(含代码),建议阅读时间 30min 📚 目录 Flex 布局在 UniApp 中的应用响应式设计与适配多端使用 SCSS 提升样式开发效率实战案例演示总结 1. Flex 布局在 UniApp 中的应用 1.1 基础布局实现 通过 display: flex 快速构建弹性容器&#…

Redis---缓存穿透,雪崩,击穿

文章目录 缓存穿透什么是缓存穿透?缓存穿透情况的处理流程是怎样的?缓存穿透的解决办法缓存无效 key布隆过滤器 缓存雪崩什么是缓存雪崩?缓存雪崩的解决办法 缓存击穿什么是缓存击穿?缓存击穿的解决办法 区别对比 在如今的开发中&…

从UNIX到Linux:操作系统进化史与开源革命

从UNIX到Linux:操作系统进化史与开源革命 一、操作系统:数字世界的基石 1.1 什么是操作系统? 操作系统(OS)是计算机系统的核心管理者,承担着三大核心使命: 硬件指挥官:直接管理C…

【Python 语法】算法合集

查找二分查找代码大 O 表示法 广度优先搜索代码 狄克斯特拉算法 递归递归调用栈 分而治之(divide and conquer,D&C)贪心教室调度问题背包问题集合覆盖问题 动态规划背包问题旅游行程最优化 遇到问题时, 如果不确定该如何 高效…

IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程

背景:最近DeepSeek比较火嘛,然后在githup上也看到了GitHub Copilot,就想着现在AI的准确率已经可以提高工作效率了。所以从网上找了一些编程插件,发现Proxy支持的模型比较多,通用性和适配性比较好。所以本文记录一下pro…

基于javaweb的SSM+Maven幼儿园管理系统设计和实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

Java-Lambda表达式详解

引言:为什么需要 Lambda 表达式? 在 Java 8 之前,处理需要传递代码块的场景(如事件监听、线程任务)通常依赖匿名内部类。这种方式代码冗余,可读性差。例如: // 传统匿名内部类实现 Runnable n…

springboot之集成Elasticsearch

目录 二、Elasticsearch 是什么?三、Elasticsearch 安装四、Springboot 集成 Elasticsearch 的方式五、创建项目集成 Elasticsearch 2.创建 Spring Initializr 项目 es (3).新建实体类 User(4).新建 dao 接口类 UserR…

HBuilderx 插件开发变量名称翻译 ,中文转(小驼峰,大驼峰,下划线,常量,CSS类名)

HBuilderx 插件开发变量名称翻译 ,中文转(小驼峰,大驼峰,下划线,常量,CSS类名) 插件开发文档 工具HBuilderx ,创建项目 创建成功后目录 插件需求 开发时 用来将中文转为&#xff0…

C# 数据转换

1. 文本框读取byte,ushort格式数据 byte addr; if (byte.TryParse(textBoxAddr.Text, out addr) true) {}2. 字节数组 (byte[]) 转换为 ASCII 字符串 byte[] bytes { 72, 101, 108, 108, 111 }; // "Hello" 的 ASCII 码 string s0 Encoding.ASCII.Ge…

unity学习60: 滑动条 和 滚动条 滚动区域

目录 1 滚动条 scrollbar 1.1 创建滚动条 1.2 scrollbar的子物体 1.3 scrollbar的属性 2 滚动视图 scroll View 2.1 创建1个scroll View 2.1.1 实际类比,网页就是一个 scroll view吧 2.2 子物体构成 2.3 核心component : Scroll Rect 3 可视区域 view p…

如何通过 LlamaIndex 将数据导入 Elasticsearch

作者:来自 Elastic Andre Luiz 逐步介绍如何使用 RAG 和 LlamaIndex 提取数据并进行搜索。 在本文中,我们将使用 LlamaIndex 来索引数据,从而实现一个常见问题搜索引擎。 Elasticsearch 将作为我们的向量数据库,实现向量搜索&am…

从黑暗到光明:FPC让盲人辅助眼镜成为视障者的生活明灯!【新立电子】

在科技日新月异的今天,智能技术正以前所未有的方式改变着我们的生活。对于视障人士而言,科技的进步更是为他们打开了一扇通往更加独立自主生活的大门。其中,盲人辅助智能眼镜可以成为视障人士日常生活中的得力助手。FPC在AR眼镜中的应用&…

【MySQL】数据类型与表约束

目录 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 字符串类型 日期和时间类型 enum和set 表的约束 空属性 默认值 列描述 zerofill 主键 自增长 唯一键 外键 数据类型分类 数值类型 tinyint类型 MySQL中,整形可以是有符号和无符号的&…