Spark RAPIDSを試したら凄かった

NVIDIA Spark RAPIDSを試してみた

Apache Sparkファンとしては,Sparkの色々な活用方法を探しています.特に私はIBM PowerでSparkを使っているので,機械学習のためのライブラリを使おうとすると,色々と苦労しています.幸い,IBM Powerは,ギリギリでNVIDIAのサポートを受けています.例えば,CUDAが使えます.
ならばSparkでCUDAを使ってGPUを活用したい!
と思いますよね.

そこでSpark RAPIDS.

GitHub - NVIDIA/spark-rapids: Spark RAPIDS plugin - accelerate Apache Spark with GPUs

RAPIDSは様々なプロジェクトのトップです.
Open GPU Data Science | RAPIDS

今回は,RAPIDSの中のSpark RAPIDSだけ取り上げます.

ローカルモードで試してみる

私はIBM Power8とIBM Power9から構成されるHadoop YARNクラスタでSparkを使っています.ただ,GPUが付いているPower9は一台しか無いので,SparkをYARNモードじゃなくてlocalモードで試してみます.

細かいことはあとで説明するとして,結果を貼り付けてみます.

f:id:tullio:20210206005645p:plain
Spark RAPIDS test 1

普通に,Hadoopのログファイルを読んで,limitで適当にレコード数を決めて,時間情報でsortして,あるカラムでgroupByするというSpark SQLを実行して,実行時間を計測してみました.
赤はRAPIDSを使わなかった時で,レコード数に比例して処理時間が増えています.緑はRAPIDSを使った時で,レコード数が増えても処理時間が変わりません(!).色々試した結果,GPUのメモリが溢れるまでは定数時間でイケました.

レコード数が20480000,約2000万レコードの時,sparkを--master localでCPUで実行した時は,処理時間が16秒でした.同じjarファイルをspark-submitした場合,1秒でした.16倍の高速化です.

CPUで実行する時と,GPUを使う時は,Sparkのconfigureで切り替えています.GPUを使う場合のConfはこんな感じ.

spark.rapids.shuffle.transport.enabled  true
spark.rapids.sql.enabled                true
spark.rapids.sql.explain                ALL
spark.rapids.sql.concurrentGpuTasks     1
spark.plugins                           com.nvidia.spark.SQLPlugin
spark.rapids.sql.castStringToTimestamp.enabled  true


詳細は,順次,報告します!