Main Content

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

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

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

複数の GPU があるマシンにアクセスできる場合は、関数 trainingOptions を使用して単純に学習オプション 'multi-gpu' を指定できます。複数の GPU を使用した学習の場合、各イメージ バッチが GPU 間に分散されます。複数の GPU を使用した学習の詳細については、複数の GPU による学習を参照してください。

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

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

複数の GPU がある場合、学習を開始する前にデバイスを選択することで、特定の GPU を使用して単一 GPU による学習を実行することができます。関数 gpuDeviceTable (Parallel Computing Toolbox) を使用して GPU を調べ、使用する GPU のインデックスを決定します。次に、そのインデックスを使用して目的の GPU を選択します。

gpuDevice(index)
学習時にこの GPU を使用するには、学習オプション 'ExecutionEnvironment','gpu' を使用して trainNetwork を実行します。

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

1 つのモデルの学習に複数の GPU を使用するものの、すべての 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("available")
    trainNetwork(…); 
end

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

この例では、並列学習用の MATLAB の自動サポートを使用して畳み込みニューラル ネットワークに学習させる方法を説明します。多くの場合、深層学習における学習には数時間または数日かかります。並列計算を使用すると、複数のグラフィックス処理装置 (GPU) をローカルで、またはクラウドのクラスターで使用して、学習を高速化できます。複数の GPU があるマシンにアクセスできる場合は、データのローカル コピーに対してこの例を完了させることができます。より多くのリソースを使用する必要がある場合は、深層学習における学習をクラウドにスケールアップできます。並列学習のオプションの詳細は、並列およびクラウドでの深層学習のスケールアップを参照してください。この例では、MATLAB の自動並列サポートを使用して、クラウドのクラスターで深層学習ネットワークに学習させる手順について順を追って説明します。

要件

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

並列プールの設定

クラスターの並列プールを起動して、ワーカー数をクラスターの GPU 数に設定します。GPU より多くのワーカーを指定した場合、残りのワーカーはアイドル状態になります。この例では、使用するクラスターが既定のクラスター プロファイルとして設定されていると仮定します。MATLAB の [ホーム] タブの [並列][既定のクラスターの選択] で、既定のクラスター プロファイルを確認します。

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

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

imageDatastore を使用して、学習データセットとテスト データセットをクラウドから読み込みます。この例では、Amazon S3 に格納されている CIFAR-10 データセットのコピーを使用します。ワーカーがクラウドのデータストアに確実にアクセスできるように、AWS 資格情報の環境変数が正しく設定されていることを確認してください。クラウドへの深層学習データのアップロードを参照してください。

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 データセット用のネットワーク アーキテクチャを定義します。コードを簡略化するために、入力を畳み込む畳み込みブロックを使用します。プーリング層は空間次元をダウンサンプリングします。

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

layers = [
    imageInputLayer(imageSize) 
    
    convolutionalBlock(netWidth,blockDepth)
    maxPooling2dLayer(2,'Stride',2)
    convolutionalBlock(2*netWidth,blockDepth)
    maxPooling2dLayer(2,'Stride',2)    
    convolutionalBlock(4*netWidth,blockDepth)
    averagePooling2dLayer(8) 
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer
];

学習オプションを定義します。実行環境を parallel に設定して、現在のクラスターを使用してネットワークの並列学習を行います。複数の GPU を使用する場合、利用可能な計算リソースを増やします。GPU の数でミニバッチ サイズをスケールアップし、各 GPU での作業負荷を一定に維持します。ミニバッチ サイズに応じて学習率をスケーリングします。学習率のスケジュールを使用して、学習の進行に応じて学習率を下げます。学習の進行状況プロットをオンにして、学習中に、可視化されたフィードバックを取得します。

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

options = trainingOptions('sgdm', ...
    'ExecutionEnvironment','parallel', ... % Turn on automatic 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',50, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsTest, ...
    'ValidationFrequency',floor(numel(imdsTrain.Files)/miniBatchSize), ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropFactor',0.1, ...
    'LearnRateDropPeriod',45);

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

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

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)

補助関数の定義

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

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

参考

| | (Parallel Computing Toolbox) | (Parallel Computing Toolbox) |

関連するトピック