狠狠撸

狠狠撸Share a Scribd company logo
Spark MLlib Now and Beyond
株式会社リクルートテクノロジーズ
アドバンスドテクノロジーラボ
石川有
発表のねらい
? エンジニアの方:
? MLlib で機械学習アプリケーションが簡単に構築できることを知って
いただく
? データ分析の方:
? Spark への移行はそれほど難しくないことを知っていただく
2
アジェンダ
? これまでの MLlib
? DataFrame API
? Pipeline API
? MLlib 2.0 に向けて
? まとめ
3
spark.mllib
spark.ml
MLlib とは?
? Spark に組み込まれている機械学習ライブラリ
? spark.mllib パッケージ
? spark.ml パッケージ
? ミッション
? より簡単でスケーラブルに機械学習アプリケーションを構築
? MLlib のコントリビュータ
? 個人:220+, 組織:70+
? 豊富な機会学習アルゴリズムやユーティリティ
? Spark Streaming や Spark SQL とシームレスに統合可能
5
spark.mlパケージ
? DataFrame を利用した機械学習パイプラインのためのハイレベル API を提供
? Spark 1.6 では spark.mllib より spark.ml の利用を推奨
? Python の scikit-learn ライブラリの API 設計に影響され開発
? API design for machine learning software: experiences from the scikit-learn
project , Lars Buitinck et al.
6
// モデルの学習
val model = algo.fit(trainingDataFrame)
// 学習したモデルで予測
model.transform(testDataFrame)
SparkとMLlibの簡単な歴史
7
RDD DataFrame Dataset
spark.mllib spark.ml
Pipeline API
1.2 1.3 1.60.8 2.0
Dataset 向けの全く新しい
パッケージは作らない予定
MLlib-speci?c Contribution Guidelines
? Be widely known
? Be used and accepted
? academic citations and concrete use cases can help justify this
? Be highly scalable
? Be well documented
? Have APIs consistent with other algorithms in MLlib that accomplish the
same thing
? Come with a reasonable expectation of developer support.
8
[https://cwiki.apache.org/con?uence/display/SPARK/Contributing+to+Spark]
豊富なアルゴリズムとユーティリティ
9
アジェンダ
? これまでの MLlib
? DataFrame API
? Pipeline API
? MLlib 2.0 に向けて
? まとめ
10
DataFrame API
11
age prefecture name
34 Tokyo ****
41 Osaka ****
27 Saitama ****
24 Chiba ****
// 都道府県ごとのユーザの平均年齢を計算
data.groupBy(“prefecture”).agg(ave(“age”))
// 年齢 25 歳以上のユーザ数
data.filter(“age >= 25”).count()
// SQL でも記述できる
sqlContext.sql(“select age from user_table”)
データ分析でよく使われる機能を DSL として提供
より少ないコード量で可読性高く記述できる
API 設計は Pandas に影響を受けている
user_table
サポートしているデータソースとフォーマット
12
DataFrame API の豊富なビルトイン関数
? 数学関数,文字列関数,日付関数など
? ユーザ定義関数も利用可能
13
Catalystによる処理の最適化
14
cited by: Spark Summit EU 2015: Spark DataFrames: Simple and Fast Analysis of Structured Data
DataFrame API を利用すれば
少ないコードでより高速に処理することができる
アジェンダ
? これまでの MLlib
? DataFrame API
? Pipeline API
? MLlib 2.0 に向けて
? まとめ
15
Simple ML Pipeline
16
Data
Feature
Extraction
Train Model
Final
Model
サンプルタスク
? レビュー (review) のテキストから評価 (rating) を予測
17
review Model rating
String Int
Spark ML Pipeline API
val tokenizer = new Tokenizer()
.setInputCol("review")
.setOutputCol(“words")
18
Training Data
Hashed Term
Logistic Regression
Evaluate
Tokenizer
words
i, have, bought, several, of, the,…
product, arrived, labeled, as, jumbo, …
this, is, a, confection, that, has, …
if, you, are, looking, for, the, secret,…
Spark ML Pipeline API
val tokenizer = new Tokenizer()
.setInputCol("review")
.setOutputCol(“words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(“words”)
.setOutputCol("features")
19
Training Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
features
(1.0, 2.0, 1.0, 3.0, ….)
(2.0, 1.0, 1.0, 2.0, ….)
(3.0, 1.0, 2.0, 1.0, …)
(1.0, 1.0, 3.0, 2.0, ….)
Spark ML Pipeline API
val tokenizer = new Tokenizer()
.setInputCol("review")
.setOutputCol(“words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(“words”)
.setOutputCol("features")
val lr = new LogisticRegression()
.setMaxIter(100)
.setRegParam(0.01)
20
Training Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
Spark ML Pipeline API
val tokenizer = new Tokenizer()
.setInputCol("review")
.setOutputCol(“words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(“words”)
.setOutputCol("features")
val lr = new LogisticRegression()
.setMaxIter(100)
.setRegParam(0.01)
val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, lr))
val model = pipeline.fit(training)
21
Pipeline
Training Data
Hashed Term Freq.
Logistic Regression
Final Model
Tokenizer
Simple ML Pipeline
22
Data
Feature
Extraction
Train Model
Final
Model
A Little Simple ML Pipeline
23
ML Pipelines for Test
24
Pipeline
Training Data
Hashed Term Freq.
Logistic Regression
Final Model
Tokenizer
Pipeline
Test Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
Pipeline API for Test
val tokenizer = new Tokenizer()
.setInputCol("text")
.setOutputCol(“words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("features")
val lr = new LogisticRegression()
.setMaxIter(100)
.setRegParam(0.01)
val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, lr))
val model = pipeline.fit(training)
model.transform(test)
25
Pipeline
Test Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
結果のイメージ
26
review Model rating
String Int
review
実際の ML Pipeline は複雑
27
Data Image!
Parser
Normalizer Convolver
sqrt,mean
Zipper
Linear
Solver
Symmetric!
Recti?er
ident,abs
ident,mean
Global
Pooler
Patch!
Extractor
Patch
Whitener
KMeans!
Clusterer
Feature Extractor
Label!
Extractor
Linear!
Mapper
Model
Test!
Data
Label!
Extractor
Feature
Extractor
Test
Error
Error!
Computer
No Hyperparameters!
A few Hyperparameters!
Lotsa Hyperparameters
パラメータチューニング
28
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
hashingTF.numFeatures
{10, 20, 40}
lr.regParam
{0.01, 0.1, 0.5}
Pipeline
クロスバリデーション
29
Practical Spark ML Pipeline API
val paramGrid = new ParamGridBuilder()
.addGrid(hashingTF.numFeatures, Array(10, 20, 40))
.addGrid(lr.regParam, Array(0.01, 0.1, 0.5))
.build()
30
Practical Spark ML Pipeline API
val paramGrid = new ParamGridBuilder()
.addGrid(hashingTF.numFeatures, Array(10, 20, 40))
.addGrid(lr.regParam, Array(0.01, 0.1, 0.5))
.build()
val cv = new CrossValidator()
.setNumFolds(3)
.setEstimator(pipeline)
.setEstimatorParamMaps(paramGrid)
.setEvaluator(new BinaryClassificationEvaluator)
val cvModel = cv.fit(trainingDataset)
cvModel.transform(testDataset)
31
Parameter Tuning も Cross-Validation も
API が用意されているので複雑な PIpeline も簡単に定義
訓練した Pipeline や学習モデルの永続化を
Spark 1.6 でサポート
32
Pipeline
Training Data
Hashed Term Freq.
Logistic Regression
Tokenizer
save
Model
Load Model
Evaluate
訓練済みモデルを保存することで
再構築の必要がなく再利用が簡単
機械学習モデルや Pipeline が永続化できるメリット
33
データ分析者 エンジニア
Model
プロダクト
Python で永続化 Scala で読み込んでデプロイ
言語インタフェースをまたいだ利用が可能
Spark Streaming 上が学習したモデルを利用することもできる
学習したモデルのバージョン管理も簡単
Model
アジェンダ
? これまでの MLlib
? DataFrame API
? Pipeline API
? MLlib 2.0 に向けて
? まとめ
34
Spark MLlib 2.0 Roadmap
? Extended support for GLM model families and link functions
? Improve GLM scalability
? Tree partition by features
? Locality sensitive hashing (LSH)
? Deep learning: RBM/CNN
? Improved pipeline API
? Pipeline persistence
? Model serving
? Better SparkR coverage
? Project Tungsten integration
? Reorganize user guide
35
Pipeline 永続化の課題
36
Pipeline
Hashed Term Freq.
Random Forest
Tokenizer
永続化未対応
save
Model
X
Pipeline 中のひとつでも永続化できなければ,
Pipeline 全体を永続化できない
Spark 1.6 時点で永続化未対応のアルゴリズム
? Classi?cation
? DecisionTreeClassi?er
? GBTClassi?er
? MultilayerPerceptronClassi?er
? OneVsRest
? RandomForestClassi?er
? Regression
? DecisionTreeRegressor
? GBTRegressor
? RandomForestRegressor
37
SparkR の MLlib 対応
? Spark 1.6 の時点で SparkR がサポートしている機械学習アルゴ
リズムは GLM のみ
? k-means や survival analysis などの対応を行っていく
38
PySpark に比べると SparkR の MLlib 対応が遅れている
アジェンダ
? これまでの MLlib
? DataFrame API
? Pipeline API
? MLlib 2.0 に向けて
? まとめ
39
まとめ
? エンジニア向け:
? Spark の機械学習ライブラリ MLlibで,プロダクションでの機械学習を簡単にスケー
ラブルに実行
? データ分析者向け:
? spark.ml のAPI設計は scikit-learn に影響を受けているので,scikit-learn ユーザに
とっては学習コストが低い
? DataFrame API は pandas に影響を受けている
? Pipeline API を利用することで複雑化する ML Pipeline の管理が簡単
? 機械学習モデルや Pipeline の永続化により,言語インターフェースやコンポーネントを
またいだ利用が簡単
? Pipeline API は発展途上なのでパフォーマンスや永続化対応を進めていく必要あり
? SparkR の開発は 2.0 以降に期待
40
MLlib は実践を意識したスケーラブル機械学習アプリケーションを
より簡単に構築できることを目指している

More Related Content

2016-02-08 Spark MLlib Now and Beyond@Spark Conference Japan 2016

  • 1. Spark MLlib Now and Beyond 株式会社リクルートテクノロジーズ アドバンスドテクノロジーラボ 石川有
  • 2. 発表のねらい ? エンジニアの方: ? MLlib で機械学習アプリケーションが簡単に構築できることを知って いただく ? データ分析の方: ? Spark への移行はそれほど難しくないことを知っていただく 2
  • 3. アジェンダ ? これまでの MLlib ? DataFrame API ? Pipeline API ? MLlib 2.0 に向けて ? まとめ 3
  • 5. MLlib とは? ? Spark に組み込まれている機械学習ライブラリ ? spark.mllib パッケージ ? spark.ml パッケージ ? ミッション ? より簡単でスケーラブルに機械学習アプリケーションを構築 ? MLlib のコントリビュータ ? 個人:220+, 組織:70+ ? 豊富な機会学習アルゴリズムやユーティリティ ? Spark Streaming や Spark SQL とシームレスに統合可能 5
  • 6. spark.mlパケージ ? DataFrame を利用した機械学習パイプラインのためのハイレベル API を提供 ? Spark 1.6 では spark.mllib より spark.ml の利用を推奨 ? Python の scikit-learn ライブラリの API 設計に影響され開発 ? API design for machine learning software: experiences from the scikit-learn project , Lars Buitinck et al. 6 // モデルの学習 val model = algo.fit(trainingDataFrame) // 学習したモデルで予測 model.transform(testDataFrame)
  • 7. SparkとMLlibの簡単な歴史 7 RDD DataFrame Dataset spark.mllib spark.ml Pipeline API 1.2 1.3 1.60.8 2.0 Dataset 向けの全く新しい パッケージは作らない予定
  • 8. MLlib-speci?c Contribution Guidelines ? Be widely known ? Be used and accepted ? academic citations and concrete use cases can help justify this ? Be highly scalable ? Be well documented ? Have APIs consistent with other algorithms in MLlib that accomplish the same thing ? Come with a reasonable expectation of developer support. 8 [https://cwiki.apache.org/con?uence/display/SPARK/Contributing+to+Spark]
  • 10. アジェンダ ? これまでの MLlib ? DataFrame API ? Pipeline API ? MLlib 2.0 に向けて ? まとめ 10
  • 11. DataFrame API 11 age prefecture name 34 Tokyo **** 41 Osaka **** 27 Saitama **** 24 Chiba **** // 都道府県ごとのユーザの平均年齢を計算 data.groupBy(“prefecture”).agg(ave(“age”)) // 年齢 25 歳以上のユーザ数 data.filter(“age >= 25”).count() // SQL でも記述できる sqlContext.sql(“select age from user_table”) データ分析でよく使われる機能を DSL として提供 より少ないコード量で可読性高く記述できる API 設計は Pandas に影響を受けている user_table
  • 13. DataFrame API の豊富なビルトイン関数 ? 数学関数,文字列関数,日付関数など ? ユーザ定義関数も利用可能 13
  • 14. Catalystによる処理の最適化 14 cited by: Spark Summit EU 2015: Spark DataFrames: Simple and Fast Analysis of Structured Data DataFrame API を利用すれば 少ないコードでより高速に処理することができる
  • 15. アジェンダ ? これまでの MLlib ? DataFrame API ? Pipeline API ? MLlib 2.0 に向けて ? まとめ 15
  • 17. サンプルタスク ? レビュー (review) のテキストから評価 (rating) を予測 17 review Model rating String Int
  • 18. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("review") .setOutputCol(“words") 18 Training Data Hashed Term Logistic Regression Evaluate Tokenizer words i, have, bought, several, of, the,… product, arrived, labeled, as, jumbo, … this, is, a, confection, that, has, … if, you, are, looking, for, the, secret,…
  • 19. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("review") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(“words”) .setOutputCol("features") 19 Training Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer features (1.0, 2.0, 1.0, 3.0, ….) (2.0, 1.0, 1.0, 2.0, ….) (3.0, 1.0, 2.0, 1.0, …) (1.0, 1.0, 3.0, 2.0, ….)
  • 20. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("review") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(“words”) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(100) .setRegParam(0.01) 20 Training Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  • 21. Spark ML Pipeline API val tokenizer = new Tokenizer() .setInputCol("review") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(“words”) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(100) .setRegParam(0.01) val pipeline = new Pipeline() .setStages(Array(tokenizer, hashingTF, lr)) val model = pipeline.fit(training) 21 Pipeline Training Data Hashed Term Freq. Logistic Regression Final Model Tokenizer
  • 23. A Little Simple ML Pipeline 23
  • 24. ML Pipelines for Test 24 Pipeline Training Data Hashed Term Freq. Logistic Regression Final Model Tokenizer Pipeline Test Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  • 25. Pipeline API for Test val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(100) .setRegParam(0.01) val pipeline = new Pipeline() .setStages(Array(tokenizer, hashingTF, lr)) val model = pipeline.fit(training) model.transform(test) 25 Pipeline Test Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  • 27. 実際の ML Pipeline は複雑 27 Data Image! Parser Normalizer Convolver sqrt,mean Zipper Linear Solver Symmetric! Recti?er ident,abs ident,mean Global Pooler Patch! Extractor Patch Whitener KMeans! Clusterer Feature Extractor Label! Extractor Linear! Mapper Model Test! Data Label! Extractor Feature Extractor Test Error Error! Computer No Hyperparameters! A few Hyperparameters! Lotsa Hyperparameters
  • 28. パラメータチューニング 28 Hashed Term Freq. Logistic Regression Evaluate Tokenizer hashingTF.numFeatures {10, 20, 40} lr.regParam {0.01, 0.1, 0.5} Pipeline
  • 30. Practical Spark ML Pipeline API val paramGrid = new ParamGridBuilder() .addGrid(hashingTF.numFeatures, Array(10, 20, 40)) .addGrid(lr.regParam, Array(0.01, 0.1, 0.5)) .build() 30
  • 31. Practical Spark ML Pipeline API val paramGrid = new ParamGridBuilder() .addGrid(hashingTF.numFeatures, Array(10, 20, 40)) .addGrid(lr.regParam, Array(0.01, 0.1, 0.5)) .build() val cv = new CrossValidator() .setNumFolds(3) .setEstimator(pipeline) .setEstimatorParamMaps(paramGrid) .setEvaluator(new BinaryClassificationEvaluator) val cvModel = cv.fit(trainingDataset) cvModel.transform(testDataset) 31 Parameter Tuning も Cross-Validation も API が用意されているので複雑な PIpeline も簡単に定義
  • 32. 訓練した Pipeline や学習モデルの永続化を Spark 1.6 でサポート 32 Pipeline Training Data Hashed Term Freq. Logistic Regression Tokenizer save Model Load Model Evaluate 訓練済みモデルを保存することで 再構築の必要がなく再利用が簡単
  • 33. 機械学習モデルや Pipeline が永続化できるメリット 33 データ分析者 エンジニア Model プロダクト Python で永続化 Scala で読み込んでデプロイ 言語インタフェースをまたいだ利用が可能 Spark Streaming 上が学習したモデルを利用することもできる 学習したモデルのバージョン管理も簡単 Model
  • 34. アジェンダ ? これまでの MLlib ? DataFrame API ? Pipeline API ? MLlib 2.0 に向けて ? まとめ 34
  • 35. Spark MLlib 2.0 Roadmap ? Extended support for GLM model families and link functions ? Improve GLM scalability ? Tree partition by features ? Locality sensitive hashing (LSH) ? Deep learning: RBM/CNN ? Improved pipeline API ? Pipeline persistence ? Model serving ? Better SparkR coverage ? Project Tungsten integration ? Reorganize user guide 35
  • 36. Pipeline 永続化の課題 36 Pipeline Hashed Term Freq. Random Forest Tokenizer 永続化未対応 save Model X Pipeline 中のひとつでも永続化できなければ, Pipeline 全体を永続化できない
  • 37. Spark 1.6 時点で永続化未対応のアルゴリズム ? Classi?cation ? DecisionTreeClassi?er ? GBTClassi?er ? MultilayerPerceptronClassi?er ? OneVsRest ? RandomForestClassi?er ? Regression ? DecisionTreeRegressor ? GBTRegressor ? RandomForestRegressor 37
  • 38. SparkR の MLlib 対応 ? Spark 1.6 の時点で SparkR がサポートしている機械学習アルゴ リズムは GLM のみ ? k-means や survival analysis などの対応を行っていく 38 PySpark に比べると SparkR の MLlib 対応が遅れている
  • 39. アジェンダ ? これまでの MLlib ? DataFrame API ? Pipeline API ? MLlib 2.0 に向けて ? まとめ 39
  • 40. まとめ ? エンジニア向け: ? Spark の機械学習ライブラリ MLlibで,プロダクションでの機械学習を簡単にスケー ラブルに実行 ? データ分析者向け: ? spark.ml のAPI設計は scikit-learn に影響を受けているので,scikit-learn ユーザに とっては学習コストが低い ? DataFrame API は pandas に影響を受けている ? Pipeline API を利用することで複雑化する ML Pipeline の管理が簡単 ? 機械学習モデルや Pipeline の永続化により,言語インターフェースやコンポーネントを またいだ利用が簡単 ? Pipeline API は発展途上なのでパフォーマンスや永続化対応を進めていく必要あり ? SparkR の開発は 2.0 以降に期待 40 MLlib は実践を意識したスケーラブル機械学習アプリケーションを より簡単に構築できることを目指している