ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

MATLAB による複数の GPU での深層学習

ニューラル ネットワークは本質的に並列アルゴリズムです。この並列性の利点を活かし、Parallel Computing Toolbox™ を使用して、学習をマルチコア CPU、グラフィックス処理装置 (GPU)、および複数の CPU と GPU を備えたコンピューターのクラスターに分散させることができます。

複数の GPU があるマシンにアクセスできる場合は、単純に学習オプション 'multi-gpu' を指定できます。

より多くのリソースを使用する必要がある場合は、深層学習における学習をクラスターまたはクラウドにスケールアップできます。並列オプションの詳細は、並列およびクラウドでの深層学習のスケールアップを参照してください。例を試してみるには、組み込みの並列サポートを使用したクラウドでのネットワークの学習を参照してください。

学習に使用する特定の GPU の選択

マシン上の利用可能な GPU をすべて使用するには、単純に学習オプション 'ExecutionEnvironment','multi-gpu' を指定します。

複数の GPU のうち 1 つを選択して 1 つのモデルの学習に使用するには、次を使用します。

gpuDevice(index)
1 つのモデルの学習に複数の GPU を使用するが、全部の GPU は使わない場合は、事前に並列プールを開き、GPU を手動で選択します。特定の GPU を選択するには、次のコードを使用します。gpuIndices は GPU のインデックスです。
parpool('local', numel(gpuIndices));
spmd, gpuDevice(gpuIndices(labindex)); end
‘multi-gpu’ExecutionEnvironment (または同じ結果が得られる ‘parallel’) を使用して trainNetwork を実行する場合、学習関数はこのプールを使用し、新しいプールを開きません。

別のオプションは、trainingOptions‘WorkerLoad’ オプションを使用してワーカーを選択する方法です。次に例を示します。

parpool('local', 5);
opts = trainingOptions('sgdm', 'WorkerLoad', [1 1 1 0 1], ...)

この場合、4 番目のワーカーはプールの一部ですがアイドル状態であり、並列リソースの理想的な使用方法ではありません。gpuDevice で GPU を指定する方が効率的です。

複数のモデルに 1 つずつ GPU を使用して学習させる場合、それぞれの MATLAB セッションを開始し、gpuDevice を使用してデバイスを選択します。

または、parfor ループを使用します。

parfor i=1:gpuDeviceCount
 trainNetwork(…); 
end

組み込みの並列サポートを使用したクラウドでのネットワークの学習

この例では、並列学習用の MATLAB の組み込みサポートを使用して CIFAR-10 で畳み込みニューラル ネットワークの学習を行う方法を説明します。多くの場合、深層学習における学習には数時間または数日かかります。複数の GPU をローカルで、またはクラウドのクラスターで使用して、並列計算によって学習を高速化できます。複数の GPU があるマシンにアクセスできる場合は、学習オプションで ExecutionEnvironment の値を multi-gpu に設定した後で、データセットのローカル コピーに対してこのスクリプトを実行できます。より多くのリソースを使用する必要がある場合は、深層学習における学習をクラウドにスケールアップできます。この例では、MATLAB の組み込みの並列サポートを使用して、クラウドのクラスターで深層ニューラル ネットワークに学習させる手順について順を追って説明します。

この例を実行する前に、クラスターを構成し、データをクラウドにアップロードする必要があります。クラウドでの作業を始めるには、Cloud Center を設定して、それを Amazon Web Services (AWS) アカウントにリンクし、クラスターを作成します。手順については、Getting Started with Cloud Center を参照してください。その後、データを Amazon S3 バケットにアップロードして、MATLAB から直接使用します。手順については、Upload Deep Learning Data to the Cloudを参照してください。

並列プールの設定

クラスターの並列プールを開始して、ワーカー数をクラスターの GPU 数に設定します。GPU より多くのワーカーを指定した場合、残りのワーカーはアイドル状態になります。ここでは、使用するクラスターがクラスター プロファイルの既定として設定されていると仮定します。

numberOfWorkers = 8;
parpool(numberOfWorkers);
Starting parallel pool (parpool) using the 'MyClusterInTheCloudAWS' profile ...
connected to 8 workers.

