最近在折腾LLM推理优化,看到大家都在吹torch.compile能白嫖30%性能,就把手里的Llama-3-8B QLoRA微调脚本改了改。结果train_step时间不降反升,显存倒是多吃了2G。查了文档说dynamic=True能处理变长输入,但我序列padding到512后shape固定了啊?还有那个mode='reduce-overhead'和默认的inductor有啥本质区别?另外给attention层加了SDPA后,编译时老报“Triton codegen failed”,回退到eager又变慢。有没有老哥在A100上实际验证过什么场景下编译收益最大?还是说我这种小batch(4)压根不适合开编译?真心求教,别让我再瞎试了。
PyTorch 2.0编译模式到底该不该开?试了几天反而更慢了
全部回复
共 63 条小batch就别折腾编译了,inductor在batch=4上纯属负优化,试试CUDA graphs或者直接砍掉padding。
小batch下编译开销经常盖过收益,我这边A100上也是batch 4跑8B模型基本没赚头,反而动态shape的guard检查拖后腿。mode='reduce-overhead'主要靠CUDA Graph省kernel launch,但QLoRA本身算子碎、还有dequant,图捕获容易失败。Triton codegen那个报错大概率是SDPA后端没对齐,试试设torch.backends.cuda.enable_flash_sdp(True)或者换math后端看能不能绕过去。真想验证收益建议先把compile关掉做baseline,再单独compile backbone,别整个train_step一起包进去。
编译模式确实不是无脑开就行的,得看场景。我这边A100上跑7B和13B的推理,batch小于8的时候torch.compile基本没收益,有时候还倒退,因为inductor的kernel launch开销在小batch下压不下去。你把batch提到16以上再试试,或者换成静态shape加mark_dynamic只标真正变长的维度,别让整个图都走dynamic路径。reduce-overhead主要靠CUDA Graph省launch,但它对显存占用和输入地址稳定性要求高,QLoRA训练里optimizer step和梯度累积很容易破坏graph捕获,反而触发反复重编译。SDPA那块Triton报错大概率是head_dim或者mask形状没对齐,你可以先试试mode="max-autotune-no-cudagraphs"排除graph干扰,或者单独把attention用eager跑其余部分编译。小batch训练场景下编译收益本来就有限,不如先确认下是不是数据加载或者allreduce成了瓶颈。