39

MLSQL拥抱BigDL,轻轻松松无编码玩深度学习

 5 years ago
source link: http://www.jianshu.com/p/b4492b0e3ad4?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言

原谅我,前半句是真的,后半句是噱头,但是真的很简化了。 MLSQL已经有一个相对来比较完善的Python Runtime,细节可以参看这篇文章,所以玩深度学习是很容易的,不过需要你提供一段tensorflow代码或者项目。

但是我一直认为这应该是高阶用户的使用场景,因为你必须要写一个完整的tf/keras之类的代码,这对使用者的要求还是颇高的(当然,你也可以使用别人写好的集成到MLSQL)。 能不能有一种开箱即用让人玩转深度学习的东西呢?于是我首先就集成了DeepLearning4J,事实上效果并不好(多方面原因,以后有时间展开讲)。直到遇到了BigDL,发现这个目标很快会实现了。

BigDL是用纯scala/Java实现的一套深度学习库这点很吸引哦,可以避免使用Python runtime 而导致的复杂环境要求。第二个是,我之前说,其实GPU真的很贵,但是大部分中小企业已经积累了足够多的CPU资源,并且很多情况下是用不满的,而BigDL针对Intel(毕竟是Intel出品)CPU做了很多的优化,这样就可以充分利用闲置的CPU资源。

前面说了下缘由,现在我们来看看如何通过MLSQL无需编码但却足够灵活的玩转深度学习。

环境准备

  1. 下载一个 spark 2.3.2 发行版
  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

开始玩起来

首先我们看看都有哪些模块可以用:

zmuum2M.png!web

image.png

不过那如果我只想看BigDL相关的模块,怎么办呢?没关系 我们过滤下:

qi6NviU.png!web

image.png

恩 只有一个BigDL分类算法。现在我想看看这个算法的细节,比如文档和示例:

fUvE7zn.png!web

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数据集,解压后应该有四个文件:

UzeieyI.png!web

image.png

现在把上面的代码黏贴到控制台(记得修改你数据路径),点击运行,恭喜,你的第一个深度学习算法就跑起来了。

EZzYvyj.png!web

image.png

跑完之后你会发现,好像结果差的比较多,那时训练次数太少了,那我怎么知道通过什么参数去修改呢?别急,用一个指令就知道了:

zeqyQvr.png!web

image.png

红框部分的值其实默认是1,你可以设置10轮左右,我测试过50轮,效果已经足够好了。

另外因为BigDL遵循了torch的标准,所以你的预测值需要+1 才能和实际值对上。

因为深度学习一般而言都是图片,也不会像mnist那样,是个特殊的文件,我想知道有没有什么好的模块可以处理图片,还是老办法,用sql找找看:

FvmMNjR.png!web

image.png

我没截图全,下面其实还有几个。大家看到的是基于BigDL实现的,我们看看具体的使用方式,

F3MBV3i.png!web

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;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK