Глубокое обучение для MATLAB на нескольких графических процессорах

Нейронные сети являются по сути параллельными алгоритмами. Можно использовать в своих интересах этот параллелизм при помощи Параллельных вычислений, Toolbox™to распределяют обучение на многожильных центральных процессорах, графические блоки обработки (графические процессоры) и кластеры компьютеров с несколькими центральными процессорами и графических процессоров.

Если у вас есть доступ к машине с помощью нескольких графических процессоров, можно просто задать опцию обучения 'multi-gpu'.

Если вы хотите использовать больше ресурсов, можно увеличить обучение глубокому обучению к кластерам или облаку. Чтобы узнать больше о параллельных опциях, смотрите, Увеличивают Глубокое обучение в параллели и в облаке. Чтобы попробовать пример, смотрите, Обучат сеть в Облаке Используя Автоматическую Параллельную Поддержку.

Выберите Particular GPUs to Use for Training

Чтобы использовать все доступные графические процессоры на вашей машине, просто задайте опцию обучения 'ExecutionEnvironment','multi-gpu'.

Чтобы выбрать один из нескольких графических процессоров, чтобы использовать, чтобы обучить одну модель, используйте:

gpuDevice(index)
Если вы хотите обучить одну модель с помощью нескольких графических процессоров и не хотите использовать все графические процессоры, открывать параллельный пул заранее и выбирать GPU вручную. Чтобы выбрать конкретные графические процессоры, используйте следующий код, где gpuIndices индексы графических процессоров:
parpool('local', numel(gpuIndices));
spmd, gpuDevice(gpuIndices(labindex)); end
Когда вы запускаете trainNetwork с ‘multi-gpu’ ExecutionEnvironment (или ‘parallel’ для того же результата), учебная функция будет использовать этот пул и не открывать новый.

Другая опция должна выбрать рабочих, использующих ‘WorkerLoad’ опция в trainingOptions. Например:

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

В этом случае 4-й рабочий является частью пула, но неактивный, который не является идеальным использованием параллельных ресурсов. Более эффективно задать графические процессоры с gpuDevice.

Если вы хотите обучить многоуровневые модели с помощью одного графического процессора каждый, запустите сеанс работы с MATLAB для каждого и выберите устройство с помощью gpuDevice.

В качестве альтернативы используйте parfor цикл:

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

Обучите сеть в облаке Используя автоматическую параллельную поддержку

В этом примере показано, как обучить использование сверточной нейронной сети MATLAB автоматическая поддержка параллельного обучения. Обучение глубокому обучению часто занимает часы или дни. С параллельными вычислениями можно ускорить обучение с помощью нескольких графических блоков обработки (графические процессоры) локально или в кластере в облаке. Если у вас есть доступ к машине с помощью нескольких графических процессоров, то можно завершить этот пример на локальной копии данных. Если вы хотите использовать больше ресурсов, то можно увеличить обучение глубокому обучению к облаку. Чтобы узнать больше о ваших опциях для параллельного обучения, смотрите, Увеличивают Глубокое обучение в параллели и в облаке. Этот пример проводит вас по шагам, чтобы обучить нейронную сеть для глубокого обучения в кластере в использовании облака MATLAB автоматическая параллельная поддержка.

Требования

Прежде чем можно будет запустить пример, необходимо сконфигурировать кластер и данные о загрузке к облаку. В MATLAB можно создать кластеры в облаке непосредственно с Рабочего стола MATLAB. На вкладке Home, в меню Parallel, выбирают Create и Manage Clusters. В Кластерном менеджере по Профилю нажмите Create Cloud Cluster. В качестве альтернативы можно использовать MathWorks Cloud Center, чтобы создать и получить доступ, вычисляют кластеры. Для получения дополнительной информации смотрите Начало работы с Центром Облака. После этого загрузите свои данные на блок Amazon S3 и получите доступ к ним непосредственно из MATLAB. Этот пример использует копию набора данных CIFAR-10, который уже хранится в Amazon S3. Для инструкций смотрите Данные о Глубоком обучении Загрузки к Облаку.

Настройте параллельный пул

Запустите параллельный пул в кластере и определите номер рабочих к количеству графических процессоров в вашем кластере. Если вы задаете больше рабочих, чем графические процессоры, то остающиеся рабочие неактивны. Этот пример принимает, что кластер, который вы используете, установлен как кластерный профиль по умолчанию. Проверяйте, что кластерный профиль по умолчанию на вкладке MATLAB Home, параллельно> Выбирают Default Cluster.

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

Загрузите набор данных от облака

Загрузите обучение и наборы тестовых данных от облака с помощью imageDatastore. В этом примере вы используете копию набора данных CIFAR-10, сохраненного в Amazon S3. Чтобы гарантировать, что у рабочих есть доступ к datastore в облаке, убедитесь, что переменные окружения для учетных данных 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');

Архитектура сети Define и опции обучения

Задайте сетевую архитектуру для набора данных 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. Когда вы используете несколько графических процессоров, вы увеличиваете доступные вычислительные ресурсы. Увеличьте мини-пакетный размер с количеством графических процессоров, чтобы сохранить рабочую нагрузку на каждом графическом процессоре постоянной. Масштабируйте темп обучения согласно мини-пакетному размеру. Используйте расписание темпа обучения, чтобы пропустить темп обучения, в то время как обучение прогрессирует. Включите график процесса обучения получить визуальную обратную связь во время обучения.

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

Смотрите также

| | | |

Похожие темы