个人技术分享

ONNX--整理笔记

Github: https://github.com/onnx/onnx

一、ONNX的介绍

ONNX(Open Neural Network Exchange)是一个开放的深度学习模型交换格式。目标是让不同的深度学习框架之间能够无缝地交换和使用训练好的模型,从而实现模型的跨平台部署和共享。

ONNX提供了一个中立的、可扩展的表示格式,能够描述常见的深度学习模型架构,如卷积神经网络(CNN)、循环神经网络(RNN)和图神经网络(GNN)。

使用ONNX,用户可以在不同的深度学习框架(如PyTorch、TensorFlow、Caffe等)之间进行模型转换和迁移,无需重新训练模型。

以下是ONNX的一些关键特点和用途:

AI模型部署落地综述(ONNX/NCNN/TensorRT等)跨平台部署:ONNX模型可以在各种硬件和软件平台上运行,包括移动设备、嵌入式设备和云服务器。通过将模型转换为ONNX格式,可以实现跨平台的部署和推理。

框架互操作性:ONNX允许不同的深度学习框架之间共享模型。用户可以在一个框架中训练模型,然后将其转换为ONNX格式,再在另一个框架中加载和使用。

模型优化:ONNX提供了一些工具和技术,用于对模型进行优化和压缩。这些优化方法可以提高模型的性能和效率,减少模型的存储和计算成本。

扩展性:ONNX支持自定义运算符和扩展,使用户能够定义和使用自己的操作和层。

社区支持:ONNX是由一个活跃的开源社区维护和发展的。这个社区不断推进ONNX的发展,提供文档、工具和示例代码,帮助用户更好地使用和理解ONNX。

二、ONNX的新特性

2.1 ONNX Hub

ONNX Hub是一个在线的模型仓库,旨在为用户提供广泛的预训练的深度学习模型。类似于PyTorch Hub和TensorFlow Hub,ONNX Hub专注于提供基于ONNX格式的模型,以便用户可以轻松地在各种深度学习框架之间进行模型的转换和使用。

ONNX Hub提供了一个集中的平台,使用户能够浏览、搜索和获取各种类型的预训练模型,包括图像分类、目标检测、语义分割、自然语言处理等。这些模型都以ONNX格式提供,因此可以在不同的深度学习框架(如PyTorch、TensorFlow、MXNet等)之间进行导入和部署。

通过使用ONNX Hub,用户可以享受以下优势:

预训练模型库:ONNX Hub提供了一个丰富的预训练模型库,涵盖了各种领域和任务。用户可以根据自己的需求搜索和选择合适的模型,节省模型训练的时间和资源。

跨框架互操作性:由于所有模型都是基于ONNX格式,因此可以轻松地在不同的深度学习框架之间进行转换和使用。用户可以将ONNX模型导入到他们所选择的框架中,并进行推理、微调或其他操作。

简化部署:ONNX Hub的模型经过预训练并在多个任务上验证,因此可以作为直接可用的部署模型。用户可以直接下载所需的模型并将其应用于自己的应用程序或项目中,无需从头训练模型。

模型共享和社区参与:ONNX Hub为用户提供了一个平台,可以与其他用户分享模型,并参与开源社区的贡献。用户可以贡献自己的模型,与他人交流和合作,共同推动深度学习模型的发展。

2.2 Parser

ONNX Parser(ONNX解析器)是用于解析和加载ONNX模型的工具或库。ONNX模型是使用ONNX格式表示的深度学习模型,可以在不同的深度学习框架和平台上进行导入和执行。

ONNX解析器的主要功能是读取和解析ONNX模型文件,并将其转换为内存中的可操作对象,通常是一个计算图或模型表示。

解析器可以提取模型的结构、权重参数和其他相关信息,以便后续使用和执行。

使用ONNX解析器,开发者可以将ONNX模型加载到他们所选择的深度学习框架中,进行模型推理、特征提取或其他任务。

ONNX解析器允许跨框架的模型转换和迁移,使得用户可以在不同的环境和框架之间灵活地共享和部署深度学习模型。

ONNX社区提供了许多开源的ONNX解析器实现,以满足不同语言和框架的需求。例如,PyTorch提供了torch.onnx模块,用于将PyTorch模型导出为ONNX格式并进行解析。TensorFlow也提供了tf2onnx工具,用于将TensorFlow模型转换为ONNX格式。

