Нейронные сети являются по сути параллельными алгоритмами. Можно использовать в своих интересах этот параллелизм при помощи Parallel Computing Toolbox™, чтобы распределить обучение на многожильных центральных процессорах, графических процессорах и кластерах компьютеров с несколькими центральными процессорами и графических процессоров.
Если у вас есть доступ к машине с помощью нескольких графических процессоров, можно просто задать опцию обучения 'multi-gpu'
использование trainingOptions
функция. Когда обучение с помощью нескольких графических процессоров, каждый пакет изображений распределяется между графическими процессорами. Для получения дополнительной информации об обучении с помощью нескольких графических процессоров, смотрите Обучение с помощью Нескольких графических процессоров.
Если вы хотите использовать больше ресурсов, можно увеличить обучение глубокому обучению к кластерам или облаку. Чтобы узнать больше о параллельных опциях, смотрите, Увеличивают Глубокое обучение в параллели и в облаке. Чтобы попробовать пример, смотрите, Обучат сеть в Облаке Используя Автоматическую Параллельную Поддержку.
Если у вас есть несколько графических процессоров, можно использовать определенный графический процессор для обучения одно графического процессора путем выбора устройства, прежде чем вы запустите обучение. Используйте gpuDeviceTable
(Parallel Computing Toolbox) функционирует, чтобы исследовать ваши графические процессоры и определить индекс графического процессора, который вы хотите использовать. Затем выберите тот графический процессор с помощью его индекса:
gpuDevice(index)
trainNetwork
использование опции обучения 'ExecutionEnvironment','gpu'
.Если вы хотите использовать все доступные графические процессоры на своей машине, просто задайте опцию обучения 'ExecutionEnvironment','multi-gpu'
.
Если вы хотите обучить одну модель с помощью нескольких графических процессоров, и вы не хотите использовать все свои графические процессоры, открывать параллельный пул заранее и выбирать 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
.
В качестве альтернативы используйте a parfor
цикл:
parfor i=1:gpuDeviceCount("available") 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
imageDatastore
| trainingOptions
| trainNetwork
| gpuDevice
(Parallel Computing Toolbox) | spmd
(Parallel Computing Toolbox)