A White Paper on Neural Network Deployment
  • ❤️‍🔥A White Paper on Neural Network Deployment
    • ❤️‍🔥A White Paper on Neural Network Deployment
    • 🤠CUDA
      • 🤑CPU|GPU程序执行流程
      • 🤗QiuckLearnFromPicture
      • 🤒GPU编程模型
      • 🫣线程束和线程束分化|Warp
      • 🤭Reduction|并行规约
      • 🤔全局内存(Global Memory)访问模式
      • 🫢Share Memory|共享内存|Bank Conflicts
      • 😷CUDA流和事件
      • 🫡Nsight system和Nsight compute
      • 🤫Grid-Stride Loops
    • 😄ONNX
      • 😉ONNX中的各类Proto
      • 🤔onnx->torch
      • 🥳0x00自定义算子
      • 😕0x01自定义算子
      • 🥴ONNX 模型的修改与调试
      • 😆ONNX中的一些概念
      • 😍用python操作ONNX
      • 🥹ONNX中的广播机制
      • 🤣外部数据
      • 🥰ONNX Model hub
      • 😘ONNX IR(Intermediate Representation)
      • 🥳ONNX后端
      • 🥸概述
    • 🐶TensorRT
      • 🐱TensorRT快速入门指南
      • 🐭文档简介
      • 🐹TensorRT的功能
      • 🐰TensorRT的C++接口解析
      • 🦊TensorRT的Python接口解析
      • 🐻TensorRT如何工作
      • 🐼trtexec的使用
      • 🐻‍❄️实战:解析onnx模型保存为engine文件|from scratch
      • 🐨实战:加载engine文件并执行推理|from scratch
      • 🐯手撕TensoRT源码|0x00
    • 🫶模型量化和剪枝
      • 🖕IEEE754标准
      • 🫰浮点运算产生的误差
      • 🤲映射和偏移
      • 🫴quantization from scratch|python
      • 👏动态量化范围
      • 🤝量化粒度
      • 👍校准
      • 👊Post-Training Quantization
      • ✊Quantization-Aware Training
      • 🤞pytorch-quantization使用文档
      • ✌️Polygraphy-Cheatsheet
    • 🤺杂文不杂
      • 😾Roofline_model
      • 🤖模型部署的几大误区
      • 😽手算Ampere架构各个精度的Throughout
      • 😻Tensor Core VS CUDA Core
      • 😺PNNX计算图结构剖析
      • 🎃融合BN和Conv层
      • 👾深度神经网络编译器原理简介
      • 👽在WSL2上安装CUDA_cuDNN_TensorRT
    • 🍀CPP
      • 🪵lamda表达式|C++11
      • 🌴智能指针|C++11
      • 🌲右值引用|移动语义|完美转发|C++11
      • 🫑emplace_back 减少内存拷贝和移动|C++11
      • 🥬多线程|互斥锁|条件变量|C++11
      • 🥒异步操作|C++11
      • 🍆原子变量|CAS操作|内存顺序|C++11
      • 🍏对象生存期和资源管理|RAII设计思想
      • 🍎Pimpl设计模式|编译防火墙
      • 🌶️std::variant|C++17
      • 🫛std::any|C++17
    • 🩷部署实战
      • ❤️yolov8Multitask
      • 💚yolov5
      • 🧡pointpillars
      • 💛centerpoint
      • 🩵deepstream
      • 💜BEVfusion
      • 💙BEVLane
      • 🖤Occupancy
    • ☯️重点参考书籍
Powered by GitBook
On this page
  • External Data
  • 将 ONNX 模型转换为外部数据
  • 将 ONNX 模型转换为外部数据并保存
  • onnx.checker 用于带有外部数据的模型
  • TensorProto: data_location and external_data fields

Was this helpful?

Edit on GitHub
  1. A White Paper on Neural Network Deployment
  2. ONNX

外部数据

External Data

用外部数据加载 ONNX 模型

  • [默认] 如果外部数据位于模型的同一目录下,只需使用 onnx.load() 即可。

import onnx

onnx_model = onnx.load("path/to/the/model.onnx")
  • 如果外部数据位于其他目录下,请使用 load_external_data_for_model() 指定目录路径,然后使用 onnx.load() 加载数据。

import onnx
from onnx.external_data_helper import load_external_data_for_model

onnx_model = onnx.load("path/to/the/model.onnx", load_external_data=False)
load_external_data_for_model(onnx_model, "data/directory/path/")
# Then the onnx_model has loaded the external data from the specific directory

将 ONNX 模型转换为外部数据

import onnx
from onnx.external_data_helper import convert_model_to_external_data

onnx_model = ... # Your model in memory as ModelProto
convert_model_to_external_data(onnx_model, all_tensors_to_one_file=True, location="filename", size_threshold=1024, convert_attribute=False)
# Must be followed by save_model to save the converted model to a specific path
onnx.save_model(onnx_model, "path/to/save/the/model.onnx")
# Then the onnx_model has converted raw data as external data and saved to specific directory

将 ONNX 模型转换为外部数据并保存

import onnx

onnx_model = ... # Your model in memory as ModelProto
onnx.save_model(onnx_model, "path/to/save/the/model.onnx", save_as_external_data=True, all_tensors_to_one_file=True, location="filename", size_threshold=1024, convert_attribute=False)
# Then the onnx_model has converted raw data as external data and saved to specific directory

onnx.checker 用于带有外部数据的模型

Models with External Data (<2GB)

当前检查器支持检查带有外部数据的模型。向检查器指定已加载的 onnx 模型或模型路径。

Large models >2GB

不过,对于大于 2GB 的模型,请使用模型路径,外部数据需要位于同一目录下。

import onnx

onnx.checker.check_model("path/to/the/model.onnx")
# onnx.checker.check_model(loaded_onnx_model) will fail if given >2GB model

TensorProto: data_location and external_data fields

在 TensorProto 消息类型中,有两个字段与外部数据有关。

data_location field

data_location 字段存储此张量的数据位置。其值必须是:

  • MESSAGE - 存储在 protobuf 报文内部特定类型字段中的数据。

  • RAW - 存储在 raw_data 字段中的数据。

  • EXTERNAL - 存储在外部位置的数据,如 external_data 字段所述。

  • value not set - legacy value. Assume data is stored in raw_data (if set) otherwise in message.

external_data field

external_data 字段存储描述数据位置的键值对

可识别的键有:

  • "location" (required) - 相对于存储 ONNX protobuf 模型的文件系统目录的路径。不允许使用诸如...之类的上层目录路径。

  • "offset" (optional) - 存储数据开始的字节位置。以字符串形式存储的整数。偏移值应是 4096(页面大小)的倍数,以便支持 mmap。

  • "length" (optional) - 包含数据的字节数。以字符串形式存储的整数。

  • "checksum" (optional) - location所指向文件的SHA1 摘要。

加载 ONNX 文件后,所有 external_data 字段都可以用一个附加键("basepath")来更新,该键存储加载 ONNX 模型文件的目录路径。

External data files

外部数据文件中存储的数据将采用与当前 ONNX 中 raw_data 字段相同的二进制字节字符串格式。

PreviousONNX中的广播机制NextONNX Model hub

Last updated 1 year ago

Was this helpful?

Reference

❤️‍🔥
😄
🤣
https://github.com/onnx/onnx/pull/678