大模型的训练与优化、强化学习
大模型的训练基础
数据准备
- 数据收集:收集多样化、高质量的训练数据。数据的规模和多样性对模型的性能至关重要。
- 数据预处理:包括清洗、标注、归一化等步骤,以确保数据的质量和一致性。
模型设计
- 架构选择:根据任务需求选择合适的模型架构(如Transformer、CNN等)。
- 参数初始化:选择合适的参数初始化方法,以避免梯度消失或梯度爆炸等问题。
训练过程
- 损失函数:根据任务类型(如回归、分类)选择适当的损失函数。
- 优化算法:常用的优化算法有SGD、Adam等。Adam通常效果较好,尤其是在大规模数据和复杂模型中。
- 学习率调整:学习率是训练中的关键超参数,过大或过小都可能导致训练失败。通常采用动态学习率调整策略。
训练资源
- 计算资源:大模型训练需要强大的计算能力,通常使用分布式计算集群和GPU/TPU加速。
- 训练时间:大模型需要长时间训练,可能需要几周到几个月,具体取决于数据规模和模型复杂度。
大模型的优化
模型压缩
- 剪枝:去除对输出影响较小的神经元或连接,减少计算量。
- 量化:使用较低精度的数字(如int8代替float32)来表示模型权重和激活值,从而减少内存占用和加速推理过程。
- 蒸馏:通过一个较小的模型(学生模型)学习一个大模型(教师模型)的知识,减小模型大小。
并行训练
- 数据并行:将数据分割到不同的设备上,每个设备计算梯度后进行汇总更新。
- 模型并行:将模型分割成不同部分,分配到多个设备上进行计算。
高效推理
- 混合精度计算:使用半精度浮点数(FP16)进行推理,减少计算量和内存使用。
- 硬件加速:使用专门的硬件(如TPU、FPGA)来加速推理过程。
超参数调优
- 网格搜索:通过穷举法搜索最佳超参数组合。
- 贝叶斯优化:通过概率模型搜索超参数空间,找到最优超参数。
自适应训练
- 动态计算图:根据输入数据动态调整计算图,避免不必要的计算。
- 早停策略:监控验证集的损失,在性能不再提升时停止训练,防止过拟合。
大模型强化学习相关知识
1. 💡 奖励模型需要和基础模型一致吗?
奖励模型和基础模型在训练过程中可以是一致的,也可以是不同的。这取决于你的任务需求和优化目标。
如果你希望优化一个包含多个子任务的复杂任务,那么你可能需要为每个子任务定义一个奖励模型,然后将这些奖励模型整合到一个统一的奖励函数中。这样,你可以根据任务的具体情况调整每个子任务的权重,以实现更好的性能。
另一方面,如果你的任务是单任务的,那么你可能只需要一个基础模型和一个对应的奖励模型,这两个模型可以共享相同的参数。在这种情况下,你可以通过调整奖励模型的权重来控制任务的优化方向。
总之,奖励模型和基础模型的一致性取决于你的任务需求和优化目标。在实践中,你可能需要尝试不同的模型结构和奖励函数,以找到最适合你任务的解决方案。
2. 💡 RLHF 在实践过程中存在哪些不足?
RLHF(Reinforcement Learning from Human Feedback)是一种通过人类反馈进行增强学习的方法,尽管具有一定的优势,但在实践过程中仍然存在以下几个不足之处:
人类反馈的代价高昂:获取高质量的人类反馈通常需要大量的人力和时间成本。人类专家需要花费时间来评估模型的行为并提供准确的反馈,这可能限制了RLHF方法的可扩展性和应用范围。
人类反馈的主观性:人类反馈往往是主观的,不同的专家可能会有不同的意见和判断。这可能导致模型在不同专家之间的反馈上存在差异,从而影响模型的训练和性能。
反馈延迟和稀疏性:获取人类反馈可能存在延迟和稀疏性的问题。人类专家不可能实时监控和评估模型的每一个动作,因此模型可能需要等待一段时间才能收到反馈,这可能会导致训练的效率和效果下降。
错误反馈的影响:人类反馈可能存在错误或误导性的情况,这可能会对模型的训练产生负面影响。如果模型在错误的反馈指导下进行训练,可能会导致模型产生错误的行为策略。
缺乏探索与利用的平衡:在RLHF中,人类反馈通常用于指导模型的行为,但可能会导致模型过于依赖人类反馈而缺乏探索的能力。这可能限制了模型发现新策略和优化性能的能力。
针对这些不足,研究人员正在探索改进RLHF方法,如设计更高效的人类反馈收集机制、开发更准确的反馈评估方法、结合自适应探索策略等,以提高RLHF方法的实用性和性能。
3. 💡 如何解决人工产生的偏好数据集成本较高,很难量产问题?
解决人工产生偏好数据集成本高、难以量产的问题,可以考虑以下几种方法:
引入模拟数据:使用模拟数据来代替或辅助人工产生的数据。模拟数据可以通过模拟环境或模型生成,以模拟人类用户的行为和反馈。这样可以降低数据收集的成本和难度,并且可以大规模生成数据。
主动学习:采用主动学习的方法来优化数据收集过程。主动学习是一种主动选择样本的方法,通过选择那些对模型训练最有帮助的样本进行标注,从而减少标注的工作量。可以使用一些算法,如不确定性采样、多样性采样等,来选择最有价值的样本进行人工标注。
在线学习:采用在线学习的方法进行模型训练。在线学习是一种增量学习的方法,可以在模型运行的同时进行训练和优化。这样可以利用实际用户的交互数据来不断改进模型,减少对人工标注数据的依赖。
众包和协作:利用众包平台或协作机制来收集人工产生的偏好数据。通过将任务分发给多个人参与,可以降低每个人的负担,并且可以通过众包平台的规模效应来提高数据收集的效率。
数据增强和迁移学习:通过数据增强技术,如数据合成、数据扩增等,来扩充有限的人工产生数据集。此外,可以利用迁移学习的方法,将从其他相关任务或领域收集的数据应用于当前任务,以减少对人工产生数据的需求。
综合运用上述方法,可以有效降低人工产生偏好数据的成本,提高数据的量产能力,并且保证数据的质量和多样性。
4. 💡 如何解决三个阶段的训练(SFT->RM->PPO)过程较长,更新迭代较慢问题?
要解决三个阶段训练过程较长、更新迭代较慢的问题,可以考虑以下几种方法:
并行化训练:利用多个计算资源进行并行化训练,可以加速整个训练过程。可以通过使用多个CPU核心或GPU来并行处理不同的训练任务,从而提高训练的效率和速度。
分布式训练:将训练任务分发到多台机器或多个节点上进行分布式训练。通过将模型和数据分布在多个节点上,并进行并行计算和通信,可以加快训练的速度和更新的迭代。
优化算法改进:针对每个阶段的训练过程,可以考虑改进优化算法来加速更新迭代。例如,在SFT(Supervised Fine-Tuning)阶段,可以使用更高效的优化算法,如自适应学习率方法(Adaptive Learning Rate)或者剪枝技术来减少模型参数;在RM(Reward Modeling)阶段,可以使用更快速的模型训练算法,如快速梯度法(Fast Gradient Method)等;在PPO(Proximal Policy Optimization)阶段,可以考虑使用更高效的采样和优化方法,如并行采样、多步采样等。
迁移学习和预训练:利用迁移学习和预训练技术,可以利用已有的模型或数据进行初始化或预训练,从而加速训练过程。通过将已有模型的参数或特征迁移到目标模型中,可以减少目标模型的训练时间和样本需求。
参数调优和超参数搜索:对于每个阶段的训练过程,可以进行参数调优和超参数搜索,以找到更好的参数设置和配置。通过系统地尝试不同的参数组合和算法设定,可以找到更快速和高效的训练方式。
综合运用上述方法,可以加速三个阶段训练过程,提高更新迭代的速度和效率,从而减少训练时间和资源消耗。
5. 💡 如何解决 PPO 的训练过程同时存在4个模型(2训练,2推理),对计算资源的要求较高问题?
要解决PPO训练过程中对计算资源要求较高的问题,可以考虑以下几种方法:
减少模型规模:通过减少模型的规模和参数量,可以降低对计算资源的需求。可以使用模型压缩技术、剪枝算法等方法来减少模型的参数数量,从而降低计算资源的使用量。
降低训练频率:可以降低PPO训练的频率,减少每个训练周期的次数。例如,可以增加每个训练周期的时间间隔,或者减少每个周期中的训练步数。这样可以减少训练过程中对计算资源的占用。
模型并行化:利用多个计算资源进行模型并行化训练,可以加速PPO的训练过程。可以将模型参数分布到多个GPU上,并进行并行计算和通信,以提高训练的效率和速度。
异步训练:采用异步训练的方式,可以在多个计算资源上同时进行PPO的训练。可以使用异步优化算法,如A3C(Asynchronous Advantage Actor-Critic)等,将训练任务分发到多个线程或进程中进行并行训练,从而提高训练的效率。
云计算和分布式训练:利用云计算平台或分布式系统进行PPO的训练,可以充分利用大规模计算资源。可以将训练任务分发到多个计算节点上进行分布式训练,以加速训练过程。
参数共享和模型缓存:对于有多个模型的情况,可以考虑共享部分参数或缓存已计算的模型输出。通过共享参数和缓存计算结果,可以减少重复计算和存储,从而降低对计算资源的要求。
综合运用上述方法,可以有效降低PPO训练过程中对计算资源的要求,提高训练的效率和速度。
大模型(LLMs)分布式训练面
1. 理论篇
1.1 想要训练一个LLM,如果只想用1张显卡,那么对显卡的要求是什么?
显卡显存足够大,nB模型微调一般最好准备20nGB以上的显存。
1.2 如果有N张显存足够大的显卡,怎么加速训练?
数据并行(DP),充分利用多张显卡的算力。
1.3 如果显卡的显存不够装下一个完整的模型呢?
最直观想法,需要分层加载,把不同的层加载到不同的GPU上(accelerate的device_map),也就是常见的PP,流水线并行。
1.4 推理时,是一个串行的过程,1个GPU计算,其他空闲,有没有其他方式?
- 横向切分:流水线并行(PP),也就是分层加载到不同的显卡上。
- 纵向切分:张量并行(TP),在DeepSpeed世界里叫模型并行(MP)。
1.5 3种并行方式可以叠加吗?
是可以的,DP+TP+PP,这就是3D并行。如果真有1个超大模型需要预训练,3D并行是必不可少的。毕竟显卡进化比较慢,最大显存的也就是A100 80GB。单卡80GB,可以完整加载小于40B的模型,但训练时+梯度+优化器状态,5B模型就是上限了,更别说activation的参数也要占显存,batch size还得大。而现在100亿以下(10B以下)的LLM只能叫small LLM。
1.6 Colossal-AI有1D/2D/2.5D/3D,是什么情况?
Colossal-AI的nD是针对张量并行,指的是TP的切分,对于矩阵各种切和3D并行不是一回事。
1.7 除了3D并行,有没有其他方式大规模训练?
可以使用更优化的数据并行算法FSDP(类似ZeRO3)或者直接使用DeepSpeed ZeRO。
1.8 有了ZeRO系列,为什么还需要3D并行?
根据ZeRO论文,尽管张量并行的显存更省一点,张量并行的通信量实在太高,只能限于节点内(有NVLINK)。如果节点间张量并行,显卡的利用率会低到5%。但是,根据Megatron-LM2的论文,当显卡数量增加到千量级,ZeRO3明显不如3D并行。
1.9 平民适不适合玩3D并行?
不适合。3D并行的基础是,节点内显卡间NVLINK超高速连接才能上TP。有没有NVLINK都是个问题。而且,节点间特殊的网络通常有400Gb/s?远超普通IDC内的万兆网络10Gb/s。
1.10 平民适不适合直接上多机多卡的ZeRO3(万兆网)?
不适合。想象一下,当65B模型用ZeRO3,每一个step的每一张卡上需要的通信量是195GB(3倍参数量),也就是1560Gb。万兆网下每步也要156s的通信时间,这画面太美。
2. 实践篇
2.1 假如有超多的8卡A100节点(DGX A100),如何应用3D并行策略?
- 首先,张量并行。3种并行方式里,张量并行(TP)对于GPU之间的通信要求最高,而节点内有NVLINK通信速度可以达到600GB/s。
- 其次,流水线并行。每个节点负责一部分层,每35个节点组成一路完整的流水线,也就是一个完整的模型副本,这里一个模型副本需280卡。
- 最后,数据并行。官方也做了8路、10路、12路的并行实验,分别使用280个节点、350个节点和420个节点。参考Megatron-Turing NLG 530B集群规模越大,单个GPU利用率越低。
2.2 如果想构这样一个大规模并行训练系统,训练框架如何选?
可以参考Megatron-Turing NLG 530B,NVIDIA Megatron-LM + Microsoft DeepSpeed。BLOOM则是PP+DP使用DeepSpeed,TP使用Megatron-LM。当然还有一些其他的训练框架,在超大规模下或许也能work。
2.3 训练框架如何选?
下面这个图是BLOOM的一个实验,DP/TP/PP都能降显存,核心是要降到单卡峰值80GB以下。真大模型就是要TP=8,充分利用NVLINK,然后优先PP,最后DP。然而假大模型(7B),比如LLaMA-7B,可以不用3D并行,直接用DeepSpeed ZeRO更方便,参考open-llama项目。
3. 并行化策略选择篇
3.1 单GPU
- 显存够用:直接用。
- 显存不够:上offload,用CPU。
3.2 单节点多卡
- 显存够用(模型能装进单卡):DDP或ZeRO。
- 显存不够:TP或者ZeRO或者PP。
重点:没有NVLINK或者NVSwitch,也就是穷人模式,要用PP。
3.3 多节点多卡
- 如果节点间通信速度快(穷人的万兆网肯定不算):ZeRO或3D并行,其中3D并行通信量少但是对模型改动大。
- 如果节点间通信慢,但显存又少:DP+PP+TP+ZeRO-1。
4. 问题篇
4.1 推理速度验证
ChatGML在V100单卡的推理耗时大约高出A800单卡推理的40%。
ChatGML推理耗时和问题输出答案的字数关系比较大,答案字数500字以内,A800上大概是每100字,耗时1秒,V100上大概是每100字,耗时1.4秒。
- ChatGML在A800单卡推理耗时统计
- ChatGML在V100单卡推理耗时统计
结论
- 训练效率方面:多机多卡训练,增加训练机器可以线性缩短训练时间。
- 推理性能方面:ChatGML在V100单卡的推理耗时大约高出A800单卡推理的40%。
- ChatGML推理耗时和问题输出答案的字数关系比较大,答案字数500字以内,A800上大概是每100字,耗时1秒,V100上大概是每100字,耗时1.4秒。
4.2 并行化训练加速
可采用Deepspeed进行训练加速,目前行业开源的大模型很多都是采用的基于Deepspeed框架加速来进行模型训练的。如何进行Deepspeed训练,可以参考基于Deepspeed构建大模型分布式训练平台。
Deepspeed在深度学习模型软件体系架构中所处的位置:
DL model → train optimization (Deepspeed) → train framework → train instruction (cloud) → GPU device
当然需要对比验证Deepspeed的不同参数,选择合适的参数。分别对比stage 2、3进行验证,在GPU显存够的情况下,最终使用stage 2。
4.3 Deepspeed训练过程,报找不主机
解决方法:Deepspeed的关联的多机的配置文件,Hostfile配置中使用IP,不使用hostname。
4.4 为什么多机训练效率不如单机?
多机训练可以跑起来,但是在多机上模型训练的速度比单机上还慢。通过查看服务器相关监控,发现是网络带宽打满,上不去了,其他系统监控基本正常。原理初始的多机之间的网络带宽是64Gbps,后面把多机之间的网络带宽调整为800Gbps,问题解决。
实验验证,多机训练的效率和使用的机器数成线性关系,每台机器的配置一样,如一台GPU机器跑一个epoch需要2小时,4台GPU机器跑一个epoch需要半小时。除了训练速度符合需求,多机训练模型的loss下降趋势和单机模型训练的趋势基本一致,也符合预期。
4.5 多机训练不通,DeepSpeed配置问题
多机间NCCL不能打通
解决方法:新建.deepspeed_env文件,写入如下内容:
NCCL_IB_DISABLE=1
NCCL_DEBUG=INFO
NCCL_SOCKET_IFNAME=eth0
NCCL_P2P_DISABLE=1
大模型蒸馏篇
一、知识蒸馏和无监督样本训练?
二、对知识蒸馏知道多少,有哪些改进用到了?
三、谈一下对模型量化的了解?
四、模型压缩和加速的方法有哪些?
五、你了解的知识蒸馏模型有哪些?
一、知识蒸馏和无监督样本训练?
知识蒸馏是利用大模型把一个大模型的知识压缩到一个小模型上。具体来说,在一个训练集上训练一个较大的模型,然后冻结该模型作为 Teacher 模型(也叫监督模型)。接着,使用这个冻结的 Teacher 模型来训练一个较小的 Student 模型。目标是通过 Teacher 模型的知识来提高 Student 模型的性能。
- A. 离线蒸馏:Student 在训练集上的损失和与 Teacher 模型的损失作为总的损失函数进行优化。
- B. 半监督蒸馏:将输入传给 Teacher 模型以获得标签,然后将这些输入和标签传递给 Student 模型进行训练。
- 自监督蒸馏:在没有 Teacher 模型的情况下,使用已经训练好的模型作为 Teacher 进行监督,通常在训练的最后几轮进行。
目前知识蒸馏的一个常见应用是对齐 ChatGPT。
无监督样本训练的具体定义不清楚。如果是传统的无监督学习,通常是指聚类、主成分分析等方法。如果在知识蒸馏中提到无监督训练,它可能是指通过离线蒸馏的方式,仅使用与 Teacher 模型的损失作为训练依据。
二、对知识蒸馏知道多少,有哪些改进用到了?
知识蒸馏是一种通过将复杂模型的知识转移到简单模型的方式,来提高简单模型的性能的方法。以下是一些常见的改进方法:
- 使用不同类型的损失函数和温度参数:调整损失函数和温度参数以获得更好的蒸馏效果。
- 引入额外的信息:例如,将相似性约束添加到模型训练中,以帮助模型更好地学习知识。
- 结合其他技术:使用多任务学习、迁移学习等方法与知识蒸馏结合,进一步提升蒸馏效果。
三、谈一下对模型量化的了解?
模型量化是一种将浮点型参数转换为定点型参数的技术,目的是减少模型的存储和计算复杂度。常见的量化方法包括:
- 量化权重和激活值:将模型中的权重和激活值转换为整数或更小的小数。
- 使用更小的数据类型:例如将数据类型从 32 位浮点数转换为 8 位整数或 16 位浮点数等。
- 使用压缩算法:如 Huffman 编码、可逆压缩算法等来压缩模型。
量化有助于减少模型的存储需求和内存占用,同时加速推理速度。但需要注意,量化可能会对模型的精度产生一定影响,因此需要平衡精度和计算效率。
四、模型压缩和加速的方法有哪些?
- 参数剪枝(Parameter Pruning):删除模型中冗余的参数,减少模型大小。只有少部分参数对模型性能有显著贡献,可以删除其他不重要的参数。
- 量化(Quantization):将浮点型参数转换为更小的整数或定点数,减小模型大小和内存占用,提高计算效率。
- 知识蒸馏(Knowledge Distillation):通过较大、较准确的模型来指导较小、较简单模型的训练,从而减小模型复杂度并提高推理速度。
- 网络剪枝(Network Pruning):删除模型中冗余的神经元,减小模型的大小。与参数剪枝不同,网络剪枝可删除神经元而不删除对应的参数。
- 蒸馏对抗网络(Distillation Adversarial Networks):在知识蒸馏的基础上,结合对抗训练以提高模型的鲁棒性和抗干扰能力。
- 层次化剪枝(Layer-wise Pruning):对模型的不同层进行不同程度的剪枝,从而实现更高效的模型压缩和加速。
- 低秩分解(Low-Rank Decomposition):将较大的权重矩阵分解为几个较小的矩阵,以减少计算开销。
- 卷积分解(Convolution Decomposition):将卷积层分解为几个更小的卷积层或全连接层,以减小计算开销。
- 网络剪裁(Network Trimming):对模型中不重要的连接进行剪裁,减少计算开销。
五、你了解的知识蒸馏模型有哪些?
以下是一些常见的知识蒸馏模型:
- FitNets:使用一个大型模型作为教师模型来指导一个小型模型的训练。
- Hinton 蒸馏:使用一个大型模型的输出作为标签来指导一个小型模型的训练。
- Born-Again Network(BAN):使用一个已训练好的模型来初始化新模型,并通过少量数据重新训练该模型。
- TinyBERT:使用大型 BERT 模型作为教师模型来指导一个小型 BERT 模型的训练。