クラウドからのデータセットの読み込み

imageDatastore を使用して、学習データセットとテスト データセットをクラウドから読み込みます。この例では、Amazon S3 に既に格納されている CIFAR-10 データのコピーを使用する方法を説明します。ワーカーがクラウドのデータストアに確実にアクセスできるように、AWS 資格情報の環境変数が正しく設定されていることを確認してください。手順については、Upload Deep Learning Data to the Cloudを参照してください。

imdsTrain = imageDatastore('s3://cifar10cloud/cifar10/train', ...
 'IncludeSubfolders',true, ...
 'LabelSource','foldernames');

imdsTest = imageDatastore('s3://cifar10cloud/cifar10/test', ...
 'IncludeSubfolders',true, ...
 'LabelSource','foldernames');

拡張イメージ データを使用してネットワークに学習させるには、augmentedImageDatastore オブジェクトを作成します。ランダムな平行移動と水平方向の反転を使用します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。

imageSize = [32 32 3];
pixelRange = [-4 4];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augmentedImdsTrain = augmentedImageDatastore(imageSize,imdsTrain, ...
    'DataAugmentation',imageAugmenter, ...
    'OutputSizeMode','randcrop');

ネットワーク アーキテクチャと学習オプションの定義

CIFAR-10 用のネットワーク アーキテクチャを定義します。コードを簡略化するために、入力を畳み込む複数の畳み込み層を含む、畳み込みブロックを使用します。プーリング層は空間次元をダウンサンプリングします。

netDepth = 4; % netDepth controls the depth of the convolutional blocks
netWidth = 32; % netWidth controls the number of filters in a convolutional block

layers = [
    imageInputLayer(imageSize)

    convolutionalBlock(netWidth,netDepth)
    maxPooling2dLayer(2,'Stride',2)
    convolutionalBlock(2*netWidth,netDepth)
    maxPooling2dLayer(2,'Stride',2)
    convolutionalBlock(4*netWidth,netDepth)
    averagePooling2dLayer(8)

    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer
];

学習オプションを定義します。現在のクラスターを使用してネットワークの学習を並列に行うには、実行環境を parallel に設定します。ミニバッチ サイズに応じて学習率をスケーリングします。学習率のスケジュールを使用して、学習の進行に応じて学習率を下げます。学習の進行状況プロットをオンにして、学習中に、可視化されたフィードバックを取得します。

miniBatchSize = 64 * numberOfWorkers;
initialLearnRate = 1e-1 * miniBatchSize/256;

options = trainingOptions('sgdm', ...
    'ExecutionEnvironment','parallel', ... % Turn on built-in parallel support.
    'InitialLearnRate',initialLearnRate, ... % Set the initial learning rate.
    'MiniBatchSize',miniBatchSize, ... % Set the MiniBatchSize.
    'Verbose',false, ... % Do not send command line output.
    'Plots','training-progress', ... % Turn on the training progress plot.
    'L2Regularization',1e-10, ...
    'MaxEpochs',30, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsTest, ...
    'ValidationFrequency',floor(numel(imdsTrain.Files)/miniBatchSize), ...
    'ValidationPatience',Inf, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropFactor',0.1, ...
    'LearnRateDropPeriod',25);

ネットワークの学習と分類での使用

クラスターでネットワークに学習させます。学習中に進行状況のプロットが表示されます。

net = trainNetwork(augmentedImdsTrain,layers,options)
net = 

  SeriesNetwork with properties:

    Layers: [43×1 nnet.cnn.layer.Layer]

このネットワークの精度を求めるには、学習済みのネットワークを使用してローカル マシン上でテスト イメージを分類し、これを実際のラベルと比較します。

YPredicted = classify(net,imdsTest);
accuracy = sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)
accuracy =

    0.9036

補助関数の定義

ネットワーク アーキテクチャでの畳み込みブロックの作成を容易にする関数を定義します。

function layers = convolutionalBlock(numFilters,numConvLayers)
    layers = [
        convolution2dLayer(3,numFilters,'Padding','same')
        batchNormalizationLayer
        reluLayer
    ];

    layers = repmat(layers,numConvLayers,1);
end

参考

| | | |

関連するトピック