最近在做LLM的prompt敏感性分析,需要批量跑不同模板的推理对比。我用PyTorch写了个循环,每个prompt都重新加载模型并生成,结果显存直接爆掉,日志显示CUDA out of memory。我知道可以复用模型实例,但问题是不同prompt需要不同长度的max_new_tokens,我试过把生成结果detach后清空cache,还是偶尔会崩。想请教下,是应该用torch.inference_mode()还是torch.no_grad()?另外有没有推荐的显存复用模式?我看网上说用vLLM能解决,但感觉对prompt实验来说有点重,想先确认是不是自己代码的问题。求大佬指点,谢谢!
楼主
2026-08-21
用PyTorch写了个Prompt调优脚本,显存总爆,是框架问题还是我写法太烂?
请 登录 后发表回复
全部回复
共 45 条
2楼
2026-09-14
我之前也踩过这个坑,基本可以确定是你写法的问题,不是PyTorch的锅。关键点在于每个prompt都重新加载模型,显存碎片化会越来越严重,就算detach和清cache也救不回来。正确做法是模型只加载一次,用inference_mode加动态max_new_tokens,再把不同长度的生成分批处理。vLLM确实更省显存,但对prompt敏感性实验来说有点杀鸡用牛刀,先把你循环里重复加载那段干掉再说。
3楼
25天前
先别急着上vLLM,你这八成是没复用模型实例,循环里重加载肯定爆。
4楼
24天前
每个 prompt 都重新加载模型确实没必要,显存爆掉大概率是模型副本没释放干净。inference_mode 和 no_grad 差别不大,前者更省一点但都拦不住你反复 load。重点是把模型只加载一次,循环里复用,max_new_tokens 不同不影响,生成完把 output detach 掉就行。另外清 cache 记得用 torch.cuda.empty_cache(),但别指望它治本,显存碎片还是得靠复用。
5楼
23天前
每个prompt重载模型肯定爆啊,先把模型加载挪出循环,inference_mode和no_grad都行,cache清干净再试。
6楼
23天前
每个prompt都重载模型肯定爆啊,复用实例加inference_mode就行,max_new_tokens动态传参不影响的。