如今,再討論大數(shù)據(jù),無論是互聯(lián)網(wǎng)行業(yè)還是傳統(tǒng)行業(yè)似乎都有話說。大數(shù)據(jù)改變了很多,也帶來了很多。人工智能作為大數(shù)據(jù)的一個重要分支,也紛紛被各大企業(yè)劃入未來的規(guī)劃之內(nèi)。不久前,李開復(fù)就曾說過,未來的人工智能市場將比如今大火的移動互聯(lián)市場要大10倍。
本文將討論Spark的開源機器學(xué)習庫Spark ML。從Spark 1.6開始,Spark ML軟件包中基于DataFrame的API推薦明顯多于基于RDD的API,但是還未完全取代。從Spark 2.0開始,Spark.ML軟件包中基于RDD的API已進入維護模式。Spark的主要機器學(xué)習API現(xiàn)在是Spark.ML包中基于DataFrame的API。
Databricks服務(wù)對數(shù)據(jù)科學(xué)家來說是一個很好的選擇。它具有完整的攝取,特征選擇,模型構(gòu)建和評估功能,以及與數(shù)據(jù)源的大量集成和出色的可擴展性。Databricks服務(wù)提供了一個基于Spark的云服務(wù)。Databricks公司由Spark的原創(chuàng)開發(fā)商Matei Zaharia和來自U.C.Berkeley’s AMPLab的公司創(chuàng)立。同時,Databricks也是Apache Spark項目的主要貢獻者。
Spark ML特點
Spark ML庫提供了通用的機器學(xué)習算法,如分類,回歸,聚類和協(xié)同過濾(但沒有深度神經(jīng)網(wǎng)絡(luò))以及用于特征提取,變換,降維和用于構(gòu)建,評估和調(diào)整ML的選項和工具管道。Spark ML還包括用于保存和加載算法,模型,管道,用于數(shù)據(jù)處理以及進行線性代數(shù)和統(tǒng)計的實用程序。
Spark ML是用Scala編寫的,并使用了線性代數(shù)包Breeze。Breeze依靠netlib-java來優(yōu)化數(shù)值處理。 如果你有機器優(yōu)化的本地netlib-java二進制代理,這將使整個庫比純JVM實現(xiàn)運行得更快。在Mac上,默認情況下安裝的是veclib框架。
你也可以通過Databricks配置的Spark集群使用GPU,而不僅僅是只有CPU的Apache Spark。GPU可以為具有大量數(shù)據(jù)的復(fù)雜機器學(xué)習模型帶來10倍的速度提升,盡管與機器優(yōu)化的CPU庫相比,這可能導(dǎo)致數(shù)據(jù)規(guī)模較小的簡單機器學(xué)習模型的訓(xùn)練速度降低。
MLlib實現(xiàn)了分類和回歸的常用算法和模型,這可能是新手容易混亂的點,但專家可能會有更好的用于數(shù)據(jù)分析的模型選擇。對于這么多模型,Spark ML增加了超參數(shù)調(diào)整的重要特性,也稱為模型選擇,它允許分析人員設(shè)置參數(shù)網(wǎng)格,估計器和評估者,并通過交叉驗證方法(耗時但很準確)或訓(xùn)練驗證分割方法(很快但不太準確)找到最佳的數(shù)據(jù)模型。
Spark ML擁有針對Scala和Java的完整API,主要是針對Python的完整API以及針對R的部分API。通過示例計算,ML覆蓋:54個Java和60個Scala ML示例,52個Python ML 示例,但只有5個R示例。
Spark安裝
如果你的電腦上已經(jīng)安裝了java 1.8.0_05,那安裝Scala2.11.8就沒有其他額外工作了,也可以考慮安裝再安裝Python 2.7和R 3.3.1。安裝Spark時,當Spark沒有檢測到Hadoop會發(fā)出警告:“WARN NativeCodeLoader:無法為您的平臺加載native-hadoop庫......請在適當?shù)那闆r下使用內(nèi)置java類” 。
目前有一種使用默認Spark AMI在Amazon EC2上設(shè)置Spark集群的簡單方法。據(jù)推測,如果你已經(jīng)安裝了Spark和具有EC2權(quán)限的Amazon帳戶,整個過程大約只需要五分鐘。
在服務(wù)器上安裝帶有Spark的Hadoop集群可能很復(fù)雜,這取決于你使用的集群管理器。除非你自己就是做這個的,否則你可能很難解決這個問題。
如果你不想安裝但仍想使用Spark,你可以在Databricks上運行。一個免費的Databricks社區(qū)集群可以提供6GB的RAM節(jié)點和0.88核。付費集群可以在Amazon r3.2xlarge EC2實例上部署內(nèi)存優(yōu)化節(jié)點(30GB,四核),部署在Amazon c3.4xlarge EC2實例上的計算優(yōu)化節(jié)點(15GB,八核)或部署在Amazon上的GPU節(jié)點 g2.2xlarge(一個GPU)或g2.8xlarge(四個GPU)EC2實例類型。
使用Databricks的一個優(yōu)點是,你可以使用從1.3到當前的任何Spark版本創(chuàng)建集群,這很重要,因為一些舊的Spark ML程序包括示例,只能在特定版本的Spark上正確運行,其他版本會拋出錯誤。
運行Spark ML
雖然Databricks默認提供了一個兼容Jupyter notebook來運行Spark,標準的Apache Spark從命令行開始分布式運行。Spark存儲庫中有多個腳本:./ bin / run-example從存儲庫運行示例代碼; ./bin/spark-shell運行交互式Scala shell; ./bin/pyspark運行交互式Python shell; ./bin/sparkR用于運行R shell; 和用于運行應(yīng)用程序的通用./bin/spark-submit。Spark提交腳本繼而運行spark-class,它負責查找Java和Spark .jar文件,然后啟動所需的腳本。
默認情況下,Spark都會生成一個詳細的日志輸出流,即使沒有實質(zhì)性的輸出。下圖展示的是使用Spark來計算Pi的一個Scala示例。 計算值,從底部大約10行,僅精確到三位數(shù)。
幸運的是,可以使用設(shè)置來減小終端日志輸出。但是還有一個更好的方法來運行Spark。使用Jupyter類型的筆記本隱藏日志記錄并且散置解釋性文本,代碼和輸出,如下面兩個Databricks屏幕截圖所示。
實際上,你不需要在Databricks上用Jupyter Notebook運行Spark。你可以在本地安裝Jupyter,并在默認的IPython內(nèi)核之上添加所需的任何語言的核(例如Scala和R)。如果你在網(wǎng)上搜索“如何在Jupyter Notebook上使用Spark”,你會發(fā)現(xiàn)很多具體說明。
學(xué)習Spark ML
在Spark網(wǎng)站上,你將看到用于運行分布式Scala,Java,Python和R示例的說明,Spark API快速啟動和編程指南及其他相關(guān)文件。示例頁面解釋了Python,Scala和Java中的一些簡單示例。
Spark遇到TensorFlow
正如我們所看到的,Spark ML提供了基本機器學(xué)習,特征選擇,管道等。它在分類,回歸,聚類和過濾方面都做得很好。鑒于它是Spark的一部分,它還具有訪問數(shù)據(jù)庫,流和其他數(shù)據(jù)源的強大訪問權(quán)限。
另一方面,Spark ML并沒有采用與Google TensorFlow,Caffe和Microsoft Cognitive Toolkit相同的方式建模和訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)。為此,Databricks一直致力于將Spark的可擴展性和超參數(shù)調(diào)整與TensorFlow的深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練和部署相結(jié)合。
如果你安裝了Hadoop,并希望用機器學(xué)習做數(shù)據(jù)科學(xué),Spark ML是一個明智的選擇。如果你需要用深度神經(jīng)網(wǎng)絡(luò)正確建模數(shù)據(jù),那么Spark ML不是最好的選擇,但你可以將它與其他工具相結(jié)合,以創(chuàng)造一個更適合的工具。
成本:免費,因為開源。 平臺:Spark運行在Windows和類Unix系統(tǒng)(如Linux,MacOS)上,使用Java 7或更高版本,Python 2.6 / 3.4或更高版本以及R 3.1或更高版本。 對于Scala API,Spark 2.0.1使用Scala 2.11。