认识Caffe与Caffe2

认识Caffe与Caffe2

目录:

一、Caffe的作者-贾扬清

二、Caffe简介--Caffe、Caffe2、Caffe2Go

三、认识Caffe

四、认识Caffe2

五、认识Caffe2Go

 

 

正文:

一、Caffe的作者-贾扬清

Caffe 作者:贾扬清,任Facebook研究科学家,曾在Google Brain工作。在AI领域有数年的研究经历。在UC Berkeley获得计算机科学博士学位,在清华大学获得硕士和本科学位。对两款流行的深度学习框架做过贡献:Caffe的作者,TensorFlow的作者之一。

作者工作经历:2016年2月从Google离职,加入Facebook,致力于前沿AI研究和平台开发。2013年12月到2016年2月在Google Brain担任研究科学家,致力于前沿的深度学习研究和工程,参与了ImgeNet2014比赛、移动端深度学习、Google下一代AI平台TensorFlow开发、基于深度学习的产品开发和产品咨询等。

二、Caffe简介--Caffe、Caffe2、Caffe2Go

Caffe的全称是:Convolutional architecture forfast feature embedding,它是一个清晰、高效的深度学习框架,它是开源的,核心语言是C++,它支持命令行、Python和Matlab接口,它既可以在CPU上运行也可以在GPU上运行。它的license是BSD 2-Clause。Deep Learning比较流行的一个原因,主要是因为它能够自主地从数据上学到有用的feature。特别是对于一些不知道如何设计feature的场合,比如说图像和speech。
(2.1) Caffe是一款知名的深度学习框架,由加州大学伯克利分校的贾扬清博士于2013年在Github上发布。自那时起,Caffe在研究界和工业界都受到了极大的关注。Caffe的使用比较简单,代码易于扩展,运行速度得到了工业界的认可,同时还有十分成熟的社区。
(2.2) Caffe2在2017年4月18日开幕的 F8 年度开发者大会上,Facebook 发布的一款全新的开源深度学习框架。

(2.3) Caffe2go是一个以开源项目Caffe2为基础、使用Unix理念构建的轻量级、模块化框架。其核心架构非常轻量化,而且可以附加多个模块。它是Facebook开发的一个可以在移动平台上实时获取、分析、处理像素的深度学习框架Caffe2Go。

 
   

 

 

 

 

 

 

 

Caffe2发布后,外界最多的讨论之一,就是发出”Caffe2和Caffe有何不同?”的疑问。贾扬清曾解释过一次:“目前Caffe2还不能完全替代Caffe,还缺不少东西,例如CuDNN。与Caffe2相比,Caffe仍然是主要的稳定版本,在生产环境中使用仍然推荐Caffe”。现在Caffe2正式发布,这个推荐应该要改成新版本了。

 

三、认识Caffe

对于刚开始学习深度学习的同学来说,Caffe是一款十分适合的开源框架。可其他同类型的框架,它又一个最大的特点,就是代码和框架比较简单,适合深入了解分析。接下来,将要介绍的内容都是Caffe中成型很久的内容,如今绝大多数版本的Caffe都包含这些功能。关于Caffe下载和安装的内容请各位根据官方网站指导进行下载和安装,这里就不再赘述。

Caffe的设计:

基本上,Caffe 遵循了神经网络的一个简单假设----所有的计算都是以layer的形式表示的,layer做的事情就是处理一些数据,然后输出一些计算以后的结果。比如说卷积,就是输入一个图像,然后和这一层的参数(filter)做卷积,然后输出卷积的结果。

每一个layer需要做两个计算:1,Forward是从输入计算输出。2,Backward是从上面给的gradient来计算相对于输入的gradient。

只要这两个函数实现了以后,我们就可以把很多层连接成一个网络,这个网络做的事情就是输入我们的数据(图像或者语音等),然后来计算我们需要的输出(比如说识别的label),在training的时候,我们可以根据已有的label来计算loss和gradient,然后用gradient来update网络的参数,这个就是Caffe的一个基本流程。

基本上,最简单地用Caffe上手的方法就是先把数据写成Caffe的格式,然后设计一个网络,然后用Caffe提供的solver来做优化看效果如何,如果你的数据是图像的话,可以从现有的网络,比如说alexnet或者googlenet开始,然后做fine tuning,如果你的数据稍有不同,比如说是直接的float vector,你可能需要做一些custom的configuration,Caffe的logistic regression example兴许会很有帮助。

