このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
深層学習バッチ ジョブのクラスターへの送信
この例では、学習中に作業を継続したり 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
すべてのネットワークに並列で学習させる単一のバッチ ジョブを使用するのではなく、個々のバッチ ジョブ内で各ネットワークに学習させることで、クラスター内で並列プールを起動するためのオーバーヘッドが必要なくなり、ジョブ モニターを使用して各ネットワークの計算の進行状況を個別に観察できるようになります。
追加のジョブをクラスターに投入できます。他のジョブを実行しているためにクラスターを使用できない場合、新しいジョブを投入すると、クラスターが使用可能になるまでキューに入った状態になります。
学習の進行状況の監視
ジョブ モニターをチェックして、クラスターにおけるジョブの現在のステータスを確認できます。[ホーム] タブの [環境] セクションで、[並列]、[ジョブの監視] を選択してジョブ モニターを開きます。
バッチ ジョブを実行しているワーカーから 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 セッションでジョブ モニターを使用することによって、ジョブのステータスを確認できます。
ジョブが完了したら、ジョブ モニターから結果を取得できます。[ホーム] タブの [環境] セクションで、[並列]、[ジョブの監視] を選択してジョブ モニターを開きます。次にジョブを右クリックすると、コンテキスト メニューが表示されます。このメニューでは以下が可能です。
[詳細を表示] をクリックしてワークスペースにジョブを読み込む
[出力の取得] をクリックし、学習済みネットワークとその精度を取得します。
[削除] をクリックして完了したジョブを削除する
サポート関数
関数 updatePlot
は、ネットワークの現在の学習精度を示すサブプロットのいずれかに点を追加します。この関数は、animated line オブジェクト、現在の反復、およびネットワークの精度を受け取ります。
function updatePlot(line,iteration,accuracy) addpoints(line,iteration,accuracy); drawnow limitrate nocallbacks end
参考
batch
(Parallel Computing Toolbox) | ValueStore
(Parallel Computing Toolbox)
関連する例
- parfor を使用した複数の深層学習ネットワークの学習
- AWS での深層学習データの処理
- Work with Deep Learning Data in Azure
- Offload Experiments as Batch Jobs to a Cluster
詳細
- バッチ処理 (Parallel Computing Toolbox)