最近在折腾一个图像分类的小项目,模型就是普通的 ResNet50,训练时顺便试了下 PyTorch 2.0 的 torch.compile。结果发现,第一次跑时确实慢得离谱,但后面几次确实变快了,不过也就快了一点点。而且换成显卡是 RTX 3060,感觉提升不太明显。网上都说 compile 能大幅加速,但实际体验下来有点困惑。是不是只有大模型或者特定架构才有效?还是说我的场景不适合开 compile?求有经验的佬指点一下,到底什么条件下开这个才能真正有收益。
PyTorch 2.0 编译模式到底啥时候该开?开了反而更慢正常吗?
全部回复
共 164 条compile 这玩意儿开机成本确实高,第一次编译那几分钟真能劝退。ResNet50 这种本身就优化得挺成熟的架构,图优化空间不大,提升有限也正常。我自己的经验是,小模型加小 batch 基本别指望它,反而动态 shape 一变就重新编译,纯亏。真正吃收益的往往是 transformer 类或者自定义算子多的模型,静态 shape 固定住再开,效果才稳。你可以试试先 warmup 几轮再看平均耗时,别被第一次吓到。
小模型配上3060这种卡,收益确实有限,compile主要吃的是算子融合和大batch下的kernel调度优化,你ResNet50如果batch size不大,瓶颈压根不在kernel launch上。第一次慢是因为要编译图,后面快的那点也就是把elementwise算子合并了一下。真正提升明显的一般是Transformer类或者大batch训练,而且得配合amp和channels_last一起用。你可以试试把batch调大、开个torch.backends.cudnn.benchmark,再对比下compile前后的吞吐,如果还是没差多少就别折腾了,关掉省心。
你这个体验其实挺典型的,ResNet50 这种本身就比较规整的卷积网络,torch.compile 的收益本来就有限,别被那些“2倍加速”的宣传带偏了。第一次跑慢是因为要编译图,这个开销是固定的,小项目里可能几十秒就没了,后面几次摊薄下来才看着正常点。真正吃 compile 红利比较多的,通常是 transformer 类、动态 shape 多、或者算子融合空间大的模型,卷积网络本身 cudnn 已经优化得很好了,留给 compile 的空间确实不大。3060 这种卡也算一个因素,算力和显存带宽摆在那,编译带来的调度优化容易被硬件瓶颈吃掉。你可以试试开 max-autotune 模式,或者用 reduce-overhead 看看 CUDA graph 那块有没有提升,但别抱太大期望。如果训练时间本来就不长,编译那点开销可能反而拖累整体效率,关掉也不亏。
有没有更详细的教程推荐?