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

Нейронные сети по своей сути являются параллельными алгоритмами. Вы можете воспользоваться этим параллелизмом, используя Parallel Computing Toolbox™, чтобы распределить обучение между многоядерными центральными процессорами, графическими процессорами и кластерами компьютеров с несколькими центральными процессорами и графическими процессорами.

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

Если вы хотите использовать больше ресурсов, можно масштабировать обучение с глубоким обучением до кластеров или облака. Дополнительные сведения о параллельных опциях см. в разделе Шкале глубокого обучения параллельно и в облаке. Чтобы попробовать пример, смотрите Обучите сеть в облаке с помощью автоматической параллельной поддержки.

Выберите конкретные графические процессоры для обучения

Если у вас есть несколько графических процессоров, можно использовать определенный графический процессор для обучения с одним графическим процессором, выбрав устройство перед началом обучения. Используйте gpuDeviceTable (Parallel Computing Toolbox), чтобы изучить ваши графические процессоры и определить индекс графического процессора, который вы хотите использовать. Затем выберите этот графический процессор с помощью его индекса:

gpuDevice(index)
Чтобы использовать этот графический процессор при обучении, запустите trainNetwork используя опцию обучения 'ExecutionEnvironment','gpu'.

Если вы хотите использовать все доступные графические процессоры на вашем компьютере, просто укажите опцию обучения 'ExecutionEnvironment','multi-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("available")
    trainNetwork(…); 
end

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

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

Требования

Прежде чем вы сможете запустить пример, вам нужно сконфигурировать кластер и загрузить данные в облако. В MATLAB можно создавать кластеры в облаке непосредственно с рабочего стола MATLAB. На вкладке «Вкладке Home», в меню Parallel, выберите Create and Manage Clusters. В Диспетчере профилей кластеров щелкните Создать облако. Также можно использовать MathWorks Cloud Center для создания и доступа к вычислительным кластерам. Дополнительные сведения см. в разделе Начало работы с облачным центром. После этого загрузите свои данные в блок S3 Amazon и получите к ним доступ непосредственно из MATLAB. Этот пример использует копию CIFAR-10 набора данных, который уже хранится в Amazon S3. Инструкции см. в разделе Загрузка данных глубокого обучения в облако.

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

Запустите параллельный пул в кластере и установите количество рабочих процессов на количество графических процессоров в кластере. Если вы задаете больше работников, чем графические процессоры, то остальные работники находятся в простое. Этот пример предполагает, что используемый кластер установлен в качестве профиля кластера по умолчанию. Проверьте профиль кластера по умолчанию на вкладке MATLAB Home, в Parallel > Select a 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');

Определите сетевую архитектуру и опции обучения

Определите сетевую архитектуру для 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

См. также

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

Похожие темы