Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Kaggle meetup 20170204

999 views

Published on

Kaggle Meet up 第二回資料

Published in: Engineering
  • Be the first to comment

Kaggle meetup 20170204

  1. 1. 並列処理を頑張って、 睡眠時間を確保する Kaggle Meetup 20170204 @ohnabe
  2. 2. 自己紹介 twitter ID : @ohnabe Kaggle 歴 : 3年くらい (not master 普通の人) 仕事:通信キャリアで Wearable Computing の研究 、異動 により研究員から分析系雑用係へ転身し、メモ帳で SAS のコードを書く業務を経て、現在は 某 Web 系企業で、 データ分析のエンジニア。  業務では、主に SQL/Python/R などを使用
  3. 3. 如何にして睡眠時間を確保するか  Kaggler の夜は長い  でも、仕事もあるし早く寝たい  早く寝るには  分身の術を覚える:難易度が高い上に、自分の分身を増やしたところで、効 率が劇的に向上するか疑問。修行の時間が無駄になる可能性もある  無駄な時間を減らす 処理待ちの間に Twitter の TL を見て、復帰に時間が掛かる 出来るだけ待ち時間がないように、Kaggle,日常生活のタスクを並列化する  寝てる間に計算機に頑張ってもらう → どっかにエラーがあるんじゃないかという不 安で安眠できない(エラーはなくても結果が気になって安眠できない)  TL を見る行為はやめれないので、少なくとも TL を見る時間が少なくなるよう に、処理が早く終わるように頑張る → 並列処理やってみよう!
  4. 4. どの部分を並列処理するか 1. raw データを加工する(data frame にする前の処理)  たまに、データセットが大きいコンペが存在し、直接 data frame として読み込めず、何らかの前処理が必要な時がある(Web ペー ジの html ファイルの中から有害な広告サイトが含まれてるページ かどうかを判別するなど) 2. data frame にした後、学習器に投入する前の処理 3. 学習器で学習、推定する処理  Xgboost を始めとし、並列化できるものはほぼオプションで並列 処理できるので、頑張るところがない。 今日は主に 1 の話。2 は。。。
  5. 5. 先に 2 の話  Python なら pandas で作成した data frame に対して、 dask を利用して並列処理 Dask については、@sinhrks さんの下記のページをご参照ください Python Dask で 並列 DataFrame 処理 http://sinhrks.hatenablog.com/entry/2015/09/24/222735  R なら parallel パッケージ? こちらについては、福島 真太朗さんの Rによるハイパフォーマンス コンピューティングをご参照ください https://www.amazon.co.jp/dp/toc/4883379353/ref=dp_toc?_encoding =UTF8&n=465392
  6. 6. 1 の話  1 台の PC にある CPU を複数働かせる環境を想定  Python でお気軽に頑張る話です、本気の高速化は、C++ などを利用しましょう!  大量のファイル(数) を並列処理したい  分散処理のフレームワークを使う Hadoop, Spark などの疑似分散環境で実行 R, Python からそれぞれコードが書ける それぞれ、Docker があるのでそれを利用 docker pull ! もうちょっと手軽に
  7. 7. 大量のファイルをこんな感じで処理する  対象のファイルをリストを1ファイルずつ逐次的に処 理するのではなく、複数のファイルを同時に処理し て計算時間を短縮。I/Oに時間が掛かるのはあきらめ る。 def exec_sample(target): with open(target) as f: ….... for f_name in [ファイル達]: exec_sample(f) pool.map(exec_sample, [ファイル達]) 並列処理でよろしくやってくれる
  8. 8. やり方その1  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(‘ファイルパス'))
  9. 9. やり方その2  iparallel を利用  Ipython で並列分散処理。  Jupyter notebook 上で、並列分散処理のクラスタを作れた りする、一台のローカル環境だと疑似分散環境 $ pip install ipyparallel $ jupyter notebook --generate-config jupyter のコンフィグファイル作成 コンフィグファイルに、下記を追加 c.NotebookApp.server_extensions.append('ipyparallel.nbextension') $ jupyter notebook 起動して、Ipython Clusters をポチる
  10. 10. その2の2 ファイルを 1000 個書く処理を 4 並列で実行して、6s ??? 分散処理のためのオーバヘッドが大きいと思われる。。。
  11. 11. その他  dask は、data frame 以外にも array の計算(sum など)について も、並列処理が可能。 詳細は、@sinhrks のさん下記を参照ください Python Dask.Array で 並列 / Out-Of-Core 処理 http://sinhrks.hatenablog.com/entry/2015/12/13/215858  joblib でも並列処理可能  dask.distributed では、ipyparallel と同様にクラスタを作って、並 列分散処理ができる  何も考えずに、data frame のデータを勝手に並列処理してくれ る世界が早く来て欲しい。 joblib.Parallel(n_jobs = 4)(joblib.delayed(exec_sample)(i) for i in range(10))

×