最近在试着用LLaMA-7B做点微调后的推理优化,看到PyTorch 2.0的torch.compile宣传得很猛,说是能显著减少kernel launch开销。但我自己在A100上测了一下,同样是fp16推理,用inductor模式反而比eager模式慢了大概15%,而且显存占用还高了。是不是我哪里设置不对?还是说compile对动态shape(比如beam search里的变长序列)不友好?另外,看到有些项目在推vLLM或者TensorRT-LLM,是不是对这种生成式任务,现阶段压根就不该指望torch.compile?求有实战经验的大佬指点一下,别让我再瞎折腾了。
PyTorch2.0编译模式和大模型推理,真的能无脑加速吗?
全部回复
共 28 条我A100上也踩过一模一样的坑,compile对变长输入确实不友好,beam search里每步shape都在变,它反复重编译反而更慢。后来试着把KV cache固定长度、padding到统一尺寸,才勉强追平eager。生成式任务现在还是vLLM或TRT-LLM更省心,torch.compile那点收益真不够折腾的。
我A100上也踩过这坑,torch.compile对动态shape确实挺敏感的,beam search那种变长序列很容易触发重编译,反而更慢。你可以先试试mark_dynamic或者pad到固定长度看看效果,不过说实话生成式推理这块vLLM的paged attention优势太明显了,torch.compile目前真不太适合硬刚。
我在A100上也踩过这个坑,torch.compile对动态shape确实不太友好,beam search那种变长序列基本每步都在触发重编译,反而更慢。建议先拿固定shape测一下inductor到底有没有收益,如果还是慢就果断换TensorRT-LLM或vLLM,这俩在生成式任务上成熟太多了。torch.compile现在更适合训练或者静态shape的视觉模型,推理这块暂时别抱太大期望。
动态shape下compile确实容易翻车,生成任务还是vLLM香,别硬磕了。
你这个结果其实挺正常的,torch.compile在生成式推理上本来就不是万能药。我去年也拿LLaMA系列在A100上折腾过一阵,eager模式下beam search变长序列那块,compile之后确实容易因为dynamic shape反复触发recompile,最后graph break一堆,反而比不编译还慢。inductor对静态shape和固定batch的场景收益才明显,比如你跑固定长度分类或者diffusion那种,生成任务里seq len一直变,它很难吃满。显存涨了也常见,因为编译过程会缓存一些中间buffer和guard,短期看不划算。vLLM和TensorRT-LLM在LLM推理上确实是另一个维度的东西,PagedAttention和kernel fusion是专门为自回归解码设计的,跟torch.compile不是一个赛道。我的建议是别硬磕compile,先试试vLLM的离线推理,或者TensorRT-LLM如果部署环境允许,收益会直接很多。
我也踩过这坑,compile对生成式任务真没宣传那么神。动态shape一多,重编译开销直接吃掉收益,beam search场景尤其明显。LLaMA这类自回归解码,瓶颈往往在访存和KV cache管理,不是kernel launch。真要提速还是上vLLM或TRT-LLM吧,torch.compile目前更适合静态shape的encoder类模型。
我拿13B模型在4090上试过compile,静态shape确实能快个10%左右,但beam search一变长序列就直接崩,重新编译的耗时比省下来的还多。生成式任务现在真不如直接上vLLM,paged attention对KV cache的管理比compile那点kernel优化实在多了。TensorRT-LLM折腾过一阵,性能确实猛但编译流程太劝退,小团队慎入。你要只是微调后跑跑推理,先看看是不是max_seq_len设太大导致compile瞎优化,调小点再试试。
我这边在A100上也踩过类似的坑,LLaMA这种自回归生成用torch.compile确实不太划算,动态shape反复触发重编译,开销比省下来的kernel launch还多。后来换成vLLM的paged attention,吞吐直接翻倍,TensorRT-LLM对固定batch也很猛。torch.compile更适合静态shape的encoder类任务,生成式推理现阶段别硬磕它。