賈揚清:希望Caffe成為深度學習領域的Hadoop

查志強發表於2015-07-08

【原文:http://www.csdn.net/article/2015-07-07/2825150

摘要:在深度學習的熱潮下,Caffe作為一個高效、實用的深度學習框架受到了廣泛的關注。《程式設計師》記者近日深度對話Caffe作者賈揚清,剖析Caffe的起源、目標、差異性、現存的一些問題和改進工作,以及未來的規劃。

在深度學習(Deep Learning)的熱潮下,Caffe作為一個高效、實用的深度學習框架受到了廣泛的關注。瞭解Caffe研發的背景、願景、技術特色、路線圖及其開發者的理念,對於我們選擇合適的工具更好地進行深度學習應用的迭代開發大有裨益。《程式設計師》記者近日深度對話Caffe作者賈揚清,剖析Caffe的起源、目標、差異性、現存的一些問題和改進工作,以及未來的規劃。

起源故事

《程式設計師》:請介紹一下您自己與深度學習結緣的故事,以及開發Caffe的背景和初衷?

賈揚清:我經常和人開玩笑說,“我寫Caffe的原因是因為我不想寫畢業論文。”

我最早開始接觸深度學習大概是在2012年,主要是做sparse coding以及相關的特徵學習。在2013年的時候,我和伯克利心理學系的Thomas Griffith教授開始合作研究這樣一個問題:我們人類在個人成長過程中是如何形成“類別”這樣的概念。我們發表的文章提出了一個很好的概率框架來表達人的行為(參見我在NIPS 2013的文章),但是因為影象上提取的特徵比較弱,所以可以外推的結果比較有限。2013年的時候,因為Alex Krizhevsky在ImageNet的成功,我開始考慮把CNN的特徵用到心理學的這個實驗上,於是就寫了Decaf。Decaf需要基於cuda-convnet來訓練,但是我們通過Decaf驗證了深度學習特徵的優異的可移植性(參見我們在ICML的Decaf文章)。這個應該算是我開始考慮實現一個完整的深度學習框架的初衷。

然後在2013年下半年的時候,NVIDIA的學術捐贈計劃送了我一塊K20 GPU,我當時正好在寫畢業論文,空閒之餘就準備把這個計劃實現出來(對一個研究生而言,GPU很貴的)。我從9月下旬開始,先自己攢了一個機器,然後大概花了兩個多月的時間寫了整個架構和ImageNet所需要的各個實現。起初純粹是因為興趣使然作為一個業餘的專案,後來因為越來越覺得有意思(寫程式碼可能和玩遊戲上癮差不多),花在Caffe上的時間逐漸變成20%、40%、80%,後來在上下班的地鐵上也開始程式設計序,畢業論文倒是沒有太重視,所幸我的導師開明,也沒有說什麼。Caffe寫完以後在我們組裡面試用,大家都覺得它挺好使 - 比如Jeff和Ross利用Caffe的訓練程式碼實現了R-CNN。到了11月份的時候,我開始考慮是不是要開源Caffe,然後12月份正式開源。順便一提,我的畢業論文最後是第二年5月份才寫完的。

在接下來的一年裡面Caffe開始吸引很多其他的使用者和開發人員,特別是NVIDIA開始幫助我們做更多的加速,Berkeley也成立了Berkeley Learning and Vision Center來組織和吸引工業界的研究人員共同開發多個開源專案(包括Caffe)。我畢業以後還在繼續和伯克利的同事開發Caffe,同時在Google繼續搞深度學習的應用和研究;我們在伯克利也建立了一個核心的Caffe團隊:Evan Shelhamer開始用他以前在開源社群的經驗來牽頭多方面的合作;Jeff Donahue在業餘時間還幫助Pinterest建立了他們的深度學習系統;Jonathan Long給Caffe提供了例如Python介面等等最新的特性。而且,Caffe開始吸引世界各地的人來嘗試和使用深度學習的技術,這個是我們所始料未及的。

哦,對了,因為Caffe的緣故,最開始的心理學專案反而被我擱下了,而後也是諸事繁雜,希望有一天我還能夠繼續回去完成那個專案。

《程式設計師》:在Caffe的開發過程中,哪些事情讓您印象深刻?克服的最大挑戰是什麼?

賈揚清:讓我印象最深刻的事情是,寫Caffe其實佔用了我寫畢業論文的時間,我最開始向我導師保證說十二月底可以寫完論文(因為年底就要開始工作了),結果半路跑去寫Caffe了,拖了好長時間的進度。有一次我和我導師開會說我個人的擔心,然後他問我“你是想多花時間寫一個大家估計不是很在意的畢業論文呢,還是多花時間寫一個將來大家都會用的系統?”我覺得博士生多年,我導師教我最多的就是分清主次,這一點我獲益良多。

