ChatTTS CUDA out of memory——显存不足的完整解决方案
典型报错
RuntimeError: CUDA out of memory. Tried to allocate ... GPU 0 has a total capacity of ...
即时解决方案
方案一:减小批量大小
如果你用的是批量推理,把批量大小从 10 降到 1 或 2:
# 原来
texts = [text1, text2, ..., text20]
wavs = chat.infer(texts)
# 改成
wavs = chat.infer([text1])
方案二:清理显存
import torch
torch.cuda.empty_cache()
# 或者重启 Python 进程
重启 Python 进程比 empty_cache() 更彻底——empty_cache 只是释放 PyTorch 占用的缓存,其他进程(浏览器、IDE)的显存占用不受影响。
方案三:CPU 降级
chat.load(compile=False, device='cpu')
速度会慢 5~10 倍但一定能跑通。
方案四:释放其他 GPU 占用
检查一下 GPU 还被什么程序占用:
nvidia-smi
如果看到浏览器、视频播放器、其他 Python 进程占着显存,关掉它们再试。
根治方案
换更大显存的显卡
- 最低门槛:4 GB VRAM(RTX 3060 12GB 绰绰有余)
- 推荐:8 GB+ VRAM 显卡(RTX 4070 12GB、RTX 4090 24GB)
用云 GPU
不想本地买显卡的话可以租云 GPU:
| 平台 | 价格(3060 12GB) | 备注 |
|---|---|---|
| AutoDL | 约 0.5 元/小时 | 国内主流 |
| 恒源云 | 约 0.6 元/小时 | 国内主流 |
| Clore.ai | $0.03~0.07/小时 | 海外 |
降低输入长度
虽然 ChatTTS 单次可以处理长文本,但长文本推理的中间缓存占用更多显存。建议:
- 把长段落拆成 200~300 字的片段
- 逐段推理,拼接音频
显存占用构成
| 成分 | 说明 |
|---|---|
| 模型权重 | ~1.2 GB(FP32) |
| 中间缓存 | 生成长度越长越大 |
| CUDA context | ~0.5 GB |
| 其他 | tokenizer、PyTorch runtime |
批量推理时,中间缓存会随批量数线性增长——这是批量推理 OOM 的主要原因。