機械学習モデルフォーマットの話:さようならpmml、こんにちはpfa
TRANSCRIPT
機械学習モデルフォーマットの話: さようならPMML こんにちはPFA
⽐⼾将平 Preferred Networks America, Inc.
⾃⼰紹介
l ⽐⼾将平(HIDO Shohei) l Twitter ID: @sla l 専⾨:データマイニング、機械学習 l 経歴:
l 2006-2012: IBM東京基礎研究所データ解析グループ l 機械学習のアルゴリズム研究開発(主に異常検知)
l 2012-2014: 株式会社Preferred Infrastructure l ⼤規模オンライン分散機械学習基盤Jubatusチームリーダー
l 2014-: 株式会社Preferred Networks l 2015-: Preferred Networks America, Inc. @ シリコンバレー
l Chief Research Officer
2
l 機械学習モデルフォーマットといえばPMML l 使われているか?流⾏っているか?
l サポートは⽼舗データ解析ソフトを中⼼にたくさん、だが… l Google trendで⾒ても、5年間ほぼ盛り上がりなし l ⽿にすることは無い(データサイエンティストブーム中すらも)
3
(これまで)機械学習モデル標準化とフォーマット いちおうPMMLがあるけどぶっちゃけ残念な感じ
⽬次
l 機械学習モデルのプロダクション利⽤
l PMMLの理想と現実
l PFAの概要
l PFA⼊⾨編
l (おまけ)ディープラーニングモデルの標準化?
4
データサイエンティストが作ったモデルをプロダクション環境で使いたい時l 開発環境:RやPythonで試⾏錯誤l プロダクション環境:HadoopやSparkベースの解析基盤の中
5
Rと格闘してやっと最⾼精度の オレオレモデルができました!
データサイエンティスト マネージャー
よし!でもRじゃ本番環境で 使えないから何とかしてね!
マジかよ… Javaで再実装?
⼆つの分断された世界
6
Death valley of M
L models
⽬次
l 機械学習モデルのプロダクション利⽤
l PMMLの理想と現実
l PFAの概要
l PFA⼊⾨編
l (おまけ)ディープラーニングモデルの標準化?
7
PMMLとは
l Predictive Model Markup Language– XMLベースの予測モデル交換フォーマット
– 1997年に初期v0.7公開、2016年に最新v4.3公開(14つめ)
8
<PMML xmlns="http://www.dmg.org/PMML-4_1" version="4.1"> <Header copyright="KNIME"> <Application name="KNIME" version="2.8.0"/> </Header> <DataDictionary numberOfFields="10">...</DataDictionary> <TransformationDictionary/> <ClusteringModel modelName="k-means" functionName="clustering" modelClass="centerBased" numberOfClusters="4"> <MiningSchema>...</MiningSchema> <LocalTransformations>...</LocalTransformations> <ComparisonMeasure kind="distance">...</ComparisonMeasure> <ClusteringField field="Age" compareFunction="absDiff"/> <ClusteringField field="Male_Gender" compareFunction="absDiff"/>… <Cluster name="cluster_0" size="289">...</Cluster> <Cluster name="cluster_1" size="536">...</Cluster> </ClusteringModel></PMML>
←特徴量定義
←モデル宣⾔←前処理定義
←得られたクラスタ
←特徴量の使い⽅←距離定義
←利⽤する特徴量宣⾔←前処理適⽤
PMMLの理想
l PMML利⽤者のメリット– 様々な環境・ソフトウェアをまたいでモデルを共⽤可能
– ⾯倒な実装は各ソフトウェアが対応して隠蔽してくれる
– TransformationとTargetにより前処理・後処理もサポート
– XMLかつschemaも与えることで⾔語を問わず簡単に操作
l PMML対応ソフトウェア開発者のメリット– PMMLに対応することでユーザーが増える
– 既存ソフトウェアはImport and/ or Exportに対応すれば良い
– PMMLバージョンアップへの対応はベストエフォートで良い
l PMML標準化団体のメリット– PMMLが業界標準として広く使われる
– アルゴリズムはSpecificationバージョンアップ毎に追加すればいよい
9
PMMLの現実
l PMMLの弱点– 拡張性が低く前処理が苦⼿
– データフローを単⼀PMMLでは表現困難
– 各種PMMLモデルの「仕様」であり全実装が追従するのが⼤変なほど複雑化
– 独⾃拡張を必要とする新しいアルゴリズムの研究開発には使えない
l PMMLのバージョン対応状況– 各製品ごとにProducer / Consumerの対応バージョンがバラバラ
– 製品をまたいだ実⾏の保証はどれくらいできているのか…?
l PMMLの利⽤実態– 主にエンタープライズシステムの中で限定的に使われている
– PMMLが今の⼈⼯知能ブームで勢いを増すことは考えづらい
10
⽬次
l 機械学習モデルのプロダクション利⽤
l PMMLの理想と現実
l PFAの概要
l PFA⼊⾨編
l (おまけ)ディープラーニングモデルの標準化?
11
PFA: Portable Format for Analytics
l 開発状況– 仕様はv0.8.1が2015年11⽉に初めて公開
– オリジナル開発者はJim Pivarski
– PMMLと同じData Mining Group (dmg.org)コンソーシアムが主導
– 実際にはOpen Data Group(という会社)がコア開発&主要プロモーター
l 公開実装– RのAurelius: 主にモデル開発⽤
– Scala (JVM)のHadrian: 主にモデル実⾏⽤
– PythonのTitus: 両⽤
l PMMLとの関係– KDD2016で“Standards in Predictive Analytics”ワークショップ
– PMML関係者のトークの後にPFAの紹介
– 同じDMG下なのに対⽴関係にあるように⾒えた12
What is the advantage of PFA over PMML?
l Itʼs JSON!
13
{"input": "string", "output": {"type": "array", "items": "string"}, "cells": { "accumulate": {"type": {"type": "array", "items": "string"}, "init": []}}, "method": "map”, "action": {"cell": "accumulate", "to": {"fcn": "u.addone", "fill": {"newitem": "input"}}}, "fcns": {"addone": {"params": [{"old": {"type": "array", "items": "string"}}, {"newitem": "string"}], "ret": {"type": "array", "items": "string"}, "do": {"a.append": ["old", "newitem"]}}}, "name": "ExampleScoringEngine” }
PFAの特徴
l ユーザー定義関数– 対応ソフトウェア開発者だけでなくユーザーもが新しいモデル、
さらに前処理や後処理を定義できるような拡張性
– モデルの連鎖や階層化など、複数モデルを組み合わせた
ワークフローの表現が可能
l JSON (もしくはYAML) & Avroスキーマ– HadoopやSpark、Stormなどの現代的な分散/ストリームデータ処理基盤に容
易に統合可能
– ⼈間可読と機械可読の丁度良いバランス
l ファイルI/O無し、型付けなど– プロダクション環境で任意のPFAドキュメントを実⾏する安全性を確保
14
What is the advantage of PFA over PMML? (contd.)l 特定モデル毎のパラメータテーブルではなくl PMMLよりもさらに柔軟で拡張性が⾼いl なおかつ汎⽤⾔語よりは事前検証が容易で安全
15
2つの世界の架け橋としてのPFA
16
⽬次
l 機械学習モデルのプロダクション利⽤
l PMMLの理想と現実
l PFAの概要
l PFA⼊⾨編
l (おまけ)ディープラーニングモデルの標準化?
17
⾔語としてのPFA:各実装はこれらをサポートすれば良いl 基本的な機能
– プリミティブな型(Avro)
– 条件分岐
– 関数
– Map / Emit / Fold
l 安全– 静的型付け
– ファイルI/Oなど無し
l 便利– Immutable data structure
– バイトコードにコンパイル可能
(⼊⼒以外の型チェック不要)
18
PFA
Primitive ⾔語機能
UDF 拡張性
Common モデル
Avroによる型システム
l Apache Avro– JSONベースのSerializationとRPCのフレームワーク
– MessagePack, Thrift, Protocol Bufferと同様
l Avro schema– Primitives: boolean, integer, floating-point, and string
– Null type
– Arrays of homogeneous, sequential items
– Maps of homogeneous, unordered key-value pairs
– Named records of heterogeneous named fields
– Named enumeration sets,
– Byte sequences (raw strings),
– Named, fixed-width byte sequences,
– Tagged unions.19
基本:input-action-output
20
算術関数
21
Map
22
Emit
23
Fold
24
If-then-else
25
While検証できないので実⾏側でWhile⼊りPFAを拒絶可能
26
For
27
Function call
28
Function例: ベルヌーイ列
29
PrettyPFA: C-like syntax for PFAPFAを⼿で書きたくない⼈のために
30
その他
l 関数オブジェクトサポート– インライン引数のみ
– グローバルなUDFメイを持つ
l 制限なし関数オブジェクトは許さない– 事前に呼び出し関係は決定できデッドロックは起きない
– UDFはバイトコードになっていてもよい
l Null型で⽋損値も安全に扱える
l JavaScriptからのコンバータもサポート予定
31
PFAの既存実装
l 現在はR、Python、Scalal 何故か全部Hadrianレポジトリに
– https://github.com/opendatagroup/
hadrian
32
モデル開発 PFA検証 スコアリングエンジン実⾏
Aurerius R
Titus Python
Hadrian Scala (JVM)
rPython呼び出し
スコアリングエンジンのマイクロサービス化
l Dockerを使ってより既存データ解析基盤への統合を容易に– 例:前処理、後処理、モデル毎のContainerの集合としてデプロイ
– REST APIアクセス、スケジューラ、pub-sub…
– 実装はこれから(?)
33 https://channel9.msdn.com/Events/useR-international-R-User-conference/useR2016/Helping-R-Stay-in-the-Lead-by-Deploying-Models-with-PFA
PFAの使⽤例: AureliusのrandomForest (1/3)
l ⽬的: simpleTreeがある他⾔語実装でもRのrandomForestを動かす
l RのrandomForestモデルのパラメータを抽出– randomForestオブジェクトforestObjectをlist-of-lists形式のforestに変換
– pfa.randomForest.*の関数はRのrandomForestオブジェクト⽤に⽤意
34
forest <- list() for (i in 1:forestObject$nTree) { treeTable <- pfa.randomForest.extractTree(forestObject, i, labelVar = TRUE) forest[[length(forest) + 1]] <- pfa.randomForest.buildOneTree(treeTable, 1, labelVar, dataLevels, lapply(dataLevels, function (v) avro.string))$TreeNode }
PFAの使⽤例: AureliusのrandomForest (2/3)
l Inputのスキーマ作成
l 全体のインタフェース作成
35
fieldNames <- as.list(forestObject$xNames) fieldTypes <- rep(avro.double, length(fieldNames)) names(fieldTypes) <- fieldNames for (n in names(dataLevels)) fieldTypes[[n]] <- avro.string inputSchema <- avro.record(fieldTypes, "Input")
tm <- avro.typemap( Input = inputSchema, Output = avro.string, TreeNode = avro.record(list( field = avro.enum(fieldNames), operator = avro.string, value = avro.union(avro.double, avro.string, avro.array(avro.string)),…), "TreeNode"))
PFAの使⽤例: AureliusのrandomForest (3/3)
l ランダムフォレストモデルのPFA定義
l ランダムフォレストモデルの読み込みと実⾏– 他⾔語実装でもmodel.tree.simpleTreeが実装されていて動くはず
36
pfaDocument <- pfa.config( input = tm("Input"), output = tm("Output"), cells = list(forest = pfa.cell(avro.array(tm("TreeNode")), forest)), action = expression( treeScores <- a.map(forest, function(tree = tm("TreeNode") -> avro.string) model.tree.simpleTree(input, tree)), a.mode(treeScores)))
engine <- pfa.engine(pfaDocument engine$action(list(field1 = 3.14, field2 = "hello"))
ところで:本当にPFAは使われるようになるのか?
l 個⼈的な感想:まだ道のりは遠い– 開発リソースが圧倒的に⾜りていない印象
– モチベーションと設計はモダンで理にかなっているように⾒える
– すでにGithubでドキュメントと実装が不整合
– 新しい⾔語に完璧なPFA実装を⽤意するコストはどれくらいなのか?
– 新しいアルゴリズムをPFA⽂書で表現するコストはどれくらいなのか?
– PMMLは20年の歴史、PFAはまだ1年ちょっとなのですぐには無理だろう
l まず2つの世界をまたいだコミュニティの拡⼤が期待される
37 https://github.com/opendatagroup/hadrian/graphs/contributors
⽬次
l 機械学習モデルのプロダクション利⽤
l PMMLの理想と現実
l PFAの概要
l PFA⼊⾨編
l (おまけ)ディープラーニングモデルの標準化?
38
GPUクラスタ作った深層学習モデルを端末に近い組み込み環境で使いたい時l 開発環境:GPUクラスタ+⼤容量ストレージl プロダクション環境:⾮⼒なCPUマシン(+電⼒の制約下)
39
GPUクラスタぶん回して最強の 深層学習モデルができました!
AIエンジニア(?) マネージャー
よし!じゃああとはそれが 組込みで動くようにしてね!
マジかよ… Cで再実装?
ディープラーニングならではのデプロイ課題
l 訓練時:予測精度最優先・バッチ処理・電⼒やコストは許容l 予測時:実⽤性最優先・オンライン処理・低消費電⼒
– 間に訓練済みモデルのCompactionが⼊ることもある
40 https://devblogs.nvidia.com/parallelforall/production-deep-learning-nvidia-gpu-inference-engine/
(1/4) PFAにおけるNeural Network
l あるといえばある: model.neural– 定義されているのはmodel.neural.simpleLayersのみ
l Weight⾏列とBiasを持つLinear + 任意のActivation function
– Multi-layer perceptronであれば実装可能
l Deep learningモデル…?– 全ての処理をイチから全部PFAでフラットに書けば表現可能(⾔語だから)
– あるいはmodel.neuralを拡張してConvolutionなどを追加する
– PFA論⽂著者に⽈く「DLフレームワーク開発チームにはコンタクトしてない」
41
(2/4) NVIDIA TensorRT (旧GPU Inference Engine)l Interence時の⾼速化
– TensorRT が計算グラフをGPU実⾏のために最適化してくれる
l 学習モデルのフォーマット– Caffe model (.prototxt)
l サポート済み(主に画像認識⽤)– Convolution2D, Deconv, Fully-connected, Pooling, ReLU, Softmax, …
l TensorRT 2.0からはINT8サポートなども導⼊
42 https://devblogs.nvidia.com/parallelforall/production-deep-learning-nvidia-gpu-inference-engine/
(3/4) DLチップ開発競争
l アプローチ– ☆汎⽤的に訓練済みNNモデルを読み込んで実⾏→モデルフォーマットと関連
– 特定のNNモデルを焼き込む
l NVIDIA– DL向けGPUではほぼ独占状態(TitaxX、GTX1080、DGX-1…)
– ⾞載AI応⽤向けにARM SoCのXavierを発表
l Intel– IntelのAVX-512命令セットに深層学習⽤サブセットが追加
– 買収したNervana Systemsが2017年にチップ発売予定
l その他– Google TPU
– 東芝&デンソーの⾃動運転⽤DNN-IP
43 (c) Intel & Nervana Systems
(4/4) フレームワーク⾮依存の標準化の動き
l Khronos Groupから2つのイニシアチブ発表– OpenGL/OpenCL/OpenVX/WebGLなどを束ねるコンソーシアム
l NNEF: Neural Network Exchange Format – Inference Engineのために学習済みモデルを表現するフォーマット
– 主要なレイヤー定義などは⽤意される(convolution, pooling, etc…)
l OpenVX Neural Network Extension– OpenVXのグラフとしてCNNを表現して実⾏する拡張
44 https://www.khronos.org/news/press/khronos-launches-dual-neural-network-standard-initiatives
まとめ
l 機械学習フォーマットの標準化は業界の要請であり悲願である
l PMMLは(それなりに)使われているが今後の発展は期待できない
l PFAはPMMLの弱点を考慮して考案されたフォーマットである
l 原理的にPFAは⾔語なので任意のモデルを表現可能である
l まだ活動としては⼩規模だがコンセプトとしては参考になる
l Deep Learningについては標準的なCNNについては陰に陽に標準化が進んでいるが汎⽤的なものはまだこれからである
45
参考⽂献
l PFA Specification v0.8.1– http://github.com/datamininggroup/pfa/releases/download/0.8.1/pfa-
specification.pdf
l Deploying Analytics with the Portable Format for Analytics (PFA)
– http://www.kdd.org/kdd2016/papers/files/adp0884-pivarskiAcb.pdf
l PFA Function Library– http://dmg.org/pfa/docs/library/
l Aurelius randomForest– https://github.com/opendatagroup/hadrian/wiki/Aurelius-randomForest
46
l NVIDIA TensorRT– https://developer.nvidia.com/tensorrt
– https://devblogs.nvidia.com/parallelforall/production-deep-learning-
nvidia-gpu-inference-engine/
l Khronos– https://www.khronos.org/news/press/khronos-launches-dual-neural-
network-standard-initiatives
47