X2Paddle icon indicating copy to clipboard operation
X2Paddle copied to clipboard

pytorch的模型已成功转换为了paddle格式,但是用tensorrt推理时,初始化时间却很长,这是为什么

Open litao-zhx opened this issue 2 years ago • 21 comments

litao-zhx avatar Jun 13 '22 06:06 litao-zhx

模型初始化部分是参考PaddleOCR去改的,不是用tensorrt的话,初始化速度正常,用了之后初始化却很慢。

litao-zhx avatar Jun 13 '22 06:06 litao-zhx

@litao-zhx 您好,可以把相关复现脚本发我一份,这边看一下吧

然后想请问下: 1、您是企业用户还是学生呢,具体业务场景是什么呢? 2、为什么会有转到Paddle的需求呢,麻烦描述一下吧

感谢~

wjj19950828 avatar Jun 14 '22 02:06 wjj19950828

1、企业员工 2、在项目中同时用到了pytorch和paddle框架的网络,但是在开启tensorrt加速时,会显示异常,觉得想框架冲突,就都转换为一致的了

litao-zhx avatar Jun 14 '22 07:06 litao-zhx

初始化部分如下:

import paddle import os from paddle.inference import Config,create_predictor,PrecisionType

def get_infer_gpuid(): if os.name == 'nt': try: return int(os.environ['CUDA_VISIBLE_DEVICES'].split(',')[0]) except KeyError: return 0 if not paddle.fluid.core.is_compiled_with_rocm(): cmd = "env | grep CUDA_VISIBLE_DEVICES" else: cmd = "env | grep HIP_VISIBLE_DEVICES" env_cuda = os.popen(cmd).readlines() if len(env_cuda) == 0: return 0 else: gpu_id = env_cuda[0].strip().split("=")[1] return int(gpu_id[0])

def Init_Paddle(model_dir,infer_type="fp16",use_tensorrt=True):

gpu_id = get_infer_gpuid()
if gpu_id is None:
    print("GPU is not found in current device by nvidia-smi. Please check your device or ignore it if run on jeston.")

model_path=os.path.join(model_dir,"model.pdmodel")
weights_path=os.path.join(model_dir,"model.pdiparams")
config=Config(model_path,weights_path)


if infer_type=="fp32":
    precision=PrecisionType.Float32
elif infer_type=="fp16":
    precision=PrecisionType.Half
else:
    precision=PrecisionType.Int8


config.enable_use_gpu(500, 0)
if use_tensorrt:
    config.enable_tensorrt_engine(
        workspace_size=1 << 30,
        precision_mode=precision,
        max_batch_size=1,
        min_subgraph_size=15)

#enable_memory_optim推理优化
config.enable_memory_optim()
#预测时不出现日志
config.disable_glog_info()

config.switch_use_feed_fetch_ops(False)
config.switch_ir_optim(True) #是否启用IR优化

predictor=create_predictor(config)

input_names=predictor.get_input_names()
for name in input_names:
    input_tensor=predictor.get_input_handle(name)

output_names=predictor.get_output_names()
output_tensors=[]
for output_name in output_names:
    output_tensor=predictor.get_output_handle(output_name)
    output_tensors.append(output_tensor)

return predictor,input_tensor, output_tensors, config

litao-zhx avatar Jun 14 '22 07:06 litao-zhx

我这边测试来看,是开了tensorrt推理时会耗时严重,模型是由pytorch版的yolov5s转化而来

litao-zhx avatar Jun 14 '22 07:06 litao-zhx

你好,请问您那边测试正常吗?

litao-zhx avatar Jun 16 '22 01:06 litao-zhx

@litao-zhx 麻烦把转换后模型,预测脚本一起打包上传到百度云,然后给我个链接吧~

另外再check一下,耗时严重还是指的初始化时间很长?还是预测时间很长?

初始化大概耗时是多少呢,建议测试一下

wjj19950828 avatar Jun 16 '22 02:06 wjj19950828

初始化时间长,大约在5分钟左右,初始化脚本是我上边发的那个,转换后的模型连接为 链接:https://pan.baidu.com/s/1DqNFsRWWBZgx0gWByBajGQ 提取码:fnsg

litao-zhx avatar Jun 16 '22 03:06 litao-zhx

推理时间可以,问题出在初始化

litao-zhx avatar Jun 16 '22 03:06 litao-zhx

@litao-zhx 我仔细看了下,你上面的脚本有问题哈,初始化不应该包含get_input_handle、get_output_handle这样的方法

建议参考这个,是yolov3的demo,照着改一下即可:https://github.com/PaddlePaddle/Paddle-Inference-Demo/blob/master/python/gpu/yolov3/infer_yolov3.py

wjj19950828 avatar Jun 16 '22 06:06 wjj19950828

好的,我先去试试,但是这是我参考PaddleOCR写的,PaddleOCR里确实是这样写的啊, 5903BA05

litao-zhx avatar Jun 16 '22 07:06 litao-zhx

已尝试在初始化部分去掉get_input_handle这些方法,但是初始化耗时还是很严重,您那边能否帮忙测试下用tensorrt的初始化时长。因为现在的情况是,不用tensorrt的话,初始化时长没问题,用tensorrt,初始化就会很耗时

litao-zhx avatar Jun 16 '22 08:06 litao-zhx

@litao-zhx 把最新的python预测脚本以py文件的形式再发我一份吧

wjj19950828 avatar Jun 17 '22 02:06 wjj19950828

utity.txt

初始化脚本如上所示,由于不支持上传py文件,所以以txt格式复制了一份,模型即为百度上方网盘里的那个,然后初始化时长如下: image

litao-zhx avatar Jun 17 '22 03:06 litao-zhx

@litao-zhx 帮你咨询了下,调小min_subgraph_size 或者workspace_size 再试试

min_subgraph_size调到3,workspace_size 1 << 20试试

wjj19950828 avatar Jun 17 '22 03:06 wjj19950828

好的

litao-zhx avatar Jun 17 '22 03:06 litao-zhx

image 尝试了您说的改法,但是报错如上,故尝试将min_subgraph_size从3分别改为了10 ,报错消失,但是初始化仍然耗时

litao-zhx avatar Jun 17 '22 05:06 litao-zhx

您好,使用 paddle-tensorrt 初始化时间长,是无法避免的。但可以 image 在该接口中,将 use_static 设置为 true,这样会保存下来序列化文件,再第二次运行时不再初始化。详细的 api 介绍:https://www.paddlepaddle.org.cn/inference/api_reference/python_api_doc/Config/GPUConfig.html#tensorrt

JZZ-NOTE avatar Jun 17 '22 05:06 JZZ-NOTE

好的,已尝试这种方法, 确实减少了,但是为什么paddle自己提供的模型用tensorrt初始化时间不长,而转换得到的模型用paddle-tensorrt初始化时间却那么长了呢?

litao-zhx avatar Jun 17 '22 05:06 litao-zhx

目前的理解是 trt 的初始化时间和子图中的算子个数和类型有关。和模型是否是转换得到的无关。是否会有其他因素的影响我再进一步调研后回复您。

JZZ-NOTE avatar Jun 17 '22 06:06 JZZ-NOTE

好的,麻烦了,感谢解答

litao-zhx avatar Jun 17 '22 06:06 litao-zhx