MLSQL擁抱BigDL,輕輕鬆鬆無編碼玩深度學習
前言
原諒我,前半句是真的,後半句是噱頭,但是真的很簡化了。 MLSQL已經有一個相對來比較完善的Python Runtime,細節可以參看這篇文章,所以玩深度學習是很容易的,不過需要你提供一段tensorflow程式碼或者專案。
但是我一直認為這應該是高階使用者的使用場景,因為你必須要寫一個完整的tf/keras之類的程式碼,這對使用者的要求還是頗高的(當然,你也可以使用別人寫好的整合到MLSQL)。 能不能有一種開箱即用讓人玩轉深度學習的東西呢?於是我首先就集成了DeepLearning4J,事實上效果並不好(多方面原因,以後有時間展開講)。直到遇到了BigDL,發現這個目標很快會實現了。
BigDL是用純scala/Java實現的一套深度學習庫這點很吸引哦,可以避免使用Python runtime 而導致的複雜環境要求。第二個是,我之前說,其實GPU真的很貴,但是大部分中小企業已經積累了足夠多的CPU資源,並且很多情況下是用不滿的,而BigDL針對Intel(畢竟是Intel出品)CPU做了很多的優化,這樣就可以充分利用閒置的CPU資源。
前面說了下緣由,現在我們來看看如何通過MLSQL無需編碼但卻足夠靈活的玩轉深度學習。
環境準備
- 下載一個 ofollow,noindex">spark 2.3.2 發行版
- 下載 MLSQL preview 版本
Ok,這就是全部工作。執行起來:
cd spark-2.3.2-bin-hadoop2.7/ ./bin/spark-submit--class streaming.core.StreamingApp \ --master local[*] \ --name sql-interactive \ streamingpro-mlsql-1.1.3-dev.jar\ -streaming.name sql-interactive\ -streaming.job.file.path file:///tmp/query.json \ -streaming.platform spark\ -streaming.rest true\ -streaming.driver.port 9003\ -streaming.spark.service true \ -streaming.thrift false \ -streaming.enableHiveSupport true
query.json 包含 "{}" 就行了。啟動後訪問url地址:
http://127.0.0.1:9003
開始玩起來
首先我們看看都有哪些模組可以用:

image.png
不過那如果我只想看BigDL相關的模組,怎麼辦呢?沒關係 我們過濾下:

image.png
恩 只有一個BigDL分類演算法。現在我想看看這個演算法的細節,比如文件和示例:

image.png
顯示比較糟糕,大家將就下,然後把程式碼複製出來:
-- You can download the MNIST Data from [here](http://yann.lecun.com/exdb/mnist/). Unzip all the -- files and put them in one folder(e.g. mnist). set json = '''{}'''; load jsonStr.`json` as emptyData; run emptyData as MnistLoaderExt.`` where mnistDir="/Users/allwefantasy/Downloads/mnist" as data; train data as BigDLClassifyExt.`/tmp/bigdl` where fitParam.0.featureSize="[28,28]" and fitParam.0.classNum="10" and fitParam.0.maxEpoch="1" -- 實際執行時把 \\ 去掉 and fitParam.0.code=\\''' def apply(params:Map[String,String])={ val model = Sequential() model.add(Reshape(Array(1, 28, 28), inputShape = Shape(28, 28, 1))) model.add(Convolution2D(6, 5, 5, activation = "tanh").setName("conv1_5x5")) model.add(MaxPooling2D()) model.add(Convolution2D(12, 5, 5, activation = "tanh").setName("conv2_5x5")) model.add(MaxPooling2D()) model.add(Flatten()) model.add(Dense(100, activation = "tanh").setName("fc1")) model.add(Dense(params("classNum").toInt, activation = "softmax").setName("fc2")) } \\''' ; predict data as BigDLClassifyExt.`/tmp/bigdl`; register BigDLClassifyExt.`/tmp/bigdl` as mnistPredict; select vec_argmax(mnistPredict(vec_dense(features))) as predict_label, label from data as output;
示例說下載一個mnist資料集,解壓後應該有四個檔案:

image.png
現在把上面的程式碼黏貼到控制檯(記得修改你資料路徑),點選執行,恭喜,你的第一個深度學習演算法就跑起來了。

image.png
跑完之後你會發現,好像結果差的比較多,那時訓練次數太少了,那我怎麼知道通過什麼引數去修改呢?別急,用一個指令就知道了:

image.png
紅框部分的值其實預設是1,你可以設定10輪左右,我測試過50輪,效果已經足夠好了。
另外因為BigDL遵循了torch的標準,所以你的預測值需要+1 才能和實際值對上。
因為深度學習一般而言都是圖片,也不會像mnist那樣,是個特殊的檔案,我想知道有沒有什麼好的模組可以處理圖片,還是老辦法,用sql找找看:

image.png
我沒截圖全,下面其實還有幾個。大家看到的是基於BigDL實現的,我們看看具體的使用方式,

image.png
通過這個可以看到文件和程式碼。
現在我們黏貼出來,大概是這個樣子的:
set json='''{}'''; load jsonStr.`json` as emptyData; run emptyData as ImageLoaderExt.`/Users/allwefantasy/Downloads/jack` -- 實際執行時把 \\ 去掉 where code=\\''' def apply(params:Map[String,String]) = { Resize(256, 256) -> CenterCrop(224, 224) -> MatToTensor() -> ImageFrameToSample() } \\''' as images; select imageName from images limit 1 as output;