주요 콘텐츠

GPU에서 신경망 훈련 재현하기

R2024b 이후

이 예제에서는 GPU에서 신경망을 여러 번 훈련시키고 동일한 결과를 얻는 방법을 보여줍니다.

GPU에서 모델 훈련과 추론의 재현성을 보장하면 실험과 디버그에 도움이 될 수 있습니다. GPU에서 모델 훈련을 재현하는 것은 딥러닝 시스템의 검증에 특히 중요합니다.

훈련 데이터 및 신경망 준비하기

지원 함수 prepareDigitsDataprepareAutoencoderLayers를 사용하여 훈련 데이터와 신경망 아키텍처를 준비합니다. 이들 함수는 image-to-image 회귀를 위해 데이터저장소 준비하기 예제에 설명된 대로 데이터를 준비하고 오토인코더 신경망을 구축하며, 이 예제에 지원 파일로 첨부되어 있습니다.

[dsTrain,dsVal] = prepareDigitsData;
layers = prepareAutoencoderLayers;

훈련 옵션 정의하기

훈련 옵션을 지정합니다. 옵션은 image-to-image 회귀를 위해 데이터저장소 준비하기 예제와 동일하지만, 다음 사항은 예외입니다.

  • 훈련을 Epoch 5회 수행합니다. Epoch 5회는 신경망이 수렴하는 데는 충분하지 않지만 훈련이 똑같이 재현될 수 있는지 여부를 보여주기에 충분합니다.

  • 마지막 훈련 반복에 해당하는 신경망을 반환합니다. 이렇게 하면 훈련된 신경망들을 비교할 때 공정한 비교가 보장됩니다.

  • GPU에서 신경망을 훈련시킵니다. 기본적으로 trainnet 함수는 GPU를 사용할 수 있으면 GPU를 사용합니다. GPU에서 훈련시키려면 Parallel Computing Toolbox™ 라이선스와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오.

  • 모든 시각화를 비활성화합니다.

options = trainingOptions("adam", ...
    MaxEpochs=5, ...
    MiniBatchSize=500, ...
    ValidationData=dsVal, ...
    ValidationPatience=5, ...
    OutputNetwork="last-iteration", ...
    ExecutionEnvironment="gpu", ...
    Verbose=false);

GPU가 선택되어 있고 훈련에 사용 가능한지 확인합니다.

gpu = gpuDevice;
disp(gpu.Name + " selected.")
NVIDIA RTX A5000 selected.

신경망을 두 번 훈련시키고 결과 비교하기

trainnet 함수를 사용하여 신경망을 두 번 훈련시킵니다. 난수 생성이 훈련에 영향을 주지 않도록 rng 함수와 gpurng (Parallel Computing Toolbox) 함수를 각각 사용하여 훈련 전에 CPU와 GPU에서 난수 생성기와 시드값을 설정합니다.

rng("default")
gpurng("default")
net1 = trainnet(dsTrain,layers,"mse",options);

rng("default")
gpurng("default")
net2 = trainnet(dsTrain,layers,"mse",options);

훈련된 신경망들의 학습 가능한 파라미터가 서로 동일한지 확인합니다. 훈련에 비결정적 알고리즘이 사용되므로 두 신경망의 학습 가능한 파라미터가 서로 다릅니다.

isequal(net1.Learnables.Value,net2.Learnables.Value)
ans = logical
   0

첫 번째 훈련 실행과 두 번째 훈련 실행 간에 첫 번째 컨벌루션 계층의 가중치 차이를 플로팅합니다. 이 플롯은 두 신경망의 가중치에 작은 차이가 있음을 보여줍니다.

learnablesDiff = net1.Learnables.Value{1}(:) - net2.Learnables.Value{1}(:);
learnablesDiff = extractdata(learnablesDiff);

figure
bar(learnablesDiff)
ylabel("Difference in Weight Value")
xlabel("Learnable Parameter Number")

결정성(Determinism) 옵션을 설정하고 신경망 훈련시키기

deep.gpu.deterministicAlgorithms 함수를 사용하여 GPU 결정성 상태를 true로 설정하고, 나중에 복원할 수 있도록 GPU 결정성의 이전 상태를 캡처합니다. 이후의 모든 GPU 딥러닝 연산 호출에서는 결정론적 알고리즘만 사용합니다.

previousState = deep.gpu.deterministicAlgorithms(true);

매번 CPU 및 GPU 난수 생성기와 시드값을 설정하고 trainnet 함수를 사용하여 신경망을 두 번 훈련시킵니다. 결정론적 알고리즘만 사용하면 훈련과 추론 속도가 느려질 수 있습니다.

rng("default")
gpurng("default")
net3 = trainnet(dsTrain,layers,"mse",options);

rng("default")
gpurng("default")
net4 = trainnet(dsTrain,layers,"mse",options);

훈련된 신경망들의 학습 가능한 파라미터가 서로 동일한지 확인합니다. 결정적 알고리즘만 사용되므로 두 신경망의 학습 가능한 파라미터는 서로 동일합니다.

isequal(net3.Learnables.Value,net4.Learnables.Value)
ans = logical
   1

첫 번째 훈련 실행과 두 번째 훈련 실행 간에 첫 번째 컨벌루션 계층의 가중치 차이를 플로팅합니다. 이 플롯은 두 신경망의 가중치에 차이가 없음을 보여줍니다.

learnablesDiff = net3.Learnables.Value{1}(:) - net4.Learnables.Value{1}(:);
learnablesDiff = extractdata(learnablesDiff);

figure
bar(learnablesDiff)
ylabel("Difference in Weight Value")
xlabel("Learnable Parameter Number")

GPU 결정성 상태를 원래 값으로 복원합니다.

deep.gpu.deterministicAlgorithms(previousState);

참고 항목

| | (Parallel Computing Toolbox) | |

도움말 항목