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

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

Avatar for ohnabe ohnabe
February 04, 2017

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

Kaggle, Python, parallel computing

Avatar for ohnabe

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))