深層学習フレームワークBigDL を CDHのSparkクラスタとCloudera Data Science Workbenchで動かす

Apache Sparkに最適化されたディープラーニングフレームワークをお使いのCDHクラスタで活用する

Aki Ariga
Cloudera Japan Official Blog

--

原著者:Sergey Ermolin and Jiao (Jennie) Wang (Intel Corp), Vartika Singh (Cloudera)
原文:BigDL on CDH and Cloudera Data Science Workbench
訳:有賀

はじめに

企業がディープラーニングフレームワークに基づいた最新のソリューションを実装しようとすると、スケーラブルで分散した方法で既存のハードウェアインフラストラクチャに展開する必要があります。 この必要性を認識して、ClouderaとIntelのBig Data Technologiesエンジニアリングチームは、Cloudera Data Science Workbenchの最新リリースで、IntelのBigDLというApache Spark向けディープラーニングライブラリを共同で詳しく説明します。 この共同作業により、高価なGPUファームに投資したり、TensorFlowやCaffeなどの並列フレームワークを立ち上げることなく、Cloudera Enterpriseを実行するXeonサーバの既存のコンピューティング能力を活用して、BigDL Spark Libraryで新しいディープラーニングアプリケーションを構築できます。

以前のブログでCloudera Data Science Workbenchの、他のディープラーニングフレームワークについてを簡単に読むことができます。

BigDL — Apache Sparkのための分散ディープラーニングフレームワーク

GitHub: https://github.com/intel-analytics/BigDL
https://software.intel.com/ai

2016年、インテルはApache Spark向けのディープ・ラーニング・ライブラリー「BigDL」をオープンソースとして公開しました(BigDL Github)。 BigDLはSparkにネイティブに統合され、一般的なニューラルネットのトポロジをサポートし、Python APIを使用して他のオープンソースのディープラーニングフレームワークと同等の機能を実現します。

BigDLアプリケーションは、計算ノード数、コア数、バッチサイズなどの高度な制御変数を提供しながら、実行中のノード通信やリソース管理に安定したCDH Spark基盤を活用できます。 BigDLアプリケーションはPythonまたはScalaのいずれかで記述でき、アルゴリズムの最適化とIntelのMKL(Math Kernel Library)との密接な統合を活用して高性能を実現します。 詳細については、IntelのBigDLポータルを参照してください。

Cloudera Data Science Workbench

Cloudera Data Science Workbenchは、機械学習アプリケーション開発の分野におけるClouderaの最新の製品です。 データサイエンティスト向けのWebベースのツールで、機械学習アプリケーションを迅速に開発して展開することができます。 これには、プロジェクトのコラボレーションやノートブックの共有といったオプションが含まれており、場所とタイムゾーンをまたいだチームベースのコラボレーションの機会を提供します。

Cloudera Data Science Workbenchは、オンプレミスまたはパブリッククラウドで動作し、CDHプラットフォームを補完します。 Cloudera Data Science Workbenchは、R、Python、およびScalaユーザーのために、Dockerコンテナを使用して独立したファイルシステムとネットワーク設定を提供します。 ユーザーはホストにインストールされているライブラリ、ホスト上の他のユーザーのプロセスとのポート競合を心配する必要はなく、管理者はユーザーがホストや他のユーザーの作業負荷に悪影響を与えることを心配する必要はありません。

Cloudera Data Science Workbenchでは、カスタマイズしたDockerイメージを使うことで、管理者はユーザー向けにRおよびPythonライブラリを簡単にパッケージ化し、拡張エンジンとして登録することができます。 これは、同じクラスタの下で、出力、モデル、コードとの相互作用を可能にするので特に魅力的です。 結果を分析してモデルパラメータを微調整し差分の変化を観察するのが非常に簡単です。

BigDLをData Science Workbenchで動かす

