ML Systems Workshop @ NIPS 2017「感想、メモ」

NIPSは機械学習のカンファレンスです。
今年はロサンゼルスでありました。
個人の感想を綴ります。

~~エンジニアとしてこのワークショップを毎年抑えるだけでも、界隈の人のライブラリのトレンドが掴める気がした。~~
→2016年は無かったのかも。
コミッター募集してます（笑）的な発表もチラホラあった。

https://nips.cc/Conferences/2017/Schedule?showEvent=8774
http://learningsys.org/nips17/

このセッションは非常に混んでた。会場に人が多くなりすぎて部屋が暑かった。
後ろはもっと混んでて途中退出するには鉄の心が必要だった。
![IMG_0353.JPG](https://qiita-image-store.s3.amazonaws.com/0/64334/09342690-36a4-9cc4-55fc-a8bf1e36de99.jpeg)



## Open Neural Network Exchange (ONNX)

...機械学習ライブラリ同士の間に挟まる役割。コンバートが容易。
3社の連合。googleへの対抗？とはいえcoreml tensorflowへのコンバータも用意されてる。

![スクリーンショット 2017-12-09 午前6.00.42.png](https://qiita-image-store.s3.amazonaws.com/0/64334/4d1c16ec-87e8-51dd-91e0-0fae209944d8.png)


https://github.com/onnx/tutorials

## TPUクラウド

Learn more about Cloud TPUs and the TensorFlow Research Cloud
...TPUすごいから使ってねって
https://services.google.com/fb/forms/tpusignup/?hl=ja


## TVM: Tensor IR Stack for Deep Learning Systems

TVMは、深層学習システム向けのTensor中間表現（IR）スタック。最適化されてて早いんだぞと。
TVMは深い学習フレームワークと連携して、さまざまなバックエンドへのコンパイルをエンドツーエンドで提供。

![スクリーンショット 2017-12-09 午前6.03.33.png](https://qiita-image-store.s3.amazonaws.com/0/64334/47bcedf6-af37-a187-e999-c4b3bae2a1b6.png)

https://github.com/dmlc/tvm

## ModelDB: A system to manage ML models

機械学習モデルを管理するエンドツーエンドのシステム。
モデルが訓練され、モデルデータを構造化されたフォーマットで格納し、豊富なクエリを行うためにWebフロントエンドを介してモデルデータを取り込むときに、モデルとそれに関連するメタデータを取り込みます。
対応ライブラリはsparkとscikit-learn。
→学習結果をDBで管理できるんならすごい便利じゃないかな。仕事でも学習結果が多すぎて管理できない問題があった。

![スクリーンショット 2017-12-09 午前6.09.03.png](https://qiita-image-store.s3.amazonaws.com/0/64334/a516f783-c412-0a79-41d9-d10e631f419d.png)


https://github.com/mitdbg/modeldb#incorporate-modeldb-into-your-ml-workflow

## MacroBase

ヒューマンエラーの分析に特化。
データの異常な傾向や面白い傾向を見つけて説明する。

![スクリーンショット 2017-12-09 午前6.11.30.png](https://qiita-image-store.s3.amazonaws.com/0/64334/6f9a256d-e1f3-7894-cc64-e7f88b41816c.png)
基本のパイプライン

https://github.com/stanford-futuredata/macrobase


## Clipper

機械学習のサービス化を容易にするシステム。

RESTインターフェイスを提供
バッチ処理、キャッシュ処理、アンサンブル機能　等

![スクリーンショット 2017-12-09 午前6.15.00.png](https://qiita-image-store.s3.amazonaws.com/0/64334/8ca51767-149a-cc7b-8d15-b955c20085b6.png)


https://github.com/ucbrise/clipper

sklearn例

```py:
from clipper_admin import ClipperConnection, DockerContainerManager
from clipper_admin.deployers.python import deploy_python_closure
import numpy as np
import sklearn

clipper_conn = ClipperConnection(DockerContainerManager())

# Connect to an already-running Clipper cluster
clipper_conn.connect()

def center(xs):
    means = np.mean(xs, axis=0)
    return xs - means

centered_xs = center(xs)
model = sklearn.linear_model.LogisticRegression()
model.fit(centered_xs, ys)

# Note that this function accesses the trained model via closure capture,
# rather than having the model passed in as an explicit argument.
def centered_predict(inputs):
    centered_inputs = center(inputs)
    # model.predict returns a list of predictions
    preds = model.predict(centered_inputs)
    return [str(p) for p in preds]

deploy_python_closure(
    clipper_conn,
    name="example",
    input_type="doubles",
    func=centered_predict)
```

pyspark例

```py:
from clipper_admin import ClipperConnection, DockerContainerManager
from clipper_admin.deployers.pyspark import deploy_pyspark_model
from pyspark.mllib.classification import LogisticRegressionWithSGD
from pyspark.sql import SparkSession

spark = SparkSession                .builder                .appName("clipper-pyspark")                .getOrCreate()

sc = spark.sparkContext

clipper_conn = ClipperConnection(DockerContainerManager())

# Connect to an already-running Clipper cluster
clipper_conn.connect()

# Loading a training dataset omitted...
model = LogisticRegressionWithSGD.train(trainRDD, iterations=10)

# Note that this function accesses the trained PySpark model via an explicit
# argument, but other state can be captured via closure capture if necessary.
def predict(spark, model, inputs):
    return [str(model.predict(shift(x))) for x in inputs]

deploy_pyspark_model(
    clipper_conn,
    name="example",
    input_type="doubles",
    func=predict,
    pyspark_model=model,
    sc=sc)
```

BASIC CONCEPTS
http://clipper.ai/tutorials/basic_concepts/


## thrift

Thriftは、軽量で言語に依存しないソフトウェアスタックで、RPCに関連するコード生成メカニズムを備えています。

RPCとはリモートプロシージャコール。遠隔手続き呼び出し。プログラムから別のアドレス空間にあるサブルーチンや手続きを実行することを可能にする技術。

Thriftは、データ転送、データのシリアライズ、およびアプリケーションレベルの処理のための明確な抽象化を提供します。コード生成システムは、単純な定義言語を入力とし、抽象スタックを使用して相互運用可能なRPCクライアントおよびサーバーを構築するプログラミング言語にわたってコードを生成します。

![スクリーンショット 2017-12-09 午前5.49.44.png](https://qiita-image-store.s3.amazonaws.com/0/64334/538f5373-46a9-c0d0-81a6-cadb61f76895.png)


```
thrift -r --gen py tutorial.thrift #Generated the tutorial.thrift and shared.thrift files
#Followed all prerequisites listed below　→　前提条件がなんたらかんたら、実行してみたら何か見えて来るはず。

```

https://github.com/apache/thrift
https://github.com/bayandin/thrift-examples



## DAWNBench : An End-to-End Deep Learning Benchmark and Competition

ベンチマークに特化したコンペ。
http://dawn.cs.stanford.edu/benchmark/


#その他

acceptedpapersをチェック♪
http://learningsys.org/nips17/acceptedpapers.html

https://github.com/hindupuravinash/nips2017