万万哇 发表于 2024-7-23 05:03:41

一文实现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)。共三种环境。
https://img-blog.csdnimg.cn/direct/60ea5629539d497aa15ac71648590154.png
二、可能遇到的标题
1. 输入xtuner train命令训练时,报错“RuntimeError: operator torchvision::nms does not exist”
https://img-blog.csdnimg.cn/direct/d4726fb703f2444d96a1c27c3ff69ad7.pnghttps://img-blog.csdnimg.cn/direct/ab0499b7fbf34c72b5c05db8297715ac.png
原因:torchvision版本有标题
办理:通过“conda update torchvision -c pytorch”命令再次更新
https://img-blog.csdnimg.cn/direct/7c795922492842f1be5d34c4a93783ff.png
如果再次报错,可以尝试“pip install --upgrade torchvision”再次更新,安装成功
https://img-blog.csdnimg.cn/direct/79167a6c7470438782fc77ae8d71e6ac.png

2.训练时,纵然用了deepspeed参数,仍旧报错out of memory
https://img-blog.csdnimg.cn/direct/26b8a456c8014763a81ec338878c2a55.png
原因:显存不够
思路一:用lmdeploy里的量化技能。结果:不可行。因为该训练命令是在xtuner框架下的,不支持。
思路二:修改deepspeed的参数命令如下:
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模型,会报错。
https://img-blog.csdnimg.cn/direct/6acdc7b8640d4f6d910863d8f22607de.png
办理:再次添加教程里的export命令即可(解释见Q&A)
3.用24g显存训练了4小时30分钟左右,日志显示保存pth文件成功。但现实文件找不到。
https://img-blog.csdnimg.cn/direct/137df8294417446287ead2e372a2e339.png
办理:云盘空间不足,自动删除了,当时是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”https://img-blog.csdnimg.cn/direct/9dc234ef3cfd4c2e83ff574e76960347.png
办理:把参数deepspeed_zero3改为deepspeed_zero2,即可通过
https://img-blog.csdnimg.cn/direct/e102806c4ac24e8dbab611f14e2c66d7.png
原理,因为前者会过多把一些数据(如张量)分拆到CPU处理,导致报错

三、测试效果
1.正常训练跑通后,如图
https://img-blog.csdnimg.cn/direct/4a32ffbd93d2496692a6fb149179bfc7.png
——显存24g时消耗19714MB,训练所需时间为4小时30分钟。
https://img-blog.csdnimg.cn/direct/4309f47abfef4c4cad13f31c71a01635.png
——在单卡 A100 80g上, 操作教程中,训练过程所需显存约为44447 MiB,所需时间为30分钟。而本文实操时, 训练过程所需显存约为35000 MB左右,20分钟完毕
https://img-blog.csdnimg.cn/direct/abd828e2d1d9485298660c0591374e27.png
——在双卡 A100 2*80g上, 本文实操44447 MiB,所需时间为30分钟(1.比上文的35000 MB多,资源有限,无法再试多几次,暂作记载。2.关于怎样提速发挥双卡效用,可看下文的QA)
https://img-blog.csdnimg.cn/direct/7a97418be23f454d865e17a8a7c227eb.png
2.推理运行时,
——显存24g时,未测试
——在单卡 A100 80g上或在双卡 A100 2*80g上,总消耗显存都在22000MB左右
(提醒注意,双卡时,训练时是集中在一卡上,而推理时则匀称分摊到2卡上。估计前者是默认,后者未知是人为代码设置还是默认)
https://img-blog.csdnimg.cn/direct/de92c37e721d490281ab8f928a5cf7b9.png
微调后的推理效果大致如下(补充说明,输入图片后,该模型可以描述该图片并答复用户标题;而微调前的效果,如操作步调教程所说,只能重复打标签,无法详细说明图片)
https://img-blog.csdnimg.cn/direct/4dba2cbc9aea4c23bad87c9690ce2af3.png
四、部门Q&A
1.简单介绍一下deepspeed
DeepSpeed是一个由微软开辟的深度学习优化库,旨在提高大规模模型训练的效率和可扩展性。以下是关于DeepSpeed的详细介绍:
——功能:


[*]零梯度同步(Zero Redundancy Optimizer, Zero-3):允许差别GPU之间异步更新权重,显著淘汰了通信开销,提高了大规模分布式训练的速率。
[*]混淆精度训练:通过低落浮点精度来加速盘算,同时保持模型的准确度,使得训练可以在更少的时间内完成。
[*]模型并行与数据并行:结合了模型并行和数据并行,能够处理超大规模的模型,纵然在单个节点上也能有用管理多GPU的训练。
[*]ZeRO-Inference:除了训练阶段的优化,还提供了ZeRO-Inference,一个用于推理阶段的优化器,淘汰内存占用,提高推理速率。
[*]显存优化:DeepSpeed的核心思想在于当GPU显存不够时,可以使用CPU内存来补充。这允许训练更大的模型,纵然在没有大量GPU显存的环境下。
——优劣点:


[*]长处:

[*]显著提高了大规模模型训练的效率和可扩展性。
[*]提供了多种优化策略,如零梯度同步、混淆精度训练等,以加速训练过程并保持模型性能。
[*]易于使用,具有清晰的代码结构和细致的文档。

[*]缺点:

[*]由于其高度复杂性和对体系资源的依赖,可能需要较高的学习资本来掌握其使用。
[*]在某些特定硬件或操作体系上可能存在兼容性标题。

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


[*]配置标题:DeepSpeed的配置相对复杂,需要正确设置各种参数和选项才能充实发挥其上风。如果配置不当,可能会导致性能降落或训练失败。
[*]版本兼容性:DeepSpeed可能与你当前使用的深度学习框架(如PyTorch)的版本不完全兼容。因此,在使用之前,请确保你已经安装了正确版本的PyTorch和DeepSpeed。
[*]体系资源限定:虽然DeepSpeed可以优化内存和显存的使用,但它仍旧受到体系资源的限定。如果你的体系资源不足(如CPU内存、磁盘空间等),可能会导致训练失败或性能降落。
[*]模型和数据标题:在使用DeepSpeed举行训练之前,请确保你的模型和数据已经经过得当的预处理和预备。否则,可能会导致训练过程中出现标题。
2. 使用deepspeed时,遇到内存不够可以有哪些办理思路。

[*]检查并理解配置文件:首先,打开 deepspeed_zero.json 或其他 DeepSpeed 配置文件,并理解此中各项设置的作用。
[*]调整 ZeRO 设置:在配置文件中,找到与 ZeRO 相干的设置,如 stage(ZeRO 阶段)、optimizer_state_sharding(优化器状态分片)等。根据你的硬件资源,尝试调整这些设置来淘汰内存和显存的使用。
[*]调整模型和数据并行参数:在配置文件中,还可以找到与模型和数据并行相干的参数,如 train_batch_size、train_micro_batch_size_per_gpu、gradient_accumulation_steps 等。得当调整这些参数可以影响训练过程中内存和显存的使用。
[*]使用混淆精度训练:如果配置文件中包含混淆精度训练的设置(如 fp16 或 bfloat16),确保它们已正确启用并配置。混淆精度训练可以通过淘汰浮点数的精度来低落显存的使用。
[*]渐渐尝试:每次只调整一个或少数几个参数,并重新运行训练命令以检察效果。这样可以资助你更准确地确定哪些设置对办理标题有资助。
[*]查阅文档和社区支持:如果以上步调都不能办理标题,建议查阅 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:PyTorch 是一个开源的 Python 呆板学习库,用于天然语言处理、盘算机视觉等任务。它提供了大量的构建深度学习模型所需的工具,包罗张量盘算(雷同于 NumPy)、自动微分(用于构建和优化神经网络)、丰富的神经网络库、优化算法等等。
[*] torchvision:torchvision 是 PyTorch 的一个扩展库,提供了流行的数据集、模型架构和图像变动等,使得人们可以更容易地处理盘算机视觉任务。torchvision 的 datasets 模块包含了一些常用的数据集(如 ImageNet、CIFAR10 等),models 模块则包含了一些预训练的模型(如 AlexNet、VGG、ResNet、MobileNet 等)。别的,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)上举行训练,其训练时间可能会有所差别,但详细差别和原因取决于多个因素。

[*] 显存大小与训练时间:

[*]在理论上,仅仅因为显存大小的差别,并不直接决定训练时间的长短。如果模型只需要22G显存,那么理论上在40G、80G或2×80G的显存上训练时间应该是相近的,因为都足够满意模型的需求。
[*]然而,在现实环境中,显存大小可能会间接影响训练时间。比方,更大的显存允许使用更大的batch size,这可能会提高GPU的使用率,从而淘汰单位数据的训练时间。但是,这并不意味着总训练时间会淘汰,因为总训练量(即迭代次数)通常是由数据集大小和batch size共同决定的。

[*] 多GPU与训练时间:

