HorovodRunner: Horovod での分散ディープラーニング

HorovodRunner は、 Horovod フレームワークを使用して Azure Databricks で分散ディープラーニングワークロードを実行するための一般的な API です。 Horovod を Spark の バリアモードと統合することにより、Azure Databricks は、spark 上で実行時間の長いディープラーニングトレーニングジョブの安定性を高めることができます。 HorovodRunner は、Horovod フックを使用したディープラーニングトレーニングコードを含む Python メソッドを受け取ります。 HorovodRunner は、このメソッドをドライバーに対して行い、Spark worker に配布します。 Horovod MPI ジョブは、バリア実行モードを使用する Spark ジョブとして埋め込まれます。 最初の実行プログラムはを使用してすべてのタスクの実行プログラムの IP アドレスを収集 BarrierTaskContext し、を使用して Horovod ジョブをトリガーし mpirun ます。 各 Python MPI プロセスは、pickle user プログラムを読み込み、逆シリアル化して実行します。

HorovodRunner

HorovodRunner を使用した分散トレーニング

HorovodRunner を使用すると、Horovod トレーニングジョブを Spark ジョブとして起動できます。 HorovodRunner API では、表に示すメソッドがサポートされています。 詳細については、 HOROVODRUNNER API のドキュメントを参照してください。

メソッドとシグネチャ 説明
init(self, np) HorovodRunner のインスタンスを作成します。
run(self, main, **kwargs) を呼び出して、Horovod トレーニングジョブを実行 main(**kwargs) します。 Main 関数とキーワード引数は cloudpickle を使用してシリアル化され、クラスターワーカーに分散されます。

HorovodRunner を使用して分散トレーニングプログラムを開発するための一般的なアプローチは次のとおりです。

  1. HorovodRunnerノード数を指定して初期化されたインスタンスを作成します。
  2. Horovod usage」で説明されているメソッドに従って Horovod トレーニングメソッドを定義し、メソッド内に import ステートメントを追加します。
  3. トレーニング方法をインスタンスに渡し HorovodRunner ます。

次に例を示します。

hr = HorovodRunner(np=2)

def train():
  import tensorflow as tf
  hvd.init()

hr.run(train)

サブプロセスのみを使用してドライバーで HorovodRunner を実行するには n 、を使用し hr = HorovodRunner(np=-n) ます。 たとえば、[ドライバー] ノードに4つの Gpu がある場合、[ n 最大] を選択でき 4 ます。 パラメーターの詳細については、 np HorovodRunner API のドキュメントを参照してください。 サブプロセスごとに1つの GPU をピン留めする方法の詳細については、 Horovod の使用方法に関するガイドを参照してください。

一般的なエラーとして、"pickle" というオブジェクトが見つからないか、またはこのオブジェクトを使用できないことがあります。 これは、ライブラリインポートステートメントが他の実行プログラムに配布されていない場合に発生します。 この問題を回避するには、 import tensorflow as tf Horovod トレーニングメソッドの先頭と Horovod トレーニングメソッドで呼び出された他のユーザー定義関数の 両方 に、すべての import ステートメント (など) を含めます。

Horovod Timeline を使用して Horovod トレーニングを記録する

Horovod には、 Horovod timelineと呼ばれる、アクティビティのタイムラインを記録する機能があります。

重要

Horovod タイムラインは、パフォーマンスに大きな影響を与えます。 Horovod タイムラインが有効になっている場合、Inception3 のスループットは約40% 減少します。 HorovodRunner ジョブを高速化する場合は、Horovod タイムラインを無効にします。

Horovod タイムラインを記録するには、 HOROVOD_TIMELINE タイムラインファイルを保存する場所に環境変数を設定します。 Databricks では、タイムラインファイルを簡単に取得できるように、共有ストレージ上の場所を使用することをお勧めします。 たとえば、次のように DBFS ローカルファイル api を使用できます。

