GeneFace++ 显存优化的核心在于:降低 batch size、使用梯度累积、开启混合精度 (AMP)、优化音频/图像分辨率,以及利用显存优化工具(如 DeepSpeed 或梯度检查点)。
以下是针对 GeneFace++ 训练与推理的具体优化方案:
训练通常比推理更吃显存,重点在于减少单次迭代的显存占用。
hparams.py 或 YAML 文件)中的 batch_size 调小(例如从 32 降到 8 或 4)。batch_size 的同时,增加 gradient_accumulation_steps。例如,原本 batch_size=32,改为 batch_size=8 且 gradient_accumulation_steps=4。fp16 或 bf16。torch.cuda.amp。这能让显存占用减半,同时加快训练速度。use_reentrant=False 或 checkpointing 相关参数。推理时通常不需要计算梯度,优化重点在于模型加载和计算效率。
torch.no_grad():确保推理代码包裹在 with torch.no_grad(): 上下文中,避免存储中间变量用于反向传播。model.half() 或 model.to(torch.float16)。import torch
torch.cuda.empty_cache()export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128DataLoader 的 num_workers 设置合理。过高的 num_workers 会占用大量 CPU 内存,间接影响 GPU 性能。| 报错信息 | 可能原因 | 解决方案 |
|---|---|---|
| CUDA Out of Memory (OOM) | Batch size 过大或输入分辨率过高 | 降低 Batch size,降低图像分辨率,开启梯度累积。 |
| NaN loss | 开启 FP16 导致数值溢出 | 关闭 FP16,或调整 AMP 的 loss_scale 参数。 |
| 显存增长但无法释放 | 存在内存泄漏或引用未释放 | 检查代码中是否有全局变量存储了中间 Tensor,使用 del 删除无用变量并调用 empty_cache()。 |
GeneFace++ 包含多个模块(如 NeRF 渲染器、运动网络等)。如果显存依然不足,可以考虑:
建议操作顺序:先调小 batch_size 和 resolution 确保能跑通,再开启 fp16 和 DeepSpeed 提升效率。