X2Paddle
X2Paddle copied to clipboard
pytorch的模型已成功转换为了paddle格式,但是用tensorrt推理时,初始化时间却很长,这是为什么
模型初始化部分是参考PaddleOCR去改的,不是用tensorrt的话,初始化速度正常,用了之后初始化却很慢。
@litao-zhx 您好,可以把相关复现脚本发我一份,这边看一下吧
然后想请问下: 1、您是企业用户还是学生呢,具体业务场景是什么呢? 2、为什么会有转到Paddle的需求呢,麻烦描述一下吧
感谢~
1、企业员工 2、在项目中同时用到了pytorch和paddle框架的网络,但是在开启tensorrt加速时,会显示异常,觉得想框架冲突,就都转换为一致的了
初始化部分如下:
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
我这边测试来看,是开了tensorrt推理时会耗时严重,模型是由pytorch版的yolov5s转化而来
你好,请问您那边测试正常吗?
@litao-zhx 麻烦把转换后模型,预测脚本一起打包上传到百度云,然后给我个链接吧~
另外再check一下,耗时严重还是指的初始化时间很长?还是预测时间很长?
初始化大概耗时是多少呢,建议测试一下
初始化时间长,大约在5分钟左右,初始化脚本是我上边发的那个,转换后的模型连接为 链接:https://pan.baidu.com/s/1DqNFsRWWBZgx0gWByBajGQ 提取码:fnsg
推理时间可以,问题出在初始化
@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
好的,我先去试试,但是这是我参考PaddleOCR写的,PaddleOCR里确实是这样写的啊,
已尝试在初始化部分去掉get_input_handle这些方法,但是初始化耗时还是很严重,您那边能否帮忙测试下用tensorrt的初始化时长。因为现在的情况是,不用tensorrt的话,初始化时长没问题,用tensorrt,初始化就会很耗时
@litao-zhx 把最新的python预测脚本以py文件的形式再发我一份吧
@litao-zhx 帮你咨询了下,调小min_subgraph_size
或者workspace_size
再试试
min_subgraph_size调到3,workspace_size 1 << 20试试
好的
尝试了您说的改法,但是报错如上,故尝试将min_subgraph_size从3分别改为了10 ,报错消失,但是初始化仍然耗时
您好,使用 paddle-tensorrt 初始化时间长,是无法避免的。但可以
在该接口中,将 use_static 设置为 true,这样会保存下来序列化文件,再第二次运行时不再初始化。详细的 api 介绍:https://www.paddlepaddle.org.cn/inference/api_reference/python_api_doc/Config/GPUConfig.html#tensorrt
好的,已尝试这种方法, 确实减少了,但是为什么paddle自己提供的模型用tensorrt初始化时间不长,而转换得到的模型用paddle-tensorrt初始化时间却那么长了呢?
目前的理解是 trt 的初始化时间和子图中的算子个数和类型有关。和模型是否是转换得到的无关。是否会有其他因素的影响我再进一步调研后回复您。
好的,麻烦了,感谢解答