В этом примере показано, как использовать несколько графических процессоров на локальном компьютере для глубокого обучения с использованием автоматической параллельной поддержки. Обучение в сетях глубокого обучения часто занимает часы или дни. Параллельные вычисления позволяют ускорить обучение с помощью нескольких графических процессоров. Дополнительные сведения о вариантах параллельного обучения см. в разделе Масштабирование глубокого обучения параллельно и в облаке (инструментарий глубокого обучения).
Перед запуском этого примера необходимо загрузить набор данных CIFAR-10 на локальный компьютер. Следующий код загружает набор данных в текущий каталог. Если у вас уже есть локальная копия CIFAR-10, можно пропустить этот раздел.
directory = pwd; [locationCifar10Train,locationCifar10Test] = downloadCIFARToFolders(directory);
Downloading CIFAR-10 data set...done. Copying CIFAR-10 to folders...done.
Загрузка наборов данных обучения и тестирования с помощью imageDatastore объект. В следующем коде убедитесь, что расположение хранилищ данных указывает на CIFAR-10 на локальном компьютере.
imdsTrain = imageDatastore(locationCifar10Train, ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); imdsTest = imageDatastore(locationCifar10Test, ... '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);
Определите сетевую архитектуру для 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 ];
Определите варианты обучения. Обучить сеть параллельно с несколькими графическими процессорами, установив для среды выполнения значение «»multi-gpu'. При использовании нескольких графических процессоров увеличиваются доступные вычислительные ресурсы. Увеличьте размер мини-пакета с количеством графических процессоров, чтобы сохранить постоянную рабочую нагрузку на каждом графическом процессоре. В этом примере количество графических процессоров равно двум. Масштабируйте скорость обучения в соответствии с размером мини-партии. Используйте график скорости обучения, чтобы снизить скорость обучения по мере прохождения обучения. Включите график хода обучения для получения визуальной обратной связи во время обучения.
numGPUs = 2; miniBatchSize = 256*numGPUs; initialLearnRate = 1e-1*miniBatchSize/256; options = trainingOptions('sgdm', ... 'ExecutionEnvironment','multi-gpu', ... % Turn on automatic multi-gpu 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',60, ... 'Shuffle','every-epoch', ... 'ValidationData',imdsTest, ... 'ValidationFrequency',floor(numel(imdsTrain.Files)/miniBatchSize), ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.1, ... 'LearnRateDropPeriod',50);
Обучение сети. Во время обучения на графике отображается ход выполнения.
net = trainNetwork(augmentedImdsTrain,layers,options)
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 2).

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.8779
Автоматическая поддержка нескольких графических процессоров может ускорить обучение сети, используя преимущества нескольких графических процессоров. На следующем графике показано ускорение общего времени обучения с количеством графических процессоров на машине Linux с четырьмя графическими процессорами NVIDIA © TITAN XP.

Определите функцию для создания сверточного блока в сетевой архитектуре.
function layers = convolutionalBlock(numFilters,numConvLayers) layers = [ convolution2dLayer(3,numFilters,'Padding','same') batchNormalizationLayer reluLayer]; layers = repmat(layers,numConvLayers,1); end
imageDatastore | trainingOptions (инструментарий глубокого обучения) | trainNetwork (инструментарий для глубокого обучения)