MLlib 線形代数アクセラレーション ガイド
はじめに
このガイドでは、Spark MLlib の線形代数処理を高速化するために必要な情報を提供します。
Spark MLlib は、機械学習アルゴリズムの基本的なデータ型として Vector と Matrix を定義しています。これらに加えて、BLAS および LAPACK の操作が実装されており、dev.ludovic.netlib によってサポートされています (アルゴリズムは Breeze を呼び出す場合もあります)。dev.ludovic.netlib は、最適化されたネイティブ線形代数ライブラリ(以下、「ネイティブライブラリ」または「BLASライブラリ」と呼びます)を使用して、より高速な数値処理を行うことができます。Intel MKL および OpenBLAS が、その代表的な例です。
公式リリースされた 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。 ↩