Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

深層学習バッチ ジョブのクラスターへの送信

この例では、学習中に作業を継続したり MATLAB を閉じたりできるように、深層学習における学習のバッチ ジョブをクラスターに送信する方法を説明します。

多くの場合、深層ニューラル ネットワークの学習には数時間または数日かかります。時間を効率的に使用するため、ニューラル ネットワークの学習をバッチ ジョブとして行い、準備が整ったらクラスターから結果を取得することができます。計算の実行中に MATLAB で作業を続行したり、MATLAB を閉じて、ジョブ モニターを使用して後で結果を取得したりできます。この例では、parfor を使用した複数の深層学習ネットワークの学習の並列パラメーター スイープをバッチ ジョブとして送信します。ジョブの完了後、学習済みのネットワークを取得して、それらの精度を比較できます。

要件

この例を実行する前に、クラスターを構成し、データをクラウドにアップロードする必要があります。MATLAB では、MATLAB デスクトップから直接、クラウドにクラスターを作成できます。[ホーム] タブの [並列] メニューで、[クラスターの作成と管理] を選択します。クラスター プロファイル マネージャーで、[クラウド クラスターの作成] をクリックします。または、MathWorks Cloud Center を使用して計算クラスターを作成し、そのクラスターにアクセスすることもできます。詳細については、Getting Started with Cloud Center を参照してください。この例では、MATLAB の [ホーム] タブの [並列][既定のクラスターの選択] で、クラスターが既定として設定されていることを確認します。その後、データを Amazon S3 バケットにアップロードして、MATLAB から直接使用します。この例では、Amazon S3 に既に格納されている CIFAR-10 データセットのコピーを使用します。手順については、クラウドへの深層学習データのアップロードを参照してください。

バッチ ジョブの投入

関数 batch を使用してスクリプトをバッチ ジョブとしてクラスターに送信します。クラスターはスクリプトの内容を実行する 1 つのワーカーを割り当てます。スクリプトの並列コードにその他のワーカーを使用するメリットがあり、たとえば、自動並列サポートまたは parfor ループが含まれる場合、ワーカーを明示的に要求する必要があります。batch は、スクリプトを実行するクライアントに対して 1 つのワーカーを使用します。名前と値のペアの引数 'Pool' を使用して、より多くのワーカーを指定できます。

この場合、trainMultipleNetworks スクリプトをクラスターに送信します。このスクリプトには、parfor を使用した複数の深層学習ネットワークの学習の並列パラメーター スイープが含まれます。スクリプトに parfor ループが含まれるため、名前と値のペアの引数 Pool を使用して 4 つのその他のワーカーを指定します。

totalNumberOfWorkers = 5;
job1 = batch('trainMultipleNetworks', ...
    'Pool',totalNumberOfWorkers-1);

ジョブ モニターをチェックして、クラスターにおけるジョブの現在のステータスを確認できます。[ホーム] タブの [環境] セクションで、[並列][ジョブの監視] を選択してジョブ モニターを開きます。

追加のジョブをクラスターに投入できます。他のジョブを実行しているためにクラスターを使用できない場合、新しいジョブを投入すると、クラスターが使用可能になるまでキューに入った状態になります。

プログラムによる結果の取得

クラスターにジョブを投入した後、計算の実行中に MATLAB で作業を続行できます。残りのコードがジョブの完了に依存する場合、wait コマンドを使用して MATLAB をブロックします。この場合、ジョブが終了するのを待ちます。

wait(job1);

ジョブが終了した後、関数 load を使用して結果を取得します。この場合、送信されたスクリプトの並列パラメーター スイープから学習済みネットワークとその精度を取得します。

load(job1,'accuracies');
accuracies
accuracies = 4×1

    0.8312
    0.8276
    0.8288
    0.8258

load(job1,'trainedNetworks');
trainedNetworks
trainedNetworks = 4×1 cell array
    {1×1 SeriesNetwork}
    {1×1 SeriesNetwork}
    {1×1 SeriesNetwork}
    {1×1 SeriesNetwork}

バッチ ジョブのすべての変数を読み込むには、引数を指定せずに関数 load を使用します。

load(job1);

MATLAB を閉じた場合でも、クラスター内のジョブを復元して、計算の実行中または計算の完了後に結果を取得できます。MATLAB を閉じる前にジョブの ID をメモしておき、後で関数 findJob を使用してジョブを取得します。

ジョブを取得するには、まず関数 parcluster を使用してクラスターに対するクラスター オブジェクトを作成します。次に、findJob にジョブ ID を指定します。この場合、ジョブ ID は 1 です。

c = parcluster('MyClusterInTheCloud');
job = findJob(c,'ID',1);

完了したら、ジョブを削除します。そのジョブはジョブ モニターから削除されます。

delete(job1);

ジョブ モニターを使用した結果の取得

バッチ ジョブを投入すると、すべての計算はクラスターで行われるため、MATLAB を安全に閉じることができます。別の MATLAB セッションでジョブ モニターを使用することによって、ジョブのステータスを確認できます。

ジョブが完了したら、ジョブ モニターから結果を取得できます。[ホーム] タブの [環境] セクションで、[並列][ジョブの監視] を選択してジョブ モニターを開きます。次にジョブを右クリックすると、コンテキスト メニューが表示されます。このメニューでは以下が可能です。

  • [詳細を表示] をクリックしてワークスペースにジョブを読み込む

  • [変数の読み込み] をクリックしてジョブのすべての変数を読み込む

  • [削除] をクリックして完了したジョブを削除する

参考

(Parallel Computing Toolbox)

関連する例

詳細