神经网络部署流程
工业界应用神经网络时,往往要对学术界产出的模型进行优化,才能在推理设备/服务器上实现更高的效率,从而降低成本,这整个过程也一般称之为模型部署(Deployment)。
部署的目的
模型部署目标有多种,云部署提供了可扩展性和易访问性;边缘部署通过使模型更接近数据源来减少延迟;本地部署则确保了隐私和可控性。
云部署非常适合需要快速扩展和处理大量数据的应用程序。 一些平台可以轻松管理从训练到部署的模型,不过,使用云计算的成本可能会很高,尤其是在数据用量大的情况下,如果用户远离数据中心,还会面临延迟问题。
边缘部署非常适合需要实时响应和低延迟的应用,尤其是在互联网接入有限或没有互联网接入的地方。 在智能手机或物联网小工具等边缘设备上部署模型可确保快速处理并保持本地数据,从而提高隐私性。 然而,边缘设备的处理能力往往有限,因此您需要优化模型。
本地部署适用于当数据隐私至关重要或互联网访问不可靠或无法访问时。 在本地服务器或台式机上运行模型可完全控制并保证数据安全。
神经网络的计算本质
神经网络一般可以表示为如下图所示的由算子组成的有向无环图,算子表示一个独立的计算过程,输入的数据就在这个图上进行传播,直到输出。
一个算子数学上是函数空间到函数空间的映射,实际上就是(大型)矩阵的加法、乘法等计算。比如卷积操作就需要卷积核在特征图上不断地进行element-wise的乘法并求和,又比如ReLU这样的激活函数需要对输入的每个值计算激活值。
根据算子计算的方式,一般会分为计算密集型算子核访存密集型算子。像矩阵乘法、卷积这种算子就是计算密集型算子,单独拿出某个值,它需要不断计算与其它值的乘法和加法;而像激活函数这些算子就是访存密集型算子,每个值的计算比较简单,但是要从内存中拿出所有数据去进行这个计算。
神经网络中用到的矩阵计算基本都是大型的运算,计算两个1024x1024的矩阵相乘是常态,对这些矩阵进行计算会消耗大量能源和时间,模型部署时需要尽可能地减少这些的消耗。
部署的技术架构
如下图所示,模型部署从上到下大致需要经历三个阶段。
绿色的是模型开发阶段,一般用到PyTorch、TensorFlow、PaddlePaddle等框架,此时还是神经网络还是动态图,比较灵活,并且一般都是在高性能的服务器上进行。
橙色的是模型部署阶段,会把训练出的模型编译为对应的格式,将计算流程固定成一个确定的有向无环图,并且进行一定的优化以适应下游任务。此时就有非常多公司有对应的技术,比如Nvidia的TensorRT、开源的Onnx、Pytorch的TorchScript、Paddle的PaddleLite等。
蓝色的是模型运行阶段,一个程序最终还是要在硬件上运行的,这就有各家不同的硬件处理器实现了。不同的处理器的计算能力不同,消耗的功率也不同。在移动平台上的硬件会更注重功率,在大型服务器上的硬件则可能会兼顾算力和功率。
第二阶段有的时候也会细分为两部分。
一部分更接近底层,直接作用于硬件。比如Nvidia的cuDNN,这是在CUDA的基础上开发的用来进行深度学习网络计算的库,使用cuDNN可以让模型在Nvidia的GPU上高效运行。
另一部分则更抽象,作用于计算图。这一部分一般会对算子进行融合,通过运算方式来进行加速。
部分则更抽象,作用于计算图。这一部分一般会对算子进行融合,通过运算方式来进行加速。