大模型加速微调和训练,不得不掌握的方法,代码解析和应用示例

大模型参数高效微调(PEFT)技术解析及微调加速实践 本文详细介绍了几种高效微调方法的原理解析和实验效果对比,并基于Unsloth做了一些微调加速的实践尝试。实验效果显示结合优秀的低参微调方法和微调加速,完全可以做到极为高效的微调大模型,可以在极低的资源占用上得到媲美全参微调的效果。读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用如果你是零基础小白,想快速入门大模型是可以考虑的。一方面是学习时间相对较短,学习内容更全面更集中。二方面是可以根据这些资料规划好学习计划和方向。 阅读详情

图片

通过本文可以了解:LoRA模型加速原理、peft包使用、Autocust自动混合精度、Accelerate和deepspeed加速、多GPU分布式训练等大模型加速训练和微调的方法和代码应用示例。

图片

近期大模型层出不穷,大家对于大模型的微调也在跃跃欲试,像斯坦福的Alpaca[1], 清华的ChatGLM[2],中文的Chinese-Vicuna[3],让我这样的普通玩家也能训练自己的微调模型。

在微调和推理的时候仍然需要加速,有哪些方法可以加速微调呢?

Part1LoRA

低秩矩阵分解 LoRA[4]原理:冻结预训练模型权重,并将可训练的秩分解矩阵注入到Transformer层的每个权重中,大大减少了下游任务的可训练参数数量。LoRA 开源代码[5]见文末。

原理图:图片

公式:图片

结合原理图和公式,我们可以很容易明白LoRA了:

左侧是预训练模型的权重,输入输出维度都是d,在训练期间被冻结,不接受梯度更新。

右侧,对A使用随机的高斯初始化,B在训练开始时为零,r是秩,会对△Wx做缩放 α/r。

HuggingFace的包peft[6]对LoRA做了封装支持,几步即可使用:

在这里插入图片描述

论文中提到了LoRA的诸多优点:图片

Part2Accelerate 和 deepspeed

Accelerate[7]库提供了简单的 API,使我们可以在任何类型的单节点或分布式节点(单CPU、单GPU、多GPU 和 TPU)上运行,也可以在有或没有混合精度(fp16)的情况下运行。

这里是我用 Accelerator 和 DeepSpeedPlugin 做个示例:

需要提前知道梯度累积步骤 gradient_accumulation_steps 和 梯度累积计算

在这里插入图片描述
在这里插入图片描述

Part3Autocast 自动混合精度

autocast是在GPU上训练时一种用于降低显存消耗的技术。原理是用更短的总位数来保存浮点数,能够有效将显存消耗降低,从而设置更大的batch来加速训练。但会造成精度的损失,导致收敛效果也会变差。

PyTorch的AMP有2种精度是torch.FloatTensor和torch.HalfTensor。

使用方法:

from torch.cuda.amp import autocast as autocast, GradScaler

dataloader = ...
model = model.cuda()
optimizer = ...
scheduler = ...
# scaler的大小在每次迭代中动态估计,为了尽可能减少梯度,scaler应该更大;
# 但太大,半精度浮点型又容易 变成inf或NaN.
# 动态估计原理就是在不出现if或NaN梯度的情况下,尽可能的增大scaler值。 
scaler = GradScaler()

for epoch in range(epochs):
    for batch_idx, (data, targets) in enumerate(train_dataloader):
        optimizer.zero_grad()        
        data = data.cuda(0)        
        with autocast(dtype=torch.bfloat16): # 自动混精度            
            logits = model(data)            
            loss = loss(logits, targets)       
        # 反向传播梯度放大        
        scaler.scale(loss).backward()        
        # 首先 把梯度值unscale回来, 优化器中的值也需要放缩        
        # 如果梯度值不是inf或NaN, 则调用optimizer.step()来更新权重,否则,忽略step调用,从而保证权重不更新。        
        scaler.step(optimizer)        
        # 看是否要增大scaler, 更新scaler        
        scaler.update()

Part4单机多GPU

如果条件允许的话,可以使用单机多卡和分布式训练。

那么:

  • 模型怎么同步参数与梯度?
  • 数据怎么划分到多个GPU中?

pytorch框架给我们封装了对应的接口函数:

在这里插入图片描述

PyTorch提供的torchrun命令以及一些API封装了多进程的实现。我们只要在普通的单进程程序前后加入:开头 setup()和 结尾 cleanup():
在这里插入图片描述

就能用多个进程来运行训练程序,每个进程分配一个GPU,我们可以用dist.get_rank()来查看当前进程的GPU号的。

在这里插入图片描述

1数据并行:

只要在生成Dataloader时,把DistributedSampler的实例传入sampler参数就行了,DistributedSampler会自动对数据采样,并放到不同的进程中。这里需要注意的是:sampler自动完成了打乱数据集的作用,所以在定义DataLoader时,不用再开启shuffle选项。

一机多GPU,使用一个进程管理一个GPU,每个进程共享模型参数,但是使用不同的数据,每次训练数据量 = batch size * GPU个数。PyTorch提供的torchrun命令以及一些API封装了多进程的实现:

https://pytorch.org/docs/stable/elastic/run.html#launcher-api

数据处理部分的示例代码,MyDataset具体内部实现,可以参考之前的自定义数据集的文章:

[图片

在这里插入图片描述

2分布式数据并行

在并行训练时,各个进程并行,每个模型使用同一份模型参数 weights。在梯度下降时,各个进程会同步一次,致使每个进程的模型都更新相同的梯度。

做法也很简单,只需要把Model套一层DistributedDataParallel,就可以实现backward的自动同步梯,其他的操作都照旧,把新模型ddp_model当成旧模型model调用就行。

在这里插入图片描述

训练流程照常:

在每个新epoch中,要用sampler.set_epoch(epoch)更新sampler打乱数据集。训练流程和普通深度学习训练流程一样。
在这里插入图片描述

3模型保存和读取:

在保存的时候,我们只需要保存一个进程下的模型即可,另外使用barrier()确保进程1在进程0保存模型之后加载模型。

存储参数时会保存设备信息。由于刚刚只保存了0号GPU进程的模型,所有参数的device都是cuda:0。而读取模型时,每个设备上都要去加载这个模型,device要做一个调整。

在这里插入图片描述

使用DistributedDataParallel把model封装成ddp_model后,模型的参数名称里多了一个module,这是因为原来的模型model被保存到了ddp_model.module这个成员变量中。

在混用单GPU和多GPU的训练代码时,要注意这个参数名不兼容的问题,包括上面我们使用LoRA加载模型的时候,也会出现模型层名称变换了的情况。最好的做法是每次存取ddp_model.module,这样单GPU和多GPU的checkpoint可以轻松兼容。

图片

大模型快速微调和训练是我们做自然语言处理必备技能之一,尤其现在大语言模型及其微调模型不断涌现,只有掌握了这些技能才能跟上AI的浪潮。

​

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

train_batch_size和 gradient_accumulation_steps之间的设置有必然联系吗? 阅读详情

相关推荐

pytorch 梯度累积(gradient accumulation)

所谓梯度累积过程,其实很简单,我们梯度下降所用的梯度,实际上是多个样本算出来的梯度的平均值,以batch_size=128为例,你可以一次性算出128个样本的梯度然后平均,我也可以每次算16个样本的平均梯度,然后缓存累加起来,算够了8次之后,然后把总梯度除以8,然后才执行参数更新。总结来讲,梯度累积就是每计算一个batch的梯度,不进行清零,而是做梯度的累加,当累加到一定的次数(accumulation_steps)之后,再更新网络参数,然后将梯度清零。

ytusdc的博客 1万+

gradient_accumulation_steps

gradient_accumulation_steps通过累计梯度来解决本地显存不足问题。 假设原来的batch_size=6,样本总量为24,gradient_accumulation_steps=2 那么参数更新次数=24/6=4 现在,减小batch_size=6/2=3,参数更新次数不变=24/3/2=4 在梯度反传时,每gradient_accumulation_steps次进行一次梯度更新,之前照常利用loss.backward()计算梯度。 ...

不知道起什么名字 1万+

大模型微调方法解析

通过微调大模型达到增加模型性能,节省训练资源和成本,适配特定场景任务。如何高效地通过微调(Fine-tuning)让通用模型适配垂直领域任务,成为行业关注的核心问题。

西木风落 1472

什么是分布式梯度累积(Distributed Gradient Accumulation)?gradient_accumulation_steps参数如何设置?

Distributed gradient accumulation helps overcome memory limitations by allowing us to simulate larger batch sizes while using smaller mini-batches.

阿正的梦工坊 2479

大模型训练和推理

大模型训练moe是指混合专家(Mixture-of-experts,简称MoE)的,这是一种用于提高大型神经网络性能的技术,它可以将模型的一部分替换为多个专家,每个专家只负责处理一部分输入数据,从而增加模型的参数量和表达能力,同时减少计算量和训练时间。指令可以作为模型的输入的一部分,也可以作为模型的输出的一部分,具体取决于任务的类型。上下文扩展技术的,这是一种用于提高大型语言模型(LLM)对长文本的处理能力的技术,它可以让模型在不增加参数量的情况下,扩展其注意力范围,从而提高模型的语言理解和生成能力。

weixin_45325331的博客 6025

微调、指令微调与 LoRA 的产品视角解析:如何选择合适的大模型训练策略

随着大语言模型在垂直领域的落地加速,产品团队面临一个关键技术决策:到底应该选用基础模型、微调模型,还是采用指令微调或LoRA等轻量方式进行定制?本篇文章将以产品视角系统解析大模型的几种主流训练方式,聚焦其适用场景、资源消耗、部署形式与工程成本,结合真实企业实践案例,帮助AI产品经理和技术团队在项目初期做出准确的能力决策与资源评估。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1196

大模型微调代码解析,哪些方法可以加速训练?

近期大模型层出不穷,大家对于大模型的微调也在跃跃欲试,像Lijia的BELLE,斯坦福的Alpaca[1], 清华的ChatGLM[2],中文的Chinese-Vicuna[3],让我这样的普通玩家也能训练自己的微调模型。在微调和推理的时候仍然需要加速,有哪些方法可以加速微调呢?

u013250861的博客 1795

ChatGLM Efficient Tuning Lora训练参数解析

"Gradient Accumulation"是一种在训练深度学习模型时使用的技术,特别是在内存有限的硬件条件下,用以有效地进行模型训练。的值需要在内存使用、训练速度和模型性能之间找到一个平衡点。这是因为,如果你在每个批次之后都进行模型更新,那么你需要在。的值可以节省内存,但是它也有可能会降低训练速度。对模型性能有较高的要求,那么可能需要使用较小的值。相反,如果你使用了梯度累积,你可以在每。定数量的步骤后,再一次性更新模型的参数。此外,如果累积的梯度步骤太多,,而不是所有批次的梯度。,从而降低优化的效果。

具身机器人和通用AI 1005

大模型进阶之路:预训练与微调的深度解析

预训练与微调是大模型训练的两个关键阶段。预训练在大规模数据集上学习通用特征表示,分为无监督和有监督两种方式,能加速训练、提高性能、解决数据不足问题。微调则在预训练基础上,使用少量有标签数据对模型进行针对性调整。两者在目标、数据集、特征表示和任务目标上存在显著差异,共同构成了大模型高效训练的核心方法。

qq_46094651的博客 1059

Innovus 安装全过程

【代码】Innovus 安装全过程。

lmyynlbcy的博客 5552

【社区分享】从零开始学习 TinyML,建立 TensorFlow 深度学习模型(技术优化篇)

本文来自社区投稿与征集,作者王玉成,ML&IoT Google Developers Expert,温州大学智能锁具研究院总工程师。 了解更多:https://blog.youkuaiyun.com/wfing 经过前面几章的讨论,我们了解了TinyML 的概念,完成了一个最简单的TinyML 的模型并且运行在微控制器上,得出最基本的结果。但是在实际的工程应用中,模型建立之后,也需要再进一步结合许多优化方面的技术,这就是我们接下来想要探讨的。 5. 优化 TinyML 这本书也详细的向我...

tensorflowforum的博客 1万+

基于大模型的预训练、量化、微调等完整流程解析

本文系统介绍了大语言模型(LLM)的关键技术流程,包括预训练(数据准备、词表构建、训练目标)、量化(PTQ/QAT方法、精度选择)和微调(全参数/PEFT策略)三个核心环节,以及蒸馏、对齐、部署优化等辅助技术。通过合理设计从数据收集到模型部署的全流程,可以在保证模型性能的同时实现高效、低成本的应用落地。文章还提供了完整的大模型工作流程图,为开发者提供了清晰的技术实施路径。

yuanmomoya的博客 9066

桑基图实战指南:Excel/Python/R三工具高效绘制方法

桑基图是一种以线条宽度编码流量大小、以节点位置表达流程阶段、以连接关系呈现数据流向的专项可视化技术,其核心原理在于‘宽即量、位即序、连即逻辑’。它并非装饰性图表,而是面向业务诊断的分析前置工具,尤其适用于预算分配、能源损耗、用户转化等存在明确单向流动与显著数值差异的场景。相比传统柱状图或漏斗图,桑基图能天然暴露系统瓶颈与隐性损耗,大幅提升决策效率。本文聚焦工程落地,覆盖Excel插件快速交付、Python Plotly交互开发、R networkD3生态集成三大主流路径,兼顾数据准备铁律、索引映射规范与中文

cuml0912的博客 489

大模型微调之P-tuning方法解析

Bert时代,我们常做预训练模型微调(Fine-tuning),即根据不同下游任务,引入各种辅助任务loss和垂直领域数据,将其添加到预训练模型中,以便让模型更加适配下游任务的方式。每个下游任务都存下整个预训练模型的副本,并且推理必须在单独的批次中执行。那么能不能将所有自然语言处理的任务转换为语言模型任务?就是所有任务都可以被统一建模,任务描述与任务输入视为语言模型的历史上下文,而输出则为语言模型需要预测的未来信息。

qq_41771998的博客 1万+

OpenV2X 车路协同开源平台 Columbia 版本正式发布!

OpenV2X车路协同开源平台Columbia 版本正式发布!

weixin_65571684的博客 1199

SAP UI5 和 Fiori 的一些小技巧合集 - 持续更新中

本文介绍笔者从事 SAP UI5 和 Fiori 开发多年以来,积累的一些经验和小技巧。会保持更新。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 915
上一篇: 如果老板让你基于大模型搭建一个系统,怎么选择一个适合自己任务的大模型?选择大模型需要考虑哪些问题?
下一篇: 基于LangChain+LLM的本地知识库问答:从企业单文档问答到批量文档问答
爱喝白开水a
博客等级 码龄3年 6793粉丝 763原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值