ビッグデータ処理や機械学習向けのオープンソースソフトウエア(OSS)「Apache Spark」の常識がここに来て大きく変わろうとしている。これまで難しかったディープラーニング(深層学習)の分散学習が可能になり、Sparkクラスターの運用形態も変わった。10年目を迎えたSparkの最新動向を解説しよう。

 Sparkは複数のコンピュータをネットワーク接続し、そのクラスターで分散処理することを強みとする。このSparkに関する常識が2つの点で変わり始めた。一つはディープラーニングに関するもので、「Sparkクラスターでディープラーニングの学習(トレーニング)は難しい」という常識が過去のものになろうとしている。

 もう一つはSparkクラスターの運用形態に関するもので、Sparkの前身である「Apache Hadoop」のころからの常識である「ストレージノードでプロセッシング(処理)を実行する」をやめて、ストレージノードとコンピュートノードを分離するユーザーが増え始めている。

深層学習の分散学習がSparkで実現

 まずはディープラーニングに関する常識の変化を見ていこう。Sparkをディープラーニングに対応させる取り組みは2016年頃から始まっていたが、主な使い道は推論の実行にとどまっていた。ディープラーニングの学習をするのであれば、ビッグデータ処理用のSparkクラスターとは別に、ノードにGPUを搭載したディープラーニング用クラスターを用意し、「TensorFlow」などのディープラーニングフレームワークを利用するのがユーザーにとっての常識だった。

 しかしSparkの主要開発企業である米データブリックス(Databricks)は2018年6月4~6日に米サンフランシスコで開催したカンファレンス「Spark + AI Summit 2018」で、様々なディープラーニングフレームワークを使った分散学習をSpark上で実行可能にする「Project Hydrogen」を発表。同社の共同創業者兼チーフアーキテクトであるレイノルド・シン(Reynold Xin)氏は、「Project Hydrogenでディープラーニングに関する全てのワークロードを、単一のSparkクラスターで実行できるようになる」と力説した。

米データブリックス共同創業者のレイノルド・シン(Reynold Xin)氏
[画像のクリックで拡大表示]

 データブリックスのシン氏は「これまでのSparkのスケジューラーは、深層学習の分散学習に向いていなかった」と語る。スケジューラーとはSparkクラスターのリソースを管理し、ジョブやタスクを制御する機能のことである。

ギャングスケジューリングを採用

 現在のSparkのスケジューラーは、ジョブを複数のタスクに分割し、タスクをそれぞれ独立して並列実行する「embarrassingly parallel」という方式を採用する。「スケーラビリティを最優先したためで、これによりペタバイト級のスケーラビリティを実現した」(シン氏)。

 一方、ディープラーニングフレームワークが分散学習を実行する際は、全てのタスクが協調して動作する。タスクは「MPI(Message Passing Interface)」などのメッセージングプロトコルを通じて常に通信しており、タスク間に依存性がある。

 Sparkとディープラーニングの分散学習で大きく異なるのは、タスクが異常終了(フェイル)した場合の動作だ。Sparkではタスクが異常終了したら該当タスクを再実行するだけだ。しかしディープラーニングの分散学習では、あるタスクが異常終了したら依存関係にある他のタスクを全て再実行する必要がある。分散処理の仕組みが大きく異なるため、Sparkで分散トレーニングを実行するのは難しかった。

 そこでProject HydrogenではSparkに「ギャングスケジューリング」方式のスケジューラーを導入し、複数のタスクを協調しながら動作させられるようにした。データブリックスのシン氏によれば、Sparkがスケジューラーを刷新するのは、同氏がカリフォルニア大学バークレー校の博士課程に在学中の2008年にSparkの開発を始めて以来、初めてのことだという。

この先は有料会員の登録が必要です。今なら有料会員(月額プラン)が4月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら