データが主食

データエンジニアのぽえむ。分析だったり、読んだ本のメモだったり。

Ecri Jonas et al.「Occupy the Cloud: Distributed Computing for the 99%」

面白そうな論文があったので、読んでみました。 とは言っても2017年の論文であまり新しくはないです。

Occupy the Cloud: Distributed Computing for the 99%

UC BerkeleyのEcri Jonasらによる論文です。

arxiv.org

Ecri Jonasは http://ericjonas.com/ によるとUC Berkeleyのポスドクの方らしいです。

彼らが解決したい課題

機械学習での特徴量設計やハイパーパラメータ調整や、計算物理でのモンテカルロ法は旧来からのMapReduceによくフィットするものである。 しかし、環境構築の複雑さや難しさからUC BerkeleyのMachine Learning専攻の学生でさえもクラスターコンピューティングのコード記述をしたことがないのが現状である。

例えば、PySparkコードを実行するためには

  • Spark(Scala)
  • HDFS(Java)
  • Yarn(Java)
  • JVM

を用意する必要があり、とても厳しい。

また上記ソフトウェアスタックを構築するインフラをみてみると、AWSは70種類のEC2インスタンスを提供しており何を選択し配置するか検討するのも難しい。 AWSのスポットインスタンスとか使いたいところだけど、処理途中で中断されるリスクを想定した設計をするのはさらに難しい。

提案

既存のコードを並列実行し弾性的にに動作させるフレームワークの開発し、使用者の開発時間を最小化したい。 そのために、AWS LambdaやGoogle Cloud FunctionなどのFunction as a Serviceを利用する。

そのプロトタイプシステムとして、PyWrenを実装した。

f:id:ktr89:20190112182340p:plain

PyWrenでは、AWS Lambdaをメインで利用し、Key-Value StroreとしてRedis、Blob StoreとしてS3を利用します。

github.com

Blob書き込み実験

f:id:ktr89:20190112182230p:plain

EC2インスタンスを利用して単体のSSDに書き込むよりも、AWS Lambdaからネットワーク越しにS3に書き込む方が高速に書き込みできることがわかった。 一方で、複数のSSDをマウントしているIO最適化インスタンスにはAWS Lambdaでは勝てない。

ベンチマーク

f:id:ktr89:20190112182421p:plain

PyWrenのベンチマークを行ったところ、2800ワーカーを利用することで40TFLOPSを実現しました。 Lambda単体ではS3のreadが40MB/s、writeが30MB/sであったが、PyWrenを利用することで、readが80GB/s、writeが60GB/sまで高速化できた。 また、c3.8xlarge上にたてたRedisを利用する場合、1000ワーカーまではトランザクション数が線形に増えることを確認した。

アプリケーション実験(MapReduce)

MapReduceで定番のWordCountを実装して実験してみた。 83.68M商品に対するレビューで、333 partitionに分割されていうデータを対象に実行したところ、PyWrenだと98.6秒かかった。 r3.xlargeを85台使ったSparkだと84秒かかった。

所感

  • 実装が大変。脱帽。
  • 素直にEMRなどを利用すればいいのにと思ってしまった。
  • あまり詳しくないので、ちゃんと説明できているか不安です。。。。