Fine tuning的想法就是说,在imagenet那么大的数据集上train好一个很牛的网络了,那别的task上肯定也不错,所以我们可以把pretrain的网络拿过来,然后只重新train最后几层,重新train的意思是说,比如我以前需要classify imagenet的一千类,现在我只想识别是狗还是猫,或者是不是车牌,于是我就可以把最后一层softmax从一个4096*1000的分类器变成一个4096*2的分类器,这个strategy在应用中非常好使,所以我们经常会先在imagenet上pretrain一个网络,因为我们知道imagenet上training的大概过程会怎么样。

Caffe可以应用在视觉、语音识别、机器人、神经科学和天文学。Caffe提供了一个完整的工具包,用来训练、测试、微调和部署模型。

Caffe的亮点:

1) 模块化:Caffe从一开始就设计得尽可能模块化,允许对新数据格式、网络层和损失函数进行扩展。

2) 表示和实现分离:Caffe的模型(model)定义是用ProtocolBuffer语言写进配置文件的。以任意有向无环图的形式,Caffe支持网络架构。Caffe会根据网络的需要来正确占用内存。通过一个函数调用,实现CPU和GPU之间的切换。

3) 测试覆盖:在Caffe中,每一个单一的模块都对应一个测试。

4) Python和Matlab接口:同时提供Python和Matlab接口。

5) 预训练参考模型:针对视觉项目,Caffe提供了一些参考模型,这些模型仅应用在学术和非商业领域,它们的license不是BSD。

 Caffe架构:

1) 数据存储:

Caffe通过“blobs”即以4维数组的方式存储和传递数据。Blobs提供了一个统一的内存接口,用于批量图像(或其它数据)的操作,参数或参数更新。Models是以Google Protocol Buffers的方式存储在磁盘上。大型数据存储在LevelDB数据库中。

2) 层:

一个Caffe层(Layer)是一个神经网络层的本质,它采用一个或多个blobs作为输入,并产生一个或多个blobs作为输出。网络作为一个整体的操作,层有两个关键职责:前向传播,需要输入并产生输出;反向传播,取梯度作为输出,通过参数和输入计算梯度。Caffe提供了一套完整的层类型。

3) 网络和运行方式:

Caffe保留所有的有向无环层图,确保正确的进行前向传播和反向传播。Caffe模型是终端到终端的机器学习系统。一个典型的网络开始于数据层,结束于loss层。通过一个单一的开关,使其网络运行在CPU或GPU上。在CPU或GPU上,层会产生相同的结果。

4) 训练一个网络:

Caffe训练一个模型(Model)靠快速、标准的随机梯度下降算法。 

在Caffe中,微调(Fine tuning),是一个标准的方法,它适应于存在的模型、新的架构或数据。对于新任务,Caffe 微调旧的模型权重并按照需要初始化新的权重。

Blobs,Layers,and Nets:深度网络的组成模式表示为数据块工作的内部连接层的集合。以它自己的model模式,Caffe定义了层层(layer-by-layer)网络。Caffe网络定义了从低端到顶层整个model,从输入数据到loss层。随着数据通过网络的前向传播和反向传播,Caffe存储、通信、信息操作作为Blobs。Blob是标准阵列和统一内存接口框架。Blob用来存储数据、参数以及loss。随之而来的layer作为model和计算的基础,它是网络的基本单元。net作为layer的连接和集合,网络的搭建。blob详细描述了layer与layer或net是怎样进行信息存储和通信的。Solver是Net的求解。

Blob 存储和传输:一个blob是对要处理的实际数据的封装,它通过Caffe传递。在CPU和GPU之间,blob也提供同步能力。在数学上,blob是存储连续的N维数组阵列。

Caffe通过blobs存储和传输数据。blobs提供统一的内存接口保存数据,例如,批量图像,model参数,导数的优化。

Blobs隐藏了计算和混合CPU/GPU的操作根据需要从主机CPU到设备GPU进行同步的开销。主机和设备的内存是按需分配。

 

对于批量图像数据,blob常规容量是图像数N*通道数K*图像高H*图像宽W。在布局上,Blob存储以行为主,因此最后/最右边的维度改变最快。例如,在一个4D blob中,索引(n, k, h, w)的值物理位置索引是((n *K + k) * H + h) * W + w。对于非图像应用,用blobs也是有效的,如用2D blobs。

参数blob尺寸根据当前层的类型和配置而变化。

一个blob存储两块内存,data和diff,前者是前向传播的正常数据,后者是通过网络计算的梯度。

一个blob使用SyncedMem类同步CPU和GPU之间的值,为了隐藏同步的详细信息和尽量最小的数据传输。

Layer计算和连接:Layer是模型(model)的本质和计算的基本单元。Layer卷积滤波、pool、取内积、应用非线性、sigmoid和其它元素转换、归一化、载入数据,计算losses。

