大模型ChatGLM Lora微调的参数详探- 多卡版本

多显卡训练深度学习,nvidia-smi中有一个volatile gpu util,现在batch size很小,显存很充足,volatile gpu util已经能达到很充足很高的利用率。现在有必要加大batch size的数量吗? 为什么加大batch size之后xxit/s这个数值反而变小了,你知道这个数值是什么意思嘛?是不是每条数据/s的意思?

在深度学习训练中,batch size的设置是一个很重要的超参数。以下是对于你问题的一些回答:

  1. 首先,volatile gpu util表示的是GPU的计算资源利用率,而不是显存利用率。它越高,代表GPU的计算能力被更好地利用了。在你的情况下,这个指标已经很高,说明你的GPU计算能力已经被很好地利用。

  2. 那么是否还需要增大batch size呢?这并不是一个简单的问题,因为batch size的大小会影响模型的学习效果。如果你的模型已经能够达到你期望的精度,那么没有必要增大batch size。但是,如果你想要尝试提高模型的精度,可能需要试验不同的batch size。

  3. 你提到xxit/s这个数值反而变小了,这个数值通常代表每秒处理的迭代次数或者说批次数。增大batch size后,因为每一次迭代需要处理更多的数据,所以迭代速度可能会变慢,导致每秒处理的迭代次数下降。但是每次迭代处理的数据量增大,可能在相同的时间内总体处理的数据量更大,所以并不意味着训练效率一定下降。

  4. 不同的深度学习框架可能会有不同的命名规则,一般来说,xxit/s是每秒钟处理的批次(batch)数量,而不是每秒处理的数据条数。一次迭代(iteration)通常包含一个批次的数据。

总的来说,增大batch size可能会提高硬件的利用率,加快训练速度,但也可能会导致收敛性变差,影响模型性能。因此,选择合适的batch size需要根据具体情况进行试验和调整。

一批次的数据是多少,怎么计算的

在深度学习中,一批次(Batch)的数据是由我们自己设定的。Batch size就是用来指定一批次包含多少样本的。

具体来说,当我们对一个深度学习模型进行训练时,我们通常会有一个很大的数据集。我们不会一次将所有数据全部输入到模型中进行训练,而是将数据集分割成一批一批的,每一批包含一定数量的样本,然后将每一批数据逐一输入到模型中进行训练。这个"一批"包含的样本数就是batch size。

比如,如果我们有1000个样本的数据集,我们可以设置batch size为100,那么我们就会将数据集分成10批,每批包含100个样本,然后逐一将这10批数据输入到模型中进行训练。

在实践中,batch size的设定需要平衡计算效率和模型性能。较大的batch size可以更充分利用硬件资源,提高计算效率,但可能会影响模型的学习效果。而较小的batch size可能会使模型学习更稳定,但计算效率较低。因此,选择合适的batch size通常需要根据具体情况进行实验和调整。

volatile gpu util是不是代表stream multiprocessor的意思

不完全是的。Volatile GPU Util,顾名思义,代表了GPU的使用率(Utilization)。这是一个用于描述GPU正在执行工作的程度的指标。一般来说,这个指标越高,说明GPU的计算能力被更充分地利用。

在NVIDIA的GPU架构中,Stream Multiprocessor (SM)是GPU内部的一个重要组件,每个SM都包含了一定数量的ALU(算术逻辑单元)、缓存和寄存器等资源。当GPU在进行并行计算时,各个SM会被分配一定数量的线程块(Thread Block),然后独立地执行这些线程块。