通过使用ONNX解析器,开发者可以利用ONNX的跨平台和跨框架特性,更好地集成和部署深度学习模型,并实现各种应用场景中的模型转换和迁移。

2.3 Function Op

在ONNX中,Function Op(函数操作)是一种用于定义和封装复杂模型组件的机制。它允许用户自定义、组合和重复使用一系列运算,以构建更复杂的模型结构。

Function Op基于ONNX中的计算图(Computation Graph)概念,可以将一组运算封装为一个可重用的函数。这些函数可以具有输入和输出,可以接受不同形状和类型的张量作为输入,并返回计算结果。

Function Op可以通过组合其他常规操作、Function Op和自定义运算符来定义。

使用Function Op的主要目的是提高模型的可读性、可维护性和重用性。它可以将复杂的模型组件抽象为单个操作单元,使模型的结构更清晰,易于理解和修改。

Function Op还允许用户将这些操作单元作为库函数进行封装,以便在不同模型和项目中重复使用。

以下是使用Function Op的简单示例:

import torch
import torch.nn as nn
from torch.onnx.symbolic_helper import parse_args, _unimplemented

class MyFunctionOp(torch.autograd.Function):
@staticmethod
def forward(ctx, input):
output = input * 2 # 自定义操作:将输入张量乘以2
ctx.save_for_backward(input) # 保存梯度计算所需的变量
return output

@staticmethod
def backward(ctx, grad_output):
    input, = ctx.saved_tensors  # 从上下文中获取保存的张量
    grad_input = grad_output.clone()  # 计算输入张量的梯度
    grad_input *= 2  # 梯度计算:将输出梯度乘以2
    return grad_input

创建一个包含Function Op的模型

class MyModel(nn.Module):
def init(self):
super(MyModel, self).init()
self.my_op = MyFunctionOp()

def forward(self, input):
    output = self.my_op(input)
    return output

将模型转换为ONNX格式

model = MyModel()
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, “my_model.onnx”)

在上面的示例中,我们定义了一个名为MyFunctionOp的自定义Function Op。它包括forward和backward两个静态方法,分别定义了前向传播和反向传播的计算逻辑。

然后,我们创建一个包含MyFunctionOp的模型MyModel,在其forward方法中使用了MyFunctionOp进行计算。最后,我们使用torch.onnx.export将模型导出为ONNX格式。

通过使用Function Op,我们可以自定义和封装复杂的操作逻辑,提高模型的可读性和可维护性。同时,它还可以促进模型组件的重用,使得开发者能够更高效地构建和部署复杂的深度学习模型。

2.4 Reference Runtime

Reference Runtime(参考运行时)是ONNX运行时的一个实现,用于执行和推理ONNX模型。它是ONNX社区提供的一种参考实现,旨在展示ONNX规范的运行时行为和功能。

Reference Runtime提供了一个基本的、纯Python实现的运行时环境,可以加载和执行ONNX模型。它支持常见的深度学习操作,并提供了基本的张量计算功能。

Reference Runtime并不追求高性能或低延迟,而是着重于模型的正确性和易于理解。

相比onnx runtime,容易输出中间层;

Reference Runtime的主要用途包括:

  1. 模型验证:通过使用Reference Runtime,用户可以验证ONNX模型的正确性。它可以帮助用户检查模型的输入、输出和中间计算结果,以确保模型在运行时行为符合预期。

  2. 教学和学习:Reference Runtime提供了一个简单而易于理解的运行时实现,适用于教学和学习目的。学生和开发者可以通过参考实现了解ONNX规范的内部工作原理和基本运行机制。

  3. 算法开发和调试:对于算法开发和调试的目的,Reference Runtime提供了一个灵活的环境。用户可以通过使用Reference Runtime快速迭代和测试他们的算法,而无需依赖于特定的深度学习框架或硬件加速。

需要注意的是,由于Reference Runtime是一个参考实现,它的性能可能不如专门针对特定硬件和框架优化的运行时库。在实际部署和生产环境中,用户可能需要考虑使用针对特定平台和硬件加速的ONNX运行时实现,以获得更高的性能和效率。

Reference Runtime: Reference Runtime是ONNX官方提供的参考实现运行时。它是一个基于C++的轻量级运行时库,用于加载、解析和执行ONNX模型。Reference Runtime的目标是提供一个简单、易于理解和验证的运行时实现,用于验证ONNX模型规范的正确性和可行性。它的性能通常比较低,不适合在生产环境中部署大规模的模型推理。
ONNX Runtime: ONNX Runtime是由Microsoft开发的高性能、生产级别的ONNX运行时库。它采用C++编写,经过了高度优化和加速,可以在各种硬件平台上实现快速的模型推理。ONNX Runtime支持多种硬件加速器,包括CPU、GPU和专用加速器(如NVIDIA的TensorRT和Intel的OpenVINO)。它还提供了Python和C++接口,使得在各种应用场景中都能方便地使用。