另一個好玩的小事情是,我2013年在Google實習喝了太多的咖啡,起Decaf這個名字是為了督促自己把咖啡戒了。後來因為GPU速度快就起了Caffe這個名字。伯克利我們組的研究生都很喜歡Caffe,向我導師要經費買了一個冰滴咖啡的咖啡機,結果我們後來又天天喝Evan做的咖啡,戒不掉了。Caffe的核心開發人員在工作允許的範疇下還會做一些consulting的工作,郵箱名字也因此起了caffe-coldpress。

說到挑戰的話,Caffe是我做的第一個從零開始,而且有實際工程意義的專案,而且是初學GPU,所以在程式設計上開始還是挺困難的。但是我覺得最大的挑戰是決定應該以什麼方式來公佈Caffe:是成立一個創業公司,是作為一個純科研不能商用的程式庫,還是作為一個完全開源的系統。每個方向都有人偏好,而且平心而論,開源這條道路也許在經濟上並不是最優的。我大概前後花了一個星期的時間來說服和我合作的每個人,甚至在一定時候需要用“這是我寫的框架,所以我應該有決定權”這樣的理由來解釋。強迫別人接受自己的觀點不是我的個性,所以我覺得很幸運最後大家都很支援這個決定。作出開源的決定應該是整個專案裡面最挑戰的一部分 - 寫程式碼倒在其次了。

在Caffe之前,深度學習領域缺少一個完全公開所有的程式碼、演算法和各種細節的框架,導致很多的研究人員和博士生(例如我)需要一次又一次重複實現相同的演算法,這不好。我覺得作為一個科研人員,還是需要有開放的胸懷來幫助整個社群的發展,所謂不忘初心,方得始終。反正咖啡還是買得起的,夫復何求呢。

社群生態及問題探討

《程式設計師》:作為一個開源工具,Caffe的社群建設和程式碼管理情況如何?

賈揚清:Caffe目前主要還是一個伯克利主導,然後由github加上caffe-users郵件組所組成的一個比較鬆散和自由的社群。因為主要的貢獻者都還是學生(包括已畢業的學生),而且大家主要的工作也還在科研上面,所以社群主要是依靠Caffe的使用者來自發組成的。我們也在摸索一些新的方法,比如說邀請工業界熟悉Caffe,貢獻過Caffe的程式碼的朋友來參與管理Caffe,或者組成一個簡單的committee/foundation來幫助程式碼管理等等。實話說,Caffe在社群建設程式碼管理上還是有很多可以進一步提高的地方,這方面我們也在繼續摸索。

《程式設計師》:經常有人說,好的開源工具不等於好的產品。我瞭解的Caffe的安裝和配置還比較複雜,有開發者評價說Caffe文件好,上手方便。但那個巨大的protobuf配置檔案就是個災難,而且改動程式碼很麻煩。對於這個問題,有什麼解決辦法?或者說使用Caffe還需要一定的門檻?

賈揚清:Caffe的安裝和配置的確是一個比較讓人頭疼的問題,特別是如果不熟悉Linux或者不在Linux的系統上的話,安裝Caffe可能需要不少的一段時間。最近我們也在社群的幫助上面做一些改進,主要是:

NVIDIA在幫助我們將Caffe放到apt-get系統裡面,使得將來可以直接apt-get install caffe;

我們在完善各個layer的文件,使得大家更容易地實現一些自己的演算法;

在protobuf上,我們加入了Python Wrapper,可以藉助簡單的Python函式來定義網路,而不是寫一個巨大的protobuf(GoogLeNet如果手寫有兩千多行… 的確有點發指)。

我在簡化一些Caffe的依賴關係,使得我們不需要編譯所有的庫(比如說leveldb,HDF5等等)也可以使用Caffe,或者可以根據自己需要選擇相應地庫檔案來編譯。

總的來說,因為是個C++的框架,所以使用Caffe還是有一定的門檻,如果大家遇到問題,也可以在caffe-users@googlegroups.com上面發信交流。

《程式設計師》:另外有一位CSDN博主之前寫了Caffe使用體驗,談到套用原有模型很方便,但個性化就要讀原始碼,比較痛苦;Theano只是提供計算函式,搭Network的細節都是自己定,非常靈活,但速度不如Caffe。針對目前的深度學習框架,您主要關注哪些?您認為他們各自的優劣如何?開發者應該如何選擇?

