SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
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 での管理が楽
百聞は一見にしかず
Markdown
実行結果とグラフ(画像)
プログラム (Python)
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 run -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 run -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 で報告します

Contenu connexe

Tendances

[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也Preferred Networks
 
Volta は、Chainer で使えるの?
Volta は、Chainer で使えるの?Volta は、Chainer で使えるの?
Volta は、Chainer で使えるの?NVIDIA Japan
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...Yoshifumi Kawai
 
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうかOedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうかMinero Aoki
 
Chainer Contribution Guide
Chainer Contribution GuideChainer Contribution Guide
Chainer Contribution GuideKenta Oono
 
サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料masahiro13
 
Shib: WebUI tool provides crossover of Hive and MPP
Shib: WebUI tool provides crossover of Hive and MPPShib: WebUI tool provides crossover of Hive and MPP
Shib: WebUI tool provides crossover of Hive and MPPSATOSHI TAGOMORI
 
Landscape of Norikra features
Landscape of Norikra featuresLandscape of Norikra features
Landscape of Norikra featuresSATOSHI TAGOMORI
 
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-clusterKubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-clusterPreferred Networks
 
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計maebashi
 
grn_ts の紹介 - Groonga Meatup 2015
grn_ts の紹介 - Groonga Meatup 2015grn_ts の紹介 - Groonga Meatup 2015
grn_ts の紹介 - Groonga Meatup 2015s5yata
 
関東GPGPU勉強会資料
関東GPGPU勉強会資料関東GPGPU勉強会資料
関東GPGPU勉強会資料Kimikazu Kato
 
OpenCLに触れてみよう
OpenCLに触れてみようOpenCLに触れてみよう
OpenCLに触れてみようYou&I
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfaceKohei KaiGai
 
Batch processing and Stream processing by SQL
Batch processing and Stream processing by SQLBatch processing and Stream processing by SQL
Batch processing and Stream processing by SQLSATOSHI TAGOMORI
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介Preferred Networks
 
パッチを投稿してみた話
パッチを投稿してみた話パッチを投稿してみた話
パッチを投稿してみた話wata2ki
 

Tendances (20)

[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
[GTCJ2018] Optimizing Deep Learning with Chainer PFN得居誠也
 
Volta は、Chainer で使えるの?
Volta は、Chainer で使えるの?Volta は、Chainer で使えるの?
Volta は、Chainer で使えるの?
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
 
Papi
PapiPapi
Papi
 
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうかOedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
Oedo Ruby Conference 04: Ruby会議でSQLの話をするのは間違っているだろうか
 
Chainer Contribution Guide
Chainer Contribution GuideChainer Contribution Guide
Chainer Contribution Guide
 
サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料
 
Shib: WebUI tool provides crossover of Hive and MPP
Shib: WebUI tool provides crossover of Hive and MPPShib: WebUI tool provides crossover of Hive and MPP
Shib: WebUI tool provides crossover of Hive and MPP
 
Landscape of Norikra features
Landscape of Norikra featuresLandscape of Norikra features
Landscape of Norikra features
 
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-clusterKubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
 
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
Fluentdでログを集めてGlusterFSに保存してMapReduceで集計
 
grn_ts の紹介 - Groonga Meatup 2015
grn_ts の紹介 - Groonga Meatup 2015grn_ts の紹介 - Groonga Meatup 2015
grn_ts の紹介 - Groonga Meatup 2015
 
関東GPGPU勉強会資料
関東GPGPU勉強会資料関東GPGPU勉強会資料
関東GPGPU勉強会資料
 
OpenCLに触れてみよう
OpenCLに触れてみようOpenCLに触れてみよう
OpenCLに触れてみよう
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
 
Batch processing and Stream processing by SQL
Batch processing and Stream processing by SQLBatch processing and Stream processing by SQL
Batch processing and Stream processing by SQL
 
NTPとうるう秒
NTPとうるう秒NTPとうるう秒
NTPとうるう秒
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
パッチを投稿してみた話
パッチを投稿してみた話パッチを投稿してみた話
パッチを投稿してみた話
 
Vector
VectorVector
Vector
 

Similaire à OCaml でデータ分析

Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルMasahito Zembutsu
 
JAMstackは眠らない
JAMstackは眠らないJAMstackは眠らない
JAMstackは眠らないKuniyoshi Tone
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021Preferred Networks
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1Ryosuke IWANAGA
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
C#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + ClooC#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + Clooaokomoriuta
 
20190722 Building handy CI with zuul and OpenStack
20190722 Building handy CI with zuul and OpenStack20190722 Building handy CI with zuul and OpenStack
20190722 Building handy CI with zuul and OpenStackAkihiro Motoki
 
Yapcasia2012 ltthon
Yapcasia2012 ltthonYapcasia2012 ltthon
Yapcasia2012 ltthonturugina
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門Masahito Zembutsu
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2Preferred Networks
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Masahito Zembutsu
 
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとはコンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとはksk_ha
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Masahito Zembutsu
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani Minoru
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜Masaya Aoyama
 
Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」
Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」
Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」Yasuyuki Sugai
 

Similaire à OCaml でデータ分析 (20)

Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
GTC Japan 2017
GTC Japan 2017GTC Japan 2017
GTC Japan 2017
 
JAMstackは眠らない
JAMstackは眠らないJAMstackは眠らない
JAMstackは眠らない
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
Runtime c++editing
Runtime c++editingRuntime c++editing
Runtime c++editing
 
C#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + ClooC#でOpenCL with OpenTK + Cloo
C#でOpenCL with OpenTK + Cloo
 
20190722 Building handy CI with zuul and OpenStack
20190722 Building handy CI with zuul and OpenStack20190722 Building handy CI with zuul and OpenStack
20190722 Building handy CI with zuul and OpenStack
 
Yapcasia2012 ltthon
Yapcasia2012 ltthonYapcasia2012 ltthon
Yapcasia2012 ltthon
 
今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門今だからこそ知りたい Docker Compose/Swarm 入門
今だからこそ知りたい Docker Compose/Swarm 入門
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理Docker入門 - 基礎編 いまから始めるDocker管理
Docker入門 - 基礎編 いまから始めるDocker管理
 
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとはコンテナを止めるな!  PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
コンテナを止めるな! PacemakerによるコンテナHAクラスタリングとKubernetesとの違いとは
 
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料Docker道場「Dockerの基本概念」0825インフラ勉強会資料
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
 
RgGen ご紹介
RgGen ご紹介RgGen ご紹介
RgGen ご紹介
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
 
Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」
Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」
Deep Learningハンズオン勉強会「Caffeで画像分類を試してみようの会」
 

OCaml でデータ分析

  • 4. 今日話すこと OCaml でデータ分析環境を作った(作っている)話 ● Jupyter (IPython) notebook ● IOCaml ● データ分析用の Docker image ● 実際に使ってみる(デモ) ● 今後の課題
  • 6. データ分析といえば Python ● 言語仕様自体が数値計算に特化しているわけではない(と思う) ● Python がよく使われる理由(偏見と主観) ○ パッケージが整っている (numpy, scikit-learn, etc.) ○ Jupyter (IPython) notebook がめちゃ便利
  • 7. Jupyter (IPython) notebook とは? ● 一言で言うと、対話環境 + 画像の埋め込み + Markdown (LaTeX) ○ コードと実行結果(グラフ等)とドキュメントを一箇所にまとめて保存・管理 ○ いろいろな言語に対応 ○ 他にもできることあるけど、省略 ● 実験や分析に便利 ○ コードが実行できるので、再現性を担保できる ○ 結果を整理・グラフ化して、他人に説明するのも楽 ○ 1 notebook = 1 file なので git での管理が楽
  • 9. 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 のことが多いため)
  • 10. なぜ OCaml でデータ分析? (主に Python と比較) ● 心が OCaml を求めている ○ 本能に逆らってはダメ! ● 静的型検査は神 ○ 長時間実行した後に、くだらないエラーで落ちることが激減 ○ 前処理や試行錯誤でデータ構造を頻繁に変えても、型でミスを防げる ○ 型検査・バイトコードコンパイルは高速なので、ストレスなし ● map, fold, パイプ演算子が便利 ○ 汎用的で簡潔、使いやすくて読みやすい ● バイトコードでも簡単な解析には十分な速度が出る ○ まぁ、中では C ライブラリ呼んでるからね ... ○ ネイティブはさらに 10 倍ぐらい速いので、成功したらそのままネイティブコンパイル
  • 11. OCaml/IOCaml の弱み (主に Python と比較) ● IOCaml がメンテされてない ○ 殆どのファイルの更新が 2 年前、いろいろ機能が不足 ● scikit-learn のような守備範囲の広いパッケージがない ○ そもそも、数値計算ライブラリ・例が少ない ○ 特定の手法の実装など小さめのパッケージが散乱 ○ 解決策 「データ分析系のパッケージを詰めた Docker image を作った」
  • 13. データ分析用の 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/ ● ちなみに、仕事でもこのイメージを使ってます
  • 14. 使い方 $ docker run -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 をブラウザに貼り付ける
  • 15. ホストマシンの notebooks を管理 $ docker run -it -p 8888:8888 -v $PWD:/notebooks akabe/iocaml-datascience ホスト上の絶対パス ゲスト(コンテナ)内の絶対パス
  • 17. 具体例 (1) 画像のフィルタ ● 画像処理の教科書の最初の あたりに出てくる例 ● コード実行と結果(画像)を 対話的に確認 ● これをファイルに書き出して 保存・管理できる
  • 18. 具体例 (2) Gaussian ランダムウォーク ● GSL で Gaussian 乱数生成 ● Archimedes でグラフ化
  • 19. 具体例 (3) フォルマント推定(音声解析) ● 音声から特徴的な周波数を 推定 ● 音声ファイルの読み込み、 FFT、AR パラメータ推定、グ ラフ化までやってる ● いい感じの実用例になって いると思う
  • 20. Tips
  • 21. Tips 遅いと思ったら: ● #print_depth, #print_length に小さい値を入れる ○ pretty print するデータ量を減らし、 IO とレンダリングを高速化 ○ 意外に IO/レンダリングのオーバーヘッドは大きい ● 副作用に逃げる ○ でかいデータは in-place に書き換えたほうが速い ○ (本音を言えば、純粋関数的に書きたい) おかしな挙動をしたら、kernel を再起動すると良い
  • 23. IOCaml を作り直す! ● IOCaml はメンテされてない ○ 殆どのファイルは最終更新が数年前、 Pull Request も無視された... ○ ppx が使えない ○ Message authentication の未サポート ○ Jupyter protocol v5 の未サポート ○ comm message の未サポート(ipywidgets 的なライブラリが作れない) ○ Lwt_unix の一部の関数が時々 dead-lock する(自分だけ?) ● 大手術になりそうなので、自分で作りなおすことにしました ○ OCaml の内部実装に詳しい人は色々教えてください ○ opam-repository に入ったら、Twitter で報告します