Windows平台GFPGAN v1.4模型TensorRT加速实战指南
当处理高分辨率图像修复任务时,GFPGAN作为业界领先的面部修复模型,其计算效率直接影响工作流体验。本文将完整呈现从原始PyTorch模型到TensorRT引擎的转化全流程,特别针对Windows平台环境配置的复杂性提供系统化解决方案。
1. 环境准备与依赖管理
1.1 基础环境配置
核心组件版本矩阵:
| 组件 | 推荐版本 | 验证方式 |
|---|---|---|
| Windows OS | 10/11 64-bit | winver命令 |
| CUDA | 11.7 | nvcc --version |
| cuDNN | 8.9.2 | 查看cudnn64_8.dll属性 |
| Python | 3.8.x | python --version |
| TensorRT | 8.5.1.7 | import tensorrt as trt; print(trt.__version__) |
注意:版本错配是90%环境问题的根源,建议严格遵循上述组合。CUDA 11.7与TensorRT 8.5.1存在官方兼容性认证。
1.2 虚拟环境搭建
使用conda创建隔离环境避免依赖冲突:
conda create -n gfpgan_trt python=3.8 -y conda activate gfpgan_trt关键库安装清单:
pip install torch==1.12.1+cu117 torchvision==0.13.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu117 pip install onnx==1.12.0 onnxruntime-gpu==1.12.12. TensorRT环境部署
2.1 组件安装流程
从NVIDIA开发者网站下载TensorRT 8.5.1.7 Windows版
解压后按顺序安装WHL包:
cd TensorRT-8.5.1.7\python pip install tensorrt-8.5.1.7-cp38-none-win_amd64.whl cd ..\graphsurgeon pip install graphsurgeon-0.4.6-py2.py3-none-any.whl cd ..\onnx_graphsurgeon pip install onnx_graphsurgeon-0.3.12-py2.py3-none-any.whl配置系统环境变量:
set PATH=%PATH%;C:\TensorRT-8.5.1.7\lib set PYTHONPATH=%PYTHONPATH%;C:\TensorRT-8.5.1.7\python
2.2 PyCUDA特殊处理
由于官方PyCUDA与CUDA 11.7存在兼容问题,需手动编译:
git clone https://github.com/inducer/pycuda cd pycuda python configure.py --cuda-root="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7" python setup.py install3. 模型转换全流程
3.1 PyTorch到ONNX转换
创建转换脚本pth2onnx.py:
import torch from gfpgan import GFPGANer model = GFPGANer(model_path='GFPGANv1.4.pth', upscale=1) dummy_input = torch.randn(1, 3, 512, 512) torch.onnx.export(model, dummy_input, 'gfpganv1.4.onnx', opset_version=13, input_names=['input'], output_names=['output'])执行优化命令:
python -m onnxsim gfpganv1.4.onnx gfpganv1.4_sim.onnx3.2 ONNX到TensorRT转换
使用TensorRT的显式batch模式提升性能:
import tensorrt as trt logger = trt.Logger(trt.Logger.INFO) builder = trt.Builder(logger) network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser = trt.OnnxParser(network, logger) with open("gfpganv1.4_sim.onnx", "rb") as f: parser.parse(f.read()) config = builder.create_builder_config() config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30) serialized_engine = builder.build_serialized_network(network, config) with open("gfpganv1.4.trt", "wb") as f: f.write(serialized_engine)4. 性能优化关键技巧
4.1 动态形状配置
对于可变分辨率输入,需配置动态profile:
profile = builder.create_optimization_profile() profile.set_shape("input", min=(1, 3, 256, 256), opt=(1, 3, 512, 512), max=(1, 3, 1024, 1024)) config.add_optimization_profile(profile)4.2 混合精度加速
启用FP16模式可提升约40%推理速度:
config.set_flag(trt.BuilderFlag.FP16)5. 实际部署验证
5.1 推理脚本改造
创建TRT推理类:
class GFPGAN_TRT: def __init__(self, trt_path): self.logger = trt.Logger(trt.Logger.WARNING) with open(trt_path, "rb") as f, trt.Runtime(self.logger) as runtime: self.engine = runtime.deserialize_cuda_engine(f.read()) self.context = self.engine.create_execution_context() def infer(self, input_tensor): # 绑定输入输出缓冲区 bindings = [None]*2 bindings[0] = input_tensor.data_ptr() output = torch.empty(self.engine.get_binding_shape(1)) bindings[1] = output.data_ptr() self.context.execute_v2(bindings) return output5.2 性能对比测试
典型测试结果对比(RTX 3090):
| 指标 | PyTorch原始模型 | TensorRT加速版 | 提升幅度 |
|---|---|---|---|
| 单帧耗时(ms) | 58.2 | 32.7 | 43.8% |
| 显存占用(MB) | 3421 | 2895 | 15.4% |
| 视频处理FPS | 17.1 | 30.6 | 78.9% |
实际部署中发现三个关键优化点:
- 使用
trtexec工具预生成engine比运行时转换更稳定 - 对于512x512输入,FP16精度与FP32视觉质量差异可忽略
- 启用CUDA graph捕获可进一步降低5-8%延迟