深度學習在spark平臺上進入生產環境
作者:吳書衛
本文整理自TalkingData T11大資料大會中吳書衛博士的演講。
主持人:我們或多或少聽到很多智慧的東西,比如AlphaGo、智慧駕駛汽車,這裡面都蘊含著一個東西,就是這兩年非常火熱的機器學習的分支深度學習(Deep Learning)。提到Deep Learning的話,大家可能都知道今年Google開源的TensorFlow,像Caffe等等,有越來越多深度學習的框架在產生。
對於廣大IT人士來講,或者對於廣大的程式設計師來講,普通深度學習的框架還是稍有門檻。那有沒有比較簡單的呢?尤其是像我是C++轉Java,有沒有比較好的深度學習的框架讓我們用呢?答案是Yes。今天非常有幸地請到了在Java時代支援Java做深度學習的公司Skymind,他們開源了一個產品叫Deeplearning4j,這個是為廣大Java程式設計師,讓我們能夠使用深度學習的能力去探索資料,去孕育智慧。
Skymind公司創始人Adam Gibson 是位很年輕的電腦科學家,生於1989年。他在矽谷的Zipfian Academy (現在稱為 GalvanizeU)教機器學習的期間,接觸到了矽谷的幾位知名的專研深度學習的資料科學家,他們涉及到的其中一個專案就是谷歌大腦。Adam Gibson由此意識到了深度學習驚人的能力。
但是那時只有谷歌能將深度學習應用到實際專案中。當然當時也有其他的深度學習框架,比如Caffe 和 Theano,但是這些只供研究使用,並沒有真正的運用到企業當中去。2013年的時候,他創立了開源框架Deeplearning4j和ND4J。Deeplearning4j是用Java和Scala編寫的開源深度學習庫,可與Hadoop以及Spark整合,即插即用,方便開發者在APP中快速整合深度學習功能。這裡我會講講Deeplearning4j如何幫助大家將深度學習使用到生產環境中。
關於深度學習
我們都知道,現在深度學習在機器學習領域是一個很熱門的概念,不過經過各種媒體的轉載播報,這個概念也逐漸變得有些神話的感覺:例如,人們可能認為,深度學習是像人腦一樣,擁有像人一樣的智慧,將來也可能會毀滅世界。而我們都錯了,它是模擬人腦的神經結構,並沒有像人一樣的智慧,但是呢,比較現有的演算法,這種模擬技術卻大大提高了計算的精準度與準確率。
深度學習有許多種不同的實現形式,根據需要解決的問題、應用領域,它也有不同的名字,例如Convolutional Neural Networks、Deep Belief Networks、Restricted Boltzmann Machines、Deep Boltzmann Machines、Recursive Autoencoders、Deep Representation等等。不過究其本質來講,都是類似的深度神經網路模型。
深度學習這樣一種神經網路模型在以前就出現過了,但是為什麼在經歷過一次沒落之後,到現在又重新進入人們的視線當中呢?這是因為在十幾年前的硬體條件下,對高層次多節點神經網路的建模,時間複雜度,幾乎是無法接受的。在很多應用當中,實際用到的是一些深度較淺的網路,雖然這種模型在這些應用當中,取得了非常好的效果,但由於這種時間上的不可接受性,限制了實際應用的推廣。而到了現在,計算機硬體的水平與之前已經不同了,因此神經網路這樣一種模型便又進入了人們的視線當中。
2012年6月,紐約時報報導了Google Brain這個專案,吸引了公眾的廣泛關注。這個專案是由著名的在Standford的機器學習教授Andrew Ng和在大規模計算機系統方面的世界頂尖專家Jeff Dean共同主導,用16000個CPU Core的平行計算平臺訓練一種稱為 “深層神經網路”Deep Neural Networks。
從Google Brain這個專案中,我們可以看到,神經網路這種模型對於計算量的要求是極其巨大的,為了保證演算法實時性,需要使用大量的CPU來進行平行計算。
當然,深度學習現在備受關注的另外一個原因,當然是因為在某些場景下,這種演算法模式識別的精度,超過了絕大多數目前已有的演算法。
為什麼說Caffe、Theano這些只是供研究使用呢?因為這些工具或框架,都是用Pyhton編寫出來的。而在現實社會,所有的大資料系統,工具,比如Hadoop, Spark, Flink, Mesos, Cassandra,Kafka等 都是由Java編寫的。換言之,你如果你想要把Caffe, Theno, Tensor Flow這些由Python 編寫的的深度學習框架,融入這些大資料系統,你必須 想辦法解決 Python 與 Java (在每個工具之間)的連結。每一次,每個工具的更新,都必須把相應的連結也更新。這是相當費勁的,也是非常不實際的,會產生出很多意想不到的問題(整合問題)。所以,要解決這個問題,就需要把深度學習框架用 Java 編寫出來。需要編寫一個可以融入大資料系統或企業的框架,同時擁有像谷歌或更先進的深度學習框架 – 讓其他大小型企業也可以受惠。Deeplearning4j 也因此誕生了。Deeplearning4j不只是考慮到大資料使用的程式語言,同時我們也考慮到資料的傳遞,處理,以及將模型訓練出來之後,該如何運用的問題。
資料科學家遇到的問題
首先,我們想要知道的是,資料科學家在企業裡部署深度學習或使用機器學習時,總會遇到的問題:
首要的問題就是以資料為質心的模式(Data Gravity)。一旦你把資料放在某個地方,那麼那個地方就會擁有非常多的程式或應用。程式和應用圍繞資料服務,就像各大行星圍繞太陽運轉一樣。
一般的情況下,因為使用的編輯語言不通(大資料=Java,深度學習=Python),所以資料科學家都把資料從大資料系統抽取出來,並把它安放在另一個電腦或伺服器,然後再進行資料處理,使用資料訓練深度學習模型。這個情況導致整個深度學習模型訓練流程複雜化。
如果要移動 1 GB的資料,很簡單。
如果要移動 500 GB 的資料,有點麻煩。
如果要移動100TB 以上的資料,那時就會產生很多的coefficient of friction, 就是摩擦係數。
所以,大多數的企業,都是在Hadoop上執行所有些程式和應用。換句話說,如果你必須把資料移來移去的,那麼你就沒有擁有一個合適的大資料架構。
第二個,就是系統整合的問題。 這是我們常常會遇到的問題。我的一個同事有一次需要幫美國的一個保險公司做資料分析。他們有一個Hadoop系統,這是好事。對方表示需要使用機器學習來做Twitter分類,當然因為Twitter分類分析一直以來是最好的用例。
開始時是用 TF-IDF 來做一個分類。TF-IDF就是term frequency–inverse document frequency,是一種用於資訊檢索與資料探勘的常用加權技術。TF-IDF 基本上就是要把每個文字都向量化,然後我們發現這其實是非常難的一件事。為什麼呢?因為我們可以開發一個工具來做資料的抽取,轉載,裝載,但是向量化呢,完全不行。而這只是針對文字,還沒考慮到 圖片和視訊。Hadoop可以採集你的圖片、視訊,但是要怎麼將其變成一個有用的檔案呢?一直以來,所有的機器學習工具只能接受他們自己特定的一個格式。所以,我們必須改善機器學習工具。他們需要它可以接受更多的格式,可以接受不同的資料。
這些傳統的機器學習架構還必須要有並行迭代演算法架構。但是很多機器學習工具還沒有這種架構。很多時候並不是他們不想要並行迭代演算法架構,而是他們是否需要這種架構,考慮到企業會不會並且值得不值得投錢在這種架構上。因為機器學習能處理的資料實在有限,所以擁有並行迭代演算法架構的機器學習工具是很少的。
這些就是資料科學家遇到的問題。
所以,我們認為,使用深度學習,最理想的方案是,不管擁你有大資料,或小資料,我們都應該可以很方便的部署深度學習。
另外就是我們不應花費太多的時間在處理資料、資料向量化的或ETL上。我們必須要專注於開發更多更好的深度學習模型,把這些模型運用到我們的應用上,讓我們能更好的分析這些資料,為企業帶來更多的盈利。
好,這裡我們可以看到,當你在處理海量資料的時候,其實,就像我剛才所說的,很多時候,我們都把時間花費在清理,整理資料上,而不是在建立模型。除了清理和整理資料,其餘的時間我們都花費在收集資料集,然後挖掘資料的特徵。我們很少將我們的時間應用在優化演算法和其他相關的事情上。
所以,大多數的資料工程師其實只用了少數的資料來建立模型。因為,當你處理10GB的資料時,你可能不會發費太長時間。但是,當我們講到大資料,我們是在說上百或上千TB的資料,想象一下,你們的工作量有多大。公司會不會聘請上萬個工程師去處理這些資料,只為了要建立一個機器學習模型。這是不可能的。
同時,我們也要避免,當我們把深度學習模型訓練好之後,部署到生產線上的問題,我們需要一個穩定的工具來執行深度學習模型。我們不想要一直為轉化器而煩惱。
深度學習框架Deeplearning4j
下面我們再講講Deeplearning4j,我們就是考慮到企業在部署深度學習時面對到的種種的問題而設計的。我們一直都稱Deeplearning4j 為 大資料裡的 “Hadoop”。
在這系列的工具裡,Deeplearning4j 是我們深度學習主要的深度學習框架,它是由Java編寫 ,裡面含有了幾乎所有深度學習演算法,包裹Reinforce Learning,就是那個最近在國內很紅的 AlphaGo所使用的神經網路。
DataVec 是向所有資料庫,資料來源溝通的工具。
ND4j是用Java編寫的numpy,是一個科學計算引擎,目前美國的航空NASA也依賴ND4J來為他們訓練和執行機器學習模型。
最後是 Arbiter, 它是在你調模及優化機器學習時的主要工具,幫助檢測和評估你的模型。
DataVec 在Deeplearning4j 系列工具裡扮演著一個非常重要的角色,它幫我們解決了資料處理的問題。主要工作就是把所有的資料轉化成機器學習可以瞭解的語言。
它在Spark上執行,使用輸入輸出的格式,就好像Hadoop裡的Map Reduce一樣。支援大多數的檔案格式,比如CSV、文字、音訊、視訊和影象。然後最主要的是它是開源的,所以你也可以加入你的資料輸入格式,讓它來幫你處理你的資料。使用DataVec,能解決資料輸出,隔離,清理,轉換,格式化,和向量化的繁瑣的問題。
ND4J,就像我剛才所說的,是由Java編寫的科學計算引擎。
一直來,為什麼Python會那麼受歡迎呢,主要因為它很像Matlab,比如有像NDArray這樣的東西。而且一直以來,有很多科學計算引擎的程式碼都是由Python編寫的,然後它可以直接連結到C程式碼,那就是Numpy。而Java沒有這樣的一個東西。所以,我們也決定要開發這樣的一個東西,但是是由Java編寫出來,然後ND4J 就這樣誕生了。
你們現在可能想到的是,如果是用Java編寫,那麼怎麼連結到GPU叢集上呢?因為GPU用的是C程式碼。所以,這個解決方案就是JavaCPP。JavaCPP就是Java裡的Cyton。它是ND4J裡的一個工具,也是一個偉大的發明。主要的任務是搭建Java到Object-C的橋樑。有了JavaCPP你可以像其他Java物件一樣來使用Object-C物件。
ND4J的另一個好處,是可以更好的儲存影象,可以把很大的影象直接送到GPU的記憶體。換句話說,我們可以更好的使用Java來儲存影象。來完成這所有工作,我們使用的是Off Heap Memory。Off Heap Memory 的目的是不再依賴Java記憶體。把資料從資料庫抽取出來再執行是很慢的,但是把資料放到記憶體上直接執行是很快的。所以這使我們在整體執行起來會更加快。
順便一提的是,這功能不只是支援 CUDA 和 CuDNN,同時也支援CPU的 OpenMP, OpenBlas或MKL和 SIMD。然後重要的是ND4J 也是開源的。
最後 也是最主要的 就是 Deeplearnig4j 深度學習框架可讓資料科學家輕鬆的在 Hadoop 大資料系統上使用深度學習建模和執行模型。
Deeplearning4j深度學習框架非常方便,可以即插即用,不需要很多的配置。它擁有分散式、多執行緒以及普通的單執行緒深度學習框架。而神經網路可通過iterative reduce 來平行訓練,兼容於 Java, Scala 和 Clojure。通過它與Open Stack的整合,使Deeplearning4j成為首個適應以微服務架構的深度學習框架。Deeplearning4j 也是一個開源平臺。
深度學習建模流程
當你把deeplearning4j系列的工具運用起來,你就可以很簡單的在大資料系統上訓練模型。這裡可以看到的是使用Deeplearning4j系列工具訓練模型的流程。
首先,由DataVec對接資料來源,比如Haddop的HDFS,然後在由DataVec 把這些資料轉換成機器學習可以接受的語言。他的過程就是資料 提取,轉換然後載入,然後再把它們向量化。把這些資料送到Deeplearning4j去建模。在建模的時候,ND4J 讓 Deeplearning4j 可以充分利用 GPU 與 CPU 的資源來快速建立模型,然後通過 Arbiter 把這些模型都調到最優化。最後,我們便得到了一個完整的,最優化的深度學習模型。
執行模型
當你要運用這些模型時,因為我們所有的工具,模型都是由Java編寫,所以不需要特意編寫一個對接的工具。你可以很簡單的使用 Kafka 來對接資料來源與 Deeplearnin4j。Deeplearning4j 除了可以用來建模以外,同時也可以用來執行模型。然後把這些使用模型分析出來的結果和預測,送到 WEB 層 和 應用上。因為Deeplearning4j 是使用 ND4J,所以同時也可以充分的利用GPU和CPU的資源,在大資料系統下快速的執行這些模型。
所以,這就是我給你們在生產環境上部署深度學習的解決方案。
通過 Deeplearning4j 系列的工具,你可以在同一個叢集上 建模,以及執行模型。也可以完全把GPU融入到叢集中快速的訓練模型。所以,為了要使用深度學習,你可以不需要有很大的投資,不需要去建立新的叢集;可以在原有的叢集,Hadoop系統上,使用深度學習。
小結deeplearning4j系列工具已被在美國、歐洲等國家的企業使用。這套深度學習框架不只是收到了各界企業的肯定,其背後的商業支援機構,Skymind也在陸續把這框架弄得更完善,更穩定,讓更多的企業可以受惠。
作者介紹
吳書衛,Skymind亞太地區的負責人。
End.