賈揚清:我讀過那篇文章,的確,Caffe在文件上相對還比較痛苦一些。這個主要是因為我們更多的定位在科研上面,假設說大家都會有一定的時間和精力來讀程式碼。目前我們主要能做的是儘量多地公開一些樣例和教程,使得大家在各種應用上都能比較容易地找到和需求比較相似的例子。在文件方面,我們也在增加一些程式碼當中的文件和註釋,但是因為我們主要的開發人員還是在校的學生,所以重心還是放在科研上。大家可以看見Caffe team最近開創性的工作很多,包括了classification,detection,segmentation,以及最近用LSTM來實現影象描述這樣的工作等等。如果開源社群願意幫助提高現在的文件水平的話,我們感激不盡:)

Theano和Caffe的定位稍微有點不同:Theano主要定位在更加容易地做一些快速的研究和迭代上,所以實現的方法很多時候是基於Python以及底層的C轉譯的。這樣做的好處是可以更加容易地修改程式碼,但是優化上就不那麼容易。我的感覺是,可以採用Python這樣的語言來做很快的迭代,但是等到確定一個具體的演算法以後,可能還是需要轉成C++/CUDA的程式碼來達到比較好的速度。從這一點上,Caffe提供了Python Layer來幫助做一些prototype,應該會有幫助。

《程式設計師》:您長期在做CV方面的工作,能否透露Caffe在您的工作中的使用情況和實際效果?在基於Caffe的深度學習方面有什麼通用的優化技巧可以分享?

賈揚清:Caffe最開始的確就是為了在我們平時科研上使用所寫的,所以在伯克利我們所有涉及到Deep Learning的工作也都會基於Caffe來進行。我在Google也同時會使用Google Brain的大規模的機器學習框架DistBelief(參見Google在NIPS 2012的文章),但是我會經常使用Caffe來做一些快速的prototype和實驗,因為Caffe有著更小的系統框架,使得一些探索性的實驗更加容易一些。值得一提的是,Google的研究人員經常會使用各種自己熟悉的開源框架來進行小規模的研究,然後用DistBelief來作為一個通用的框架實現大規模產品級別的部署。

說到通用的優化技巧,我的經驗就是從簡單的實現開始,尋找到瓶頸以後再做具體的優化。一個比較直接的例子是Caffe的卷積層:我當時使用了一個將它轉化為矩陣乘積的方法來進行計算,雖然相對比較耗費記憶體,但是在實際應用中一度是最快的實現。後來因為卷積在Deep Learning當中的重要性,大家紛紛開始實現更加有效的演算法(比如說cuDNN),解決了最初實現中的種種問題。

另外,我個人覺得在研究生階段,特別是機器學習的研究生階段,學一點實際的程式語言(比如C++和Python)是很有幫助的,我以前大部分程式都在Matlab下實現,但是改用C++和Python以後,發現Matlab下很難實現的很多優化,比如說多GPU,多個機器的通訊等等,可以非常容易地實現出來,於是就不再用Matlab了(聽起來有點廣告嫌疑…)。

《程式設計師》:我們通常採用Linux+Caffe,但也有很多人在Windows下跑Caffe,我看到一個介紹,說Windows版本的Caffe比Linux版本還要快,整合cuDNN速度就更快了,是否存在這樣的情況?

賈揚清:我個人對此持謹慎的懷疑態度,因為主要的程式都是C++編寫的,所以應該在速度上沒有什麼差別,看到的不同可能只是因為在兩個平臺上編譯器優化不同的結果。因為編譯器的不同優化選項會影響到速度,所以我一般提及速度的比較的時候會比較謹慎。一般而言,只要底層的硬體相同,像Caffe這樣主要是數學計算的系統,速度應該是大同小異的。當然,也有可能Windows上的GPU驅動做的比Linux好,所以使得在GPU上執行速度比較快,這個是有可能的,但是我個人沒有太多經驗(我一般只用Linux和Mac)。

《程式設計師》:深度學習框架一般都整合CUDA、cuDNN,我看到NVIDIA最新推出的DIGITS率先支援Caffe,這需要Caffe進行一些特別的工作嗎?另外Caffe社群與NVIDIA開源團隊如何互動?

賈揚清:NVIDIA對於Caffe的支援非常好,這一點我們整個Caffe team也非常感謝。基本上,除了和NVIDIA的開發人員討論一些實現細節之外,我們沒有對DIGITS做任何特殊的改動。從一定的方面來說,這也說明整個框架很容易移植。NVIDIA對Caffe的支援主要在兩方面:軟體上提供CuDNN的整合和優化,以及硬體上對於科研的支援。我們Caffe的核心成員定期會和NVIDIA的團隊開會討論雙方的需求和遇到的問題,以及新版本釋出的時候的測試、整合的流程。總的來說合作非常愉快,而且也獲得了不錯的成果。

