主要观点总结
本文介绍了深度学习模型部署的入门知识,包括为什么使用torch需要动转静,以及部署框架如ONNX、OpenVINO和TensorRT的作用和转换方法。
关键观点总结
关键观点1: 深度学习模型部署的重要性及部署框架简介
随着深度学习的发展,模型部署在实际应用中变得越来越重要。部署框架如ONNX、OpenVINO和TensorRT等,能够帮助我们更好地进行模型部署,提高模型的运行效率和性能。
关键观点2: Torch中的动态图与静态图
动态图在torch中虽然易于使用和编写,但性能上可能存在一些问题,如额外的开销、优化难度和内存使用等。因此,在进行模型部署前,将动态图转换为静态图是非常重要的。
关键观点3: ONNX:不同模型间的桥梁
ONNX是一个开放的神络网络交换格式,旨在架起不同深度学习框架之间的桥梁,让模型能够自由迁移。但是,ONNX在某些情况下可能不如原生框架的模型运行得快,并且不一定能很好地表示各种算子。
关键观点4: OpenVINO和TensorRT:针对不同硬件的推理引擎
OpenVINO和TensorRT是针对不同硬件的推理引擎,旨在提高模型的运行性能和效率。OpenVINO针对英特尔硬件进行优化,而TensorRT针对NVIDIA的GPU。它们通过深度优化和硬件差异化来提高性能。
关键观点5: 模型转换与部署流程
文章介绍了如何将模型转换为ONNX、OpenVINO和TensorRT等格式,并进行了简单的部署流程介绍。包括模型优化器将训练好的模型转换为推理引擎可以识别的中间表达——IR文件,以及推理引擎的执行流程等。
正文
》讲了很多 torch 的好处和优点。最核心的就是 torch 使用了动态图组网。使用动态组网的好处是。可以使用更偏向 python 语法的格式对模型进行定义。下面就给大家一个常见的网络:
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
# 示例使用
input_size = 784 # 例如,对于MNIST数据集
hidden_size = 128
num_classes = 10
model = SimpleNet(input_size, hidden_size, num_classes)
print(model)
大家很容易开心的写出这样代码,但问题是,使用动态图模式。不可避免的带来了一系列问题。对于一个动态图来说,面临了以下三点问题:
-
-
动态图在每次执行时都需要重新构建计算图,这可能导致额外的开销。
-
-
动态图难以进行全局优化,因为图结构在运行时可能会改变。
-
静态图允许更多的编译时优化,如内存分配优化、算子融合等。
-
动态图可能需要更多的运行时内存,因为它需要保持 Python 解释器和相关对象的活跃状态。
-
所以从 torch 开始,我们第一步要做的就是动转静。拿到静态图才能更好的做整体性能上的优化!
美好的愿景:ONNX
ONNX,全称 Open Neural Network Exchange,是人工智能领域中一个引人入胜的故事。它的诞生源于一个美好的愿景:在纷繁复杂的深度学习世界中架起一座沟通的桥梁。
2017 年的硅谷,各大科技巨头都在人工智能领域奋力拼搏。Facebook(现在的Meta)和 Microsoft 这两个看似竞争对手的公司,却因为一个共同的梦想走到了一起。他们希望打破AI框架之间的壁垒,让不同平台上训练的模型能够自由迁移。就这样,ONNX 项目应运而生。