Optimizing Machine Learning Performance at Netsuite with GraalVM and NVIDIA GPUs

原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/optimizing-machine-learning-performance-at-netsuite-with-graalvm-and-nvidia-gpus-d0d40f0b0cf1
https://blogs.oracle.com/graalvm/optimizing-machine-learning-performance-at-netsuite-with-graalvm-and-nvidia-gpus-v2

このエントリでは、NetSuiteでGraalVM PythonとgrCUDAを使って高速かつ高精度な機械学習モデルを構築する方法をご紹介します。

Reference Manual for Python
https://www.graalvm.org/docs/reference-manual/languages/python/
grCUDA – Polyglot CUDA integration for the GraalVM
https://github.com/NVIDIA/grcuda

Creating a next generation recommendation system at NetSuite

NetSuiteは、19,000以上の組織にERP、財務、CRM、Eコマースを網羅したクラウドベースのビジネス管理サービスを提供しています。NetSuiteのテクノロジー・スタックはJava SEとOracle Databaseをベースにしており、世界中のオラクル・データセンターに配備されています。

NetSuite製品の中で最も人気のある製品の1つは、ERP、財務、受注管理などを組み合わせたEコマース・プラットフォームであるSuiteCommerceです。Netsuiteのエンジニアリング・チームは、いくつかの異なるユースケースを対象とした次世代レコメンデーション・システムの開発に取り組んできました。1つは、一般的なレコメンデーション・ウィジェットで、Eコマースやビデオ・ストリーミング・プラットフォームでよく見かける Recommendation for You というブロックです。もう一つのユースケースは、機械学習アルゴリズムに基づいて検索結果を補強する searchandising (Searching + Merchandising) です。

Research

レコメンダーシステムは、通常、コラボレーションフィルタリングまたはコンテンツベースフィルタリングのいずれかに基づいてレコメンデーションを提供します。コンテンツベースフィルタリングでは、アイテムの内容とユーザープロファイルを比較してレコメンデーションを作成します。例えば、好きなジャンルとしてSF映画を選択した場合、または過去に多くのSF映画を見た場合、ストリーミングサービスはこのジャンルの映画をより多く薦めてくる可能性が高くなります。

コラボレーションフィルタリングは、多くのユーザーからユーザーの好みや行動に関する情報を収集・分析し、他のユーザーとの類似性に基づいて、そのユーザーが何を好むかを予測することに基づきます。

より良いレコメンデーションシステムを作るために、最も一般的なコラボレーション手法の一つであるMatrix Factorizartion (以下MF) という手法を採用しました。

Matrix Factorization (Pulaparthi, N.V.)

MFアルゴリズムは、ユーザーとアイテムの相互作用行列を、ユーザーとアイテムを表す低い次元(ランク)の長方形の行列の積に分解することで機能します。Netsuiteチームが実装したこのバージョンでは、クリックやトランザクションなどの暗黙のフィードバックを使用しています。データが計算されると、ユーザーとアイテムの関連性(個人的なレコメンデーション)やアイテム間の類似性(クロスセル・レコメンデーションで有用)の予測を簡単に取得できます。

MFを採用することを決めた後、チームはJava、Scala、Spark、Pythonでプロトタイプを開始し、ソリューションとして2つのライブラリ、Ben Frederickson氏によるImplicitと、Maciej Kula氏によるLightFMに絞り込みました。

Fast Python Collaborative Filtering for Implicit Feedback Datasets
https://github.com/benfred/implicit
A Python implementation of LightFM, a hybrid recommendation algorithm.
https://github.com/lyst/lightfm

Solution

上述のMLモデルはともに高速かつうまく動作しますが、問題が両者ともPythonで記述されていて、NetsuiteはJavaベース、という点です。そこで、チームは他の言語とともにJavaもPythonもサポートするGraalVMを使うことを決断しました。Pythonの場合、GraalVMは高パフォーマンスにして、簡単で一貫性のある言語間の相互運用性を提供します。

もう一つのソリューションとしては、grCUDAを使ったGPUアクセラレーションです。grCUDAとは、開発者がNVIDIA GPUとRやPython、JavaScriptといったGraalVM言語間でデータを共有したり、GPUカーネルを起動したりすることも可能なオープンソースの言語バインディングです。GPU用のCUDAでパフォーマンスクリティカルなコンポーネントを実装し、GPUとのデータ交換やGPUカーネルの起動にPythonのgrCUDAを使用しました。

Polyglot CUDA integration for the GraalVM
https://github.com/NVIDIA/grcuda

Recommender system prototype architecture

Results

プロトタイプを展開するため、以下の設定を使いました。

Model computation time for different implementations

上のグラフは、EJMLを使って作成されたJavaモデルとPython と grCUDAモデルの2つのモデルの計算時間を比較したものです。ご覧のように、GraalVMとgrCUDAを使用したもののほうが、MFの処理が大幅に速くなっています。

Efficient Java Matrix Library (EJML)
http://ejml.org/

Conclusion

Pythonの機械学習モデルをアプリケーションで使用する方法を模索しているのであれば、最高のパフォーマンスを得るためにGraalVM PythonとgrCUDAをチェックする価値があるでしょう。
いつものように、皆様からのご意見をお待ちしております。Python実装やGraalVM全般に対するフィードバックや機能リクエストがある場合は、GitHubリポジトリにIssueを立てるなり、Twitterで問い合わせするなりしてください。

Graal Python
https://www.graalvm.org/docs/reference-manual/languages/python/
grCUDA
https://github.com/NVIDIA/grcuda
A Python 3 implementation built on GraalVM
https://github.com/graalvm/graalpython


このプロジェクトの発表は、Lukas StadlerとRadek ObořilがDevoxx Belgium 2019にて初めて行われました。動画は以下からどうぞ。

Optimizing the Performance of Machine Learning in Enterprise Java SaaS with GraalVM, Python and CUDA

NVIDIAのGPU Technology Conference(GTC)でも発表されましたが、こちらはGTC Digitalへの登録が必要です。セッション動画は以下からご覧頂けます。

Simplifying GPU Access: A Polyglot Binding for GPUs with GraalVM [s21269]
https://www.nvidia.com/en-us/gtc/session-catalog/?search=grCUDA

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中