《程式設計師》:大規模的並行在深度學習中的作用很重要,能否介紹Caffe並行版,包括單機多卡並行和多機並行的Roadmap和當前進度?

賈揚清:Caffe並行的實現應該很快就會整合進來,因為其實實現本身並不困難:我最近幾次報告都提到了基於MPI的實現方法。目前在伯克利我們有一個基於自己的機群所編寫的並行實現,Yahoo/Flickr在github上也有一個並行實現的pull request。什麼時候併入caffe的master branch其實主要是人手的問題,大家都在忙於實現新的演算法,沒有太多精力處理程式碼庫的問題… 我們在Berkeley目前也在尋求一位PostDoc來負責Caffe的日常維護和團隊管理,在這裡順便做個廣告。

《程式設計師》:知乎上有一個問題:“做一個基於C++的物體識別系統,Caffe只提供了Matlab和Python的介面的,C++要怎麼使用Caffe?希望能提供具體的配置(Linux下)和呼叫方法。”能否介紹Caffe在語言支援的選擇方面是如何考慮的?對於廣大的C++使用者,您有什麼建議?

賈揚清:Caffe主要的程式碼其實都是C++的,所以C++比Python和Matlab更加容易整合一些。當然,因為C++本身的緣故,所以實現一些資料的預處理比Matlab和Python要更困難一些。對於C++的話,可能就是多讀Caffe的原始碼吧:) 另外Caffe的tutorial一般都有對應的樣例程式碼,順著這些樣例找到相應的實現,可能比單純從底層讀程式碼會更容易一些。

未來展望

《程式設計師》:與深度學習的發展和應用相比,您對Caffe目前的整體開發進度的滿意度如何?Caffe未來需要解決哪些問題、增加哪些特性或者做哪些方面的優化,能否從整體上介紹一下未來的研發計劃?

賈揚清:Caffe整體的開發進度還是非常令我感到驚訝的,特別是考慮到Caffe的核心成員只有五個人 - 我,Evan Shelhamer,Jon Long,Jeff Donahue和Sergio Guadarrama。每個人都有自己日常的科研和工程任務,但是同時我們還很好地保持了Caffe的維護和改進工作。最近我們正在做的工作主要是整合github上的各個pull request,包括多GPU計算、Python支援等等。

我覺得我們在CVPR 2015上的tutorial基本上概括了Caffe最近或者正在增加的特性:http://tutorial.caffe.berkeleyvision.org/。當然,我們一如既往地公開了所有的細節,包括源程式和訓練好的模型。目前我個人除了科研以外主要在做的是兩方面的內容,一方面是繼續開源Google最近在Deep Learning上的科研成果(比如說我參與的GoogLeNet),另一方面是重新設計Caffe的一些結構,使得它更模組化,更容易在各種環境下部署。

《程式設計師》:現在很多雲服務商都提供了機器學習雲服務,Caffe基於雲服務的優化是如何規劃的?

賈揚清:據我所知,目前很多機器學習的雲服務都是基於簡單的模型,比如說線性的Logistic Regression等等來提供的。最近有許多公司開始提供更加複雜的機器學習服務,比如說Microsoft Project Oxford等等,也許將來我們就可以很容易地使用深度學習的最新成果了。對於Caffe而言,我們更多地注重在深度學習的研究上面,所以對於雲服務的優化並不是一個主要的方向。當然,我覺得Caffe的開發團隊非常優秀,所以將來也許會走一條和工業界更加緊密聯絡的道路。《程式設計師》:是否因為架構或者設計的原因,使得Caffe會存在一些天生不擅長的深度學習場景?Caffe訓練出來的模型和其他的框架產生的模型如何很好支援地轉化?

賈揚清:Caffe一開始主要是為了影象領域的應用所設計的,所以在非影象的問題,比如說一般的機器學習、語音識別等問題上,Caffe的框架並不一定是最優的。舉個例子,我們最近對於Caffe的資料結構做了一些修改,但是那之前Caffe的資料都需要強制定義成四維的Tensor:顯然,在很多應用當中這是不夠靈活的。根據我們從開發者社群得到的反饋,在很多非影象的應用領域,包括語音、自然語言處理、金融資料處理等等,其實也有很多人在使用Caffe。我們最近也在繼續修改Caffe的框架,希望在不同領域的應用能夠更加方便。

