1. 程式人生 > >認識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不支援動態圖表,因為它可能會產生移動平臺目前無法支援的計算負載。

依賴處理

第一版 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

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體驗,比如,在拍下一個視訊後,你可以立即把它轉換成梵高的風格。”

【. . . . . .本部落格僅作個人生活、工作、學習等的日常記錄。說明: (1) 內容有參考其他博主、網頁等,有因“懶”直接貼上來,會備註出處。若遇雷同,或忘備註,並無故意抄襲之意,請諸“原主”諒解,很感謝您的辛勤"筆記"可供本人蔘考學習。 (2) 如遇同行,有參考學習者,因個人學識有限,不保證所寫內容完全正確。您對本博文有任何的意見或建議,歡迎留言,感謝指正。 (3) 若您認為本主的全部落格還不錯,可以點選關注,便於互相學習。 (4) 感謝您的閱讀,希望對您有一定的幫助。歡迎轉載或分享,但請註明出處,謝謝。. . . . . .】 【作者: Carole0904 ; 出處: https://www.cnblogs.com/carle-09/ 】