作为算法工程师的你是否对如何应用大型语言模型构建医学问答系统充满好奇?是否希望深入探索LLaMA模型的微调技术,进一步优化参数和使用不同微调方式?现在笔者会带你领略大模型训练与微调进阶之路,拓展您的技术边界!
目前训练超大规模语言模型主要有两条技术路线:TPU + XLA + TensorFlow 和 GPU + PyTorch + Megatron-LM + DeepSpeed。前者由Google主导,由于TPU和自家云平台GCP深度绑定,对于非Google开发者来说, 只可远观而不可把玩,后者背后则有NVIDIA、Meta、微软等大厂加持,社区氛围活跃,也更受到群众欢迎。
数据并行(Data Parallel, DP)
缺点:存在空闲等待时间
流水线并行的核心思想是,模型按层分割成若干块,每块都交给一个设备。在前向传递过程中,每个设备将中间的激活传递给下一个阶段。在后向传递过程中,每个设备将输入张量的梯度传回给前一个流水线阶段。这允许设备同时进行计算,并增加了训练的吞吐量。流水线并行训练的一个缺点是,会有一些设备参与计算的冒泡时间,导致计算资源的浪费。
数据并行+流水线并行,如下图:
数据并行+流水线并行+模型并行,如下图:
二、训练-Deepspeed ZeRO模式
ZeRO(Zero Redundancy Optimizer)类似于张量并行进行切分,支持多种offload技术。目标:优化存储效率的同时还能保持较高的计算和通信效率。
为了能够在比较普通的机器上也能微调大模型,我们首先需要分析一下模型训练过程中都有哪些部分需要消耗存储空间。在进行深度学习训练的时候,有4大部分的显存开销,分别是模型参数(Parameters),模型参数的梯度(Gradients),优化器状态(Optimizer States)以及中间激活值(Intermediate Activations)。
ZeRO-DP
基于上述问题,提出了ZeRO-DP技术,即ZeRO驱动的数据并行,兼顾数据并行的计算/通信效率和模型并行的空间效率。首先ZeRO-DP会对模型状态进行分区,避免了复制模型导致的冗余,然后在训练期间使用动态通信调度保留数据并行的计算粒度和通信量,也能维持一个类似的计算/通信效率。
ZeRO-DP有三个优化阶段:① 优化器状态分区、② 梯度分区、③ 参数分区。
1.优化器状态分区(Optimizer State Partitioning, Pos):在与数据并行保持相同通信的情况下可以降低4倍空间占用;
2.① + 梯度分区(Gradient Partitioning, Pos+g):在与数据并行保持相同通信量的情况下可以降低8倍空间占用;
3.① + ② + 参数分区(Parameter Partitioning, Pos+g+p):空间占用减少量与GPU的个数呈线性关系 ,通信量增加50%。
优化模型占用空间:在训练过程中当然模型占用的空间是最大的,但是现有的方法中,不管是数据并行DP还是模型并行MP都不能很好的解决。数据并行有很好的计算/通信效率,但是由于模型复制了多份,导致空间利用率很差,而模型并行虽然内存利用率高,但是由于对模型的进行了很精细的拆分,导致计算/通信效率很低。除此之外,所有这些方法都静态保存了整个训练过程中所需的所有模型参数,但实际上并不是整个训练期间都需要这些内容。
这里假设模型参数(fp16)、模型梯度(fp16)和Adam状态(fp32的模型参数备份,fp32的momentum和fp32的variance)。假设模型参数量 Φ ,则共需要 2Φ+2Φ+(4Φ+4Φ+4Φ)=4Φ+12Φ=16Φ 字节存储。
ZeRO说到底是一种数据并行方案,可是很多人只有几张甚至一张卡,显存加起来都不够,那怎么办呢?在操作系统中,当内存不足时,可以选择一些页面进行换入换出,为新的数据腾出空间。类比一下,既然是因为显存不足导致一张卡训练不了大模型,那么ZeRO-Offload的想法就是:显存不足,内存来补。在一个典型的服务器上,CPU 可以轻松拥有几百GB的内存,而每个 GPU 通常只有16或32GB的内存。相比于昂贵的显存,内存比较廉价,之前的很多工作都是聚焦在内存显存的换入换出,并没有用到CPU的计算能力,也没有考虑到多卡的场景。ZeRO-Offload则是将训练阶段的某些模型状态从GPU和显存卸载到CPU和内存。当然ZeRO-Offload并不希望为了最小化显存占用而牺牲计算效率, 否则的话还不如直接使用CPU和内存,因为即使将部分GPU的计算和显存卸载到CPU和内存,肯定要涉及到GPU和CPU、显存和内存的通信,而通信成本一般是非常高的,此外GPU的计算效率比CPU的计算效率高了好几个数量积,因此也不能让CPU参与过多的计算。
单卡场景-上图
多卡场景-上图
现在的计算流程是,在GPU上面进行前向和后向计算,将梯度传给CPU,进行参数更新,再将更新后的参数传给GPU。为了提高效率,可以将计算和通信并行起来,GPU在反向传播阶段,可以待梯度值填满bucket后,一边计算新的梯度一边将bucket传输给CPU,当反向传播结束,CPU基本上已经有最新的梯度值了,同样的,CPU在参数更新时也同步将已经计算好的参数传给GPU,如下图所示。
到目前为止还都是单卡的场景,在多卡场景中,ZeRO-Offload可以利用ZeRO-2,将优化器状态和梯度进行切分,每张卡只保留,结合上ZeRO-Offload同样是将这的优化器状态和梯度卸载到内存,在CPU上进行参数更新。在多卡场景,利用CPU多核并行计算,每张卡至少对应一个CPU进程,由这个进程负责进行局部参数更新。
并且CPU和GPU的通信量和 N 无关,因为传输的是fp16 gradient和fp16 parameter,总的传输量是固定的,由于利用多核并行计算,每个CPU进程只负责 1N 的计算,反而随着卡数增加节省了CPU计算时间。
三、利用ChatGPT生成训练数据
指令生成所用到的提示:


