GPUを使用したラップスアクセラレータでUDFを高速化
Table of Contents:
- イントロダクション
- ラップスアクセラレータとは
- ラップスアクセラレータの仕組み
- ユーザー定義関数の問題点
- Scala UDFコンパイラとは
- ラップス実装のUDF
- URLデコードの具体的な例
- 今後の課題
- 既存のラップスアクセラレータについての情報
イントロダクション
こんにちは、私はJason Lauです。私はNVIDIAのソフトウェアデベロッパーの一人で、Apache Sparkの高速アクセラレータであるラップスアクセラレータに取り組んでいます。今日は、ラップスアクセラレータを使用してGPUでユーザー定義関数を高速化する方法についてお話しします。このトークでは、ラップスアクセラレータをApache Sparkに組み込む方法や、ユーザー定義関数がパフォーマンス上の問題となる理由などについて説明します。
ラップスアクセラレータとは
仕組み
ラップスアクセラレータは、Apache Sparkのプラグインであり、ユーザー定義関数を変更することなく、SQLやデータフレームの操作をGPUで高速化することができます。ラップスアクセラレータを使用するためには、いくつかの設定とjarファイルの追加が必要ですが、クエリ自体は変更する必要はありません。これにより、Sparkを使用しているすべてのSQLやデータフレーム操作に対してGPUを使用することができます。
性能の向上
ラップスアクセラレータを使用すると、パフォーマンスが劇的に向上します。NDディシジョンサポートベンチマークを使用して、CPUで実行した場合とラップスアクセラレータを使用した場合の実行時間を比較しました。CPUでの実行時間は4000秒以上かかりましたが、ラップスアクセラレータを使用した場合は3倍以上の速さで処理が完了しました。さらに、A100を使用することでコストを削減できるため、コスト効率も向上します。
ユーザー定義関数の問題点
ユーザー定義関数(UDF)は、一般には不明瞭な関数です。そのため、UDFはラップスアクセラレータがGPUで処理できるかどうか判断するのが困難です。UDFがGPUで処理できるとわかっていても、UDFの中に不明瞭な処理が含まれているために、GPUでの処理を行うことができません。UDFが必ずしも完全にGPUに翻訳されるわけではなく、パフォーマンスが向上するかどうかも状況によります。
Scala UDFコンパイラとは
Scala UDFコンパイラは、Scala UDFをCatalystに変換する自動的なソリューションです。Scala UDFコンパイラは、UDFのバイトコードを分析し、その内容に基づいてCatalystの式木を生成します。これにより、不明瞭なUDFを自動的に解析してGPUで処理することが可能になります。現在、Scala UDFコンパイラは、数学演算や型キャスト、条件分岐などの簡単なUDFに対してサポートしています。
ラップス実装のUDF
UDFには、CPU版とGPU版の実装を提供することができます。CPU版は従来通り行単位で処理されますが、GPU版はGPUのパワーを利用してカラム単位で処理されます。これにより、パフォーマンスの向上が期待できます。現在、ラップスアクセラレータではさまざまなタイプのUDFに対してサポートしていますが、今後もさらなる拡張を予定しています。
URLデコードの具体的な例
URLデコードは、一般的なUDFの例です。関数内でURLデコードが必要な場合、ラップス実装のUDFを使用することで、GPUを活用して高速に処理することができます。具体的な実装例を示しましたが、このようなUDFでもGPUを活用することで約6倍のパフォーマンス向上が見られました。
今後の課題
今後の課題としては、他のタイプのUDFに対するサポートの拡大や、パンダスUDFのデータ転送の改善が挙げられます。また、カスタムなネイティブGPUコードをサポートすることも検討しています。
既存のラップスアクセラレータについての情報
ラップスアクセラレータはオープンソースプロジェクトです。詳細な情報やドキュメント、コードについては、公式のウェブサイトをご覧ください。また、質問や機能リクエストなどがあれば、イシュートラッカーを利用してください。このプロジェクトは現在も進化を続けており、新たな機能や改善が追加されていく予定です。