MLlib 線形代数高速化ガイド
はじめに
このガイドでは、Spark MLlib の線形代数処理を高速化するために必要な情報を提供します。
Spark MLlib は、機械学習アルゴリズムの基本的なデータ型として Vector と Matrix を定義します。これらのデータ型の上に、BLAS および LAPACK の操作が dev.ludovic.netlib によって実装およびサポートされています (アルゴリズムは Breeze も呼び出す場合があります)。dev.ludovic.netlib
は、より高速な数値処理のために最適化されたネイティブ線形代数ライブラリ (以下「ネイティブライブラリ」または「BLASライブラリ」と呼びます) を使用できます。Intel MKL と OpenBLAS は、人気のある2つのライブラリです。
公式にリリースされた Spark バイナリには、これらのネイティブライブラリは含まれていません。
以下のセクションでは、ネイティブライブラリのインストール方法、適切な構成方法、および dev.ludovic.netlib
がこれらのネイティブライブラリを参照する方法について説明します。
ネイティブ線形代数ライブラリのインストール
Intel MKL と OpenBLAS は、人気のある2つのネイティブ線形代数ライブラリです。どちらか一方を好みに応じて選択できます。以下に基本的な手順を示します。
Intel MKL
- Intel MKL をダウンロードしてインストールします。インストールは、クラスターのすべてのノードで実行する必要があります。インストール場所は $MKLROOT (例: /opt/intel/mkl) であると想定します。
- システムのライブラリ検索パスに特定の名前で
libmkl_rt.so
へのソフトリンクを作成します。たとえば、/usr/local/lib
がシステムのライブラリ検索パスに含まれていることを確認し、以下のコマンドを実行します。$ ln -sf $MKLROOT/lib/intel64/libmkl_rt.so /usr/local/lib/libblas.so.3 $ ln -sf $MKLROOT/lib/intel64/libmkl_rt.so /usr/local/lib/liblapack.so.3
OpenBLAS
インストールは、クラスターのすべてのノードで実行する必要があります。OpenBLAS の汎用バージョンは、ほとんどのディストリビューションで利用できます。apt
や yum
のようなディストリビューションパッケージマネージャーを使用してインストールできます。
Debian / Ubuntu の場合
sudo apt-get install libopenblas-base
sudo update-alternatives --config libblas.so.3
CentOS / RHEL の場合
sudo yum install openblas
MLlib でネイティブライブラリが有効になっているかどうかの確認
ネイティブライブラリが正しくロードされていることを確認するには、spark-shell
を起動し、次のコードを実行します。
scala> import dev.ludovic.netlib.blas.NativeBLAS
scala> NativeBLAS.getInstance()
正しくロードされている場合は、dev.ludovic.netlib.blas.NativeBLAS = dev.ludovic.netlib.blas.JNIBLAS@...
と出力されます。そうでない場合は、警告が出力されるはずです。
WARN InstanceBuilder: Failed to load implementation from:dev.ludovic.netlib.blas.JNIBLAS
...
java.lang.RuntimeException: Unable to load native implementation
at dev.ludovic.netlib.blas.InstanceBuilder.nativeBlas(InstanceBuilder.java:59)
at dev.ludovic.netlib.blas.NativeBLAS.getInstance(NativeBLAS.java:31)
...
また、dev.ludovic.netlib
が特定のライブラリ名とパスを参照するように指定することもできます。たとえば、Intel MKL の場合は、-Ddev.ludovic.netlib.blas.nativeLib=libmkl_rt.so
または -Ddev.ludovic.netlib.blas.nativeLibPath=$MKLROOT/lib/intel64/libmkl_rt.so
を使用します。LAPACK および ARPACK についても同様のパラメータがあります。-Ddev.ludovic.netlib.lapack.nativeLib=...
、-Ddev.ludovic.netlib.lapack.nativeLibPath=...
、-Ddev.ludovic.netlib.arpack.nativeLib=...
、および -Ddev.ludovic.netlib.arpack.nativeLibPath=...
。
ネイティブライブラリがシステムで正しく構成されていない場合は、フォールバックオプションとして Java 実装 (javaBLAS) が使用されます。
Spark の構成
Intel MKL または OpenBLAS のいずれかでのマルチスレッドのデフォルトの動作は、Spark の実行モデルでは最適ではない可能性があります1。
したがって、これらのネイティブライブラリを操作に単一のスレッドを使用するように構成すると、実際にはパフォーマンスが向上する可能性があります (SPARK-21305 を参照)。通常、これは spark.task.cpus
の数に一致させるのが最適です。これはデフォルトでは 1
であり、通常は 1
のままです。
config/spark-env.sh
のオプションを使用して、Intel MKL または OpenBLAS のスレッド数を設定できます。
- Intel MKL の場合
MKL_NUM_THREADS=1
- OpenBLAS の場合
OPENBLAS_NUM_THREADS=1
-
これらの BLAS 実装のスレッド数を構成する方法については、次のリソースを参照してください。Intel MKL または Intel oneMKL および OpenBLAS。 ↩