2、LoRA 与 Transformer 的结合也很简单,仅在 QKV attention 中 QKV 的映射增加一个旁路(可看下文中具体的 LORA 网络结构),而不动MLP模块。基于大模型的内在低秩特性,增加旁路矩阵来模拟全模型参数微调,LoRA通过简单有效的方案来达成轻量微调的目的,可以将现在的各种大模型通过轻量微调变成各个不同领域的专业模型。
五、Ptuning微调

Github:chatglm-ptuning
prompt tuning, prefix tuning 和p-tuning v1 有一定的联系,这几种方法都是基于优化continuous prompt,之前的工作都是手动设计模板或者自动生成模板,统称discrete prompt。discrete prompt有一定的局限性,找出的结果可能不是最优,而且对token的变动十分敏感,所以之后的研究方向也都是连续空间内的prompt。
文章中介绍了微调的部分核心知识,限于文章的篇幅关于训练(微调)-LLaMA代码结构、工具配置-Accelerate、工具配置-Deepspeed、工具配置-FSDP、训练(微调)-全参数微调、训练(微调)-LoRA微调、训练(微调)-Ptuning微调、结果评估的详细的讲解和代码实操,会在我们的课程中进行详细的阐述。希望文章能够对您的工作有所帮助和启发。如果对课程内容感兴趣的朋友,可以了解一下我们独家推出《大模型训练和微调—医学问答系统》课程,欢迎大家咨询免费试听。前30名同学可获得价值500元算力(4090双卡50小时),名额有限。
《大模型训练和微调-医学问答系统》
l学习如何模型构建一个大型医学方向问答系统;
l理解LLaMA模型微调的相关内容,包括参数设置、数据类型、Zero 设置等;
l学习优化器的定义和参数设置,包括 adam、adamw、lamb、lion 等;
l熟悉监视器工具 Wandb 的使用,以便有效监控模型训练过程;
l深入了解模型代码梳理的过程,包括数据准备和 ChatGPT 数据生成流程;
l了解模型效果的测评指标,并学会有效评估模型性能的方法;
l多模态大模型微调(VisualGLM-6B)、最新大模型特点分析。
第八节 典型应用-从文本到图像
名师介绍
毕业于浙江大学计算机系,10年AI赋能落地与算法研发经验,作为团队负责人成功培养并产出多个高水准AI团队;在NLP、语音、图像、推荐等多个领域深耕;全栈算法架构师;主导研发了诸如知识图谱、智能对话、内容推荐等众多基于实际应用场景的商业化AI产品,;擅长将算法技术进行产业化落地,如成功应用LLM等预训练语言模型、知识图谱等技术,解决保险、金融等行业实际问题,降低运营成本提升运营效率。拥有7项专利成果,出版了三本畅销算法书籍。并在国际阅读理解竞赛(squad2)中获得第一名。
l提供讲义课件、源代码、数据集、模型文件;
l一对一答疑、算力服务、技术周报不定期研究报告、会员福利。
了解更多课程信息。
前30名同学可获得价值500元算力(4090双卡50小时),名额有限。
内容中包含的图片若涉及版权问题,请及时与我们联系删除
评论
沙发等你来抢