三、ONNX的周边工具

3.1 onnxsim

https://github.com/daquexian/onnx-simplifier

"onnxsim"是一个用于简化和优化ONNX模型的工具库。它提供了一种简单的方式来减少和简化ONNX模型的计算图,并尽可能地减少不必要的计算和内存消耗,从而提高推理性能和效率。

onnxsim的主要功能包括:

简化计算图:onnxsim可以分析和简化ONNX模型的计算图,去除不必要的计算节点和辅助节点。这可以减少模型的计算复杂度和内存占用,从而提高推理速度。

消除常量折叠:onnxsim可以执行常量折叠,将静态常量的计算结果直接替换到计算图中。这消除了不必要的计算,并减少了模型的内存消耗。

张量形状推断:onnxsim可以自动推断张量的形状信息,并将其应用到模型中的计算节点。这有助于优化计算图和提高推理的效率。

模型优化:onnxsim还提供了一些模型优化技术,例如常量融合、冗余节点删除和无用输入删除。这些优化技术可以减少模型的计算负载和内存占用。

动态输入形状
自定义OP

2GB模型
形状推导+图变换+常量折叠

3.2 convertmodel.com

一个包含了各种 WebAssembly 格式的模型转换工具、提供开箱即用的模型转换功能的网站

转换前后:

3.3 onnx-graphsurgeon

ONNX GraphSurgeon 是一个用于修改和优化 ONNX 模型的 Python 库。它提供了一组简单而强大的工具,用于对 ONNX 图进行操作、修改和优化,以满足特定的需求。

使用 ONNX GraphSurgeon,你可以进行以下操作:

修改和扩展 ONNX 图:你可以使用 ONNX GraphSurgeon 添加、删除或修改 ONNX 图中的节点、边和属性。这使得你能够自定义修改模型的结构,如更改节点参数、添加新节点或修改图的拓扑结构。

图优化和剪枝:ONNX GraphSurgeon 提供了优化工具,用于剪枝和优化模型的结构。你可以使用这些工具剪枝不必要的节点、合并相邻的节点或优化计算图的结构,以提高推理性能或减少模型的大小。

模型转换和整合:ONNX GraphSurgeon 使你能够将不同框架的模型转换为 ONNX 格式,并在转换过程中进行必要的修改和优化。此外,它还可以将多个 ONNX 模型整合为单个模型,以方便部署和推理。

可视化和调试:ONNX GraphSurgeon 允许你可视化 ONNX 图的结构,并提供了调试工具,以帮助你理解和调试模型。你可以可视化节点、边和属性,检查模型的输入输出,以及识别潜在的问题或错误。

ONNX GraphSurgeon 提供了灵活且易于使用的接口,使得对 ONNX 图进行修改和优化变得简单和高效。你可以在自己的 Python 代码中使用 ONNX GraphSurgeon 库来处理 ONNX 模型,并根据自己的需求进行相应的修改和优化。