言うまでもなく、CDHを用いたデータ処理パイプラインとディープラーニングフレームワーク共に利用すると、データ探索、アルゴリズムとモデルの進化がずっと簡単になり、同時にデータガバナンスとリネージの追跡が統合された作業になります。

WorkbenchからBigDLプログラムを実行するのはかなり簡単です。 コンパイル済みのjarとBigDLのPython APIをWorkbenchにアップロードし、 spark-defaults.confを使用してコンテキストを初期化することができます。 今後リリースされるBigDLのリリースでは、Workbench内でmaven artifactを直接使用することができます。

このブログでは、以下の環境を使います。

  • OS: CentOS 7.2
  • JDK: 1.8.0_60
  • Python: 2.7.11 (Anaconda distribution)
  • CDH: 5.11.0
  • Spark: 2.1.0

Workbenchの管理コンソールでは、システム全体でいくつかの設定を適用するいくつかの方法があります。 起動されたDockerセッションには、デフォルトでいくつかのディレクトリがロードされています。 いくつか例を挙げると、parcelsディレクトリ、JAVA_HOME環境変数、Kerberos設定などです。管理者アクセス権があれば、ユーザーが読み込みしたいフォルダをいくつか追加しマウントすることができます。 または、各プロジェクト毎にユーザーごとの設定をアップロードすることもできます。

mavenインストール用のマウントディレクトリと PYSPARK_PYTHONの環境変数を指定するように管理者として設定を行います。 セッションが開始されると、これらのディレクトリと変数がセッションの一部になります。

GitHubリンクを使用してプロジェクトを初期化します。このレポジトリでは、事前にコンパイルされたライブラリ/アーカイブをホストしています。 これらは、CDH 5.11、Cloudera Data Science Workbench 1.0およびJDK 1.8.0_60に対してコンパイルおよびテストされています。

Workbenchは、管理オプションまたはプロジェクトごとに、すべてのセッションで環境変数を設定する便利な方法を提供します。 管理者設定は以下のスクリーンショットに含まれています。

BigDLのJARをダウンロードしてビルドする

上記のようにBigDLツールの事前コンパイル済みスナップショットをダウンロードする代わりに、下記のようにGitHubからBigDLの最新リリースを直接ダウンロードしてビルドすることができます。

マスター以外のGitHubブランチ(またはタグ)が必要な場合は、CDSWコマンドラインインターフェースから発行される簡単な一連のコマンドを使用して簡単に実行できます。

# downloading git repo into a local ‘BigDL’ directory
$!git clone https://github.com/intel-analytics/BigDL.git BigDL
# updating git repo content
$!git pull
# switching to a specific branch (in this case, ‘branch-0.1’)
$!git checkout branch-0.1
# check out branch-0.1, tag ‘v0.1.0’, for example
$!git checkout -b branch-0.1 v0.1.0

セッション中にライブラリをコンパイルできるようにしたいので、JVM内のPermanent Generationのサイズを増やしたいと思います。

CDSWは、プロジェクトのセッションごとに環境変数を設定する便利な方法を提供します。以下を参照ください。

  • PATH: /home/cdsw/apache-maven-3.3.9/bin:$PATH
  • MAVEN_OPTS: -Xmx2g -XX:ReservedCodeCacheSize=512m

セッションが上がったら、CDSWのターミナルを起動し、ライブラリのコンパイル及び生成をします。

$ !cd BigDL
$ !bash make-dist.sh -P Cloudera

コンパイルが完了したら、ライブラリは以下のようになっています。

$ ls BigDL/dist/lib
bigdl-0.2.0-SNAPSHOT-jar-with-dependencies.jar
bigdl-0.2.0-SNAPSHOT-python-api.zip
$ ls BigDL/dist/conf
spark-bigdl.conf
$ ls BigDL/dist/bin
bigdl.sh* classes.lst img_class.lst

Data Science Workbenchを使って、CNNベースのテキスト分類器を対話的に実行しよう

