qidao123.com技术社区-IT企服评测·应用市场

标题: 一文实现Llama 3 图片理解本领微调(XTuner+LLaVA 版) [打印本页]

作者: 万万哇    时间: 2024-7-23 05:03
标题: 一文实现Llama 3 图片理解本领微调(XTuner+LLaVA 版)
本次实行基于 Llama3-8B-Instruct 和 XTuner 团队预训练好的 Image Projector 微调本身的多模态图文理解模型 LLaVA。实行平台为InternStudio,实行所用的显存为24G。
=============目录============
一、总体步调
二、可能遇到的标题
三、测试效果
四、部门Q&A
=============正文============
一、总体步调
参考Llama3-Tutorial/docs/llava.md at main · kv-chiu/Llama3-Tutorial · GitHub
本文实现时用的是24G显存。别的,也测试了80g(1卡A100),2*80g(2卡A100)。共三种环境。

二、可能遇到的标题
1. 输入xtuner train命令训练时,报错“RuntimeError: operator torchvision::nms does not exist”

原因:torchvision版本有标题
办理:通过“conda update torchvision -c pytorch”命令再次更新

如果再次报错,可以尝试“pip install --upgrade torchvision”再次更新,安装成功


2.训练时,纵然用了deepspeed参数,仍旧报错out of memory

原因:显存不够
思路一:用lmdeploy里的量化技能。结果:不可行。因为该训练命令是在xtuner框架下的,不支持。
思路二:修改deepspeed的参数命令如下:
  1. xtuner train /root/Llama3-Tutorial/configs/llama3-llava/llava_llama3_8b_instruct_qlora_clip_vit_large_p14_336_lora_e1_finetune.py --work-dir /root/model/llama3_llava_pth --deepspeed deepspeed_zero2_offload
复制代码
结果:可行(原理解释参照下文的第四部门Q&A)
3.测试没有添加export命令,直接跑xtuner 运行llava模型,会报错。

办理:再次添加教程里的export命令即可(解释见Q&A)
3.用24g显存训练了4小时30分钟左右,日志显示保存pth文件成功。但现实文件找不到。

办理:云盘空间不足,自动删除了,当时是45g。扩容到75g后重跑即可。
总结教训:这个实在黑白常惨重的教训。花了了很长时间去训练的模型前功尽弃。
延伸标题:
1)怎样预估训练时要用的硬盘空间(乃至内存、显存、时间等资源)
2)后续成功后,看到天生的pth文件并没有大到会爆了硬盘空间的程度,为什么仍旧会磁盘空间不足?
(见Q&A)
4.用2*80g(2卡A100)和80g(A100)运行训练时,报错“typeError: All input tensors need to be on the same GPU, but found some tensors to not be on a GPU”

办理:把参数deepspeed_zero3改为deepspeed_zero2,即可通过

原理,因为前者会过多把一些数据(如张量)分拆到CPU处理,导致报错

三、测试效果
1.正常训练跑通后,如图

——显存24g时消耗19714MB,训练所需时间为4小时30分钟。

——在单卡 A100 80g上, 操作教程中,训练过程所需显存约为44447 MiB,所需时间为30分钟。而本文实操时, 训练过程所需显存约为35000 MB左右,20分钟完毕

——在双卡 A100 2*80g上, 本文实操44447 MiB,所需时间为30分钟(1.比上文的35000 MB多,资源有限,无法再试多几次,暂作记载。2.关于怎样提速发挥双卡效用,可看下文的QA)

2.推理运行时,
——显存24g时,未测试
——在单卡 A100 80g上或在双卡 A100 2*80g上,总消耗显存都在22000MB左右
(提醒注意,双卡时,训练时是集中在一卡上,而推理时则匀称分摊到2卡上。估计前者是默认,后者未知是人为代码设置还是默认)