访问 ONNX GraphSurgeon 的 GitHub 仓库(https://github.com/NVIDIA/TensorRT/tree/master/tools/onnx-graphsurgeon ) ONNX GraphSurgeon 的信息,以及示例代码和文档。

3.3.1 ONNX GraphSurgeon 安装和使用

安装 ONNX GraphSurgeon:

确保你已经安装了 Python(建议使用 Python 3)。

打开终端或命令提示符,使用以下命令安装 ONNX GraphSurgeon:

pip install onnx-graphsurgeon

这将使用 pip 包管理器从 Python Package Index(PyPI)安装 ONNX GraphSurgeon。

使用 ONNX GraphSurgeon:

import onnx_graphsurgeon as gs
import numpy as np
import onnx

Register functions to make graph generation easier

@gs.Graph.register()
def min(self, *args):
return self.layer(op=“Min”, inputs=args, outputs=[“min_out”])[0]

@gs.Graph.register()
def max(self, *args):
return self.layer(op=“Max”, inputs=args, outputs=[“max_out”])[0]

@gs.Graph.register()
def identity(self, inp):
return self.layer(op=“Identity”, inputs=[inp], outputs=[“identity_out”])[0]

Generate the graph

graph = gs.Graph()

graph.inputs = [gs.Variable(“input”, shape=(4, 4), dtype=np.float32)]

Clip values to [0, 6]

MIN_VAL = np.array(0, np.float32)
MAX_VAL = np.array(6, np.float32)

Add identity nodes to make the graph structure a bit more interesting

inp = graph.identity(graph.inputs[0])
max_out = graph.max(graph.min(inp, MAX_VAL), MIN_VAL)
graph.outputs = [graph.identity(max_out), ]

Graph outputs must include dtype information

graph.outputs[0].to_variable(dtype=np.float32, shape=(4, 4))

onnx.save(gs.export_onnx(graph), “model.onnx”)

使用https://netron.app/ 打开保存的模型:

使用onnx_graphsurgeon将OP Min和Max整合成一个叫Clip的新OP,这样即使部署时也只需要写个Clip插件就好了,当然本文只是为了演示,Clip OP已经TensorRT支持了。

3.3.2 修改代码

方法非常简单,先把你想要合并的OP和外界所有联系切断,然后替换成新的ONNX OP保存就好了。本质上就是把Min和Identity断开,Min和c2常数断开,Max和c5常数断开,Max和下面那个Identity断开,然后替换成新的OP:

import onnx_graphsurgeon as gs
import numpy as np
import onnx

Here we’ll register a function to do all the subgraph-replacement heavy-lifting.
NOTE: Since registered functions are entirely reusable, it may be a good idea to
refactor them into a separate module so you can use them across all your models.

这里写成函数是为了,万一还需要这样的替换操作就可以重复利用了
@gs.Graph.register()
def replace_with_clip(self, inputs, outputs):
# Disconnect output nodes of all input tensors
for inp in inputs:
inp.outputs.clear()

# Disconnet input nodes of all output tensors
for out in outputs:
    out.inputs.clear()

# Insert the new node.
return self.layer(op="Clip", inputs=inputs, outputs=outputs)

Now we’ll do the actual replacement

导入onnx模型

graph = gs.import_onnx(onnx.load(“model.onnx”))

tmap = graph.tensors()

You can figure out the input and output tensors using Netron. In our case:
Inputs: [inp, MIN_VAL, MAX_VAL]
Outputs: [max_out]

子图的需要断开的输入name和子图需要断开的输出name

inputs = [tmap[“identity_out_0”], tmap[“onnx_graphsurgeon_constant_5”], tmap[“onnx_graphsurgeon_constant_2”]]
outputs = [tmap[“max_out_6”]]

断开并替换成新的名叫Clip的 OP

graph.replace_with_clip(inputs, outputs)

Remove the now-dangling subgraph.

graph.cleanup().toposort()

That’s it!
onnx.save(gs.export_onnx(graph), “replaced.onnx”)

使用https://netron.app/ 打开保存的模型查看:

AI模型部署落地综述(ONNX/NCNN/TensorRT等)

参考: onnx-graphsurgeon----ONNX计算图修改神器

3.4 onnx-modifier

Github: https://github.com/ZhangGe6/onnx-modifier/tree/master

其中教程有【安装和运行】、【用法】、【示例模型文件】!!!!

目前已支持下列操作:

删除/恢复节点
修改节点输入输出名
修改模型输入输出名
增加模型输出节点
编辑节点属性值
增加新节点
修改模型batch size
修改模型initializers

【onnx-modifier基于流行的模型可视化工具 Netron 和轻量级Web应用框架 Flask 开发。希望它能给社区带来一些贡献~】

四、ONNX的使用

ONNX是一个格式,不包含什么功能;

onnx runtime是微软开发的框架;

ONNX使用步骤:

  1. 安装所需的库:首先,您需要安装适当的库和工具来处理和执行ONNX模型。具体的安装步骤可能因您使用的深度学习框架而有所不同。例如,如果您使用PyTorch,则可以使用torchonnx库;如果使用TensorFlow,则可以使用tensorflowtf2onnx等库。根据您的需求和环境选择适当的库进行安装。

  2. 导出模型为ONNX格式:如果您已经有一个训练好的模型,您可以将其导出为ONNX格式。不同的深度学习框架提供了相应的导出工具或方法。例如,在PyTorch中,您可以使用torch.onnx.export函数将模型导出为ONNX格式。确保您已仔细阅读文档并按照指导进行导出。

  3. 加载和解析ONNX模型:一旦您导出了模型为ONNX格式,您可以使用相应的库加载和解析该模型。这将生成一个内存中的表示,通常是一个计算图或模型对象,以供后续操作和执行。使用适当的库和函数,例如torch.onnx.load(PyTorch)或tf.compat.v1.GraphDef(TensorFlow)来加载和解析ONNX模型。

  4. 执行模型推理:一旦您成功加载和解析了ONNX模型,您可以使用相应的库和函数执行模型推理。具体的推理方法和代码将取决于您使用的深度学习框架。例如,在PyTorch中,您可以将输入张量传递给模型并获得输出张量。在TensorFlow中,您可以使用tf.Sessiontf.Tensor对象来运行模型。确保您查阅所选框架的文档,并按照指导进行模型推理。

  5. 根据需求进一步处理和部署:一旦您完成了模型推理,您可以根据需求进一步处理和部署模型。这可能包括特征提取、后处理、部署到不同平台或将模型转换为其他框架的格式。使用相应的库和工具,根据您的具体需求执行相应的操作。

4.1 ONNX格式分析 参考:ONNX学习笔记

ONNX中最核心的部分就是onnx.proto。https://github.com/onnx/onnx/blob/master/onnx/onnx.proto 这个文件了,它定义了ONNX这个数据协议的规则和一些其它信息,其中最核心的几个对象并解释一下它们之间的关系。

ModelProto
GraphProto
NodeProto
ValueInfoProto
TensorProto
AttributeProto

在加载了一个ONNX之后,我们获得的就是一个ModelProto,它包含了一些版本信息,生产者信息和一个GraphProto。在GraphProto里面又包含了四个repeated数组,它们分别是node(NodeProto类型),input(ValueInfoProto类型),output(ValueInfoProto类型)和initializer(TensorProto类型),其中node中存放了模型中所有的计算节点,input存放了模型的输入节点,output存放了模型中所有的输出节点,initializer存放了模型的所有权重参数。

这个拓扑关系在ONNX中是如何表示的呢?ONNX的每个计算节点都会有input和output两个数组,这两个数组是string类型,通过input和output的指向关系,我们就可以利用上述信息快速构建出一个深度学习模型的拓扑图。这里要注意一下,GraphProto中的input数组不仅包含我们一般理解中的计算图输入的那个节点,还包含了模型中所有的权重。例如,Conv层里面的W权重实体是保存在initializer中的,那么相应的会有一个同名的输入在input中,其背后的逻辑应该是把权重也看成模型的输入,并通过initializer中的权重实体来对这个输入做初始化,即一个赋值的过程。

最后,每个计算节点中还包含了一个AttributeProto数组,用来描述该节点的属性,比如Conv节点或者说卷积层的属性包含group,pad,strides等等,每一个计算节点的属性,输入输出信息都详细记录在 https://github.com/onnx/onnx/blob/master/docs/Operators.md

4.2 模型定义

五、其他:

参考: AI模型部署落地综述(ONNX/NCNN/TensorRT等)

腾讯公司开发的移动端平台部署工具——NCNN;
Intel公司针对自家设备开发的部署工具——OpenVINO;
NVIDIA公司针对自家GPU开发的部署工具——TensorRT;
Google针对自家硬件设备和深度学习框架开发的部署工具——Mediapipe;
由微软、亚马逊 、Facebook 和 IBM 等公司共同开发的开放神经网络交换格式——ONNX;

如何选择:
ONNXRuntime 是可以运行在多平台 (Windows,Linux,Mac,Android,iOS) 上的一款推理框架,它接受 ONNX 格式的模型输入,支持 GPU 和 CPU 的推理。唯一不足就是 ONNX 节点粒度较细,推理速度有时候比其他推理框架如 TensorRT 较低。
NCNN是针对手机端的部署。优势是开源较早,有非常稳定的社区,开源影响力也较高。
OpenVINO 是 Intel 家出的针对 Intel 出品的 CPU 和 GPU 友好的一款推理框架,同时它也是对接不同训练框架如 TensorFlow,Pytorch,Caffe 等。不足之处可能是只支持 Intel 家的硬件产品。
TensorRT 针对 NVIDIA 系列显卡具有其他框架都不具备的优势,如果运行在 NVIDIA 显卡上, TensorRT 一般是所有框架中推理最快的。一般的主流的训练框架如TensorFlow 和 Pytorch 都能转换成 TensorRT 可运行的模型。当然了,TensorRT 的限制就是只能运行在 NVIDIA 显卡上,同时不开源 kernel。
MediaPipe 不支持除了tensorflow之外的其他深度学习框架。MediaPipe 的主要用例是使用推理模型和其他可重用组件对应用机器学习管道进行快速原型设计。MediaPipe 还有助于将机器学习技术部署到各种不同硬件平台上的演示和应用程序中,为移动、桌面/云、web和物联网设备构建世界级ML解决方案和应用程序。

5.1 NCNN

NCNN(NVIDIA CUDA Convolutional Neural Network)是一个高效的深度学习推理框架,专为嵌入式设备和移动平台设计。它具有轻量级、低延迟和高性能的特点,可以在边缘设备上高效地运行深度学习模型。

以下是一些关键特点和功能:

  1. 轻量级和高性能:NCNN通过优化算法和硬件加速(如CUDA和Vulkan)实现了高效的深度学习推理。它使用精简的计算图表示和专门设计的计算算子,以提供较小的模型尺寸和更快的推理速度。

  2. 跨平台支持:NCNN支持多个硬件平台和操作系统,包括CPU、GPU和专用AI加速器。它可以在嵌入式设备(如ARM)和桌面平台(如x86)上运行,并支持Android、iOS和Linux等操作系统。

  3. 支持多种深度学习框架:NCNN可以与常见的深度学习框架(如Caffe、TensorFlow和ONNX)集成,使用户能够将训练好的模型转换为NCNN格式,并在移动设备上进行高效的推理。

  4. 低延迟推理:NCNN专注于实时推理任务,如实时图像处理、目标检测和人脸识别。通过优化推理流程和网络结构,它可以实现较低的推理延迟,适用于对实时性要求较高的应用场景。

  5. 开源社区支持:NCNN是一个开源项目,拥有活跃的开发者社区。社区提供了丰富的文档、示例和工具,以帮助用户更好地使用和定制NCNN,同时也提供了技术支持和问题解答。

总而言之,NCNN是一个高效、轻量级且跨平台的深度学习推理框架,适用于嵌入式设备和移动平台。它提供了高性能的推理能力,并支持多种硬件平台和深度学习框架,使开发者能够在边缘设备上实现快速、低延迟的深度学习推理。

5.2 OpenVINO

OpenVINO是一种可以加快高性能计算机视觉和深度学习视觉应用开发速度的工具套件,支持各种英特尔平台的硬件加速器上进行深度学习,并且允许直接异构执行。OpenVINO™工具包是用于快速开发应用程序和解决方案的综合工具包,可解决各种任务,包括模拟人类视觉,自动语音识别,自然语言处理,推荐系统等。该工具包基于最新一代的人工神经网络,包括卷积神经网络(CNN),循环和基于注意力的网络,可在英特尔®硬件上扩展计算机视觉和非视觉工作负载,从而最大限度地提高性能。它通过从边缘到云的高性能,人工智能和深度学习推理来加速应用程序。

5.3 TensorRT

NVIDIA TensorRT™ 是用于高性能深度学习推理的 SDK。此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高吞吐量。

在推理过程中,基于 TensorRT 的应用程序的执行速度可比 CPU 平台的速度快 40 倍。借助 TensorRT,您可以优化在所有主要框架中训练的神经网络模型,精确校正低精度,并最终将模型部署到超大规模数据中心、嵌入式或汽车产品平台中。

TensorRT 以 NVIDIA 的并行编程模型 CUDA 为基础构建而成,可帮助您利用 CUDA-X 中的库、开发工具和技术,针对人工智能、自主机器、高性能计算和图形优化所有深度学习框架中的推理。

TensorRT 针对多种深度学习推理应用的生产部署提供 INT8 和 FP16 优化,例如视频流式传输、语音识别、推荐和自然语言处理。推理精度降低后可显著减少应用延迟,这恰巧满足了许多实时服务、自动和嵌入式应用的要求。

5.4 MediaPipe

MediaPipe是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌,一系列重要产品,如 YouTube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。作为一款跨平台框架,MediaPipe 不仅可以被部署在服务器端,更可以在多个移动端 (安卓和苹果 iOS)和嵌入式平台(Google Coral 和树莓派)中作为设备端机器学习推理 (On-device Machine Learning Inference)框架。

除了上述的特性,MediaPipe 还支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用。同时,在移动端和嵌入式平台,MediaPipe 也支持设备本身的 GPU 加速。