GeneFace++(GeneFace Plus Plus)在训练和推理时都比较吃显存,尤其是使用了 NeRF / 人脸渲染 + 音频驱动 + 3D 表征。下面从训练和推理两个角度,系统讲一下显存优化方法,按“性价比从高到低”排序。
一、训练阶段显存优化
1. 降低 batch size(最直接)
- 把
batch_size 从 16 / 32 降到 4 / 2 / 1 - 配合 gradient accumulation
batch_size: 1
accumulate_grad_batches: 4
效果:显存 ↓,训练速度略慢,但收敛基本不变
2. 减小图像分辨率
GeneFace++ 常用 256 / 512 分辨率:
- 推理可用 256
- 训练若爆显存,可先 256 训,再 512 fine-tune
修改位置:
data_config.image_size- 视频预处理脚本中的 resize 参数
3. 减少帧序列长度(最重要但常被忽略)
很多显存爆炸来自 一次性加载太多帧
优化方式:
- 缩短
window_size(如 16 → 8) - 使用 clip / chunk 训练
- 避免把整段视频塞进 GPU
4. 使用混合精度(AMP)
开启 fp16 或 bf16:
torch.cuda.amp.autocast()
显著效果:
- 显存 ↓ 30%~50%
- 速度 ↑
- 数值稳定性一般 OK(NeRF 类模型也好用)
5. 冻结部分模块
GeneFace++ 通常包含:
- audio encoder
- face NeRF
- renderer
- landmark / 3D model
可冻结:
for p in audio_encoder.parameters():
p.requires_grad = False
适合:
- 只 finetune 渲染器
- 使用 pretrained 模型
6. 使用梯度检查点(Gradient Checkpointing)
以时间换显存:
torch.utils.checkpoint
适合:
- Transformer / NeRF backbone
- 显存极度紧张时
7. 优化器选择
| 优化器 | 显存 |
|---|
| Adam | 高 |
| AdamW | 高 |
| 8-bit Adam | ↓↓ |
| Lion | ↓ |
推荐:
pip install bitsandbytes
二、推理阶段显存优化
1. 使用 torch.inference_mode()
with torch.inference_mode():
...
比 no_grad 更省显存
2. 逐帧 / 短窗口推理
不要一次性生成整段视频:
3. 降低 renderer 采样数
NeRF 类渲染中:
- 减少
num_samples - 减少
batch_pixels
4. 模型分离部署(进阶)
把:
- audio → motion
- motion → video
分成两个进程 / 两张卡
三、硬件 & 环境建议
- ✅ 24G(3090 / 4090)较舒服
- ⚠️ 16G(3060 / 4070)需 fp16 + 小 batch
- ❌ 8G 基本只能推理小模型
其他:
- 更新 CUDA / PyTorch
- 关闭无关进程
- 使用
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
四、推荐组合(实用方案)
12–16G 显存可跑:
- batch_size=1
- fp16
- image_size=256
- window_size=8
- 8-bit Adam
24G 显存舒服方案:
- batch_size=4
- fp16
- 512 分辨率
- window_size=16
如果你愿意,可以告诉我:
- 你的 显卡型号
- 是 训练还是推理
- 报的是什么 OOM 报错
我可以直接帮你改配置文件。