きちんと知りたいApache Spark
∼機械学習とさまざまな機能群
株式会社リクルートテクノロジーズ
アドバンスドテクノロジーラボ
石川有
本発表の想定聴講者とゴール
• 想定している聴講者
• CTOや技術選択の責任者レベルの方
• Spark の機械学習ライブラリの初学者
• ゴール
• Sparkのデータサイエンス関連の Top-Level API は企業における
• 「実践」を意識して作られていることを知っていただく
• スケーラブルな機械学習アルゴリズムが簡単に利用できる
• 実践的な機械学習に必要な一連の複雑な処理も簡単に利用できる
• 本発表では話さないこと
• Spark の分散処理のやキャッシュの仕組み
• Spark のクラスタ管理やチューニング
• 個別の機械学習アルゴリズムの具体的な解説 など
2
Talk Overview
• Spark 関連の基礎知識
• Spark MLlib
• DataFrame API
• Pipline API
• まとめ
3
Apache Sparkとは?
• 大規模データを処理するための分散処理システム
• Speed, Easy of Use, Generality, Runs Everywhere
• 「ポスト Hadoop MapReduce」の有力候補
• リリース頻度:約3ヶ月に1回リリース
• 現在の stable バージョンは 1.5
• 次のバージョン 1.6 はおそらく 12 月初旬にリリース見込み
• プログラミングインタフェース:
• 企業におけるデータ分析シーンに対応
• バッチ,ストリーミング,インタラクティブ(探索的分析)
• 標準で機械学習,グラフ処理などのコンポーネントを備えている
4
Spark Components
5
サポートしているデータソース
6
Talk Overview
• Spark 関連の基礎知識
• Spark MLlib
• DataFrame API
• Pipline API
• FAQ
• まとめ
8
Spark Components
9
spark.mllib
MLlib のミッション
• プロダクションレベルでの機械学習を簡単にスケーラブル
で実行できるようにする
• 機械学習アプリケーションを簡単に構築
• 大規模データセットでの学習を可能にする
• Spark 0.8 から開発が始まる
• 現在では累計で 50+ の企業,100+ の個人が開発に参加
• 分散機械学習アルゴリズムは日々追加されています
• 1.6 でリリース予定の bisecting k-means の実装を担当
• 開発を通して得た知見はまた別の機会で話したいと思います
10
MLlib-specific 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.
11
[https://cwiki.apache.org/confluence/display/SPARK/Contributing+to+Spark]
MLlib で実装されている手法
12
レコメンドアルゴリズム ALS の
単純な実行方法
val ratings =
sc.textFile(“s3n:/path/to/csv/files/*”)
.map(_.split(","))
.map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble)
13
Data (CSV)
Load Data
Train Model
Evaluate
user_id product_id rating
473 348 0.8
5623 87583 0.3
6545 9382 0.5
234 246 0.6
レコメンドアルゴリズム ALS の
単純な実行方法
val ratings =
sc.textFile(“s3n:/path/to/csv/files/*”)
.map(_.split(","))
.map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble)
val als = new ALS.setRank(10).setIterations(10)
val model = als.run(ratings)
14
Data
Loa Data
Train Model
Evaluate
レコメンド手法のひとつである
ALS のオブジェクトを生成して訓練
レコメンドアルゴリズム ALS の
単純な実行方法
val ratings =
sc.textFile(“s3n:/path/to/csv/files/*”)
.map(_.split(","))
.map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble)
val als = new ALS.setRank(10).setIterations(10)
val model = als.run(ratings)
val userId = 12345
val productId = 987654
model.predict(userId, productId)
0.4…
15
Data
Loa Data
Train Model
EvaluateTop-level API がよくデザインされているので
非常に簡単に機械学習ライブラリが使える
ALSのベンチマーク
• データセット:Amazon Reviews Dataset
• データサイズ: 660万ユーザ, 220万アイテム
• クラスタサイズ:m3.2xlarge x 16
16
cited by: Xiangrui Meng: A More Scaleable Way of Making Recommendations with MLlib
MLlib の ALS について詳しく知りたい方は
「レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証」
http://www.slideshare.net/recruitcojp/sparkmapreduce
17
Talk Overview
• Spark 関連の基礎知識
• Spark MLlib
• DataFrame API
• Pipline API
• まとめ
18
Spark Components
19
DataFrame API
20
age prefecture name
34 Tokyo ****
41 Osaka ****
27 Saitama ****
24 Chiba ****
// 都道府県ごとのユーザの平均年齢を計算
data.groupBy(“prefecture”).ave(“age”)
// 年齢 25 歳以上のユーザ数
data.filter(“age >= 25”).count()
// SQL でも記述できる
data.sql(“select age from user_table”)
データ分析でよく使われる機能を DSL として提供
Hive などのデータソースにも対応
user_table
DataFrame の豊富なビルドイン関数
• 日付け関数,数学関数,文字列関数など標準サポート
• UDFで独自の関数も簡単に作成できる
21
Spark をネイティブで書くより早い
22
cited by: Spark Summit EU 2015: Spark DataFrames: Simple and Fast Analysis of Structured Data
DataFrame API を利用すれば
少ないコードでより高速に処理することができる
Talk Overview
• Spark 関連の基礎知識
• Spark MLlib
• DataFrame API
• Pipline API
• まとめ
23
Spark Components
24
spark.ml
spark.mllib
実装面から見れば
25
MLlib DataFrame
ML Pipeline
Simple ML Pipeline
26
Data
Feature
Extraction
Train Model
Final
Model
Our Task
• レビュー (review) のテキストから評価 (rating) を予測
27
review Model rating
String Int
Load Data
• Data Schema
• label: Int
• text: String
28
Load Data
Feature Extraction
Train Model
Evaluate
Feature Extraction
• Data Schema
• label: Int
• text: String
• words: Seq[String]
• features: Vector
29
Load Data
Hashed Term Freq.
Train Model
Evaluate
Tokenizer
Transformer
Train a Model
• Data Schema
• label: Int
• text: String
• words: Seq[String]
• features: Vector
• prediction: Int
30
Load Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
Transformer
Estimator
Spark ML Pipeline API
val tokenizer = new Tokenizer()
.setInputCol("text")
.setOutputCol(“words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("features")
31
Load Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
Spark ML Pipeline API
val tokenizer = new Tokenizer()
.setInputCol("text")
.setOutputCol(“words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("features")
val lr = new LogisticRegression()
.setMaxIter(10)
.setRegParam(0.01)
32
Load Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
Spark ML Pipeline API
val tokenizer = new Tokenizer()
.setInputCol("text")
.setOutputCol(“words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("features")
val lr = new LogisticRegression()
.setMaxIter(10)
.setRegParam(0.01)
val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, lr))
val model = pipeline.fit(training)
33
Pipeline
Load Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
Simple ML Pipeline
34
Data
Feature
Extraction
Train Model
Final
Model
A Little Simple ML Pipeline
35
ML Pipelines for Test
36
Pipeline
Training Data
Hashed Term Freq.
Logistic Regression
Evaluate
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(10)
.setRegParam(0.01)
val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, lr))
val model = pipeline.fit(training)
model.transform(test)
37
Pipeline
Test Data
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
結果のイメージ
38
review Model rating
String Int
Practical ML Pipeline is Complicated!
39
Data Image!
Parser
Normalizer Convolver
sqrt,mean
Zipper
Linear
Solver
Symmetric!
Rectifier
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
Parameter Tuning
40
Hashed Term Freq.
Logistic Regression
Evaluate
Tokenizer
hashingTF.numFeatures
{10, 20, 40}
lr.regParam
{0.01, 0.1, 0.5}
Pipeline
Cross-Validation
41
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()
42
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)
43
Parameter Tuning も Cross-Validation も
API が用意されているので複雑な PIpeline も簡単に定義
Model export/import for Pipeline API is coming soon!
44
Pipeline
Load Data
Hashed Term Freq.
Logistic Regression
Tokenizer
save
Model
Load Model
Evaluate
モデルを保存することで
再構築の必要がなく再利用が簡単
Talk Overview
• Spark 関連の基礎知識
• Spark MLlib
• DataFrame API
• Pipline API
• まとめ
45
まとめ
• Spark は企業における3つの分析シーンに対応
• バッチ,ストリーミング,インタラクティブ(探索的分析)
• DataFrame API は大規模分散処理の探索分析をより身近なものにする
• SQL で実行することもできる
• Hive などのさまざまなデータソースをサポート
• 最適化機構により「ネイティブ」に Spark のコードを書くより早くなる
• Spark の機械学習ライブラリ MLlibで,プロダクションレベルでの機械学習を簡単
にスケーラブルで実行できる
• 機械学習アプリケーションを簡単に構築
• 大規模データセットでの学習を可能にする
• Pipeline API を利用することで「実践」での複雑化する ML Pipeline の管理が簡単
46
Sparkのデータサイエンス関連の Top-Level API は
企業における「実践」を意識して作られていることを知っていただく

2015-11-17 きちんと知りたいApache Spark ~機械学習とさまざまな機能群

  • 1.
  • 2.
    本発表の想定聴講者とゴール • 想定している聴講者 • CTOや技術選択の責任者レベルの方 •Spark の機械学習ライブラリの初学者 • ゴール • Sparkのデータサイエンス関連の Top-Level API は企業における • 「実践」を意識して作られていることを知っていただく • スケーラブルな機械学習アルゴリズムが簡単に利用できる • 実践的な機械学習に必要な一連の複雑な処理も簡単に利用できる • 本発表では話さないこと • Spark の分散処理のやキャッシュの仕組み • Spark のクラスタ管理やチューニング • 個別の機械学習アルゴリズムの具体的な解説 など 2
  • 3.
    Talk Overview • Spark関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • まとめ 3
  • 4.
    Apache Sparkとは? • 大規模データを処理するための分散処理システム •Speed, Easy of Use, Generality, Runs Everywhere • 「ポスト Hadoop MapReduce」の有力候補 • リリース頻度:約3ヶ月に1回リリース • 現在の stable バージョンは 1.5 • 次のバージョン 1.6 はおそらく 12 月初旬にリリース見込み • プログラミングインタフェース: • 企業におけるデータ分析シーンに対応 • バッチ,ストリーミング,インタラクティブ(探索的分析) • 標準で機械学習,グラフ処理などのコンポーネントを備えている 4
  • 5.
  • 6.
  • 8.
    Talk Overview • Spark関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • FAQ • まとめ 8
  • 9.
  • 10.
    MLlib のミッション • プロダクションレベルでの機械学習を簡単にスケーラブル で実行できるようにする •機械学習アプリケーションを簡単に構築 • 大規模データセットでの学習を可能にする • Spark 0.8 から開発が始まる • 現在では累計で 50+ の企業,100+ の個人が開発に参加 • 分散機械学習アルゴリズムは日々追加されています • 1.6 でリリース予定の bisecting k-means の実装を担当 • 開発を通して得た知見はまた別の機会で話したいと思います 10
  • 11.
    MLlib-specific 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. 11 [https://cwiki.apache.org/confluence/display/SPARK/Contributing+to+Spark]
  • 12.
  • 13.
    レコメンドアルゴリズム ALS の 単純な実行方法 valratings = sc.textFile(“s3n:/path/to/csv/files/*”) .map(_.split(",")) .map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble) 13 Data (CSV) Load Data Train Model Evaluate user_id product_id rating 473 348 0.8 5623 87583 0.3 6545 9382 0.5 234 246 0.6
  • 14.
    レコメンドアルゴリズム ALS の 単純な実行方法 valratings = sc.textFile(“s3n:/path/to/csv/files/*”) .map(_.split(",")) .map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble) val als = new ALS.setRank(10).setIterations(10) val model = als.run(ratings) 14 Data Loa Data Train Model Evaluate レコメンド手法のひとつである ALS のオブジェクトを生成して訓練
  • 15.
    レコメンドアルゴリズム ALS の 単純な実行方法 valratings = sc.textFile(“s3n:/path/to/csv/files/*”) .map(_.split(",")) .map(x => Rating(x(0).toInt, x(1).toInt, x(2).toDouble) val als = new ALS.setRank(10).setIterations(10) val model = als.run(ratings) val userId = 12345 val productId = 987654 model.predict(userId, productId) 0.4… 15 Data Loa Data Train Model EvaluateTop-level API がよくデザインされているので 非常に簡単に機械学習ライブラリが使える
  • 16.
    ALSのベンチマーク • データセット:Amazon ReviewsDataset • データサイズ: 660万ユーザ, 220万アイテム • クラスタサイズ:m3.2xlarge x 16 16 cited by: Xiangrui Meng: A More Scaleable Way of Making Recommendations with MLlib
  • 17.
    MLlib の ALSについて詳しく知りたい方は 「レコメンドバッチ高速化に向けたSpark/MapReduceの機械学習ライブラリ比較検証」 http://www.slideshare.net/recruitcojp/sparkmapreduce 17
  • 18.
    Talk Overview • Spark関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • まとめ 18
  • 19.
  • 20.
    DataFrame API 20 age prefecturename 34 Tokyo **** 41 Osaka **** 27 Saitama **** 24 Chiba **** // 都道府県ごとのユーザの平均年齢を計算 data.groupBy(“prefecture”).ave(“age”) // 年齢 25 歳以上のユーザ数 data.filter(“age >= 25”).count() // SQL でも記述できる data.sql(“select age from user_table”) データ分析でよく使われる機能を DSL として提供 Hive などのデータソースにも対応 user_table
  • 21.
  • 22.
    Spark をネイティブで書くより早い 22 cited by:Spark Summit EU 2015: Spark DataFrames: Simple and Fast Analysis of Structured Data DataFrame API を利用すれば 少ないコードでより高速に処理することができる
  • 23.
    Talk Overview • Spark関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • まとめ 23
  • 24.
  • 25.
  • 26.
  • 27.
    Our Task • レビュー(review) のテキストから評価 (rating) を予測 27 review Model rating String Int
  • 28.
    Load Data • DataSchema • label: Int • text: String 28 Load Data Feature Extraction Train Model Evaluate
  • 29.
    Feature Extraction • DataSchema • label: Int • text: String • words: Seq[String] • features: Vector 29 Load Data Hashed Term Freq. Train Model Evaluate Tokenizer Transformer
  • 30.
    Train a Model •Data Schema • label: Int • text: String • words: Seq[String] • features: Vector • prediction: Int 30 Load Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer Transformer Estimator
  • 31.
    Spark ML PipelineAPI val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") 31 Load Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  • 32.
    Spark ML PipelineAPI val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.01) 32 Load Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  • 33.
    Spark ML PipelineAPI val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.01) val pipeline = new Pipeline() .setStages(Array(tokenizer, hashingTF, lr)) val model = pipeline.fit(training) 33 Pipeline Load Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  • 34.
  • 35.
    A Little SimpleML Pipeline 35
  • 36.
    ML Pipelines forTest 36 Pipeline Training Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer Pipeline Test Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  • 37.
    Pipeline API forTest val tokenizer = new Tokenizer() .setInputCol("text") .setOutputCol(“words") val hashingTF = new HashingTF() .setNumFeatures(1000) .setInputCol(tokenizer.getOutputCol) .setOutputCol("features") val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.01) val pipeline = new Pipeline() .setStages(Array(tokenizer, hashingTF, lr)) val model = pipeline.fit(training) model.transform(test) 37 Pipeline Test Data Hashed Term Freq. Logistic Regression Evaluate Tokenizer
  • 38.
  • 39.
    Practical ML Pipelineis Complicated! 39 Data Image! Parser Normalizer Convolver sqrt,mean Zipper Linear Solver Symmetric! Rectifier 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
  • 40.
    Parameter Tuning 40 Hashed TermFreq. Logistic Regression Evaluate Tokenizer hashingTF.numFeatures {10, 20, 40} lr.regParam {0.01, 0.1, 0.5} Pipeline
  • 41.
  • 42.
    Practical Spark MLPipeline API val paramGrid = new ParamGridBuilder() .addGrid(hashingTF.numFeatures, Array(10, 20, 40)) .addGrid(lr.regParam, Array(0.01, 0.1, 0.5)) .build() 42
  • 43.
    Practical Spark MLPipeline 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) 43 Parameter Tuning も Cross-Validation も API が用意されているので複雑な PIpeline も簡単に定義
  • 44.
    Model export/import forPipeline API is coming soon! 44 Pipeline Load Data Hashed Term Freq. Logistic Regression Tokenizer save Model Load Model Evaluate モデルを保存することで 再構築の必要がなく再利用が簡単
  • 45.
    Talk Overview • Spark関連の基礎知識 • Spark MLlib • DataFrame API • Pipline API • まとめ 45
  • 46.
    まとめ • Spark は企業における3つの分析シーンに対応 •バッチ,ストリーミング,インタラクティブ(探索的分析) • DataFrame API は大規模分散処理の探索分析をより身近なものにする • SQL で実行することもできる • Hive などのさまざまなデータソースをサポート • 最適化機構により「ネイティブ」に Spark のコードを書くより早くなる • Spark の機械学習ライブラリ MLlibで,プロダクションレベルでの機械学習を簡単 にスケーラブルで実行できる • 機械学習アプリケーションを簡単に構築 • 大規模データセットでの学習を可能にする • Pipeline API を利用することで「実践」での複雑化する ML Pipeline の管理が簡単 46 Sparkのデータサイエンス関連の Top-Level API は 企業における「実践」を意識して作られていることを知っていただく