因此,Volatile GPU Util可以被理解为GPU中的SM被使用的程度。但它不等同于SM本身,更不能说Volatile GPU Util就是代表SM。Volatile GPU Util是一个度量指标,而SM是一个硬件组件。

  1. torchrun --nnodes=1 --nproc_per_node=2:这是torchrun命令的参数,用于启动分布式训练。--nnodes=1表示你在一台机器(节点)上运行训练。--nproc_per_node=2表示你在这台机器上启动两个训练进程。

  2. src/train_sft.py:这是你要运行的训练脚本的路径。

  3. --output_dir bjls_train_5e_4:这是你的模型和训练日志的输出目录。

  4. --do_train:这是一个标志,表示你要进行模型训练。

  5. --finetuning_type lora:这是你的微调类型,这里设为了"lora"。

  6. --dataset bjls_train:这是你要用于训练的数据集。

  7. --overwrite_cache:这是一个标志,表示如果你的缓存中已经存在预处理过的数据集,那么这个标志会让你的程序忽略这些数据,重新预处理数据。

  8. --per_device_train_batch_size 2:每个设备(如GPU)上的训练批次大小为2。

  9. --gradient_accumulation_steps 2:这是梯度累积步数,也就是每2步进行一次参数更新。

  10. --lr_scheduler_type cosine:学习率调度器的类型,这里设为了"cosine"。

  11. --logging_steps 10:每10步打印一次日志。

  12. --save_steps 1000:每1000步保存一次模型。

  13. --learning_rate 5e-4:设置学习率为0.0005。

  14. --num_train_epochs 100.0:设置训练的总轮数(epoch)为100。

  15. --lora_rank 32:设定LoRA的rank值为32。

  16. --ddp_find_unused_parameters False:分布式数据并行训练时,是否查找未使用的参数,这里设为了False。

  17. --plot_loss:这是一个标志,表示你要绘制损失曲线。

  18. --fp16:这是一个标志,表示你使用16位浮点数进行训练,这可以减少显存使用并加速训练,但可能会稍微影响精度。

  19. --use_v2:这个参数可能特定于你的训练脚本,可能是指使用某种版本的模型或者训练策略,具体含义需要参考train_sft.py脚本中的定义。

以上解释基于我对这些参数通用含义的理解,具体的参数含义和行为可能会根据你使用的脚本和库有所不同。如果需要具体的信息

为什么我的电脑只有唯一一个GPU的时候,--per_device_train_batch_size参数最多加到2, 但当我有两个GPU了,用torchrun分布式计算的时候,--per_device_train_batch_size这个参数可以加到32或更大?

这个现象的出现可能与你的GPU内存有关。在深度学习训练中,模型参数、激活函数值、梯度值等都需要存储在GPU内存中,而每一个批次的大小就决定了一次需要处理和存储多少数据。当你增大--per_device_train_batch_size参数时,意味着每个GPU需要同时处理更多的数据,这会消耗更多的GPU内存。如果GPU内存不足,就会导致程序出错或者崩溃。

当你从一个GPU增加到两个GPU时,可以理解为你的总GPU内存翻倍了(假设两个GPU的内存大小相同)。因此,你可以处理的数据量也大约翻倍了。所以,在多GPU的情况下,你可以将每个GPU上的批次大小设得更大。

此外,使用torchrun进行分布式训练时,还会使用到一些优化策略,例如梯度累积和模型并行,这些策略可以进一步减少单个GPU上需要存储的数据量,从而允许更大的批次大小。

需要注意的是,虽然更大的批次大小可以提高计算效率,但并不一定能得到更好的模型性能,因为批次大小会影响模型的学习过程和最终性能。所以选择适当的批次大小是一个需要权衡的问题。

为什么在多GPU的情况下,可以将每个GPU上的批次大小设得更大。--per_device_train_batch_size这个参数不是平均加到每一块GPU吗,理论上无论多少GPU,该值都应该相同不是吗。

对不起,我之前的回答可能造成了一些混淆。你的理解是正确的。参数--per_device_train_batch_size是指每块GPU上的批次大小,所以它并不会因为GPU数量的增加而增加。无论是单个GPU还是多个GPU,每块GPU上的批次大小都应该是这个值。

所以,如果你发现当有多个GPU时,可以将--per_device_train_batch_size设得更大,那可能与你的训练设置有关,例如使用了数据并行(Data Parallel)或模型并行(Model Parallel)等技术。这些技术能够使得每块GPU上的数据和计算量减少,从而允许更大的批次大小。

我要强调的是,尽管增加了GPU的数量,每块GPU的内存容量是不变的。因此,每块GPU能够处理的数据量(也就是批次大小)也应该是有限的。如果你发现在增加GPU数量后可以显著增加批次大小,可能是因为你的训练策略有所调整,或者你的程序在分配数据和计算任务时做了优化。

猜你喜欢

转载自blog.csdn.net/sinat_37574187/article/details/131542680