原文はこちら。
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) という手法を採用しました。

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

Results
プロトタイプを展開するため、以下の設定を使いました。
- Oracle Cloud Infrastructure上にNetSuiteデータセンターを仮想化
- 仮想マシンおよびベアメタルマシンの組み合わせにデプロイ(NVIDIA GPUも利用)
- GraalVM、CUDA、Graal Python、grCUDAをインストール
- NetsuiteをGraalVMで稼働

上のグラフは、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にて初めて行われました。動画は以下からどうぞ。
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