每一个layer类型定义了三个至关重要的计算:设置、前向和反向。(1)、设置:初始化这个layer及在model初始化时连接一次;(2)、前向:从底部对于给定的输入数据计算输出并传送到顶端;(3)、反向:对于给定的梯度,顶端输出计算这个梯度到输入并传送到低端。

有两个前向(forward)和反向(backward)函数执行,一个用于CPU,一个用于GPU。

Caffe layer的定义由两部分组成,层属性和层参数。

每个layer有输入一些’bottom’blobs,输出一些’top’ blobs。

Net定义和操作:net由组成和分化共同定义了一个函数和它的梯度。每一层输出计算函数来完成给定的任务,每一层反向从学习任务中通过loss计算梯度。Caffe model是终端到终端的机器学习引擎。

 

Net是layers组成的有向无环图(DAG)。一个典型的net开始于数据层,此layer从磁盘加载数据,终止于loss层,此layer计算目标任务,如分类和重建。

Model初始化通过Net::Init()进行处理。初始化主要做了两件事:通过创建blobs和layers来构建整个DAG,调用layers的SetUp()函数。它也做了一系列的其它bookkeeping(簿记)的事情,比如验证整个网络架构的正确性。

Solver: 优化一个model通过首先调用forward得到输出和loss,然后调用backward生成model的梯度,接着合并梯度到权值(weight)更新尽量减少loss.Solver, Net和Layer之间的分工,使Caffe保持模块化和开放式发展。

Loss: 在Caffe中,作为大多数机器学习,学习(learning)是通过loss函数(error, cost, or objective函数)来驱动。一个loss函数指定了学习的目标通过映射参数设置(例如,当前的网络权值)到一个标量值。因此,学习的目标是找到最小化loss函数权值的设置。

在Caffe中,loss是由网络的forward计算。每一个layer采用一组输入blobs(bottom,表示输入),并产生一组输出blobs(top,表示输出)。一些layer的输出可能会用在loss函数中。对于分类任务,一个典型的loss函数选择是SoftmaxWithLoss函数。

Loss weights:net通过许多个layers产生一个loss,loss weights能被用于指定它们的相对重要性。

按照惯例,带有”loss”后缀的Caffe layer类型应用于loss函数,但其它layers是被假定为纯碎用于中间计算。然而,任一个layer都能被用于loss,通过添加一个”loss_weight”字段到一个layer定义。

在Caffe中,最后的loss是被计算通过所有的weighted loss加和通过网络。

 

Solver:Solver通过协调网络的前向推理和后向梯度形成参数更新试图改善loss达到model优化。Learning的职责是被划分为Solver监督优化和产生参数更新,Net产生loss和梯度。

Caffe中solver

solver方法:

随机梯度下降(StochasticGradient Descent, type:”SGD”);

AdaDelta(type:”AdaDelta”);

自适应梯度(Adaptive Gradient,type:”AdaGrad”);

Adam(type:”Adam”);

Nesterov’sAccelerated Gradient(type:”Nesterov”);

RMSprop(type:”RMSProp”).

Solver作用:Solver是Net的求解。

(1)、优化bookkeeping、创建learning训练网络、对网络进行评估;

(2)、调用forward/backward迭代优化和更新参数;

(3)、定期评估测试网络;

(4)、整个优化快照model和solver状态。

Solver的每一次迭代执行:

(1)、调用网络forward计算输出和loss;

(2)、调用网络backward计算梯度;

(3)、按照solver方法,采用渐变进行参数更新;

(4)、按照学习率、历史和方法更新solver状态。通过以上执行来获得所有的weights从初始化到learned model.

 

像Caffe models,Caffe solvers也可以在CPU或GPU模式下运行。solver方法处理最小化loss的总体优化问题。实际的weight更新是由solver产生,然后应用到net参数。

Layer Catalogue为了创建一个Caffe model,你需要定义model架构在一个prototxt文件(protocolbuffer definition file)中。Caffe layers和它们的参数是被定义在protocol buffer definitions文件中,对于Caffe工程是caffe.proto.

Vision LayersVision layers通常以图像作为输入,并产生其它图像作为输出:

(1)、Convolution(Convolution):卷积层通过将输入图像与一系列可学习的滤波进行卷积,在输出图像中,每一个产生一个特征图;

(2)、Pooling(Pooling);

(3)、Local Response Normalization(LRN);

(4)、im2col;

Loss LayersLoss驱动学习通过比较一个输出对应一个目标和分配成本到最小化。Loss本身是被计算通过前向传输,梯度到loss是被计算通过后向传输:

>>>   Softmax(SoftmaxWithLoss);

>>>   Sum-of-Squares/Euclidean(EuclideanLoss);

>>>   Hinge/Margin(HingeLoss);

