Нейронные сети по своей сути являются параллельными алгоритмами. Вы можете воспользоваться этим параллелизмом, используя 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. На вкладке Главная в меню Параллельный выберите Создать кластеры и управление ими. В диспетчере профилей кластера щелкните Создать облачный кластер. Можно также использовать Cloud Center MathWorks для создания вычислительных кластеров и доступа к ним. Дополнительные сведения см. в разделе Начало работы с облачным центром. После этого загрузите данные в ведро Amazon S3 и получите к ним доступ непосредственно из MATLAB. В этом примере используется копия набора данных CIFAR-10, который уже хранится в Amazon S3. Инструкции см. в разделе Загрузка данных глубокого обучения в облако.
Настройка параллельного пула
Запустите параллельный пул в кластере и задайте число работников в количестве графических процессоров в кластере. Если указано больше работников, чем GPU, остальные работники простаивают. В этом примере предполагается, что используемый кластер установлен в качестве профиля кластера по умолчанию. Проверьте профиль кластера по умолчанию на вкладке Главная страница MATLAB (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. Чтобы гарантировать, что работники имеют доступ к хранилищу данных в облаке, убедитесь, что переменные среды для учетных данных 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
imageDatastore | trainingOptions | trainNetwork | gpuDevice (Панель параллельных вычислений) | spmd(Панель инструментов параллельных вычислений)