多模态大模型实战DeepSpeedxMiniGPT4Qwen系列4:给Lavis带上DeepSpeed翅膀

初始化:不同于torch.distributed使用torch.distributed.init_process_group,deepspeed需要使用以下方法进行分布式多进程的初始化

deepspeed.init_distributed(dist_backend='nccl',init_method='env://',distributed_port=8080,)其他操作:都可以使用torch.distributed的操作,如:torch.distributed.barrier(),等价于使用deepspeed.utils.dist.barrier()

model=create_eva_vit_g(img_size=224,drop_path_rate=0.,use_checkpoint=False,precision="fp32").cuda(args.local_rank)zero3直接分片初始化(如果模型太大,无法在一张卡上加载)如果模型太大,无法在一张显卡上加载,可以加载在多卡上,需要在deepspeed.zero.Init()下进行初始化,但只有采用zero3的时候才可用。

withdeepspeed.zero.Init():model=xxxxDataLoader既可以使用DDP的分布式DataLoader(即带上DistributedSampler),也可以直接将Dataset输入给deepspeed.initialize()得到DataLoader

目前发现如果打开zero_optimization的offload_optimizer,是得使用DeepSpeed内部的fused的optimizer的,直接使用torch自带的optimizer会报错:

deepspeed.runtime.zero.utils.ZeRORuntimeException:

用deepspeed_config自然是不会出错的方法,但deepspeed支持的scheduler还是太简单了,甚至不好满足简单的linearwarmup+后续cosinedecay。如果使用torch的scheduler,由于需要提供optimizer参数,假如optimizer是用的deepspeed实现的optimizer,会报错(因为不是torch里的optimizer类):

TypeError:DeepSpeedZeroOptimizerisnotanOptimizer

可以自定义scheduler如下:

ifepoch%save_interval==0:client_sd['global_step']=global_stepclient_sd['epoch']=epochclient_sd['scheduler']=scheduler.state_dict()ckpt_id=loss.item()model_engine.save_checkpoint(save_dir=save_dir,tag=f'epoch_{epoch}',client_state=client_sd)加载checkpointdefload_ckpt(model_engine,scheduler,ckpt_dir,ckpt_tag):_,client_sd=model_engine.load_checkpoint(load_dir=ckpt_dir,tag=ckpt_tag)global_step=client_sd['global_step']start_epoch=client_sd['epoch']scheduler.load_state_dict(client_sd['scheduler'])returnstart_epoch,global_step后续需要在for循环处修改开始的epoch和dataloader的step数,如下:

使用deepspeed的fp16或bf16,在数据输入、中间算子等位置常常会出现数据类型的问题,在输入处直接改dtype可能还行,但其他位置一直修改dtype终究有些不美观,甚至会出现错误,解决方法:可以直接和torch.cuda.amp.autocast联动:

首先,借用我个人上篇博客的分析采用混合精度时的显存占用:

在ViT模型使用时,一般情况激活值还是会占很大比例的(经验性的结论可能会占50%,当然也和batch_size有关),且这里并不开启Gradient-Checkpointing

这里想说几个点,用MiniGPT4Qwen,由于只训练中间的一个linearprojection层(几M的参数量),导致实际上ZERO系列对显存的优化并不明显(尤其是ZERO-1和ZERO-2,几乎不会有提升,甚至由于通信的缘故导致实际显存占用有较少的增加,ZERO-3我还在调),但如果想多训练一些部分(如:把BLIP2的Q-former也打开,给Qwen上LoRA,甚至想训练ViT),在3090上,你不开ZERO优化就是不可能的哈。

这里放一个使用示例吧~额滴麦麦~

请在代码中加入

"zero_optimization":{"stage":2,"allgather_partitions":true,"allgather_bucket_size":3e8,"overlap_comm":true,"reduce_scatter":true,"reduce_bucket_size":3e8,"contiguous_gradients":true}Zero-3(optimizer-state+gradient+model-paramsshard)"zero_optimization":{"stage":3,"offload_optimizer":{"device":"cpu","pin_memory":true},"offload_param":{"device":"cpu","pin_memory":true},"overlap_comm":true,"contiguous_gradients":true,"sub_group_size":1e9,"reduce_bucket_size":1e6,"stage3_prefetch_bucket_size":4e6,"stage3_param_persistence_threshold":1e4,"stage3_max_live_parameters":1e9,"stage3_max_reuse_distance":1e9,"stage3_gather_16bit_weights_on_model_save":true},ZeRO-3中不使用allgather_partitions、allgather_bucket_size和reduce_scatter配置参数

"offload_optimizer":{"device":"cpu","pin_memory":true},"offload_param":{"device":"nvme","pin_memory":true}

