MLlib 線形代数高速化ガイド

はじめに

このガイドでは、Spark MLlib の線形代数処理を高速化するために必要な情報を提供します。

Spark MLlib は、機械学習アルゴリズムの基本的なデータ型として Vector と Matrix を定義します。これらのデータ型の上に、BLAS および LAPACK の操作が dev.ludovic.netlib によって実装およびサポートされています (アルゴリズムは Breeze も呼び出す場合があります)。dev.ludovic.netlib は、より高速な数値処理のために最適化されたネイティブ線形代数ライブラリ (以下「ネイティブライブラリ」または「BLASライブラリ」と呼びます) を使用できます。Intel MKLOpenBLAS は、人気のある2つのライブラリです。

公式にリリースされた Spark バイナリには、これらのネイティブライブラリは含まれていません。

以下のセクションでは、ネイティブライブラリのインストール方法、適切な構成方法、および dev.ludovic.netlib がこれらのネイティブライブラリを参照する方法について説明します。

ネイティブ線形代数ライブラリのインストール

Intel MKL と OpenBLAS は、人気のある2つのネイティブ線形代数ライブラリです。どちらか一方を好みに応じて選択できます。以下に基本的な手順を示します。

Intel MKL

OpenBLAS

インストールは、クラスターのすべてのノードで実行する必要があります。OpenBLAS の汎用バージョンは、ほとんどのディストリビューションで利用できます。aptyum のようなディストリビューションパッケージマネージャーを使用してインストールできます。

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 のスレッド数を設定できます。

  1. これらの BLAS 実装のスレッド数を構成する方法については、次のリソースを参照してください。Intel MKL または Intel oneMKL および OpenBLAS。