微调后的推理效果大致如下(补充说明,输入图片后,该模型可以描述该图片并答复用户标题;而微调前的效果,如操作步调教程所说,只能重复打标签,无法详细说明图片)

四、部门Q&A
1.简单介绍一下deepspeed
DeepSpeed是一个由微软开辟的深度学习优化库,旨在提高大规模模型训练的效率和可扩展性。以下是关于DeepSpeed的详细介绍:
——功能:

——优劣点:

——使用时容易犯错的地方:

2. 使用deepspeed时,遇到内存不够可以有哪些办理思路。
3. 使用deepspeed时,为什么上文中添加了offload能办理内存不够的标题
offload的作用主要是将一部门模型的状态(Model States)或激活值(Activation)从GPU显存中卸载(offload)到CPU内存或硬盘上,从而节省GPU显存的使用。这是因为相比GPU,CPU的内存通常更加充裕,而且CPU处理这些数据时虽然速率较慢,但在训练深度学习模型时,这部门盘算通常不是性能瓶颈。
详细来说,offload可以资助办理在训练大模型时遇到的显存不足的标题。当模型的规模很大,或者批次大小(batch size)设置得很大时,显存的占用会迅速增加,导致训练无法举行。通过使用offload,可以将一部门数据从GPU显存中移动到CPU内存或硬盘上,从而释放显存,使得训练可以继承举行。
同时,需要注意的是,虽然offload可以节省显存,但它也可能会带来一些性能上的开销,因为CPU和GPU之间的数据传输速率通常比GPU内部的数据传输速率慢。因此,在使用offload时,需要衡量显存节省和性能开销之间的关系,选择符合的配置参数。
熟悉误区
——”DeepSpeed的核心思想在于当GPU显存不够时,可以使用CPU内存来补充”,意味着DeepSpeed有本领将部门数据从GPU显存转移到CPU内存。但是,这并不等同于--deepspeed deepspeed_zero命令直接实行数据迁徙的操作。
详细来说,--deepspeed deepspeed_zero是DeepSpeed框架的一个功能,它实现了ZeRO(Zero Redundancy Optimizer)技能。ZeRO技能通过模型参数、优化器状态等的分片,以及使用CPU内存来存储这些分片,从而达到优化显存使用的目的。在这个过程中,数据(如模型参数、优化器状态等)可能会根据需要被从GPU显存转移到CPU内存。
而offload是DeepSpeed中的另一个功能,它更加明确地将某些数据(如激活值)从GPU显存卸载到CPU内存或硬盘上,以进一步节省显存。
以是,虽然--deepspeed deepspeed_zero和offload都涉及到将数据从GPU显存转移到CPU内存的操作,但它们的实现方式和应用场景有所差别。--deepspeed deepspeed_zero主要是通过ZeRO技能来实现显存优化,而offload则更加专注于在训练过程中动态地将数据从显存卸载到CPU内存或硬盘上。
——““DeepSpeed将当前时刻,训练模型用不到的参数,缓存到CPU中,等到要用到了,再从CPU挪到GPU。这里的“参数”,不仅指的是模型参数,还指optimizer、梯度等。 越多的参数挪到CPU上,GPU的负担就越小;但随之的代价就是,更为频繁的CPU,GPU交互,极大增加了训练推理的时间开销”,这个说法不完全准确。
首先,DeepSpeed和ZeRO确实不是直接将全部的模型参数、优化器状态或梯度从GPU“挪到”CPU。相反,ZeRO技能通过分片(sharding)的方式,在多个GPU之间分散存储这些参数和状态,同时可能使用CPU内存来存储那些当前不需要直接参与盘算的数据。
详细来说,ZeRO有几个差别的阶段(stage),每个阶段都决定了哪些数据应该被分片以及怎样分片。比方,在ZeRO Stage 1中,模型参数本身会被分片并分散到差别的GPU上,但优化器状态和梯度仍旧会完备地存储在每个GPU上。而在ZeRO Stage 2或更高的阶段,连优化器状态和梯度也会被分片。
当模型在训练过程中需要访问某些当前不在GPU上的数据时(比如某个分片在另一个GPU上或在CPU内存中),DeepSpeed会负责将这些数据移动到正确的位置。这确实可能涉及CPU和GPU之间的数据传输,但这并不是简单的“挪到”CPU,而是一个更复杂的数据管理和传输过程。
参考资料:
目前最火的大模型训练框架 DeepSpeed 详解来了-CSDN博客
模型并行训练:为什么要用Megatron,DeepSpeed不够用吗? - 知乎 (zhihu.com)
3.能否简单介绍下PyTorch 和 torchvision有何区别

