最近在试着用LoRA微调llama3-8B,显卡是3090(24G),batch size调到2,gradient accumulation设了8,显存占用大概16G左右。但跑一个epoch要差不多10个小时,感觉不太对劲。我看网上有人用同样配置微调13B都没这么慢。我的数据集大概5万条,max length设了2048,也试过用flash-attention和deepspeed stage2,但速度提升不明显。是不是我哪里配置有问题?还是说这个速度其实是正常的,只是我预期太高了?求有经验的大佬指点一下,或者有什么优化方向可以尝试的?顺便问下,用QLoRA会不会快一些?谢谢!
用LoRA微调7B模型,显存够但训练速度慢得离谱正常吗?
全部回复
共 99 条5万条2048长度这速度真不慢,QLoRA省显存不省时间,想快得换更大卡或砍长度。
你这配置跑这个速度其实不算离谱,5万条2048长度单卡3090本来就要这个时间,网上说13B快的要么数据量小要么没算全epoch。QLoRA能快一些但主要省显存,对速度提升有限,瓶颈还是在序列长度和数据集规模上。建议先确认下是不是真用上了flash-attention,有时候编译版本不对会静默回退,然后试试把max length砍到1024对比下耗时,如果快三倍以上那就正常了。另外deepspeed stage2在小batch下反而可能拖慢速度,关掉纯用原生accelerate跑跑看。
5万条数据、2048长度,单卡3090跑10个小时一个epoch其实不算离谱,网上那些13B的速度多半是拿短文本或小数据集测的,参考价值不大。你试了flash-attention和deepspeed但提升不明显,很可能瓶颈在数据加载和预处理上,可以开--dataloader_num_workers和--prefetch_factor,另外检查下是不是在CPU上做tokenize。QLoRA不会更快,它只省显存,反而因为量化可能慢10%-20%。真要提速建议先降到1024长度看看,或者用packing把短样本拼起来,比折腾并行配置实在。
说实话这个速度确实偏慢但也没到离谱的程度,5万条2048长度单卡3090跑10小时一个epoch,算下来大概每秒处理不到1.5条样本,对于8B模型来说有点卡在IO和计算效率的瓶颈上。你提到flash-attention和deepspeed都试过提升不大,我怀疑瓶颈不在显存或显式优化,而在数据加载和预处理管线,比如tokenize是不是在每次step都重复做,或者dataloader的num_workers设太低导致GPU在等数据。另外你确认一下是不是真的用到了bf16,3090对fp16有加速但bf16在某些kernel上反而更慢,而且LoRA本身低秩更新占计算比例很小,主要时间还是花在base model的前后向传播上,所以QLoRA不会快,反而因为量化反量化额外开销可能更慢。建议你试试gradient checkpointing打开,虽然会增加一点计算但能大幅降低显存压力,把batch size拉高到4或8,减少gradient accumulation的同步次数,有时候小batch连续step的kernel launch开销比计算本身还大。还有检查一下你的max length是否真的用满,如果大部分样本实际长度远小于2048,padding带来的无效计算可能占了三成以上,可以用动态padding或packing策略。我之前用类似配置跑7B,5万条大概6小时一个epoch,你这慢了一半,大概率是数据管线和batch策略的问题,可以先用torch profiler看下GPU util和CPU的耗时分布。
这速度确实偏慢,检查下是不是max length太长导致计算量爆炸,QLoRA能快但效果会打点折扣。
这速度确实有点离谱了,我拿3090跑7B的LoRA,同样5万条数据但seq长度是1024,一个epoch大概4小时左右,你这2048的max length直接让计算量翻倍,10小时其实算合理区间。建议先确认一下是不是序列长度导致的长尾效应,把max length砍到1024试试看,另外flash-attention在3090上提升有限,不如把batch size提到4配合gradient checkpointing。QLoRA不会更快,它省的是显存不是算力,单纯速度反而可能更慢。
5万条2048长度这速度正常,先砍到1024试试,QLoRA不会更快反而更慢。
5万条2048长度这速度正常,瓶颈在数据量和序列长度,QLoRA快不了多少。试试packing或缩短max length。
5万条2048长度这速度正常,QLoRA不会更快反而可能更慢,先查下数据加载是不是瓶颈。
3090跑8B这速度算正常,想快就降max length或换更小模型,别指望QLoRA提速。
说实话你这个速度有点太夸张了,我拿4090跑7B LoRA,同样5万条数据、2048长度,一个epoch大概3-4小时。你显存才占16G说明batch size其实还能往上拉,试试直接batch size=4甚至8,减少gradient accumulation的步数,那个东西开销不小。
另外你确认一下是不是数据加载成了瓶颈,dataloader的num_workers设了吗?我上次没开多进程,训练直接慢了三倍。QLoRA不会更快,但能省显存,你可能需要的是把模型量化到4bit然后加大batch size,这样吞吐量反而能上来。
还有个小细节,flash-attention对3090这种Ampere架构提升有限,真正吃性能的是attention里的padding,你数据集里长短差距大的话,试试把max length降到1024或者用packing策略,可能比折腾那些花活管用。
5万条2048长度跑10小时真不算离谱,13B快是因为数据量小吧。QLoRA能快20%但降精度,建议先查下是不是CPU瓶颈。
这速度确实偏慢了,我拿3090跑7B LoRA,5万条数据max length 2048大概6-7小时一个epoch,你这个10小时有点夸张。你试试把batch size提到4,gradient accumulation降到4,有时候小batch反而让GPU利用率上不去。QLoRA大概率会快一些,毕竟4bit量化后计算量小不少,但如果你主要瓶颈在数据加载或者CPU预处理,那换QLoRA提升也有限。建议先看一眼nvidia-smi的GPU利用率,如果经常掉到50%以下,那多半是数据管道卡脖子,用dataloader的num_workers=8和pin_memory=True试试。
这速度确实偏慢,我3090跑7B同参数量大概6小时一个epoch,查查数据加载和预处理是不是瓶颈。QLoRA不会更快,但能省显存换更大batch,提效有限。
5万条数据、2048长度,这个速度其实真不算离谱,你算下总token数就知道了,单卡3090跑这个规模10小时一个epoch挺正常的。网上说13B快的,多半是拿短序列或者小数据集在秀。QLoRA不会直接变快,反而因为多一层量化可能更慢,但它能让你把batch size调大,间接提升吞吐。另外你可以试试把max length砍到1024,或者用packing把短样本拼一起,这比折腾deepspeed省事多了。
这速度确实偏慢但不算离谱,5万条2048长度单卡3090跑10小时一个epoch,基本是正常范围的下限了。你试试把max length降到1024或者用packing,吞吐能涨不少。QLoRA不会更快,4bit反而可能拖慢速度,但能省显存换更大batch。另外检查下是不是数据加载成瓶颈了,试试num_workers调高或者预处理成tokenized格式存起来。
这速度确实不太正常,我同样配置跑5万条也就6小时左右,看看是不是max length太长拖慢了。
有没有试试把batch size调大点,gradient accumulation设小些,有时候反而能提速不少。
这速度确实偏慢了,我拿4090跑7B LoRA,5万条数据max len 2048大概3-4小时一个epoch。你batch size和梯度累积加起来等效batch才16,3090这表现不对劲,建议看看是不是数据加载那块卡了,或者seq len没实际打满。QLoRA的话4bit量化后速度不会快太多,主要省显存,你这情况不如把max len砍到1024试试,效果差不了多少但能快一倍。
5万条2048长度这速度正常,想快就降max length或换8bit量化,QLoRA能快30%左右。
说实话你这个问题我踩过类似的坑,3090跑8B单卡本来就不算宽裕,5万条2048长度数据一个epoch十小时其实没太离谱,网上那些说13B跑得快的多半是没统计完整或者用了更短的序列。你可以先看看是不是dataloader的num_workers没调,或者数据预处理卡在CPU上,把这块拉满有时比折腾deepspeed更见效。QLoRA的话4bit量化后显存占用会降不少,但速度提升有限,主要是省显存而不是省算力,如果你瓶颈在计算上反而可能更慢。建议先开个profiler看看具体时间花在哪个环节,再决定要不要换策略。