>>>   SigmoidCross-Entropy(SigmoidCrossEntropyLoss);

>>>   Infogain(InfogainLoss);

>>>   Accuracy andTop-k;

Activation/NeuronLayers一般Activation/Neuron Layers是逐元素操作,输入一个bottom blob,产生一个同样大小的topblob:

 

>>>   ReLU/Rectified-Linearand Leaky-ReLU(ReLU);

>>>   Sigmoid(Sigmoid);

>>>   TanH/Hyperbolic Tangent(TanH);

>>>   Absolute Value(AbsVal);

>>>   Power(Power);

>>>   BNLL(BNLL);

Data Layers数据输入Caffe通过Data Layers,它们在网络的低端。数据可以来自于:高效的数据库(LevelDB或LMDB)、直接来自内存、在不注重效率的情况下,也可以来自文件,磁盘上HDF5数据格式或普通的图像格式:

>>>  Database(Data);

>>>  In-Memory(MemoryData);

>>>  HDF5Input(HDF5Data);

>>>  HDF5 Output(HDF5Output);

>>>  Images(ImageData);

>>>  Windows(WindowData);

>>>  Dummy(DummyData);

Common Layers

>>>   InnerProduct(InnerProduct);

>>>   Splitting(Split);

>>>   Flattening(Flatten);

>>>   Reshape(Reshape);

>>>   Concatenation(Concat);

>>>   Slicing(Slice);

>>>   Elementwise Operations(Eltwise);

>>>   Argmax(ArgMax);

>>>   Softmax(Softmax);

>>>   Mean-VarianceNormalization(MVN);

Data在Caffe中,数据存储在Blobs中。Data Layers加载输入和保存输出通过转换从blob到其它格式。普通的转换像mean-subtraction和feature-scaling是通过配置datalayer来完成。新的输入类型需要开发一个新的data layer来支持。

 

四、认识Caffe2

Caffe2支持:caffe 转caffe2模型转caffe2模型。据Caffe2的第一个正式版本发布时,官方介绍说:这是一个轻量化和模块化的深度学习框架,在强调轻便性的同时,也保持了可扩展性和计算性能。

Caffe2的特性:

- Caffe2框架可以通过一台机器上的多个GPU或具有一个及多个GPU的多台机器来进行分布式训练。
- 也可以在iOS系统、Android系统和树莓派(Raspberry Pi)上训练和部署模型。
- 只需要运行几行代码即可调用Caffe2中预先训练好的Model Zoo模型。
- Caffe2框架已经应用在Facebook平台上。
- NVIDIA(英伟达),Qualcomm(高通),Intel(英特尔),Amazon(亚马逊)和Microsoft(微软)等公司的云平台都已支持Caffe2。
- GitHub上有Caffe2的源代码。

 

Caffe2和Caffe有何不同?
Caffe2发布后,外界最多的讨论之一,就是发出上述疑问。去年12月,贾扬清曾经解释过一次:“目前Caffe2还不能完全替代Caffe,还缺不少东西,例如CuDNN。与Caffe2相比,Caffe仍然是主要的稳定版本,在生产环境中使用仍然推荐Caffe”。
现在Caffe2正式发布,这个推荐肯定要改成新版本了。
Caffe2的基本计算单位是Operator。对于适当数量和类型的输入参数,每个Operator都包括所需的计算逻辑。Caffe和Caffe2的总体差异如下图所示:

 

 

官方提供了从Caffe迁移到Caffe2的教程,据说这个迁移非常简单。
Caffe2和PyTorch有何不同?
这是另外一个疑问。
Caffe2长于移动和大规模部署。虽然Caffe2新增了支持多GPU的功能,这让新框架与Torch具有了相同的GPU支持能力,但是如前所述,Caffe2支持一台机器上的多个GPU或具有一个及多个GPU的多台机器来进行分布式训练。
PyTorch适合进行研究、实验和尝试不同的神经网络;而Caffe2更偏向于工业应用,而且重点关注在移动端上的表现。
贾扬清现身说法
Caffe2发布后,作者贾扬清在reddit上连发四记解答。“Yangqing here”,贾扬清一上来就表明了身份。

 

