FastDeploy集成了CV-CUDA来加速预/后处理,个别CV-CUDA不支持的算子使用了CUDA kernel的方式实现。
FastDeploy的Vision Processor模块对CV-CUDA的算子做了进一步的封装,用户不需要自己去调用CV-CUDA, 使用FastDeploy的模型推理接口即可利用CV-CUDA的加速能力。
FastDeploy的Vision Processor模块在集成CV-CUDA时,做了以下工作来方便用户的使用:
- GPU内存管理,缓存算子的输入、输出tensor,避免重复分配GPU内存
- CV-CUDA不支持的个别算子利用CUDA kernel实现
- CV-CUDA/CUDA不支持的算子可以fallback到OpenCV/FlyCV
编译FastDeploy时,开启CV-CUDA编译选项
# 编译C++预测库时, 开启CV-CUDA编译选项.
-DENABLE_CVCUDA=ON \
# 在编译Python预测库时, 开启CV-CUDA编译选项
export ENABLE_CVCUDA=ON
只有继承了ProcessorManager类的模型预处理,才可以使用CV-CUDA,这里以PaddleClasPreprocessor为例
# C++
# 创建model之后,调用model preprocessor的UseCuda接口即可打开CV-CUDA/CUDA预处理
# 第一个参数enable_cv_cuda,true代表使用CV-CUDA,false代表只使用CUDA(支持的算子较少)
# 第二个参数是GPU id,-1代表不指定,使用当前GPU
model.GetPreprocessor().UseCuda(true, 0);
# Python
model.preprocessor.use_cuda(True, 0)
- 如果预处理第一个算子是resize,则要根据实际情况决定resize是否跑在GPU。因为当resize跑在GPU, 且图片解码在CPU时,需要把原图copy到GPU内存,开销较大,而resize之后再copy到GPU内存,则往往只需要 copy较少的数据。