timeline_dir = "/dbfs/ml/horovod-timeline/%s" % uuid.uuid4()
os.makedirs(timeline_dir)
os.environ['HOROVOD_TIMELINE'] = timeline_dir + "/horovod_timeline.json"
hr = HorovodRunner(np=4)
hr.run(run_training_horovod, params=params)

タイムラインファイルをダウンロードするには、 DATABRICKS CLI または FileStoreを使用し、Chrome ブラウザーの機能を使用し chrome://tracing て表示します。 次に例を示します。

Horovod タイムライン

開発ワークフロー

ここでは、単一ノードのディープラーニングコードを分散トレーニングに移行する一般的な手順について説明します。 このセクションの では、これらの手順について説明します。

  1. 1 つのノードコードを準備する: PyTorch を使用して、シングルノードコードを準備してテストします。
  2. Horovod への移行:Horovod usageの指示に従って、Horovod でコードを移行し、ドライバーでテストします。
    1. を追加して hvd.init() Horovod を初期化します。
    2. を使用して、このプロセスで使用されるようにサーバーの GPU をピン留めし config.gpu_options.visible_device_list ます。 通常、1つのプロセスにつき1つの GPU を設定します。これはローカルランクに設定できます。 この場合、サーバー上の最初のプロセスに最初の GPU が割り当てられ、2番目のプロセスに2つ目の GPU が割り当てられます。
    3. データセットのシャードを含めます。 このデータセット演算子は、各ワーカーが一意のサブセットを読み取ることができるため、分散トレーニングを実行する場合に非常に便利です。
    4. Worker の数で学習率をスケールします。 同期分散トレーニングの有効なバッチサイズは、ワーカーの数によってスケーリングされます。 学習率を上げると、バッチサイズの増加が相殺されます。
    5. でオプティマイザーをラップし hvd.DistributedOptimizer ます。 分散オプティマイザーは、グラデーション計算を元のオプティマイザーに委任し、allreduce または allreduce を使用して平均グラデーションを適用して、平均グラデーションを適用します。
    6. hvd.BroadcastGlobalVariablesHook(0)を、順位0から他のすべてのプロセスにブロードキャストする初期変数状態を追加します。 これは、トレーニングがランダムな重みで開始されたとき、またはチェックポイントから復元されたときに、すべてのワーカーを一貫して初期化するために必要です。 または、を使用していない場合は、 MonitoredTrainingSession hvd.broadcast_global_variables グローバル変数が初期化された後に操作を実行できます。
    7. ワーカー0にのみチェックポイントを保存するようにコードを変更し、他のワーカーがそれらを破損しないようにします。
  3. HorovodRunner への移行: HorovodRunner は、Python 関数を呼び出して Horovod トレーニングジョブを実行します。 メインのトレーニング手順を1つの Python 関数にラップする必要があります。 次に、ローカルモードおよび分散モードで HorovodRunner をテストできます。

ディープ ラーニング ライブラリを更新する

注意

この記事には、Azure Databricks 使用されなくなった用語である、 スレーブ という用語への参照が含まれています。 ソフトウェアからこの用語が削除された時点で、この記事から削除します。

PyTorch をアップグレードまたはダウングレードする場合は、新しくインストールされたライブラリに対してコンパイルされるように Horovod を再インストールする必要があります。 たとえば、Databricks では、次のようにして、「Horovod」の インストール手順 に従って、次の説明に示すように、このスクリプトを最後に追加することをお勧めします。 PyTorch やその他のライブラリのアップグレードやダウングレードなど、さまざまな組み合わせを使用する Horovod のインストール手順 を参照してください。

add-apt-repository -y ppa:ubuntu-toolchain-r/test
apt update
# Using the same compiler that TensorFlow was built to compile Horovod
apt install g++-7 -y
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7

HOROVOD_GPU_ALLREDUCE=NCCL HOROVOD_CUDA_HOME=/usr/local/cuda pip install horovod==0.18.1 --force-reinstall --no-deps --no-cache-dir

次の例は、 Mnist データセットに基づいて、HorovodRunner を使用して、単一ノードのディープラーニングプログラムを分散ディープラーニングに移行する方法を示しています。