有人问搞出Caffe2意义何在?现在已经有PyTorch、TensorFlow、MXNet等诸多框架。
贾扬清说Caffe2和PyTorch团队紧密合作。他们把Caffe2视作一种生产力的选择,而把Torch视作研究型的选择。而在构建AI模块时,他们也持有一种“非框架”的理念,例如Gloo、NNPACK和FAISS等可以被用于任何深度学习框架。
有人问Caffe2接受外部贡献么?
贾扬清说大爱外部贡献,也会在开源方面继续努力。
有人问Caffe2是否用了Torch的代码库,以及CUDA等相关支持的问题。
贾扬清说他们正在计划让Caffe2和Torch和PyTorch共享后端,这几个框架已经共享Gloo用于分布式训练,THCTensor、THNN和其他C/C++库也将会共享。
在GPU层面,Caffe2使用了CUDA和CUDNN。贾扬清和团队也试验了OpenCL,但是感觉用NVIDIA的GPU CUDA效果更好。
另外在其他平台(例如iOS上),Caffe2使用了特定的工具,例如Metal。一两天内,官方会发布Metal的实施。
有人问Caffe2支持动态图么?
贾扬清给出否定的回答,他表示这是Caffe2和PyTorch团队有意做出的选择。Caffe2的任务就是提供最佳的性能,而如果想要极端灵活的计算,请选择PyTorch。贾扬清认为这是一个更好的方式,因为“一个框架通吃”可能会影响性能。
所以,目前Caffe2只支持非常有限的动态控制,例如动态RNN。
 
此外,功能特性:重视移动计算——Caffe2针对ARM CPU进行了优化,拥有超越机载GPU的优势。它支持Andriod和iOS。轻量级和可扩展支持分布式计算可用于生产环境Python和C ++ API“代码编写一次,可到处运行”。作为一个kickstart,Caffe2还提供了内置的标准深度学习架构模型,以便任何人都可以在此基础上进行开发,而不必从头开始。
Facebook发布的广泛流行的PyTorch框架,PyTorch是专为研究建立神经网络和实验而开发的。Caffe2是专为移动生产环境而设计的,可以在各种移动平台上部署大规模数据。
 
Caffe2的承诺:
构建可用和稳定的开源库比看起来更困难,这也是很多深度学习库,如Tensorflow无法升级的原因之一。特别是在像深度学习这样的热门领域,管理开放源代码库是一项艰巨的任务。由于有太多的贡献者,管理程序员们提出的要求是很乏味的,所造成的延误反过来又会让程序员们失望。为了解决这个问题,Caffe2开发商已经承诺更快和更透明地接受贡献者的建议,进一步增强Caffe2。
此外,FAIR已经承诺了PyTorch和Caffe2之间的互操作性,因此可以使用Caffe2将实验模型直接部署到移动平台上,从而满足许多AI创业公司的愿望。 但这里要注意的是,Caffe2不支持动态图表,因为它可能会产生移动平台目前无法支持的计算负载。

再引用:http://www.hackcv.com/index.php/archives/110/?utm_source=tuicool&utm_medium=referral 前几天 facebook 开源的 caffe2,让我们在深度学习框架上又多了一个选择。caffe2 宣称是轻量级、模块化和可扩展的一个框架,code once,run anywhere。作为一个老 caffe 玩家,自是要好好研究一番。

依赖处理

第一版 caffe 的依赖是个让人头疼的事,尤其是在公司旧版的服务器上安装时,需要花费大量的时间折腾。服务器的系统旧,python的版本低(2.4),直接升级可能会影响现有服务,所以只能源码编译安装各种依赖。当时比较头疼的问题有两个:

  • 依赖里面套着依赖:glog需要gflags,gflags需要cmake(版本低了,好像也会有问题),numpy依赖python的版本和Cython,等等。
  • 解决完一台的问题,下一台还会出现新问题。

docker

当然,现在有了docker,这些都不再是问题了。但当时前前后后安装了好多遍,又是改代码,又是改Makefile,每次都挺麻烦。

记得当时为了简化依赖,我还开了个坑simple_Caffe,准备做两件事:

  • 去掉依赖,有些依赖其实并不会用到,比如数据库部分,我只用到lmdb,就不需要leveldb和hdf5的依赖。
  • 把training和inference分开,众所周知,training是个费时费力的活,为了得到一个有效的模型,需要多台机器长时间的工作,但inference也许仅仅需要一台就够了,而inference也仅是载入模型权重参数,构建网络,可以对依赖做简化的。

但后来深度学习的工作告一段落,懒癌发作,就一直没填坑 :

现在新版的 caffe2 通过简化依赖,按需配置,完美的解决了这些问题。在 caffe2 的文件夹中,只有core和proto两个文件夹是必须的,其他都是可配置的。而所谓的code once,run everywhere,核心就在于此。

Deep_Learning/caffe2/caffe2(master⚡)» tree -d .                                                                        

.

├── binaries

├── contrib

│   ├── docker-ubuntu-14.04

│   ├── gloo

│   ├── mpscnn-fb

│   ├── nccl

│   ├── nervana

│   ├── nnpack

│   ├── prof

│   ├── snpe-fb

│   ├── torch