關於模型在不同框架之間轉化的問題,我覺得我的回答是“與其用多個框架,不如優化一個框架” - 客觀地說,Caffe在通用性和可移植性上比其他的框架(比如說基於Python的Theano和基於Lua的Torch)要靈活很多。Caffe的社群裡面也有愛好者提供不同框架之間的轉換程式碼,如果的確需要的話,可以搜尋一下。

《程式設計師》:目前大型網際網路公司的深度學習系統都依賴於GPU加速,當然Caffe也支援無GPU模式,您如何看待非GPU加速的深度學習的前景?比如在FPGA加速或者未來基於神經網路晶片的系統,Caffe會如何支援?

賈揚清:非GPU加速的深度學習目前而言還是有一定的優勢的,因為如果計算GPU的成本,目前雲端服務的價格還是很貴 - 這主要是因為GPU本身帶來更多成本,比如前期投入以及後期的維護等等。GPU的更新換代也會導致投入和產出的平衡更加難以計算。如果深度學習被證明有著巨大的產品需求的話,我覺得FPGA以及ASIC這樣的專用晶片會逐漸出現並且佔據市場 - 畢竟在固定演算法的前提下,它們在速度上和成本上都有著巨大的優勢。

在Caffe的支援上,我個人並不是非常擔心,因為深度學習的模型都可以用比較通用的數學函式表達出來。舉個例子,在沒有GPU的時候,深度學習的演算法都是在CPU上實現的;在GPU出現以後,模型還是一樣的模型,但是速度得到了一個數量級的提高。我覺得FPGA也會一樣,只要有晶片的產品以後,由Caffe(或者其他深度學習的框架)所訓練的模型只需要相應的實現程式碼就可以重現。當然,軟硬體的同步開發也是需要的。

《程式設計師》:業界已經有人嘗試深度學習在智慧裝置上的應用,晶片廠商在研究嵌入式視覺SoC,您自己也嘗試過Raspberry Pi和Jetson,您如何看待嵌入式系統深度學習的趨勢?在這方面Caffe還能夠做些什麼?

賈揚清:嵌入式的深度學習應該是一個大的趨勢 - 就像百度IDL的創始人餘凱博士說的一樣,“世界終歸是屬於做機器人的人”。從廣義上來說,各種智慧裝置都可以歸為機器人的範疇。目前而言深度學習的大部分演算法還是基於雲端的計算,但是隨著最近幾年計算能力飛速提高,很多演算法已經可以在嵌入式晶片(比如說NVIDIA的Tegra K1)上實時地執行了。想象一下,如果我們身邊的每一個裝置,從汽車到冰箱都是智慧的,這該是多麼美好的一件事情!這樣的想法其實很早以前就有了(我記得我讀初中的時候就聽說過微軟的智慧家居的計劃),但是我覺得現在我們站在一個技術的拐點上,也許可以真正實現以前的這些夢想。

從一定意義上說,希望深度學習在所有平臺上都可以執行,這也是我最開始寫Caffe的希望,也是為什麼我選了C++而不是其他的語言。我目前正在修改一些Caffe的架構,希望能夠更加容易地實現模組化的設計:核心Caffe程式碼是最小化和完全可移植的,然後可以根據需求來增加各種其他的模組。希望這樣一來,Caffe的應用都能很高效地自定義到各種平臺上面。

《程式設計師》:最後,請談談您對Caffe在深度學習領域的未來有什麼期待?

賈揚清:用一句話來說,我希望Caffe能夠成為機器學習和深度學習領域的Hadoop:人人瞭解,人人使用,人人獲益。目前而言,深度學習領域的發展日新月異,各種框架發展非常迅猛,但是一定程度上也導致很多具體實現的碎片化。我個人的希望是通過不斷改進Caffe本身的框架、程式碼、優化和周邊各種支援,將Caffe變成一個業界標準的框架,提供一個相對普適的平臺,讓大家能更好地交流科研的成果,以及更快地將這些成果轉化到實際的應用中去。

作者簡介:賈揚清,擁有加州大學伯克利分校電腦科學博士學位、清華大學碩士學位和學士學位,曾於新加坡國立大學、微軟亞洲研究院、NEC美國實驗室、Google研究院實習或工作,現就職於Google,從事機器視覺(Computer Vision)研究工作。

責任編輯:周建丁(zhoujd@csdn.net)

本文選自程式設計師電子版2015年7月A刊,該期更多文章請檢視這裡。2000年創刊至今所有文章目錄請檢視程式設計師封面秀。歡迎訂閱程式設計師電子版(含iPad版、Android版、PDF版)。


相關文章