Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

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

要件

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

バッチ ジョブの投入

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

既定では、バッチ ジョブをスクリプトとして送信すると、クライアントからワーカーにワークスペース変数がコピーされます。ワークスペース変数がワーカーにコピーされるのを防ぐには、バッチ ジョブを関数として送信します。

この例では、trainNetworkFcn がサポート ファイルとして提供されています。この関数は、与えられたミニバッチ サイズを使用して単一ネットワークの学習を行い、学習済みネットワークとその精度を返します。すべてのミニバッチ サイズについてパラメーターのスイープを実行するため、ジョブごとに異なるミニバッチ サイズを指定し、関数をバッチ ジョブとしてクラスターに 4 回送信します。関数をバッチ ジョブとして送信するとき、関数の出力の数と入力引数を指定します。

c = parcluster;
miniBatchSize = [64 128 256 512];
numBatchJobs = numel(miniBatchSize);

for idx=1:numBatchJobs
    job(idx) = batch(c,"trainNetworkFcn",2,{idx,miniBatchSize(idx)});
end

すべてのネットワークに並列で学習させる単一のバッチ ジョブを使用するのではなく、個々のバッチ ジョブ内で各ネットワークに学習させることで、クラスター内で並列プールを起動するためのオーバーヘッドが必要なくなり、ジョブ モニターを使用して各ネットワークの計算の進行状況を個別に観察できるようになります。

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

学習の進行状況の監視

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

runningJobs.png

バッチ ジョブを実行しているワーカーから MATLAB クライアントにデータを送信することで、学習の進行状況を詳細に監視することもできます。trainNetworkFcn において、各反復の後に出力関数 sendTrainingProgress が呼び出され、現在の反復と学習精度がValueStore (Parallel Computing Toolbox)に追加されます。ValueStore は、特定のジョブが所有するデータ、ならびに値および対応するキーから成る各データ エントリを保存します。

function sendTrainingProgress(info)

    if info.State == "iteration"
        % Get the ValueStore object of the current job.
        store = getCurrentValueStore;
    
        % Store the training results in the job ValueStore object with a unique
        % key.
        key = idx;
        store(key) = struct(iteration=info.Iteration,accuracy=info.TrainingAccuracy);
    end

end

ネットワークの学習精度を表示するための figure を作成し、送信した各ジョブについて次を行います。

  • 学習するネットワークの精度を表示するためのサブプロットを作成します。

  • ジョブの ValueStore オブジェクトを取得します。

  • ジョブによって ValueStore にエントリが追加されるたびに実行されるコールバック関数を指定します。コールバック関数 updatePlot は、この例の最後に示されています。これは、ネットワークの現在の学習精度をプロットします。

figure
for i=1:numBatchJobs
    subplot(2,2,i)
    xlabel("Iteration");
    ylabel("Accuracy (%)");
    ylim([0 100])
    lines(i) = animatedline;

    store{i} = job(i).ValueStore;
    store{i}.KeyUpdatedFcn = @(store,key) updatePlot(lines(i),store(key).iteration,store(key).accuracy);
end

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

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

wait(job(1))

ジョブが終了した後、関数 fetchOutputs を使用して結果を取得します。この場合、学習済みネットワークとその精度を取得します。

for idx=1:numBatchJobs
    results{idx}=fetchOutputs(job(idx));
end
results{:}
ans=1×2 cell array
    {1×1 SeriesNetwork}    {[0.6644]}

ans=1×2 cell array
    {1×1 SeriesNetwork}    {[0.6824]}

ans=1×2 cell array
    {1×1 SeriesNetwork}    {[0.6482]}

ans=1×2 cell array
    {1×1 SeriesNetwork}    {[0.6398]}

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

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

c = parcluster("MyClusterInTheCloud");
job = findJob(c,ID=3);

不要になったジョブを削除します。そのジョブはジョブ モニターから削除されます。

delete(job(1));

特定のクラスターに送信したすべてのジョブを削除するには、そのクラスターに関連付けられているすべてのジョブを関数 delete に渡します。

delete(c.Jobs);

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

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

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

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

  • [出力の取得] をクリックし、学習済みネットワークとその精度を取得します。

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

jobContextMenu.png

サポート関数

関数 updatePlot は、ネットワークの現在の学習精度を示すサブプロットのいずれかに点を追加します。この関数は、animated line オブジェクト、現在の反復、およびネットワークの精度を受け取ります。

function updatePlot(line,iteration,accuracy)

addpoints(line,iteration,accuracy);
drawnow limitrate nocallbacks

end

参考

(Parallel Computing Toolbox) | (Parallel Computing Toolbox)

関連する例

詳細