│   └── warpctc

├── core

├── cuda_rtc

├── db

├── distributed

├── experiments

│   ├── operators

│   └── python

├── image

├── mkl

│   └── operators

├── mpi

├── operators

├── proto

├── python

│   ├── docs

│   ├── examples

│   ├── helpers

│   ├── layers

│   ├── mint

│   │   ├── static

│   │   │   └── css

│   │   └── templates

│   ├── models

│   ├── operator_test

│   ├── predictor

│   ├── tutorial

│   └── tutorials

│       ├── experimental

│       └── images

├── queue

├── sgd

├── test

│   └── assets

└── utils

    ├── mkl

    └── threadpool

 

48 directories

这样,就可以针对不同的需求做不同的选择,灵活性更大。

Net 组成方式

第一版的 caffe 的 Net 由粒度较粗的layer组成,即每个layer的 weight 和 bias 都以layer级别存储,这样做虽然简单直观,但有以下几个问题:

  • 针对具体平台做优化时,就会比较繁琐,现有的代码只有GPU和CPU的版本,即forward_cpu,forward_gpu,如果针对arm优化,则不仅仅添加该layer的arm实现,还要修改其他地方的代码。
  • 添加新的layer实现,需要修改caffe.proto文件,重新编译,而且当新的layer是已有几个layer的组合时,比如LRN layer,就由split layer、power layer和pooling layer组成,复用起来稍有复杂。
  • weight 和 bias 参数和 layer 绑定在一起,finetune 也会稍显复杂,修改Net的prototext文件,指定哪些layer的参数保持不变,哪些layer的参数需要重新学习。

其实最后一个问题是我经常所遇到的问题,感谢开源,有很多现成的模型可以直接使用,我一般会挑选合适的模型进行finetune,很少会从零开始训练(只有个家用级别的GPU,也训不起来,哈哈)。做的多了,就会想,如果可方便的方式进行finetune就好了,比如我基本都在搞分类识别,基本都会保留前几层的卷积参数不动,用来提取中级特征,如果Net的组成方式更加灵活,不同的训练可以载入使用相同的layer,类似与数据并行,就可以同时训练出好几组模型了。

新版 caffe2 的Net组成,也采用了 tensorflow、mxnet 等这些框架使用 operator 方式,由更细粒度的 operator 组合而成。当粒度变小时,可以做的优化就更多了:

  • 多平台的支持变得更加容易了,operator 仅仅是处理数据的逻辑,这就可以有针对性的优化。这个优化不仅包括单个 operator 在新平台的支持,还包括多个 operator 组合的优化。
  • layer 变成了 operator 的组合,剥离了 weight 和 bias 的参数,一方面生成新的 layer更加方便,另一方面也可对 weight 和 bias 控制。就像 output=f(wx+b),当把w和b都当成了参数,就可以把一个函数变成一类函数了。
  • 最大的好处,我觉得还是可以声明式的编写神经网络了,这个和第一版 caffe 相比,就类似使用所见即所得的方式 vs 使用latex 编写文档一样。

在源码的scripts文件夹中,可以看到iOS、Android、Raspberry PI、windows等平台的编译脚本,而仅仅改动几行,就可以支持watchOS,很好很强大,具体可以看看这个Pull Request

基础数据 Blob

caffe2 中把 caffe 中的 Blob 进行扩展,支持了更多的类型,这就让 Binary Net 和模型的量化压缩变得可行。这两个在工业界应该关注更多一些,毕竟关乎成本,它们可以让模型在现有的 CPU 机器上可实用,进一步可以应用到手机端。目前动辄几十、几百MB的模型,怎么嵌入到手机端,确实是个大问题啊(怪不得 facebook 的 iOS 端的安装包越来越大,会不会和这个有关?哈哈)。

总结

caffe2 可以看作是 caffe 更细粒度的重构,在实用的基础上,增加了扩展性和灵活性。作为 caffe 的重度用户,caffe2 解决了我的好几个痛点,后续我会从源码角度进行深入学习,会在树莓派上进行测试,同时我业余也在使用 golang 进行第一版 caffe 模型的量化压缩和可视化的研究,即 gocaffe,对这方面感兴趣的朋友可以关注微博或者微信公众号:hackcv,一起交流学习。

 

五、认识Caffe2Go

    原文:code.facebook.com

