codeformer 中文文档 下载 App

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 Ti4GB只有 --has_aligned 模式,不开背景
GTX 10606GB--has_aligned 或 小图整图处理
RTX 20608GB整图可以但别开 Real-ESRGAN 背景
RTX 306012GB整图 + 背景增强都行
RTX 308016GB4K + 背景 + face_upsample 都能跑
RTX 409024GB视频长序列也 OK

显存监控

跑推理时用另一个终端实时看显存:

# Linux / WSL2
watch -n 1 nvidia-smi

# Windows(PowerShell)
nvidia-smi -l 1

一句话总结

显存不够 → 关背景增强 + 用对齐模式 + 缩小图片,三管齐下基本能把显存需求从 12GB 压到 5GB 以下。