Out of Memory 显存不足:8GB 卡怎么让 CodeFormer 跑起来
症状
推理中途突然报:
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 2.00 GiB
(GPU 0 has 7.93 GiB total capacity; 5.50 GiB already allocated...)
显存预算
先搞清楚 CodeFormer 各环节的显存消耗:
| 组件 | 显存 | 说明 |
|---|---|---|
| CodeFormer 模型权重 | ~2GB | 固定消耗 |
| YOLOv5 人脸检测 | ~1GB | 固定消耗(不用 --has_aligned 时) |
| Real-ESRGAN 背景增强 | ~3.5GB | 开 --bg_upsampler 时 |
| CodeFormer 推理激活值 | ~2GB | 取决于输入分辨率 |
| 合计 | ~8.5GB | 不开背景增强 |
| 合计 | ~12GB | 开背景增强 |
8GB 卡刚好在"不开背景增强 + 1080p 图片"的边缘——4K 或多人脸大概率 OOM。
解法一:关掉 --bg_upsampler realesrgan(省 3.5GB)
# 之前
python inference_codeformer.py -w 0.7 --bg_upsampler realesrgan photo.jpg
# 改后
python inference_codeformer.py -w 0.7 photo.jpg
代价:背景不增强,人脸和背景可能有分辨率差。但 CodeFormer 核心功能不受影响。
解法二:用 --has_aligned 模式(省 1GB)
跳过 YOLOv5 人脸检测,只跑 CodeFormer 推理:
# 先离线裁脸(一次裁好,多次使用)
python scripts/crop_align_face.py -i inputs/ -o aligned_faces/
# 然后 --has_aligned 推理
python inference_codeformer.py -w 0.7 --has_aligned --input_path aligned_faces/
裁脸过程需要 dlib(或其他检测器),但可以批量一次性做完。
解法三:图片先缩小再处理
# 1920x1080 → 960x540(显存减少约 3/4)
python inference_codeformer.py -w 0.7 \
--input_path photo_960x540.jpg \
--output_path result.jpg
# 处理完后再手动放大(用 Real-ESRGAN 单独)
python inference_realesrgan.py -i result.jpg -o final_output.jpg
显存占用不是线性——输入面积减半,激活值显存减少约 4 倍。
解法四:PyTorch 显存优化
# 设置 PyTorch CUDNN 配置
set PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
# 或在命令行前加
PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128 python inference_codeformer.py ...
这让 PyTorch 更高效地管理显存碎片,避免"明明还有显存但分配不到"的情况。
解法五:fp16 / amp 混合精度
CodeFormer 默认用 fp32 推理。如果 CodeFormer 脚本支持,可以加 --fp16 让 PyTorch 自动走混合精度:
python inference_codeformer.py -w 0.7 --fp16 photo.jpg
混合精度显存减半,速度还更快。但某些老版本的 CodeFormer 可能不支持 --fp16 参数——需要检查具体脚本。
解法六:不用 GPU,改用 CPU 或 NCNN
CodeFormer 可以在 CPU 上跑(虽然慢),或者用 ChaiNNer 的 NCNN 后端(速度比 CPU 快):
# CPU 模式(去掉 CUDA_VISIBLE_DEVICES 或手动指定 CPU)
python inference_codeformer.py -w 0.7 --input_path photo.jpg --device cpu
4GB 内存的机器跑 CPU 模式也能出结果,只是很慢(单张 10 秒以上)。
各显卡的推荐配置
| 显卡 | 显存 | 推荐配置 |
|---|---|---|
| GTX 1050 Ti | 4GB | 只有 --has_aligned 模式,不开背景 |
| GTX 1060 | 6GB | --has_aligned 或 小图整图处理 |
| RTX 2060 | 8GB | 整图可以但别开 Real-ESRGAN 背景 |
| RTX 3060 | 12GB | 整图 + 背景增强都行 |
| RTX 3080 | 16GB | 4K + 背景 + face_upsample 都能跑 |
| RTX 4090 | 24GB | 视频长序列也 OK |
显存监控
跑推理时用另一个终端实时看显存:
# Linux / WSL2
watch -n 1 nvidia-smi
# Windows(PowerShell)
nvidia-smi -l 1
一句话总结
显存不够 → 关背景增强 + 用对齐模式 + 缩小图片,三管齐下基本能把显存需求从 12GB 压到 5GB 以下。