最近在折腾用 Llama 2 7B 做微调,看到 PyTorch 2.0 的 torch.compile 吹得很厉害,说能白嫖 30%-50% 的加速。但我试了下在单卡 A100 上跑 LoRA,torch.compile(mode="reduce-overhead") 反而比原生 torch 慢了一截,而且第一次编译要等好久。我用的 deepspeed stage2 加 bf16,是不是大模型场景下编译加速不明显,还是我哪里配错了?大佬们有没有实际对比过训练吞吐的?另外,编译后的显存开销好像也变大了,这正常吗?真心求教,不想把时间浪费在玄学调优上。
PyTorch 2.0 编译模式在大模型训练中真的比原生快很多吗?
全部回复
共 165 条试过跟你一样的配置,reduce-overhead在大模型上确实容易负优化,换mode="max-autotune"或者直接关掉编译反而稳。
编译后显存涨正常,CUDA graph会占额外缓存,小batch下尤其不划算。
同感,LoRA场景下torch.compile收益确实不明显,我试过7B全参微调反而能快10%左右,但小模型加LoRA经常是负优化。显存变大也正常,编译会额外保存一些中间张量,尤其reduce-overhead模式更吃显存。
你deepspeed stage2和bf16叠加时,建议试试把compile放到stage2外面包一层,或者换mode="max-autotune"对比下,有时候默认模式不如手动指定算子融合策略。另外第一次编译那十几分钟别省,多跑几个step后看稳定吞吐。
其实很多人吹的30%-50%是纯推理场景,训练里能稳定吃到20%就不错了,而且跟模型结构、batch size关系很大。建议直接用原生+flash attention试试,可能比折腾编译省心。
小模型上compile收益明显,7B这规模确实容易负优化,deepspeed和编译叠加反而互相干扰。
显存变大正常,reduce-overhead会缓存额外buffer,建议试试mode=max-autotune再对比下。
我A100上试过类似的组合,reduce-overhead对LoRA这种小batch场景确实不友好,编译开销反而盖过了收益。建议试试mode="max-autotune"或者干脆default,另外把dynamo的graph break检查下,deepspeed的stage2和torch.compile经常有算子冲突。显存变大正常,编译会保留一些中间buffer,我这边大概多了5%-8%。吞吐对比的话,纯原生加flash attention和deepspeed优化好,其实跟compile差距很小,不值得为那点提升折腾。
LoRA微调本身可训练参数就少,计算密度低,torch.compile那套算子融合的收益基本被吃掉了,减速不奇怪。reduce-overhead模式主要针对小batch推理场景,训练用它反而容易踩坑,试试default或者max-autotune。显存涨是正常的,编译会缓存一些中间结果和额外kernel,deepspeed stage2下更明显。真想压吞吐的话建议先关掉compile跑个baseline,再单独测max-autotune,别一上来就reduce-overhead。