Caffe2Go是一个以开源项目Caffe2为基础、使用Unix理念构建的轻量级、模块化框架。其核心架构非常轻量化,而且可以附加多个模块。它是Facebook开发的一个可以在移动平台上实时获取、分析、处理像素的深度学习框架Caffe2Go。考虑到速度是计算密集型移动应用的核心,该框架的轻量化设计让他们可以针对特定平台上定义的操作符进行优化。Caffe2go提升了AI处理速度,让它可以在移动终端上运行。但要实现实时性,并提供高质量、高分辨率的图像,风格转换模型也需要进行优化。Caffe2go是Facebook的第二个AI平台,第一个是已有的开源深度学习框架Torch。但是现在,Facebook将Caffe2go推上了战略地位,因为“它的大小、速度和灵活性”。

引用:“随着视频成为越来越流行的社交方式,我们希望为每个人提供最先进的创作工具来表现自己。我们最近开始在 Facebook 应用程序上测试一个新的创意效果相机,可以帮助人们即时把视频转换成艺术作品风格。这种技术被称为“风格转移”(style transfer)。它能从一种绘画风格中提取艺术性特质,例如梵高画的风格,并将其应用到其他图像和视频中。这种诡计在技术上难以实现的原因在于,它通常需要把内容发送到数据中心,然后在大型计算机服务器上进行处理。但现在,我们在移动设备上开发了一个新的深度学习平台,首次实现了实时的捕获、分析,和像素处理——这一最先进的技术只在手上就能实现。这个成熟的深度学习系统叫 Caffe2Go,它的框架现在已经嵌入我们的手机app中。通过把用于处理图像和视频的AI模型压缩100倍,我们能够在iOS和Android设备上高效运行各种深度神经网络。最终,我们能够为一些移动设备提供的AI推断所需时间不及1/20秒,也就是50毫秒——人眨一下眼睛需要1/3秒,也就是300毫秒。

这个相机中的风格转移工具是两种技术的结合:Caffe2go运行库和风格转移模型。由于我们的AI团队同时研究算法和大规模系统,他们开发的新模型完美实现了这两种追求,使风格转移既质量高又快速。这两种技术的结合能让你在举起手机拍摄视频时,感觉拿着梵高的画笔。

这项工作开始于三个月前,当时还没有人做这样的研究:将基于AI的风格转移技术视作一个创造性工具,让它在人们的移动设备上实时运行。跨产品、技术和研究团队的一群人参与进这个项目。Facebook AI 研究团队的 Justin Johnson 是有关该技术的一篇基础研究论文的作者,为这个项目做了一些前期研究。我们的应用机器学习团队一直致力于开发一个可以在移动设备上运行的AI平台。相机产品团队对用户的需求非常了解。还有另外许多人也为此作出了贡献,这些团队为在移动设备上运行高度优化的神经网络制作了一流的解决方案。

Caffe2Go:更轻便,更快。人工智能已经对计算机科学产生了深远的影响,但它大部分局限于大型数据中心,这些数据中心往往远离实际使用以AI为动力的服务的人。因此,任何标榜能“实时”用AI处理某物的技术仍然受到延迟的影响,因为数据必须发送到数据中心,以在GPU上运行。我们也认为让人们随身带着超级计算机是不切实际的,因此我们试图找到一种方法,让AI能在最无处不在的设备——智能手机上的CPU上工作。

手机能够实时地看、说、理解,而无需连接到远程服务器,但它们也有局限性。虽然近年来手机的计算能力有了显著的提升,每秒能够执行数十亿次数学运算,但它们仍受到诸如功率、存储器、计算能力等的各种资源限制,需要更聪明的软件设计。因此,对机器学习系统来说,手机既是机会也是挑战。

我们应对这个挑战的方案是设计一个非常轻量级,而且模块化的框架。为此,我们在开源Caffe2项目之上利用Unix原理。这确保了连接组件的核心框架非常轻量,而且能够附加多个模块——包括专门为移动设备进行的优化。我们使用一个精益算法框架,允许工程师将抽象运算描述为一个有向无环图(DAG),同时确保图中可以执行的这些节点的输入和输出没有被强加限制。这让我们的工程团队能够在不同平台上实现并优化模块,同时能轻松地把这些模块连接起来。当DAG实际运行时,它能利用各种硬件功能最快地实现具现化。

由于速度是计算密集型移动应用程序的核心,尤其是图像和视频应用,框架设计的轻量能让我们为已定义的运算符执行平台特定的优化。一个著名的例子是Caffe2集成在我们的移动运行库中的名为NNPack的库。利用移动CPU的NEON功能,我们能显著提高移动计算的速度。在 iOS设备上,我们还开始集成加速功能,例如Metal语言。所有这些都是通过模块化设计完成的,无需改变常规模型定义。因此,算法端和运行库端能够安全地彼此依赖,不需要担心任何潜在的不兼容性。

