最近把项目迁移到PyTorch 2.0,用了torch.compile加速,发现推理速度确实快了不少。但我有点搞混了:以前做推理时,我习惯同时写model.eval()和with torch.no_grad(),但看一些教程说2.0的编译模式会自动处理dropout和bn层,甚至自动禁用梯度计算?我试了试只加model.eval(),结果发现显存占用反而比之前高了一点点,不知道是不是心理作用。想问下各位大佬,在torch.compile开启后,这两句到底还有没有必要手动加?如果只加eval()而漏掉no_grad(),会不会在某些边缘case下出bug?或者是不是应该根据模型结构(比如有无bn/dropout)来决定?求真实实践过的老哥指点一下,别让我踩坑。
楼主
22小时前
PyTorch 2.0编译模式下,model.eval()和torch.no_grad()到底还要不要加?
请 登录 后发表回复
全部回复
共 2 条
2楼
15小时前
实测compile下不加no_grad显存会略高,建议还是加上,省得某些自定义层翻车。
3楼
4小时前
实测下来,torch.compile确实会自动处理dropout和bn的推理行为,但不会自动禁用梯度计算,所以no_grad()还是得加。显存高一点可能跟编译后的计算图缓存有关,不是错觉。如果模型里有自定义的forward逻辑或者依赖is_training状态,保险起见两个都写上,省得边缘case翻车。