神经网络经过脚本执行、专用推理库后来到了native 时代。
如果我们按照 编程语言的运行方式进行划分,AI程序的推理方式也可以分为三种: 脚本解析,JIT 和全编译。
传统的训练框架训练如pytorch/tensorflow 可以看作脚本时代:解释执行。
一、解析执行的脚本时代
当我们使用tensorflow/pytorch/mxnet 训练了一个模型并保存后,我们将怎样使用它呢? 这个时候我们通常是直接用框架中的模型加载代码加载训练好的模型和参数,对需要推理的数据进行预处理(比如图片的正则化,NLP语料的分词/词干化等预处理),然后输入到模型进行推理,并作后处理。
为什么我们称之为解释时代呢?
回想一下脚本语言的执行情况,特别是python. 通常python程序是解析执行的,我们写的AI程序的数据处理部分通常也是python编写,它会调用推理库进行加载和处理。
推理库通常是根据模型文件和参数文件创建计算图并调用相应的算子解析执行计算图并得到结果。这种方式,我们称之为解释运行方式。
二、JIT 时代(不是太确切)
当我们用java/c/c++, 特别是使用c/c++语言来调用推理库并运行模型推理时,这个可以认为是JIT方式 。数据处理部分代码会被编译成native方式code, 在cpu上直接运行,无需脚本解释器。此时数据预处理或后处理代码的运行速度得到很大提高。但是我们要记住,模型推理部分依然类似解析执行。
三、全编译时代
当我们使用TVM/ONNX-MLIR/GLOW 等模型编译软件,将模型文件和参数文件一起编译生成native code方式的so/dll 文件时,此时的计算图并不是解释执行,而是真编译方式执行。通常计算图、算子原语以及硬件层的优化后,生成本机native code, 运行速度有了极大地提高,进入全编译时代。
在性能受限的设备,如cpu设备或嵌入式设备上,全编译方式将会极大提高AI程序模型推理时的性能。
在极端的情况下,TVM甚至可以在IOT设备中脱离操作系统,运行于裸金属方式。