• Pytorch与Onnx的转换与推理


    Open Neural Network Exchange(ONNX,开放神经网络交换)格式,是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。

    一、pytorch模型保存/加载
    有两种方式可用于保存/加载pytorch模型 1)文件中保存模型结构和权重参数 2)文件只保留模型权重.

    1、文件中保存模型结构和权重参数
    模型保存与调用方式一(只保存权重):

    保存:

    torch.save(model.state_dict(), mymodel.pth)#只保存模型权重参数,不保存模型结构

    调用:

    1. model = My_model(*args, **kwargs)  #这里需要重新创建模型,My_model
    2. model.load_state_dict(torch.load(mymodel.pth))#这里根据模型结构,导入存储的模型参数
    3. model.eval()

    模型保存与调用方式二(保存完整模型):

    保存:

    torch.save(model, mymodel.pth)#保存整个model的状态

    调用:

    1. model=torch.load(mymodel.pth)#这里已经不需要重构模型结构了,直接load就可以
    2. model.eval()

    .pt表示pytorch的模型,.onnx表示onnx的模型,后缀名为.pt, .pth, .pkl的pytorch模型文件之间其实没有任何区别

    二、pytorch模型转ONNX模型
    1、文件中保存模型结构和权重参数

    1. import torch
    2. torch_model = torch.load("/home/pytorch/save.pth") # pytorch模型加载
    3. #set the model to inference mode
    4. torch_model.eval()
    5. x = torch.randn(1,3,320,640)        # 生成张量(模型输入格式)
    6. export_onnx_file = "/home/pytorch/test.onnx"   # 目的ONNX文件名
    7. // 导出export:pt->onnx
    8. torch.onnx.export(torch_model,                    # pytorch模型
    9.                     x,                            # 生成张量(模型输入格式)
    10.                     export_onnx_file,            # 目的ONNX文件名
    11.                     do_constant_folding=True,    # 是否执行常量折叠优化
    12.                     input_names=["input"],        # 输入名(可略)
    13.                     output_names=["output"],    # 输出名(可略)
    14.                     dynamic_axes={"input":{0:"batch_size"},        # 批处理变量(可略)
    15.                                     "output":{0:"batch_size"}}) 

    注:dynamic_axes字段用于批处理.若不想支持批处理或固定批处理大小,移除dynamic_axes字段即可.

    2、文件中只保留模型权重

    1. import torch
    2. torch_model = selfmodel()                      # 由研究员提供python.py文件
    3. #set the model to inference mode
    4. torch_model.eval()
    5. x = torch.randn(1,3,320,640)        # 生成张量(模型输入格式)
    6. export_onnx_file = "/home/pytorch/test.onnx"   # 目的ONNX文件名
    7. // 导出export:pt->onnx
    8. torch.onnx.export(torch_model,                    # pytorch模型
    9.                     x,                            # 生成张量(模型输入格式)
    10.                     export_onnx_file,            # 目的ONNX文件名
    11.                     do_constant_folding=True,    # 是否执行常量折叠优化
    12.                     input_names=["input"],        # 输入名(可略)
    13.                     output_names=["output"],    # 输出名(可略)
    14.                     dynamic_axes={"input":{0:"batch_size"},        # 批处理变量(可略)
    15.                                     "output":{0:"batch_size"}}) 

    3、onnx文件操作

    3.1 安装onnx,onnxruntime:

    1. pip install onnx
    2. pip install onnxruntime(只能用cpu)
    3. pip install onnxruntime-gpu(gpu和cpu都能用)

    首先要强调的是,有两个版本的onnxruntime,一个叫onnxruntime,只能使用cpu推理,另一个叫onnxruntime-gpu,既可以使用gpu,也可以使用cpu。
    如果自己安装的是onnxruntime,需要卸载后安装gpu版本。

     确认一下是否可以使用gpu
    注意:
    ```python
    print(onnxruntime.get_device())
    ```
    上面的代码给出的输出是'GPU'时,并不代表就成功了。

    而要用下面的代码来验证:
    ```python
    ort_session = onnxruntime.InferenceSession("path/model/model_name.onnx",
    providers=['CUDAExecutionProvider'])
    print(ort_session.get_providers())
    ```
    当输出是:['CUDAExecutionProvider', 'CPUExecutionProvider']才表示成功了。

    版本查询:NVIDIA - CUDA | onnxruntime

    安装固定版本的onnxruntime:

    pip install onnxruntime-gpu==1.9.0

    卸载pip uninstall


    3.2 加载onnx文件

    1. # "加载load"
    2. model=onnx.load('net.onnx')

    检查模型格式是否完整及正确

    onnx.checker.check_model(model)

    3.3 打印onnx模型文件信息

    1. session=onnxruntime.InferenceSession('net.onnx')
    2. inp=session.get_inputs()[0]
    3. #conv1=session.get_inputs()['conv1']
    4. #out1=session.get_outputs()[1]
    5. out=session.get_provider_options()
    6. #print(inp,conv1,out1)
    7. print(inp)
    8. #print(out)
    9. "打印图信息:字符串信息"
    10. graph=onnx.helper.printable_graph(model.graph)
    11. print(type(graph))

    3.4 获取onnx模型输入输出层

    1. input=model.graph.input
    2. output = model.graph.output
    3. """输入输出层"""
    4. print(input,output)

    3.5 推理过程

    1. import onnx
    2. import onnxruntime
    3. import torch
    4. inputs=torch.randn(1,3,640,320)
    5. #上述inputs仅用于测试使用,用于图片推理,应该换成自己的图片,如:
    6. #img_path='1.jpg'#图片尺寸与onnx模型的处理尺寸保持一致
    7. #img=cv2.imread(img_path)
    8. #inputs=preprocess_imgae(img)#标准化等预处理操作,与源项目代码保持一致即可
    9. #print('inputs.size():',inputs.size())
    10. model=onnx.load('/home/pytorch_DL/test_320_640.onnx')
    11. onnx.checker.check_model(model)
    12. session =onnxruntime.InferenceSession('/home/pytorch_DL/test_320_640.onnx',
    13. providers['CUDAExecutionProvider','CPUExecutionProvider'])
    14. print('session.get_providers():',session.get_providers())
    15. input_name = session.get_inputs()
    16. output_name=session.get_outputs()[0].name
    17. res=session.run([output_name],{input_name[0].name:inputs.numpy()})

    参考:Pytorch与Onnx模型的保存、转换与操作_onnx转pytorch_Yuezero_的博客-CSDN博客

    pytorch 模型的保存与加载方法以及使用onnx模型部署推理 | 码农家园

    onnxruntime使用gpu推理 - 知乎

  • 相关阅读:
    经纬度转化平面坐标
    理解HTTPS/TLS/SSL(二)可视化TLS握手过程并解密加密数据
    86.(cesium之家)cesium叠加面接收阴影效果(gltf模型)
    【大学英语视听说上】绕口令练习
    代码随想录刷题day52 300.最长递增子序列;674. 最长连续递增序列;718. 最长重复子数组
    SpringSecurity6从入门到上天系列第七篇:讲明白SpringBoot的自动装配完善上篇文章中的结论
    python 爬虫与协同过滤的新闻推荐系统 计算机竞赛
    这份Java面试八股文堪称2022最强,让329人成功进入大厂
    【HTTP下】总结{重定向/cookie/setsockopt/流操作/访问网页/总结}
    springcloudalibaba架构(6):Sentinel热点规则
  • 原文地址:https://blog.csdn.net/maohule/article/details/133915189