gscienty 2018-12-17
人工智能繁荣发展的背后是各大厂商暗战的开始,大家都在为了争抢开发者推出各自的深度学习开发框架,而随着应用在不同场景下的关联性越来越强,碎片化的框架也对开发人员造成了困扰,开发框架需要统一。
AI开发面临碎片化 深度学习框架要统一(图片来自FactorDaily)
深度学习的优势在于,利用非监督式或半监督式的特征学习、分层特征提取高效算法去替代传统的人工获取特征。为此,微软、谷歌、亚马逊等IT巨头都在围绕深度学习投资项目、开发框架工具,CNTK、TensorFlow、MXNet背后均有着这些企业的力挺。除此之外,Caffe、Torch、Theano也是比较流行的开发框架。
对于开发人员来说,使用这些框架的特性和功能各有不同,应用场景也可能是算机视觉、语音识别、自然语言处理与生物信息学等等。以TensorFlow来说,使用者不再需要通过反向传播求解梯度,这点和Theano类似,而且在设计神经网络结构时,也不用耗费过多精力去写C++或者CUDA代码。
在使用过程中,C++在线上部署的复杂度方面有所降低,而且让手机、平板、穿戴设备等对处理资源占用密集的终端可以运行更为复杂的模型,要知道相比之下Python的资源损耗还处在相对较高的水平。借此,开发者就能在硬件性能相对足够的机器中,即使是用Python也可以获得在低延迟状态下、嵌入式环境中使用C++的能力。当然TensorFlow也有其问题,比如异类设备之间的通信优化仍需完善。
Theano可以说是最古老的同类库之一,也是最初深度学习的主导标准之一,其流行程度可以让用户在上面找到各种常见问题,包括如何去存储、运行训练模型,在单GPU方面执行效率也算是还不错的水平。而且基于Theano,也衍生出了大量的深度学习库,像Keras对神经网络的抽象就可以对执行后端随意切换。
不过考虑到Theano缺乏底层C++的接口,导致部署起来并不方便,在工业生产环境的应用几乎鲜有。因此,很多人都是将其视为研究工具,而不是最终的产品,在CPU上的低性能也有这方面的阻碍。所以这种框架更像是一个原始语言,如果直接用其设计神经网络,或者去读它的输出信息,对开发者是毕竟痛苦的事情。
此外,Caffe、Deeplearning4J等也有着各自的问题,这里就不一一赘述了。由此也引申出了开发者到底该如何选择深度学习的开发平台?这里列出了几个考察点:首先,多数公司的AI架构不是从0起步,对既有编程平台的整合难度不能忽视;其次,对机器学习软件包和数据处理的难度也要寻求兼容;再有,二次开发能力同样关键,有了分布式、多GPU的优化能力,如何在其他平台上发挥作用,这是要思考的事情。
通过对比主流的几款深度学习开发框架,可以看到底层语言用C++(Caffe、MXNet、CNTK、TensorFlow)和C(Torch)的占有大多数,这也是当前来看最有效率的,像Python则是有望成为下一代的平台语言,这也是像微软在CNTK 2.0中所努力的方向。
从生态的角度来看,各家的框架多少还存在着分战队的情况。开发者需要在各自的平台上做各自的开发,而且这些框架在更新时并不是统一的,也就是说开发者在一个框架上开发的神经网络模型,并不能直接在另一个框架上用。要想让二者实现兼容,开发者需要花费很大的精力去自行解决。
为了解决这一问题,需要微软、谷歌这样掌握开发者“主权”的企业站出来,借助兼容框架去统一开发者的使用体验,ONNX(开放神经网络交换)就是在这个思路下成立的,这是由微软共同发起的一个项目,参与者有Facebook、AWS这样的软件厂商,也有AMD、ARM、华为、IBM、英特尔、高通这样的产业参与者。比如说有了ONNX,开发者可以把在PyTorch训练的模型直接放到Caffe2上推理。
几乎每隔2-4个月就会有ONNX的升级,例如其中会新增一些运算符帮助用户创建新的模型。事实上,现在微软的主流产品Bing、广告和Office,还有视觉服务,基本上后台都在用ONNX。在此基础之上,微软还发布了ONNX Runtime,插件式的执行者界面意味着ONNX Runtime可以快速适应软件和硬件的改进。执行者界面是硬件加速器向ONNX Runtime报告其性能的标准方式。英特尔、英伟达都在将ONNX Runtime整合到他们的硬件加速器中,目前,英特尔的MKL-DNN、nGraph编译器以及英伟达优化的TensorRT推理引擎都已完成整合。