背景
将 pytorch / tensorflow 模型转换为onnx后,推理速度相对变快。但是问题在于当请求量增加,onnx模型会无限制申请GPU资源。如果将onnx模型部署为一个接口,则这个接口会一直存在,申请的GPU资源也不会得到释放(详细可以搜索pytorch模型显存管理机制与显存占用机制)。
缓解方法
# 手动构建provider# CUDAExecutionProvider :使用GPU进行推理,默认使用CUDAExecutionProviderprovider = [("CUDAExecutionProvider", {"device_id": torch.cuda.current_device(), # 使用哪张显卡"arena_extend_strategy": "kNextPowerOfTwo", "gpu_mem_limit": 5 * 1024 * 1024 * 1024, # 显存上限"cudnn_conv_algo_search": "EXHAUSTIVE","do_copy_in_default_stream": True,}),'CPUExecutionProvider',
]
onnx_model = onnxruntime.InferenceSession("your_onnx_model_path.onnx", providers=provider)
缺陷
这个方法能够限制推理申请的资源上限,但是
1. 没有从根源上实现资源动态申请和释放
2. 需要对不同的任务制定不同的配置,例如显存上限,设定不好影响推理速度和吞吐速度
理想的方案
将onnx模型进一步转换为trt格式,使用tensorRT进行部署,方案可以由python或
c++实现,c++性能更佳。