每天学点AI知识:PyTorch,NCNN,ONNX,都分别是什么

查理谈科技 2024-06-18 20:57:17

在学习AI 的过程中,经常会遇到这些PyTorch、NCNN等名词,今天我们来系统的理解一下。

一、先从Torch开始

Torch ML

既然说到PyTorch, 先来说说Torch, 这是一个开源的机器学习框架和科学计算框架, 是基于Lua 脚本语言。

可能我们会有点奇怪, 为什么Torch这个框架一开始要选择Lua这么一个脚本语言, 其实这要从最开始的Torch的设计目标说起。

从这篇2014年的Torch 7 的介绍文章里面,可以看出, Torch7的目标是为机器学习语言提供一个类似Matlab的环境, 为此研究人员提出了3个目标:

(1)应该简化数值算法的开发

(2)应该易于扩展(包括使用其他库)

(3)应该速度快

最后, 他们的结论是选择了具有C API的Lua 脚本语言,主要是看中Lua的现代脚本语言和C语言的速度 :

具有良好 C API 的脚本(解释)语言似乎是“满足”约束 (2) 的便捷解决方案。

首先,高级语言使开发程序的过程比低级语言更简单、更易懂。

其次,如果编程语言是解释性的,那么以交互方式快速尝试各种想法也会变得更容易。

最后,假设有一个好的 C API,脚本语言将成为异构库之间的“粘合剂”:同一概念的不同结构(来自不同的库)可以隐藏在脚本语言中独特的结构后面,同时保留来自所有不同库的所有功能。

一开始, Torch 还不是很认同Python的,哈哈, 看看论文中是怎么写的:

为什么不用 Python?谈论一种语言时,很难不引发一场口水战。虽然 Lua 在游戏程序员社区中广为人知(因为它的速度优势和强大的嵌入能力),但 Python 在普通大众中更受欢迎。毫无疑问,Python 附带了更多的库。

但是,毫无疑问 ,“将 Lua 与 C 集成起来非常简单,小孩子都可以做到。Lua 从一开始就是为此而设计的,这一点也得到了体现6。这意味着,只要花几个小时,任何 C 或 C++ 库都可以成为 Lua 库。”

Lua 的另一个关键优势是它的嵌入能力:一旦代码被原型化,它就可以在很少额外工作的情况下变成最终的系统/产品。使用 LuaJIT 可以获得额外的性能,使大多数纯 Lua 代码具有与 C 类似的性能。

Lua 是用纯 ANSI C 编写的,可以轻松地为任意目标(手机、FPGA 中的嵌入式 CPU、DSP 处理器等)编译。加上 Lua 的速度优势,这个选择是“不需思考的”。

同时,也正是由于Torch 的灵活性、速度, Torch 拥有庞大的社区驱动的软件包生态系统, 涵盖了机器学习、计算机视觉、信号处理、并行处理、图像、视频、音频和网络等, 这些都是建立在Lua社区之上的。

Torch 最核心的是流行的神经网络NN(Neural Network,NN)和优化库, 这些库易于使用,在实现复杂的神经网络拓扑方面具有非常大的灵活性, 还可以以高效地并行运行在CPU和GPU之上。

这里提到了GPU, 没错,Torch 一个非常重要的特性就是, 快速和有效的GPU 支持, 同时还具有很好的嵌入性, 可以非常方便地移植到 iOS和Android 设备。需要记住这一点,因为后面我们讲的很多框架,都是基于手机设备的,而Torch 很早就提供了对于这些设备的支持。

二、PyTorch

PyTorch, 这是一个用Python语言编写的、基于Torch库的开源机器学习(Machine Learnling,ML)框架。

既然PyTorch 里面也有Torch ,这里的意思就是很明白了:PyTorch 是Torch 的移植。2017年, Facebook, 也就是现在的META AI, 发布了PyTorch, 当时提到的主要特性就是, PyTorch 是一个可以利用GPU 加速神经网络计算的Python包, “Pyton Implementation of the Torch”, 是当时PyTorch 的定义, PyTorch 把Torch的核心功能包装到Python,并对很多功能提供了GPU 的加速。

目前PyTorch 属于Linux 基金会, 最新的2.0 版本发布于2023年3月,目前主要有两大高级功能:

类似于NumPy的Tensor(张量)计算,能在 GPU 或 MPS 等硬件加速器上加速;基于带自动微分系统的深度神经网络

PyTensor的Tensor计算是非常重要的一个模块, 主要是定了一个torch.Tensorde类来存储和计算各种同构多维矩形数字数组, 有点类似于NumPy模块;但是PyTorch也可以在支持CUDA的英伟达显卡上执行。 同时, 目前PyTorch 也正在开发对于其他GPU 平台的支持, 例如AMD的ROCm,以及Apple 公司的Metal 框架。

三、ONNX

ONNX 是Open Neural Network Exchange,开放神经网络交换的缩写, 是2017年9月年由Meta公司和Microsoft 公司共同创建的项目, 从名字也看得出, 这个项目是用来在框架之间转换模型的。

为什么需要这么一个框架呢?

这是因为,前面讲过, PyTorch 是Torch的移植, 但是一开始这是一个实习项目,在当时的Facebook 内部有两个项目, 由于PyTorch刚刚研发,他们部门内部约定,Caffe2用于生产环境,而PyTorch 则用于内部的研究,而且这两个框架的模型格式不兼容。

随着PyTorch的不断成熟和广泛接受, 因此在PyTorch发布的第二年,也就是2018年,就诞生了这个ONNX 项目,用于转换框架之间的模型。

来看看正式定义:

ONNX 是一种为表示机器学习模型而构建的开放格式。ONNX 定义了一组通用运算符,也就是机器学习和深度学习模型的构建块, 以及一种通用文件格式,使 AI 开发人员能够将模型与各种框架、工具、运行时和编译器一起使用。

假设项目中之前有人使用 TensorFlow,而另一个项目中想要使用 TensorRT,或者使用 PyTorch,想要使用 TFLite 或其他机器学习框架。当使用不同的机器学习框架时,ONNX 是一个很好的中介,可用于转换模型。

ONNX 可以比作一种专门用于数学函数的编程语言。它定义了机器学习模型使用该语言实现其推理功能所需的所有必要操作。线性回归可以用以下方式表示:

def onnx_linear_regressor(X):"ONNX code for a linear regression"return onnx.Add(onnx.MatMul(X, coefficients), bias)

此示例与开发人员用 Python 编写的表达式非常相似。它也可以表示为一个图形,逐步展示如何转换特征以获得预测。这就是为什么使用 ONNX 实现的机器学习模型通常被称为 ONNX 图。

基于ONNX这种中间格式的重要性,不仅像国外的Intel、Intel、高通等很多厂商都加入了ONNX项目, 从下面的图中可以看出,我们国家的百度、华为、商汤等AI厂商也都已经加入。

四、NCNN

说完了ONNX, 再来说一下 NCNN。

NCNN是什么呢? 这是腾讯公司的优图实验室发布的专门针对移动平台优化的高性能神经网络(NN)推理框架。更详细的说,NCNN就是是一个轻量级的深度学习推理框架,特别适合在移动端和嵌入式设备上运行。 它由Tencent开发,主要用于QQ和微信等产品的图像处理和机器学习任务。 由于其高效、快速和轻量级的特性,NCNN在许多场景中都得到了广泛应用

用腾讯自己的比较正式的官方介绍就是:ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。

ncnn 从设计之初深刻考虑手机端的部署和使用。 无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。

基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行, 开发出人工智能 APP,将 AI 带到你的指尖。 ncnn 目前已在腾讯多款应用中使用,如:QQ,Qzone,微信,天天 P 图等

NCNN这个项目其实非常容易理解, 腾讯的当家项目,微信、QQ等, 都运行在手机端, 那么必然要求公司层面要有一个统一的AI 框架作为底层支撑, 在提供高度兼容各个设备、操作系统的情况下, 还要做到尽可能的轻量、高效。

而事实也是如此, NCNN 具备一下特点:

支持卷积神经网络,支持多输入和多分支结构,可计算部分分支无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架广泛的硬件平台和操作系统支持

NCNN 目前支持ARM、X86、MIPS等各种硬件, 同时还支持安卓、iOS、MacOS、华为鸿蒙操作系统、Ubuntu等各种平台。

ncnn是 CPU 框架中最快的,安装包体积最小,跨平台兼容性中也是最好的。ncnn无任何第三方库依赖,不依赖 BLAS/NNPACK 等计算框架;而且纯 C++ 实现,跨平台,支持 Android、 iOS 等。

ncnn 为手机端 CPU 运行做了深度细致的优化,使用 ARM NEON 指令集实现卷积层、全连接层、池化层等大部分 CNN 关键层。对于寄存器压力较大的 armv7 架构,手工编写 neon 汇编,内存预对齐,cache 预缓存,排列流水线,充分利用一切硬件资源,防止编译器意外负优化。

ncnn支持多核并行计算加速,ARM big.LITTLE CPU 调度优化

整体库体积小于 500K,并可轻松精简到小于 300K。ncnn 自身没有依赖项,且体积很小,默认编译选项下的库体积小于 500K,能够有效减轻手机 App 安装包大小负担。此外,ncnn 在编译时可自定义是否需要文件加载和字符串输出功能,还可自定义去除不需要的层实现,轻松精简到小于 300K。

五、统一:从PyTorch 模型到NCNN格式的转换

上面讲了这么多, 又是PyTorch, 又是ONNX,又是NCNN什么的,看起来不是很关联。 但是, 从模型转换的角度来说,这三个模型是可以转换的。

下面介绍从PyTorch模型如何转换到NCNN 模型。

在部署时,首先将预训练的 PyTorch 模型 (.pth/.pt) 转换为 PyTorch 中的 ONNX 文件 (.onnx)。

然后,.onnx 模型文件将由 NCNN 转换器转换为由两个文件组成的 NCNN 模型:.param 文件和 .bin 文件。

最后,通过 C++ 代码加载 NCNN 模型文件,使用 NCNN 库执行推理。C++ 代码可以进一步集成到 Android 中,以在移动设备上执行推理。

 

0 阅读:2

查理谈科技

简介:感谢大家的关注