友好的开发环境:Caffe2也是我们的第一个具有产业实力的深度学习平台,可以在四个平台上用同样的代码集全速运行:服务器CPU,GPU,iOS和Android。由于模块化设计,框架可以使用相同的语言,但要分别在各个平台上优化。这是一个对开发者隐藏的实现细节,例如,框架可以在手机(iOS和Android)的NNPack和服务器GPU的CUDNN之间选择。因此,开发者可以专业于算法的工作,而不用研究怎样运行卷积。

开发者还能从最新的设计部署中获益。从开发者的角度看,缩减手机的运行时间是一个难题,因为手机的工具链并不像台式机和服务器那样强大。我们通过压缩神经网络以匹配硬件来解决这一问题。Caffe2go 中一个序列化的网络在手机和服务器上都能实现相同的输出。最终,我们能把主要的工作转移到服务器环境中,模型训练、性能观察、用户体验研究等。如果一切进展顺利,我们仅需要设置一个按钮,就能再转移到手机环境中。

风格转换模型训练:风格转换的概念并不新鲜,最早提出是在2015年8月的一篇会议论文 A Neural Algorithm for Artistic Style。但是,当时的技术处理速度极慢并且要求强大的服务器。论文发表后的几个月,圈内的研究员提升了这一技术并且把速度提升了好几个维度,但是,对计算能力依然有很高的要求。

Caffe2go 把这一AI处理过程变得更快,并且在手持设备上就能完成。但是,风格转化模型依然要进行优化,来保证体验可以实时进行,同时保持好质量、高分辨率的图像。

有效模型尺寸优化:传统的风格转化研究模型(即使是前馈变量)都是很大的(指的是参数的数量),并且很慢。我们的目标是创建一个风格转换应用,能运行新的、更小的同时更有效的模型,来生成高质量的视频,视频能达到20FPS,能在iphone6或以上的设备中运行,并且避免掉帧。

我们采用了三个主要的方法,来缩减模型的尺寸,我们对卷积层数量进行了优化(这是处理过程最消耗时间的部分),也对每一层的宽度进行了优化,在处理过程中,我们还调整了空间分辨率。通过调整需要处理的图像特征数量,或者调整单独的处理行为所需要的时间,卷积网络层的数量和它们的宽度能在独立的层级使用,进而调整处理所需要的时间。

对于空间分辨率,我们能调整实际的尺寸,也就是在中间层中被处理的那些。通过使用早期池化(缩减被处理的图像的尺寸)以及后来的去卷积(在处理后放大图像),我们能加速处理时间,因为系统需要处理的信息变少了。我们还发现,有了这些技术,我们能极大地缩减训练网络的宽度和深度,同时又能确保图像质量维持在合理的水平。

手机上进行神经网络训练:图像的质量是非常主观的,并且非常难以衡量,特别是在风格迁移之类的任务上。所以,我们开发了可视化工具,其中包括A/B测试,训练了不同的模型,来保证我们能得到最佳的图像质量结果。我们使用的由FBLearner Flow 支持的大型GPU集群,让我们可以实现这一目标,因为我们可以快速地扫过大范围的超参数,比如模型架构、内容/风格权重和缩减采样,进而发现一个经过良好训练的回馈风格,能够满足我们的性能目标,同时又切实保持并提升了图片的质量。

还有很多提升质量的方法,比如,采用即时的标准化而不是常用的分批标准化,能够在许多风格上产生有益影响。比如,卷积层中避免零填充(zero padding)进而减少棋盘效应(人工痕迹),或者,在风格或者内容图片上采用不同的预训练和后处理过滤层。

风格转化技术中实现的速度和质量优化结果在Caffe 2 框架上运行,能够打造一个手机上的实时图像处理系统。

Caffe2go是Facebook 机器学习产品的核心,将开源。Caffe2go ,加上研究工具链比如Torch组成了Facebook 机器学习产品的核心。因为其大小、速度和灵活性上的优势,我们正在Facebook 的stack 中全面推广Caffe2go。

我们也非常乐意与整个研究社区分享我们的软件和设计,这样我们就能更好地学习如何利用不同硬件平台和算法设计的独有特性,这对于跨平台机器学习系统来说尤为重要。我们将会在接下来的几个月内,部分开源这一AI框架。

随着我们不断进步,你可以想象,可以在(移动)设备上运行的实时AI技术将能帮助这个世界变得更加开放,让人与人之间的联系得以加强,特别是在无障碍和教育等领域。可以拿在手上的智能设备将会持续地改变我们对智能的定义。拥有像Caffe2go这样敏捷、轻便的学习系统,我们一定会带来更多美妙的AI和AR体验,比如,在拍下一个视频后,你可以立即把它转换成梵高的风格。”

posted on 2018-05-13 22:01  WP的烂笔头  阅读(26586)  评论(0编辑  收藏  举报