Upgrade to Pro — share decks privately, control downloads, hide ads and more …

並列処理を頑張って、睡眠時間を確保する

ohnabe
February 04, 2017

 並列処理を頑張って、睡眠時間を確保する

Kaggle, Python, parallel computing

ohnabe

February 04, 2017
Tweet

More Decks by ohnabe

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 utwitter ID : @ohnabe uKaggle 歴 : 3年くらい (not

    master 普通の⼈) u仕事:通信キャリアで Wearable Computing の研究 、 異動により研究員から分析系雑⽤係へ転⾝し、メモ帳で SAS のコードを書く業務を経て、現在は 某 Web 系企業で、 データ分析のエンジニア。 u 業務では、主に SQL/Python/R などを使⽤
  2. 如何にして睡眠時間を確保するか u Kaggler の夜は⻑い u でも、仕事もあるし早く寝たい u 早く寝るには u 分⾝の術を覚える:難易度が⾼い上に、⾃分の分⾝を増やしたところで、効

    率が劇的に向上するか疑問。修⾏の時間が無駄になる可能性もある u 無駄な時間を減らす u処理待ちの間に Twitter の TL を⾒て、復帰に時間が掛かる u出来るだけ待ち時間がないように、Kaggle,⽇常⽣活のタスクを並列化する u 寝てる間に計算機に頑張ってもらう → どっかにエラーがあるんじゃないかという不 安で安眠できない(エラーはなくても結果が気になって安眠できない) u TL を⾒る⾏為はやめれないので、少なくとも TL を⾒る時間が少なくなるように、 処理が早く終わるように頑張る → 並列処理やってみよう!
  3. どの部分を並列処理するか 1. raw データを加⼯する(data frame にする前の処理) u たまに、データセットが⼤きいコンペが存在し、直接 data frame

    として読み込めず、何らかの前処理が必要な時がある (Web ページの html ファイルの中から有害な広告サイトが含ま れてるページかどうかを判別するなど) 2. data frame にした後、学習器に投⼊する前の処理 3. 学習器で学習、推定する処理 u Xgboost を始めとし、並列化できるものはほぼオプションで並列 処理できるので、頑張るところがない。 今⽇は主に 1 の話。2 は。。。
  4. 先に 2 の話 u Python なら pandas で作成した data frame

    に対して、 dask を利⽤して並列処理 Dask については、@sinhrks さんの下記のページをご参照ください Python Dask で 並列 DataFrame 処理 http://sinhrks.hatenablog.com/entry/2015/09/24/222735 u R なら parallel パッケージ? こちらについては、福島 真太朗さんの Rによるハイパフォーマンス コンピューティングをご参照ください https://www.amazon.co.jp/dp/toc/4883379353/ref=dp_toc?_e ncoding=UTF8&n=465392
  5. 1 の話 u 1 台の PC にある CPU を複数働かせる環境を想定 u

    Python でお気軽に頑張る話です、本気の⾼速化は、C++ などを利⽤しましょう! u ⼤量のファイル(数) を並列処理したい u 分散処理のフレームワークを使う uHadoop, Spark などの疑似分散環境で実⾏ uR, Python からそれぞれコードが書ける uそれぞれ、Docker があるのでそれを利⽤ docker pull ! uもうちょっと⼿軽に
  6. やり⽅その1 u Multiprocessing モジュールを利⽤ from multiprocessing import Pool Import os

    def exec_sample(target_f): with open(target_f, "rb") as f: ….... if __name__ == '__main__': p= Pool(4) #同時に⽴ち上げるプロセス数(頑張って並列してくれる数)を指定 %%time p.map(write_power, os.listdir(‘ファイルパス'))
  7. やり⽅その2 u ipyparallel を利⽤ u Ipython で並列分散処理。 u Jupyter notebook

    上で、並列分散処理のクラスタを作れ たりする、⼀台のローカル環境だと疑似分散環境 $ pip install ipyparallel $ jupyter notebook --generate-config jupyter のコンフィグファイル作成 コンフィグファイルに、下記を追加 c.NotebookApp.server_extensions.append('ipyparallel.nbextension') $ jupyter notebook 起動して、Ipython Clusters をポチる
  8. その他 u dask は、data frame 以外にも array の計算(sum など)につい ても、並列処理が可能。

    詳細は、@sinhrks のさん下記を参照ください Python Dask.Array で 並列 / Out-Of-Core 処理 http://sinhrks.hatenablog.com/entry/2015/12/13/215858 u joblib でも並列処理可能 u dask.distributed では、ipyparallel と同様にクラスタを作って、 並列分散処理ができる u 何も考えずに、data frame のデータを勝⼿に並列処理してく れる世界が早く来て欲しい。 joblib.Parallel(n_jobs = 4)(joblib.delayed(exec_sample)(i) for i in range(10))