372 Views
July 22, 17
スライド概要
物流スタートアップで働く機械学習エンジニア。 データ基盤や機械学習プロダクトの企画、設計、開発、運用を担当しています。
OCaml でデータ分析 2017.7.22 ML 勉強会 #2
はじめに この発表のデモを一緒に楽しみたい人は ● ● docker のインストール docker pull akabe/iocaml-datascience をお願いします。
自己紹介 ● ● ● ● 阿部晃典 データ分析・サーバサイド開発 Twitter: @ackey_65535 GitHub: @akabe
今日話すこと OCaml でデータ分析環境を作った(作っている)話 ● ● ● ● ● Jupyter (IPython) notebook IOCaml データ分析用の Docker image 実際に使ってみる(デモ) 今後の課題
Jupyter + IOCaml
データ分析といえば Python ● 言語仕様自体が数値計算に特化しているわけではない(と思う) ● Python がよく使われる理由(偏見と主観) ○ パッケージが整っている (numpy, scikit-learn, etc.) ○ Jupyter (IPython) notebook がめちゃ便利
Jupyter (IPython) notebook とは? ● 一言で言うと、対話環境 + 画像の埋め込み + Markdown (LaTeX) ○ ○ ○ ● コードと実行結果(グラフ等)とドキュメントを一箇所にまとめて保存・管理 いろいろな言語に対応 他にもできることあるけど、省略 実験や分析に便利 ○ ○ ○ コードが実行できるので、再現性を担保できる 結果を整理・グラフ化して、他人に説明するのも楽 1 notebook = 1 file なので git での管理が楽
百聞は一見にしかず プログラム (Python) 実行結果とグラフ(画像) Markdown
IOCaml ● ● Jupyter は notebooks の表示・管理ツール プログラムの実行は kernel が行う ○ ○ ○ ● kernel: API 化された対話環境 プロトコルが公開されているので、 kernel は自作できる R, Scala, Haskell などの kernel が存在 OCaml にもあった:IOCaml https://github.com/andrewray/iocaml ○ ○ IOCaml-kernel: バイトコードを実行する kernel (今日のトピック) IOCamlJS-kernel: OCaml を対話的に JS にコンパイルして実行 ■ 個人的に非推奨(数値計算ライブラリは C binding のことが多いため)
なぜ OCaml でデータ分析? (主に Python と比較) ● 心が OCaml を求めている ○ ● 静的型検査は神 ○ ○ ○ ● 長時間実行した後に、くだらないエラーで落ちることが激減 前処理や試行錯誤でデータ構造を頻繁に変えても、型でミスを防げる 型検査・バイトコードコンパイルは高速なので、ストレスなし map, fold, パイプ演算子が便利 ○ ● 本能に逆らってはダメ! 汎用的で簡潔、使いやすくて読みやすい バイトコードでも簡単な解析には十分な速度が出る ○ ○ まぁ、中では C ライブラリ呼んでるからね ... ネイティブはさらに 10 倍ぐらい速いので、成功したらそのままネイティブコンパイル
OCaml/IOCaml の弱み (主に Python と比較) ● IOCaml がメンテされてない ○ ● 殆どのファイルの更新が 2 年前、いろいろ機能が不足 scikit-learn のような守備範囲の広いパッケージがない ○ ○ ○ そもそも、数値計算ライブラリ・例が少ない 特定の手法の実装など小さめのパッケージが散乱 解決策 「データ分析系のパッケージを詰めた Docker image を作った」
データ分析用 Docker image
データ分析用の Docker image akabe/iocaml-datascience ● Jupyter + IOCaml + pre-installed packages ○ ○ ○ ○ ● ● ● 標準ライブラリ 数値計算 データ取得 可視化 Jane Street Core, Batteries Lacaml, SLAP, GSL, L-BFGS, FFTW3, libsvm, Tensorflow, etc. MySQL, PostgreSQL, Cohttp, etc. Cairo2, Archimedes GitHub: https://github.com/akabe/docker-iocaml-datascience DockerHub: https://hub.docker.com/r/akabe/iocaml-datascience/ ちなみに、仕事でもこのイメージを使ってます
使い方 $ docker -it -p 8888:8888 akabe/iocaml-datascience ... [I 13:39:45.080 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). [C 13:39:45.081 NotebookApp] Copy/paste this URL into your browser when you connect for the first time, to login with a token: http://localhost:8888/?token=7e836819e98518c13c7f341279cb26b0f3a382240b15b06a この URL をブラウザに貼り付ける
ホストマシンの notebooks を管理 $ docker -it -p 8888:8888 \ -v $PWD:/notebooks akabe/iocaml-datascience ホスト上の絶対パス ゲスト(コンテナ)内の絶対パス
デモンストレーション
具体例 (1) 画像のフィルタ ● ● ● 画像処理の教科書の最初の あたりに出てくる例 コード実行と結果(画像)を 対話的に確認 これをファイルに書き出して 保存・管理できる
具体例 (2) Gaussian ランダムウォーク ● ● GSL で Gaussian 乱数生成 Archimedes でグラフ化
具体例 (3) フォルマント推定(音声解析) ● ● ● 音声から特徴的な周波数を 推定 音声ファイルの読み込み、 FFT、AR パラメータ推定、グ ラフ化までやってる いい感じの実用例になって いると思う
Tips
Tips 遅いと思ったら: ● #print_depth, #print_length に小さい値を入れる ○ ○ ● pretty print するデータ量を減らし、 IO とレンダリングを高速化 意外に IO/レンダリングのオーバーヘッドは大きい 副作用に逃げる ○ ○ でかいデータは in-place に書き換えたほうが速い (本音を言えば、純粋関数的に書きたい) おかしな挙動をしたら、kernel を再起動すると良い
今後の課題
IOCaml を作り直す! ● IOCaml はメンテされてない ○ ○ ○ ○ ○ ○ ● 殆どのファイルは最終更新が数年前、 Pull Request も無視された ... ppx が使えない Message authentication の未サポート Jupyter protocol v5 の未サポート comm message の未サポート( ipywidgets 的なライブラリが作れない) Lwt_unix の一部の関数が時々 dead-lock する(自分だけ?) 大手術になりそうなので、自分で作りなおすことにしました ○ ○ OCaml の内部実装に詳しい人は色々教えてください opam-repository に入ったら、Twitter で報告します