THE END
1.TensorFlow实现随机训练和批量训练的方法python本篇文章主要介绍了TensorFlow实现随机训练和批量训练的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 TensorFlow更新模型变量。它能一次操作一个数据点,也可以一次操作大量数据。一个训练例子上的操作可能导致比较“古怪”的学习过程,但使用大批量的训练会造成计算成本昂贵。到底选用https://www.jb51.net/article/139083.htm
2.[PyTorch]批量训练数据的一个流程使用的时候,因为是批量的数据,所以要有一个pack进行压包操作,做完了还要有一个pad解包操作。解包操作pad的第一个第一个返回值ouput就是gru每一步的输出维度是maxLen * batchSize * hiddenSize,第二个返回值就是这个batch里面每个句子的单词数目是一个一维tensor,和传入到Pack的第二个参数感觉一毛一样,如tensorhttps://www.jianshu.com/p/a06a6042d680
3.(83)批量训练和随机训练batchtraining批量训练(Batch Training)和随机训练(Stochastic Training)是深度学习中两种不同的训练策略。 8.3.1 批量训练的概念 1.批量训练(Batch Training) 批量训练是指在每一次参数更新时,将整个训练数据集分成多个批次(小部分数据),然后使用每个批次的数据来计算梯度并更新模型参数。批量训练可以更好地利用硬件加速,如GPU,因为https://blog.csdn.net/asd343442/article/details/135639960
4.神经网络为什么每次训练小批量数据神经网络批量训练原理为什么要使用批量归一化? 使用浅层模型时,随着模型训练的进行,当每层中参数更新时,靠近输出层的输出较难出现剧烈变化。对深层神经网络来说,随着网络训练的进行,前一层参数的调整使得后一层输入数据的分布发生变化,各层在训练的过程中就需要不断的改变以适应学习这种新的数据分布。所以即使输入数据已做标准化,训练中https://blog.51cto.com/u_12995/9856087
5.GPU捉襟见肘还想训练大批量模型?谁说不可以机器之心深度学习模型和数据集的规模增长速度已经让 GPU 算力也开始捉襟见肘,如果你的 GPU 连一个样本都容不下,你要如何训练大批量模型?通过本文介绍的方法,我们可以在训练批量甚至单个训练样本大于 GPU 内存时,在单个或多个 GPU 服务器上训练模型。 深度学习模型和数据集的规模增长速度已经让 GPU 算力也开始捉襟见肘https://www.jiqizhixin.com/articles/2018-10-17-11
6.LLaMAFactory全面指南:从训练到部署训练配置:在这里,你可以设置训练参数,如学习率、批量大小、训练轮数等。 微调配置:如果你正在进行微调,可以在这里设置微调的特定参数,如LoRA的秩、学习率等。 推理配置:在进行推理时,你可以设置生成文本的长度、温度、top-p等参数。 日志和监控:训练和微调过程中的日志信息会实时显示在这里,帮助你监控训练进度和性https://www.skycaiji.com/aigc/ai21379.html
7.四分钟内就能训练目标检测器,商汤基模型团队是怎么做到的?来自商汤的基模型团队和香港大学等机构的研究人员提出了一种大批量训练算法 AGVM,该研究已被NeurIPS 2022接收。 本文提出了一种大批量训练算法 AGVM (Adaptive Gradient Variance Modulator),不仅可以适配于目标检测任务,同时也可以适配各类分割任务。AGVM 可以把目标检测的训练批量大小扩大到 1536,帮助研究人员四分钟训https://m.thepaper.cn/newsDetail_forward_20728146
8.2024年人工智能(AI)训练师职业技能鉴定考试题库(浓缩500题).docxPAGE PAGE 12024年人工智能AI训练师职业技能鉴定考试题库浓缩500题一单选题1.在机器学习领域,监督学习常用于训练哪种类型的机器人A自适应机器人B自主机器人C有教师指导的机器人D强化学习机器人答案:C2.哪个指标用于衡量分类模https://www.renrendoc.com/paper/343440631.html
9.基于点云卷积神经网络的蛋白质柔性预测与Qi等的模型不同的是,不同的蛋白质结构所含有的原子数量不均一、数据尺寸不规则,为了实现网络的小批量训练方法,提出了一种新的批量化策略,使用大小不等的蛋白质小批量输入对网络进行迭代训练,并采用Pearson相关系数作为模型训练的评价指标。同时,在网络的池化层和空间变换网络部分,采用了最大池化、平均池化串联的https://www.pibb.ac.cn/pibbcn/article/html/20200383?st=article_issue
10.机器学习学习笔记(21)深度学习中的正则化腾讯云开发者社区对于每个单元,掩码采样是独立采样的。掩码值为1的采样概率(导致包含一个单元)是训练开始前一个固定的超参数。它不是模型当前参数值或输入样本的函数,通常在每一个小批量训练的神经网络中。一个输入单元被包括的概率的0.8,一个隐藏单元被包括的概率为0.5。更正式的说,假设一个掩码向量https://cloud.tencent.com/developer/article/1327181
11.TF2.0深度学习实战(一):分类问题之手写数字识别train_dataset=train_dataset.batch(32).repeat(10)# 设置批量训练的batch为32,要将训练集重复训练10遍 3.2 网络结构搭建 由于MNIST数据集里的图像特征较为简单,所以本次以搭建一个3层的全连接网络为例,来实现MNIST数据集10分类任务。其中,每个全连接层的节点数分别为:256,128和10。 https://www.flyai.com/article/629
12.上海交大樊昕昱何祖源课题组在计算重构光谱测量技术取得重要上海交通大学智能光子学研究中心樊昕昱教授、何祖源教授团队针对这一问题提出了联合物理模型与数据驱动的光谱重建神经网络,仅需10μs时间下获得的小批量训练数据集即可完成具有2300个频谱输出通道的光谱重构神经网络的训练,且实现了3.2fm的分辨率。 联合物理模型与数据驱动的神经网络结构及训练数据:(a) 系统传输矩阵,(bhttps://news.sjtu.edu.cn/jdzh/20230805/186848.html