最近在调一个LLM推理的demo,用的HuggingFace的transformers,显存老是不够,看网上说torch.compile能提升不少,但我试了一下,第一次跑编译特别慢,而且有的算子报错不支持,回退到eager模式了。想问下各位大佬,对于像我这种做应用开发的,不是专门搞框架优化的,torch.compile是必须掌握的吗?还是说靠vLLM、TensorRT这些现成方案就够了?顺便问下,大家平时用torch.compile多吗,还是主要用纯PyTorch?有点迷茫,感觉新东西学不完。
PyTorch 2.0的torch.compile到底值不值得花时间学?
全部回复
共 2 条说实话我觉得你现在的思路挺对的,torch.compile这玩意儿对于做应用层的人来说,真不是个“必须掌握”的选项。我自己的经验是,它更适合那些模型结构固定、想要反复压榨单卡性能的算法工程师,像咱们这种天天换模型、调demo的,花一整天去debug那些算子兼容性问题,性价比实在太低了。vLLM和TensorRT这些方案基本上已经把常见的LLM推理优化到很极致了,尤其是vLLM的PagedAttention和continuous batching,直接解决了显存碎片化的大头,比你折腾torch.compile的收益来得快得多。而且你提到编译慢和回退eager,这个我太有同感了,有一次我试一个最新的transformer块,结果编译时间比推理时间还长好几倍,后来直接弃了。我现在的习惯是,default用纯PyTorch把逻辑跑通,真到部署阶段再考虑上TensorRT或者ONNX Runtime,torch.compile基本只在写研究原型、需要快速验证新idea的时候才会碰一下。不过话说回来,如果你未来想往高性能推理方向深入,那了解它背后的triton和inductor原理还是有点用的,但那是另一条赛道了。你目前在显存不够这个点上,其实更值得先看看是不是模型加载方式有问题,比如用bitsandbytes做4bit量化,或者用flash-attention替换原生的attention实现,这些往往比torch.compile更能立竿见影。我觉得你不用太焦虑“学不完”这件事,工具是跟着需求走的,等哪天你遇到torch.compile能解决的、别的方案搞不定的场景了,再花时间学也不迟。
说实话我觉得你这种情况直接上vLLM更实际,torch.compile对推理场景的收益有时候还不如量化来得直接,而且编译那几分钟的等待在迭代调demo时真的挺折磨人。我自己的经验是,如果模型结构比较常规,TensorRT或者ONNX Runtime的优化效果已经很好了,没必要跟编译器死磕。torch.compile更适合那些要反复部署同一个模型、追求极致性能的生产环境,或者你在搞研究要跑实验脚本,应用开发阶段优先级真不高。不过有一点可以试试,就是先关掉动态shape,固定输入长度再编译,很多不支持的算子问题能避开不少。