[*]当使用2×80G显存(即两个具有80G显存的GPU)时,可以通过数据并行或模型并行来加速训练。数据并行意味着将数据集分成两部门,每个GPU处理一部门数据,然后归并结果。这可以显著低落每个迭代的时间,因为两个GPU同时工作。
[*]然而,使用多GPU也会引入一些额外的开销,如数据在GPU之间的传输、结果的归并等。因此,现实加速比可能并不完全即是GPU的数量。参考多卡跑深度学习 多卡训练效果不如单卡_mob64ca140d2323的技能博客_51CTO博客

[*] 其他因素:

[*]除了显存大小和GPU数量外,还有很多其他因素可能影响训练时间,如CPU频率、内存读写速率、磁盘I/O速率、网络带宽等。
[*]别的,深度学习框架、优化器、学习率等超参数的选择也会对训练时间产生影响。

总结,就硬件而言,显存本身的结构是否更新更先进,是告急因素,而不是容量大小。
5.扩容显存后怎样加快训练?加快推理的话呢?答复时注意2点:1)加快步伐必须和扩容相干,否则视为不需要扩容,也能采取这些步伐。2)扩容有2种,1种是小卡换大卡,针对1张卡的环境,另一种是增加卡,比如原来1卡,增加2卡?
针对您提出的标题,以下是关于扩容显存后怎样加快训练和推理的解答:
一、扩容显存后加快训练的步伐

[*]优化模型结构:

[*]增大显存后,可以尝试使用更复杂的模型结构,如增加网络层数或神经元数量,以提高模型的体现本领。
[*]精简模型结构,去除冗余层或神经元,以淘汰盘算量和显存占用,同时保持模型性能。

[*]调整批量大小(Batch Size):

[*]扩容显存后,可以尝试增加批量大小,以提高GPU的使用率和训练速率。但需要注意,过大的批量大小可能导致显存不足或其他标题。
[*]渐渐增加批量大小,找到最佳的平衡点,以实现训练速率和显存占用的最佳组合。

[*]使用混淆精度训练:

[*]混淆精度训练是一种有用低落显存占用的方法,它使用差别精度的数据范例举行训练,如FP16或FP32与FP16的混淆。
[*]扩容显存后,可以尝试使用混淆精度训练来加快训练速率,同时保持模型性能。

[*]使用多个GPU:

[*]如果扩容是通过增加显卡数量实现的,可以使用多个GPU举行并行盘算,以加快训练速率。
[*]使用深度学习框架提供的多GPU训练功能,如TensorFlow的tf.distribute.Strategy或PyTorch的DataParallel/DistributedDataParallel等。

[*]优化数据加载和预处理:

[*]使用高性能的数据加载和预处理库,如PyTorch的Dataloader或TensorFlow的tf.data等。
[*]配置得当的num_workers和pin_memory等参数,以提高数据加载和传输的效率。

二、扩容显存后加快推理的步伐

[*]使用更高效的模型:

[*]扩容显存后,可以尝试使用更高效的模型举行推理,如使用剪枝、量化等技能优化模型大小和盘算量。
[*]选择得当当前任务的模型结构,避免过度复杂的模型导致推理速率过慢。

[*]批量推理:

[*]雷同于训练时的批量处理,推理时也可以接纳批量推理的方式,以提高GPU的使用率和推理速率。
[*]但需要注意,批量推理可能增加额外的盘算和内存开销,需要衡量利弊。

[*]使用多个GPU:

[*]如果扩容是通过增加显卡数量实现的,可以使用多个GPU举行并行推理,以加快推理速率。
[*]使用深度学习框架提供的多GPU推理功能,如TensorFlow的tf.distribute.Strategy或PyTorch的DataParallel/DistributedDataParallel等。

[*]优化代码和库:

[*]使用高性能的推理库和工具,如TensorRT、ONNX Runtime等。
[*]优化代码实现,淘汰不必要的内存占用和盘算开销。

总结:扩容显存后加快训练和推理的关键在于提高显存的使用率和盘算效率。通过优化模型结构、调整批量大小、使用混淆精度训练、使用多个GPU等方法,可以充实使用扩容后的显存资源,实现更快的训练和推理速率。同时,也需要注意平衡资源使用率和盘算效率之间的关系,以达到最佳的性能体现。
6.训练成功后,看到天生的pth文件并没有大到会爆了硬盘空间的程度,为什么硬盘扩容前会磁盘空间不足保存模型失败,非得厥后扩容才保存pth文件成功?
如果在硬盘扩容前尝试保存pth文件但遭遇磁盘空间不足的错误,而扩容后成功保存了该文件,这通常是由于以下几个原因:

