当前位置: 首页 > 工具软件 > paddle2onnx > 使用案例 >

关于部署过程中paddle、onnx、trt等模型转换(一)

郗亦
2023-12-01

前言

    paddle1.0版本 检测与识别模型同理使用。

1.paddle模型转化为inference模型

    首先,将使用的后缀为.pdopt/.pdparams/.states的三个训练文件以及训练时的yml文件,放到相应的文件夹下,随后修改tools/program.py文件中的参数,将-c中对应的default设为yml文件的相对路径或绝对路径。
    其次,打开yml文件,将文件中的Global:checkpoints设置为三个训练文件保存的位置(注意,此处位置应当是保存文件夹+去后缀的文件名,例如:./output/yanzhou_ID_detect/best_accuracy);修改save_inference_dir,即推理模型的保存位置。
    最后,运行tools/export_model.py文件,生成推理模型。

2.inference模型转onnx

    首先,需要安装相应的第三方依赖:
		1.paddlepaddle-gpu
		2.paddle2onnx
		3.onnx
		4.onnxruntime-gpu
		5.cuda
		6.cudnn
	其次,修改以下命令中model_dir model_filename以及params_filename、save_file,并在控制台运行命令:
paddle2onnx --model_dir ./inference/yanzhou_ID_detect/ --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./inference/yanzhou_ID_detect/detID_mv3.onnx --opset_version 11 --enable_onnx_checker True
即可生成.onnx文件。测试onnx情况,修改程序onnx_text.py的file路径,运行程序:
import onnx,time
import numpy as np
import onnxruntime
 
 
onnx_file = './inference/yanzhou_ID_detect/detID_mv3.onnx'  # './inference/yanzhou_ID_detect/detID_res50.onnx'
onnx_model = onnx.load(onnx_file)
onnx.checker.check_model(onnx_model)
print('The model is checked!')
 
x = np.random.random((1,3,640,640)).astype('float32') # 此处也可用cv读取某张图片作为输入
print("x:",x)
 
ort_sess = onnxruntime.InferenceSession(onnx_file)
ort_inputs = {ort_sess.get_inputs()[0].name: x}
start = time.time()
ort_outs = ort_sess.run(None, ort_inputs)
end = time.time()
print("Runtime:{}".format(end-start))
	由此,我们可以验证onnx是否转出成功,并测试onnx的部分性能。
	模型的输入输出尺寸也需要特别关注,下附修改代码:
import onnx

model = onnx.load(r'det_server.onnx')
model.graph.input[0].type.tensor_type.shape.dim[2].dim_param = '?'
model.graph.input[0].type.tensor_type.shape.dim[3].dim_param = '?'
model.graph.output[0].type.tensor_type.shape.dim[2].dim_param = '?'
model.graph.output[0].type.tensor_type.shape.dim[3].dim_param = '?'
# print(model.graph.input[0].type.tensor_type.shape)
onnx.save(model, 'det.onnx')

3.onnx转tensorrt

	该步骤需要在盒子上进行,尝试过网上所有直接装包,用python程序去转的方法,无一例外都报了如下的错:
AttributeError: 'NoneType' object has no attribute 'serialize'。
	在查找了很多信息后,还是选择使用编译生成的方式进行。
	首先,找到盒子上是否装有tensorrt,如果没有,则自行安装符合cuda版本的tensorrt,安装好后将其写入环境变量。
	然后,到https://github.com/onnx/onnx-tensorrt.git,下载onnx-tensorrt

(参考https://jinfagang.github.io/2019/07/16/2019_07_16_20_onnx%E6%A8%A1%E5%9E%8Btensorrt%E6%8E%A8%E7%90%86%E5%AE%9E%E8%B7%B5/ )
但是,按他的步骤会出现错误:

/home/nvidia/onnx-tensorrt-master/third_party/onnx   does not contain a CMakeLists.txt file.
	因为在该步骤前,应当先将onnx放到此目录下,否则cmake是根本找不到响应文件。所以,接下来,去到https://github.com/onnx/onnx/releases下载onnx对应版本,将其解压到onnx-tensorrt-master/third_party/onnx下,在onnx-tensorrt-master目录下,执行命令:
mkdir build
cd build
cmake .. 
make -j8
sudo make install
	编译完成后,如果出现下面的log,预示着构建了onnx和tensorrt的桥梁,并且它会生成可执行文件。
-- The CXX compiler identification is GNU 7.5.0
-- The C compiler identification is GNU 7.5.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Build type not set - defaulting to Release
-- Found PythonInterp: /usr/bin/python (found version "3.6.9") 
-- Found PythonLibs: /usr/lib/aarch64-linux-gnu/libpython3.6m.so (found version "3.6.9") 
Generated: /home/nvidia/onnx-tensorrt-master/third_party/onnx/onnx/onnx_onnx2trt_onnx-ml.proto
Generated: /home/nvidia/onnx-tensorrt-master/third_party/onnx/onnx/onnx-operators_onnx2trt_onnx-ml.proto
Generated: /home/nvidia/onnx-tensorrt-master/third_party/onnx/onnx/onnx-data_onnx2trt_onnx.proto
-- 
-- ******** Summary ********
--   CMake version             : 3.20.2
--   CMake command             : /usr/local/lib/python3.6/dist-packages/cmake/data/bin/cmake
--   System                    : Linux
--   C++ compiler              : /usr/bin/c++
--   C++ compiler version      : 7.5.0
--   CXX flags                 :  -Wall -Wno-deprecated-declarations -Wno-unused-function -Wnon-virtual-dtor
--   Build type                : Release
--   Compile definitions       : ONNX_NAMESPACE=onnx2trt_onnx
--   CMAKE_PREFIX_PATH         : 
--   CMAKE_INSTALL_PREFIX      : /usr/local
--   CMAKE_MODULE_PATH         : 
-- 
--   ONNX version              : 1.10.1
--   ONNX NAMESPACE            : onnx2trt_onnx
--   ONNX_USE_LITE_PROTO       : OFF
--   USE_PROTOBUF_SHARED_LIBS  : OFF
--   Protobuf_USE_STATIC_LIBS  : ON
--   ONNX_DISABLE_EXCEPTIONS   : OFF
--   ONNX_WERROR               : OFF
--   ONNX_BUILD_TESTS          : OFF
--   ONNX_BUILD_BENCHMARKS     : OFF
--   ONNXIFI_DUMMY_BACKEND     : OFF
--   ONNXIFI_ENABLE_EXT        : OFF
-- 
--   Protobuf compiler         : /usr/bin/protoc
--   Protobuf includes         : /usr/include
--   Protobuf libraries        : /usr/lib/aarch64-linux-gnu/libprotobuf.so;-lpthread
--   BUILD_ONNX_PYTHON         : OFF
-- Found TensorRT headers at /usr/include/aarch64-linux-gnu
-- Find TensorRT libs at /usr/lib/aarch64-linux-gnu/libnvinfer.so;/usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/nvidia/onnx-tensorrt-master

	之后,就是激动人心的onnx转trt步骤了,幸运的话,基本一次性就可以成功了。
onnx2trt ***.onnx -o ***.trt
	下一篇着重介绍,paddle2.0版本如何转换onnx与trt。
 类似资料: