主要内容

이번역페이지는최신내용을담고있지않습니다。최신내용을문으로보려면여기를클릭하십시오。

복수의gpu에서MATLAB을사용한딥러닝

신경망은본질적으로병렬알고리즘입니다。并行计算工具箱™를사용하여멀티코어CPU、GPU또는복수의CPU와GPU가탑재된컴퓨터클러스터로훈련을분산하여이러한병렬처리의이점을활용할수있습니다。

복수의gpu가장착된컴퓨터를사용하는경우에는trainingOptions함수를사용하여훈련옵션“multi-gpu”를지정하면됩니다。복수의gpu를사용하여훈련시킬때는각상배치가gpu간에분산됩니다。복수의gpu를사용하여훈련시키는것에대한자세한내용은복수의gpu를사용하여훈련시키기항목을참조하십시오。

더많은리소스를사용하기위해딥러닝훈련을클러스터또는클라우드로확장할수있습니다。병렬옵션에대한자세한내용은并行、gpu和云中扩展深度学习항목을참조하십시오。예제를시도해보려면자동병렬지원을사용하여클라우드의신경망훈련시키기항목을참조하십시오。

훈련에사용할특정gpu선택하기

GPU가여러개있는경우훈련시작전에장치를선택하여단일GPU훈련에특정GPU를사용할수있습니다。gpuDeviceTable(并行计算工具箱)함수를사용하여gpu를검토하고사용할gpu의덱스를확합니다。그런다음그덱스를사용하여해당gpu를선택합니다。

gpuDevice(索引)
훈련시이gpu를사용하려면훈련옵션“ExecutionEnvironment”、“gpu的를사용하여trainNetwork를실행하십시오。

컴퓨터에서사용가능한모든gpu를사용하려면훈련옵션“ExecutionEnvironment”、“multi-gpu”를지정하면됩니다。

복수의GPU를사용하여단일모델을훈련시키려는경우모든GPU를사용하지는않으려면병렬풀을미리열고GPU를직접선택하십시오。성능이떨어지는디스플레GPU이에서훈련하는것을피하고자할때이방법을사용할수있습니다。특정gpu를선택하려면다음코드를사용하십시오。여기서gpuIndices는사용할gpu의덱스입니다。

parpool(当地的元素个数(gpuIndices));spmd gpuDevice (gpuIndices (labindex));结束
ExecutionEnvironment“multi-gpu”로설정하여trainNetwork를실행할경우(“平行”로설정해도동일한결과가나옴),훈련함수는이풀을사용하고새풀을열지않습니다。

또다른옵션은trainingOptions“WorkerLoad”옵션을사용하여워커를선택하는것입니다。예를들면다음과같습니다。

parpool(“当地”,5);opts = trainingOptions('sgdm', 'WorkerLoad',[1 1 1 10 0 1],…)

이경우4번째워커는풀의일부이지만유휴상태입니다。이것은병렬리소스의이상적사용방법이아닙니다。gpuDevice를사용하여gpu를지정하는것이더효율적입니다。

모델당하나의GPU를사용하여복수의모델을훈련시키려면각각에대해MATLAB세션을시작하고gpuDevice를사용하여장치를선택하십시오。

또는parfor루프를사용할수있습니다。

parfor i=1:gpuDeviceCount("available") trainNetwork(…);结束

자동병렬지원을사용하여클라우드의신경망훈련시키기

이예제에서는병렬훈련에대한MATLAB자동지원을사용하여컨벌루션신경망을훈련시키는방법을보여줍니다。딥러닝훈련에는종종몇시간이나며칠이소됩니다。병렬연산을사용하면로컬에서또는클라우드에있는클러스터에서여러개의GPU(그래픽처리장치)를사용하여훈련속도를높일수있습니다。복수의GPU가장착된컴퓨터를사용하는경우에는이예제를데이터의로컬복사본에대해실행할수있습니다。리소스를더많이사용하고싶다면딥러닝훈련을클라우드로확장할수있습니다。병렬훈련옵션에대해알아보려면并行、gpu和云中扩展深度学习항목을참조하십시오。이예제에서는MATLAB자동병렬지원을사용하여클라우드에있는클러스터에서딥러닝신경망을훈련시키는방법을보여줍니다。

구사항

이예제를실행하려면먼저클러스터를구성하고데이터를클라우드로업로드해야합니다。Matlab에서는Matlab데스크탑에서직접클라우드에클러스터를만들수있습니다。탭의병렬연산메뉴에서클러스터생성및관리를선택합니다。클러스터프로파일관리자에서클라우드클러스터생성을클릭합니다。또는MathWorks云中心를사용하여계산클러스터를만들고액세스할수도있습니다。자세한내용은开始使用云中心를참조하십시오。그런다음Amazon S3버킷으로데이터를업로드하면MATLAB에서직접액세스할수있습니다。이예제에서는기존에Amazon S3에저장되어있는CIFAR-10데이터세트복사본을사용합니다。자세한지침은딥러닝데이터를클라우드로업로드하기항목을참조하십시오。

병렬풀설정하기

클러스터에서병렬풀을시작하고워커의개수를클러스터상의gpu개수로설정합니다。워커의개수를gpu의개수보다많이지정하면나머지워커들은유휴상태가됩니다。이예제에서는사용하는클러스터가디폴트클러스터프로파일로설정되어있다고가정합니다。디폴트클러스터프로파일은matlab탭의병렬연산>디폴트클러스터선택에서확하십시오。

numberOfWorkers = 8;parpool (numberOfWorkers);
使用' myclusterincloud '配置文件启动并行池(parpool)…连接8个工人。

클라우드에서데이터세트불러오기

imageDatastore를사용하여클라우드에서훈련데이터세트와테스트데이터세트를불러옵니다。이예제에서는Amazon S3에저장되어있는CIFAR-10데이터세트복사본을사용합니다。워커가클라우드의데이터저장소에액세스할수있도록하려면AWS자격증명의환경변수가올바르게설정되었는지확인하십시오。딥러닝데이터를클라우드로업로드하기항목을참조하십시오。

imdsTrain = imageDatastore(s3: / / cifar10cloud / cifar10 /火车'...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);imdsTest = imageDatastore(s3: / / cifar10cloud / cifar10 /测试”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

augmentedImageDatastore객체를만들어서대상데이터로신경망을훈련시킵니다。무작위평행이동및가로반사를사용합니다。데이터증대는신경망이과적합되는것을방지하고훈련영상의정확한세부정보가기억되지않도록하는데도움이됩니다。

imageSize = [32 32 3];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter(...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augmentedImdsTrain = augmentedimagedastore (imageSize,imdsTrain,...“DataAugmentation”imageAugmenter,...“OutputSizeMode”“randcrop”);

신경망아키텍처와훈련옵션정의하기

Cifar-10데이터세트에대해신경망아키텍처를정의합니다。코드를단순화하려면입력값을컨벌루션하는컨벌루션블록을사용하십시오。풀링계층은공간차원을다운샘플링합니다。

blockDepth = 4;% blockDepth控制卷积块的深度netWidth = 32;% netWidth控制卷积块中的过滤器数量图层= [imageInputLayer(imageSize) convolutionalBlock(netWidth,blockDepth) maxPooling2dLayer(2,“步”,2) convolutionalBlock(2*netWidth,blockDepth) maxPooling2dLayer(2,“步”,2) convolutionalBlock(4*netWidth,blockDepth) averagePooling2dLayer(8) fullyConnectedLayer(10) softmaxLayer classificationLayer];

훈련옵션을정의합니다。실행환경을平行로설정하여,현재클러스터를사용하여신경망을병렬로훈련시킵니다。복수의gpu를사용하면사용가능한연산리소스가늘어납니다。미니배치크기를GPU개수로설정하여각GPU상의워크로드를일정하게유지합니다。미니배치크기에따라학습률의크기를조정합니다。훈련이진행됨에따라학습률을떨어뜨리는학습률일정을사용합니다。훈련중에시각적피드백을볼수있도록훈련진행상황플롯을켭니다。

miniBatchSize = 256 * numberOfWorkers;initialLearnRate = 1e-1 * miniBatchSize/256;选项= trainingOptions(“个”...“ExecutionEnvironment”“平行”...打开自动并行支持。金宝app“InitialLearnRate”initialLearnRate,...%设置初始学习率。“MiniBatchSize”miniBatchSize,...设置MiniBatchSize。“详细”假的,...不发送命令行输出。“阴谋”“训练进步”...打开训练进度图。“L2Regularization”1平台以及...“MaxEpochs”, 50岁,...“洗牌”“every-epoch”...“ValidationData”imdsTest,...“ValidationFrequency”、地板(元素个数(imdsTrain.Files) / miniBatchSize),...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”, 45岁);

신경망을훈련시키고분류에사용하기

클러스터에서신경망을훈련시킵니다。훈련중에플롯에진행상황이@ @시됩니다。

net = trainNetwork(augmentedImdsTrain,layers,options)

net = SeriesNetwork with properties: Layers: [43×1 nnet.cnn.layer.Layer]

훈련된신경망을사용하여로컬컴퓨터에서테스트영상을분류하여이신경망의정확도를확인합니다。그런다음예측된레이블을실제레이블과비교합니다。

ypredict = category (net,imdsTest);accuracy = sum(ypredict == imdsTest.Labels)/numel(imdsTest.Labels)

헬퍼함수정의하기

신경망아키텍처에서컨벌루션블록을만드는함수를정의합니다。

函数layers = [convolution2dLayer(3,numFilters, numConvLayers)“填充”“相同”) batchNormalizationLayer reluLayer;layers = repmat(layers,numConvLayers,1);结束

참고 항목

||(并行计算工具箱)|(并行计算工具箱)|

관련 항목