[*]磁盘空间分配和可用空间:在操作体系中,纵然文件的大小远小于整个磁盘的容量,也可能因为磁盘上其他文件或文件夹占用了大量空间,导致没有足够的连续空间来保存新文件。比方,一个5GB的文件可能无法在一个总容量为10GB但已有多个小文件占据大部门非连续空间的磁盘上保存。
[*]文件体系和碎片:文件体系可能会因为频繁的文件创建、删除和修改而产生碎片。这些碎片会低落磁盘空间的使用效率,纵然从总容量上看还有足够的空间,也可能因为无法找到足够大的连续空间块来保存新文件。
[*]暂时文件和其他数据:在训练过程中,可能会产生大量的暂时文件、日志文件或其他与训练相干的数据。这些数据可能会占用大量的磁盘空间,导致没有足够的空间来保存终极的模型文件(pth文件)。
[*]其他应用程序和体系历程:其他正在运行的应用程序和体系历程也可能占用大量的磁盘空间。这些历程可能会锁定某些文件或文件夹,导致无法释放空间来保存新文件。
当硬盘扩容后,你有更多的连续空间来保存文件,因此纵然pth文件本身并不大,也能够成功保存。别的,扩容后可能还有助于淘汰文件碎片、释放被暂时文件或其他数据占用的空间,从而进一步提高磁盘空间的使用效率。
为了避免未来再次遇到磁盘空间不足的标题,你可以思量以下方法:


[*]定期清理暂时文件、日志文件和其他不必要的文件。
[*]使用磁盘碎片整理工具来淘汰文件碎片,提高磁盘空间的使用效率。
[*]监控磁盘使用环境,确保有足够的空间来保存告急的文件和数据。
[*]在可能的环境下,将大型文件或数据集存储在外部硬盘、网络存储或其他存储介质上,以释放本地磁盘空间。
7.怎样预估训练时要用的硬盘空间,之前出现过硬盘扩容前会磁盘空间不足保存模型失败的例子。
要预估训练时所需的硬盘空间,可以依照以下步调和思量因素,以确保有足够的空间来保存模型和其他相干文件:

[*]评估模型大小:

[*]相识你的模型在训练完成后大致会占用多少空间。这通常取决于模型的复杂性和参数数量。比方,深度学习模型可能会天生数百MB到数GB的pth文件。

[*]思量检查点(Checkpoints):

[*]在训练过程中,你可能会保存多个检查点文件,以便在需要时恢复训练或举行模型评估。这些文件也会占用额外的空间。预估你将保存多少个检查点以及每个检查点的大小。

[*]日志和暂时文件:

[*]训练过程中可能会天生大量的日志文件和暂时文件。这些文件可能会占用相称大的空间,尤其是在长时间运行的训练中。思量这些文件可能占用的空间,并确定是否需要定期清理它们。

[*]数据集:

[*]确保你有足够的空间来存储训练数据集、验证数据集和测试数据集(如果实用)。这些数据集可能会占用大量的磁盘空间,特殊是在处理大型图像、视频或文本数据时。

[*]依赖库和代码:

[*]思量你的项目依赖的库和代码所需的磁盘空间。虽然这些通常不是主要的存储需求,但在某些环境下,它们可能会占用一些空间。

[*]预留空间:

[*]预留一些额外的磁盘空间以应对不可预见的环境。这可以确保你在训练过程中不会因为磁盘空间不足而遇到标题。

[*]监控磁盘使用环境:

[*]在训练过程中定期监控磁盘使用环境。这可以资助你及时发现磁盘空间不足的标题,并采取相应的步伐来释放空间或增加存储容量。

对于你提到的案例,如果之前硬盘扩容前会磁盘空间不足保存模型失败,你可以按照以下步调举行预估和规划:

[*]检察之前的训练日志:

[*]回首之前的训练日志,相识在训练过程中天生了哪些文件以及它们的大小。这可以资助你估算在雷同训练中将使用的磁盘空间。

[*]评估模型大小和检查点:

[*]根据你的模型架构和训练策略,预估模型大小和检查点文件的大小。思量你筹划保存的检查点数量。

[*]盘算总需求:

[*]将模型大小、检查点文件大小、日志和暂时文件大小以及数据集大小相加,得出总磁盘空间需求。

[*]比力与当前磁盘空间:

[*]将总磁盘空间需求与当前可用的磁盘空间举行比力。如果当前空间不足,思量清理不必要的文件、增加存储容量或优化存储策略。

[*]制定存储策略:

[*]根据你的需求和可用资源,制定符合的存储策略。比方,你可以定期清理旧的检查点文件和日志文件,以释放磁盘空间。或者,你可以思量使用外部存储或云存储来保存大型数据集和模型文件。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 一文实现Llama 3 图片理解本领微调(XTuner+LLaVA 版)