AI 机器学习框架 python C++

简介

Github地址: https://github.com/Jittor/Jittor 在机器学习框架领域,Pytorch、TensorFlow已分别成为目前学界和业界使用最广泛的两大实力玩家,而紧随其后的Keras、Caffe/Caffe2、MXNet等框架也因为自身的独特性受到相应开发者的喜爱。
如今,AI开源框架之争再添新入局者。 如你所知,随着深度学习新技术的出现,任务复杂度不断提高,由于架构设计和不断扩充等原因,导致系统复杂,架构优化和移植变得困难,新模型的实际性能还有待提升。 一支清华大学团队决定研发更加灵活高效的深度学习框架。他们于近日宣布开源Jittor(计图)(Jittor:Just in Time),采用元算子融合和动态编译技术,深度优化内存,有效提升了系统的运行性能和通用性,确保实现和优化分离,大幅提升应用开发的灵活性、可拓展性和可移植性。 Jittor的研发团队是清华大学计算机系的图形学实验室,负责人现为胡事民教授,长期从事可视媒体智能处理的研究。2006年-2015年间,实验室得到两期国家973计划项目的资助,在可视媒体的认知计算、机器学习、几何计算、智能算法等方面开展研究。

关键技术

元算子

元算子是jittor的关键概念,元算子的层次结构如下所示。

【AI】Jittor(计图)开源深度学习框架 - 图1

元算子的层级结构。元算子包含三类算子,重索引算子,重索引化简算子,元素级算子。元算 子的反向传播算子还是元算子。元算子可以组成常用的深度学习算子。而这些深度学习算子又 可以进一步组成深度学习模型。 元算子由重索引算子,重索引化简算子和元素级算子组成。
  • 重索引算子(一元算子),是其输入和输出之间的一对多映射。广播,填补, 切分算子是常见的重新索引算子。
  • 重索引化简算子(一元算子) ,是多对一映射。而化简,累乘,累加算子是常见的索引化简算子。
  • 元素算级子可能包含多个输入。 但是元素级算子的所有输入和输出形状必须相同,它们是一对一映射的。 例如,两个变量的加法是一个二进制的逐元素算子。

融合

融合实际上是数据计算pipeline化,即两次计算中间数据不再经历store-load的过程,而是直接给到下一个计算单元完成计算。以元算子融合为例,在实现卷积运算时,Jittor能够将4个元操作符融合成一个操作符,这样中间变量xx、pp、yy就不需要实际计算了。 ## 动态编译&静态编译 1.静态编译:编译器在编译可执行文件时,把需要用到的对应动态链接库(.so或.ilb)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行时不需要依赖于动态链接库. 2.动态编译: 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一 方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。 # 三大设计理念

1.易用且可定制:用户只需要数行代码,就可定义新的算子和模型,在易用的同时,不丧失任何可定制性。

深度学习采用的卷积神经网络是由算子(Operator)组成的一个计算网络,当前深度学习框架有多达2000种算子。Jittor将算子运算进一步分解,形成了更加底层的三类20余种元算子闭包,目前神经网络常用算子均可以使用元算子的组合进行表达。

【AI】Jittor(计图)开源深度学习框架 - 图2

Jittor通过元算子融合实现深度神经网络模型

2.实现与优化分离:用户可以通过前端接口专注于实现,而实现自动被后端优化。从而提升前端代码的可读性,以及后端优化的鲁棒性和可重用性

3.所有都是即时的:Jittor的所有代码都是即时编译并且运行,包括Jittor本身。用户可以随时对Jittor的所有代码进行修改,并且动态运行。

面向未来深度学习框架的发展趋势,Jittor利用元算子组合表达的优势,提出统一计算图进行优化,并从底层开始设计了一个全新的动态编译架构。

性能表现

Jittor团队称,该架构支持多种编译器,确保实现和优化分离,大幅提升了应用开发灵活性、可拓展性和可移植性,与其他主流框架相比,具有多项先进特性。

【AI】Jittor(计图)开源深度学习框架 - 图3

基于元算子组合表达神经网络的优势,Jittor提出统一计算图,融合静态计算图和动态计算图,提供高性能的计算:统一管理前向反向计算图,自动支持任意高阶导数的计算;统一调度CPU和GPU内存,支持超大模型的训练;统一同步异步运行接口,使得数据读取、内存拷贝、模型计算可以同时进行;统一管理多次迭代的计算图,实现跨迭代的融合优化。 基于此,Jittor团队在平台实现了ResNet、VGG、SSD、DeepLab、LSGAN等多个网络模型,根据他们提供的数据,与Pytorch相比,Jittor的推理和训练速度达到10%-50%的性能提升。

