最近在单卡A100上微调一个7B的模型,用的是HuggingFace的Trainer,听说PyTorch 2.0的torch.compile能自动加速,就试着加上了。结果发现训练速度不但没提升,显存还多占了快10个G,而且第一次编译特别慢,等了快十分钟才跑起来。试了mode="reduce-overhead"和"max-autotune"都差不多,有时候还会报一些奇怪的graph break警告。是我用的方式有问题,还是说在大模型场景下torch.compile其实不太适合?有没有实际用过的老哥分享下经验,到底该怎么配置才能吃到这个加速红利?
PyTorch 2.0的torch.compile在大模型训练上真的能加速吗,还是我打开方式不对?
全部回复
共 12 条大模型微调torch.compile基本吃不到啥红利,graph break多反而更慢,我后来直接关了。
7B模型上torch.compile没加速太正常了,我去年在A100上折腾过类似的事,最后发现大部分时间都耗在graph break上了。HuggingFace的Trainer内部有不少动态控制流,比如根据loss判断是否跳过某些层,这些Python层面的分支会让compile反复重新编译,甚至直接fallback到eager模式,你看到的警告就是它在告诉你这段没法融合。显存涨10G也不奇怪,inductor默认会缓存一堆中间结果和编译产物,大模型参数量摆在那,开销很实在。reduce-overhead那个模式主要针对小batch推理,训练场景下cudagraph会把静态显存池撑得很大,反而帮倒忙。真想试的话,先别用Trainer,手写一个干净的训练循环,把model.forward里的条件判断都去掉,再用mode="default"跑通一次看有没有增益。另外可以试试把attention换成FlashAttention的原生实现,torch.compile对它的融合效果比HuggingFace的包装好很多。我最后是放弃了compile,改用deepspeed的ZeRO-2加gradient checkpointing,提速更稳。
7B模型在单卡上跑torch.compile确实挺容易踩坑的,graph break多半是HuggingFace模型里那些动态控制流搞的,编译不出来反而白折腾。我之前也试过,后来把mode设成"default"配合dynamic=False才稍微好点,但显存涨是必然的,它要缓存编译图和中间结果。建议先跑个profile看看瓶颈到底在不在kernel launch上,如果本来就是compute-bound那编译收益很有限,不如把精力放在flash attention和gradient checkpointing上。
7B模型加torch.compile确实容易踩坑,graph break多半是HuggingFace里那些动态控制流搞的,你可以试试加fullgraph=False先看看到底断在哪。我这边经验是reduce-overhead对中小模型效果明显,但7B以上显存开销基本都会涨,max-autotune编译时间又长,性价比不高。真要加速可能得配合FSDP或者DeepSpeed一起用,单靠compile在大模型上收益很有限。
7B模型加torch.compile确实容易踩坑,我这边试下来graph break多半是HuggingFace里那些动态控制流和自定义attention搞出来的,一break就退回去了,加速自然吃不到。显存涨10G也正常,max-autotune会缓存一堆kernel,单卡本来就紧,更不划算。可以先用mode="default"配合fullgraph=False看看break点在哪,或者换FlashAttention加torch.compile只包model.forward,别整个Trainer套进去。真要稳还是等PyTorch 2.1以后对Transformer的支持再说。
7B模型微调想靠torch.compile吃加速确实挺难的,graph break基本躲不掉,尤其HuggingFace Trainer里那些动态控制流一多,编译出来的图碎得跟拼图似的。我试过把modeling代码里的一些if分支改成静态shape才稍微好点,但显存多占是常态,因为编译缓存和中间激活都留着。你可以先跑个torch._dynamo.explain看看break在哪,别硬上max-autotune,reduce-overhead在小batch下反而更稳。
7B微调开torch.compile确实容易踩坑,graph break多的话加速基本就废了,显存涨也正常,因为编译缓存和中间图都占地方。我试过在Llama2上开,短序列能快一点,长序列反而更慢,后来干脆关了。建议先跑一遍torch._dynamo.explain看看断在哪,把那些动态控制流改掉再说。
大模型场景下torch.compile确实没那么美好,graph break多半是HF Trainer里那些动态控制流和自定义层触发的,编译一遍十分钟很正常。显存涨10个G大概率是inductor缓存了中间结果,reduce-overhead对显存本来就不友好。我这边7B以上基本不开compile,小模型或者推理用着才香,训练还是老老实实上deepspeed省心。
我之前也遇到过类似问题,后来换了方案。
刚入门,这个对我帮助很大。
7B模型微调开torch.compile确实容易踩坑,graph break多半是HuggingFace Trainer里动态shape和attention mask搞出来的,编译时间长得离谱基本就是反复recompile了。可以试试先固定max_length、关掉gradient checkpointing,再用fullgraph=False看看到底断在哪,别一上来就max-autotune。显存涨10G也正常,inductor会缓存一堆中间结果,单卡A100跑7B本来就紧巴巴的。我之前在类似配置下感觉加速也就10%出头,长序列训练收益更不明显,你可能没打开方式错,就是这场景红利没那么大。
大模型上torch.compile确实容易吃力不讨好,graph break一大堆,先跑通再说吧。