同步操作将从 PaddlePaddle/FastDeploy 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
English | 中文
FastDeploy针对python和cpp开发者,提供了以下多线程或多进程的示例
任务类型 | 说明 | 模型下载链接 |
---|---|---|
Detection | 支持PaddleDetection系列模型 | PaddleDetection |
Segmentation | 支持PaddleSeg系列模型 | PaddleSeg |
Classification | 支持PaddleClas系列模型 | PaddleClas |
OCR | 支持PaddleOCR系列模型 | PaddleOCR |
注意:
下载预训练模型
模块下载模型pipeline
文件夹,其他单模型多线程示例在single_model
文件夹中针对一个视觉模型的推理包含3个环节
针对以上preprocess、infer、postprocess三个阶段,FastDeploy分别抽象出了三个对应的类,即Preprocessor、Runtime、PostProcessor
在多线程调用FastDeploy中的模型进行并行推理的时候,要考虑几个问题
FastDeploy采用分别拷贝多个对象的方式,进行多线程推理,即每个线程都有一份独立的Preprocessor、Runtime、PostProcessor的实例化的对象。而为了减少内存的占用,对于Runtime的拷贝则采用共享模型权重的方式进行拷贝。因此,虽然复制了多个对象,但对于模型权重和参数在内存或显存中只有一份。 以此减少拷贝多个对象带来的内存占用。
FastDeploy提供如下接口,来进行模型的clone(以PaddleClas为例)
PaddleClasModel.clone()
PaddleClasModel::Clone()
import fastdeploy as fd
option = fd.RuntimeOption()
model = fd.vision.classification.PaddleClasModel(model_file,
params_file,
config_file,
runtime_option=option)
model2 = model.clone()
im = cv2.imread(image)
res = model.predict(im)
auto model = fastdeploy::vision::classification::PaddleClasModel(model_file,
params_file,
config_file,
option);
auto model2 = model.Clone();
auto im = cv::imread(image_file);
fastdeploy::vision::ClassifyResult res;
model->Predict(im, &res)
注意:其他模型类似API接口可查阅官方C++文档以及官方Python文档
Python由于语言的限制即GIL锁的存在,在计算密集型的场景下,多线程无法充分利用硬件的性能。因此,Python上提供多进程和多线程两种示例。其异同点如下:
资源占用 | 计算密集型 | I/O密集型 | 进程或线程间通信 | |
---|---|---|---|---|
多进程 | 大 | 快 | 快 | 慢 |
多线程 | 小 | 慢 | 较快 | 快 |
注意:以上分析相对理论,实际上Python针对不同的计算任务也做出了一定的优化,像是numpy类的计算已经可以做到并行计算,同时由于多进程间的result汇总涉及到进程间通信,而且往往有时候很难鉴别该任务是计算密集型还是I/O密集型,所以一切都需要根据任务进行测试而定。
C++的多线程,兼具了占用资源少,速度快的特点。因此,是使用多线程推理的最佳选择
硬件:Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz
模型:ResNet50_vd_infer
后端:CPU OPENVINO后端推理引擎
单进程内初始化多个模型,内存占用
模型数 | model.Clone()后 | Clone后model->predict()后 | 不Clone模型初始化后 | 不Clone后model->predict()后 |
---|---|---|---|---|
1 | 322M | 325M | 322M | 325M |
2 | 322M | 325M | 559M | 560M |
3 | 322M | 325M | 771M | 771M |
模型多线程预测内存占用
线程数 | model.Clone()后 | Clone后model->predict()后 | 不Clone模型初始化后 | 不Clone后model->predict()后 |
---|---|---|---|---|
1 | 322M | 337M | 322M | 337M |
2 | 322M | 343M | 548M | 566M |
3 | 322M | 347M | 752M | 784M |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。