【AI】Jittor(计图)开源深度学习框架 - 图4

Jittor在性能上的提升,主要得益于Jittor提出的元算子融合和统一计算图,优化计算,节省计算资源,提升访存效率。同时,Jittor设计的全新编译架构将元算子动态编译成高性能的C++/CUDA代码,并进一步通过与LLVM兼容的优化编译遍(complier pass),生成对计算设备友好的可执行代码。

国内其他机器学习框架

腾讯优图NCNN

2017年,腾讯优图实验室公布了成立以来的第一个开源项目ncnn,这是一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖,跨平台,手机端 cpu的速度快于目前所有已知的开源框架。
【AI】Jittor(计图)开源深度学习框架 - 图5 ncnn与同类框架对比 ## 百度PaddlePaddle PaddlePaddle 作为国内首个深度学习开源平台,是2016 年 8 月底百度开源的深度学习平台。 PaddlePaddle 的设计思想是基于Layer的设计。

【AI】Jittor(计图)开源深度学习框架 - 图6

阿里X-DeepLearning

X-DeepLearning的计划是业界首个面向广告、推荐、搜索等高维稀疏数据场景的深度学习开源框架,可以与TensorFlow、PyTorch 和 MXNet 等现有框架形成互补。 X-Deep Learning(下文简称XDL)由阿里巴巴旗下大数据营销平台阿里妈妈基于自身广告业务自主研发,已经大规模部署应用在核心生产场景。 XDL整体上跟TensorFlow和PyTorch是同级的,它们很好地解决了目前已有开源深度学习框架分布式运行能力不足,以及大规模稀疏特征表征学习能力不足的问题。 XDL 采用了“桥接”的架构设计理念。

机器学习框架互通—ONNX

Open Neural Network Exchange(ONNX,开放神经网络交换)格式,是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。

ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互。 ONNX的规范及代码主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同开发,以开放源代码的方式托管在Github上。目前官方支持加载ONNX模型并进行推理的深度学习框架有: Caffe2, PyTorch, MXNet,ML.NET,TensorRT 和 Microsoft CNTK,并且 TensorFlow 也非官方的支持ONNX。—-维基百科

假设一个场景:现在某组织因为主要开发用TensorFlow为基础的框架,现在有一个深度算法,需要将其部署在移动设备上,以观测变现。传统地我们需要用caffe2重新将模型写好,然后再训练参数;试想下这将是一个多么耗时耗力的过程。

此时,ONNX便应运而生,Caffe2,PyTorch,Microsoft Cognitive Toolkit,Apache MXNet等主流框架都对ONNX有着不同程度的支持。这就便于了我们的算法及模型在不同的框架之间的迁移。

机器学习框架优缺点比较

TensorFlow

“使用数据流图表的可伸缩机器学习的计算

优点:

  • 使用易于学习的语言(Python)。
  • 使用计算图表抽象。
  • 用于TensorBoard的可用性的可视化。

缺点:

  • 这很慢,因为Python不是语言中最快的。
  • 缺乏许多预先训练的模型。
  • 不完全开源。

Caffe

“快速、开源的深度学习框架”

优点:

  • Python和MATLAB的绑定可用。
  • 性能表现良好。
  • 无需编写代码即可进行模型的训练。

缺点:

  • 对于经常性网络不太好。
  • 新体系结构不太好。

Keras

“人类的深度学习”

优点:

  • 它是用户友好的。
  • 它很容易扩展。
  • 在CPU和GPU上无缝运行。
  • 与Theano和TensorFlow无缝工作。

缺点:

  • 不能有效地用作独立的框架。

Microsoft CNTK

“开源深度学习工具包”

优点:

  • 这是非常灵活的。
  • 允许分布式训练。
  • 支持C ++、C#、Java和Python。

缺点:

  • 它以一种新的语言——网络描述语言(Network Description Language , NDL)来实现。
  • 缺乏可视化。

参考文献

Jittor算子融合方法

元算子:通过元算子实现自己的卷积层

动态编译、静态编译区别

盘点国内那些深度学习框架

ONXX简介链接