这两个库通常是互补的,PyTorch 提供了深度学习模型的基本构建和优化工具,而 torchvision 则提供了处理盘算机视觉任务所需的额外工具和数据集。因此,在处理盘算机视觉任务时,人们通常会同时安装和使用这两个库。

3.export MKL_SERVICE_FORCE_INTEL=1这个命令有啥用?
export MKL_SERVICE_FORCE_INTEL=1 是在 Unix-like 体系(如 Linux)的 shell 中暂时设置一个环境变量。这个特定的环境变量 MKL_SERVICE_FORCE_INTEL 通常与 Intel 的 Math Kernel Library (MKL) 有关,用于强制某些程序或库使用 Intel 的优化版数学函数,而不是体系默认的数学库。
针对的标题和报错见文章https://blog.csdn.net/weixin_39190382/article/details/134554729

4.假设某模型训练消耗22g显存,那在40g,80g,2*80g显存上训练,时间会有差别吗?详细说说和原因
当模型训练消耗22G显存时,在差别的显存配置(如40G、80G、2×80G)上举行训练,其训练时间可能会有所差别,但详细差别和原因取决于多个因素。
总结,就硬件而言,显存本身的结构是否更新更先进,是告急因素,而不是容量大小。
5.扩容显存后怎样加快训练?加快推理的话呢?答复时注意2点:1)加快步伐必须和扩容相干,否则视为不需要扩容,也能采取这些步伐。2)扩容有2种,1种是小卡换大卡,针对1张卡的环境,另一种是增加卡,比如原来1卡,增加2卡?
针对您提出的标题,以下是关于扩容显存后怎样加快训练和推理的解答:
一、扩容显存后加快训练的步伐
二、扩容显存后加快推理的步伐
总结:扩容显存后加快训练和推理的关键在于提高显存的使用率和盘算效率。通过优化模型结构、调整批量大小、使用混淆精度训练、使用多个GPU等方法,可以充实使用扩容后的显存资源,实现更快的训练和推理速率。同时,也需要注意平衡资源使用率和盘算效率之间的关系,以达到最佳的性能体现。
6.训练成功后,看到天生的pth文件并没有大到会爆了硬盘空间的程度,为什么硬盘扩容前会磁盘空间不足保存模型失败,非得厥后扩容才保存pth文件成功?
如果在硬盘扩容前尝试保存pth文件但遭遇磁盘空间不足的错误,而扩容后成功保存了该文件,这通常是由于以下几个原因:
当硬盘扩容后,你有更多的连续空间来保存文件,因此纵然pth文件本身并不大,也能够成功保存。别的,扩容后可能还有助于淘汰文件碎片、释放被暂时文件或其他数据占用的空间,从而进一步提高磁盘空间的使用效率。
为了避免未来再次遇到磁盘空间不足的标题,你可以思量以下方法:

7.怎样预估训练时要用的硬盘空间,之前出现过硬盘扩容前会磁盘空间不足保存模型失败的例子。
要预估训练时所需的硬盘空间,可以依照以下步调和思量因素,以确保有足够的空间来保存模型和其他相干文件:
对于你提到的案例,如果之前硬盘扩容前会磁盘空间不足保存模型失败,你可以按照以下步调举行预估和规划:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4