Python 2.7.11を使用して、CNN(Convolutional Neural Network)ベースのテキスト分類を実行します。 BigDLリポジトリのサンプルを再利用します。 BigDL固有の実装の詳細については、ソースコードまたはBigDL Pythonのドキュメントを参照してください。 いくつか設定が必要なものがあります。

BigDLは、高性能を実現するために、Intel MKLとマルチスレッドプログラミングを使用しています。 したがって、最初に関連する環境変数を設定する必要があります。

あるいは、Sparkを使用してこれらのパラメータを渡すことができます。 spark-defaults.confを使用して、関連するパラメータで SparkContextを初期化します。 また、これらの変数を現在のセッションの環境で表示できるように、これらの環境変数をプロジェクトに設定する必要があります。

PythonのバージョンはPythonバージョンのコンテナと互換性がある必要があるため、Sparkを使用して関連するアーカイブを配布するか、管理UIを使用して前述のように環境変数を設定することができます。

インタラクティブな形式でプログラムを実行しているので、Spark Sessionの構築から始めましょう。 セッションをクライアントモードで起動します。

from pyspark.sql import SparkSessionspark = SparkSession.builder\
.master("yarn")\
.appName("TextClassifier")\
.getOrCreate()

BigDL Python APIをさらにインポートする必要があります。 Spark Sessionですべてがうまくいったら、これらのインポートはエラーなしでセッションに入るはずです。

from dataset import news20
from nn.layer import *
from nn.criterion import *
from optim import *
from optim.optimizer import *
from util.common import *
from util.common import Sample
import util.common

BigDLは、最適に動作するように環境変数の設定が必要です。 以下のコードはそれを設定します。

init_engine()

この例では、事前に訓練されたGloVeのembeddingを使用して単語をベクトルに変換し、CNN、LSTM、またはGRUを用いてテキスト分類モデルを学習し、20カテゴリを持つ20のニュースグループデータセットを分類します。このサブセクションでは、データをロードし、サンプルセットを準備し、訓練データと検証データに分割し、インタラクティブセッションでワードクラウドを使用してデータのサンプルをプロットします。 異なる実行の間で、 /tmpにはプリトレーニングされたデータが含まれます。 それが空の場合、サンプルコードを実行するとデータがダウンロードされます。

このサブセクションを使用して、層ごとにモデルを構築します。 layer.pyファイルを見ることで、BigDLのPython APIで利用可能なさまざまな変換、レイヤー、さまざまなモジュールの詳細を理解してください。

最後に、モデル、データ、損失関数や学習率、weight decayなどのいくつかのハイパーパラメータを定義して、実際の学習を開始してオプティマイザを構成します。

CNNモデルは、2, 3エポックを学習した後に約96%の精度を達成することができます。

  • 3エポックでのCNNモデルの精度は約95.6%
  • 3エポックでのGRUモデルの精度は約94.48%
  • 6エポックでのLSTMモデルの精度は約89.76%

CNNモデルの混同行列は以下のようになります。

これをワークベンチから自己完結型PySparkプログラムとして起動するには、このスクリプトを使用して、プログラムが真のクラスタモードでどのように動作するかを検証することができます。

まとめ

このブログ記事では、BigDLを既存のCDHクラスタに簡単に展開できることを実証しました。 CDH上のBigDL Sparkライブラリを活用することで、ユーザーは基盤となるコンピューティングクラスタの構成を詳しく知ることなく、使い慣れたSpark基盤の上でスケーラブルな分散型ディープラーニングアプリケーションを簡単に作成できます。

簡単なPythonのテキスト分類の例をCNNを使って実行しました。 このサンプルはBigDLリポジトリから利用でき、ライブラリを使い始めるのに適しています。

BigDLに関するご質問がある場合は、BigDLのGoogle Groupでご質問をお寄せください。

リソース

--

--

ML Engineer at Arm Treasure Data. Previously Cloudera. Love machine learning, data analysis, Ruby and Python.