Contenido principal

Reproducir un entrenamiento de red en una GPU

Desde R2024b

En este ejemplo se muestra cómo entrenar una red varias veces en una GPU y obtener resultados idénticos.

Garantizar la reproducibilidad del entrenamiento y la inferencia de un modelo en la GPU puede ser beneficioso para la experimentación y la depuración. Reproducir el entrenamiento de un modelo en la GPU es especialmente importante en la verificación de sistemas de deep learning.

Preparar los datos de entrenamiento y la red

Utilice las funciones de soporte prepareDigitsData y prepareAutoencoderLayers para preparar los datos de entrenamiento y la arquitectura de la red. Estas funciones preparan los datos y crean la red del codificador automático tal como se describe en el ejemplo Prepare Datastore for Image-to-Image Regression y se añaden a este ejemplo como archivos de soporte.

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

Definir opciones de entrenamiento

Especifique las opciones de entrenamiento. Las opciones son las mismas que las del ejemplo Prepare Datastore for Image-to-Image Regression, con estas excepciones.

  • Entrenar durante 5 épocas. Cinco épocas no son suficientes para que la red converja, pero son suficientes para demostrar si el entrenamiento es reproducible de forma exacta.

  • Devolver la red correspondiente a la última iteración de entrenamiento. Hacer esto garantiza una comparación justa cuando se comparen las redes entrenadas.

  • Entrenar la red en una GPU. De forma predeterminada, la función trainnet usa una GPU en caso de que esté disponible. Para entrenar en una GPU se requiere una licencia de Parallel Computing Toolbox™ y un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox).

  • Deshabilitar todas las visualizaciones.

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

Compruebe si se ha seleccionado una GPU y si está disponible para el entrenamiento.

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

Entrenar una red dos veces y comparar resultados

Entrene la red dos veces con la función trainnet. Para garantizar que la generación de números aleatorios no afecta al entrenamiento, establezca el generador de números aleatorios y semilla en la CPU y la GPU antes del entrenamiento con las funciones rng y gpurng (Parallel Computing Toolbox), respectivamente.

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

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

Compruebe si los parámetros que se pueden aprender de las redes entrenadas son iguales. Dado que el entrenamiento utiliza algoritmos no deterministas, los parámetros que se pueden aprender de las dos redes son diferentes.

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

Represente la diferencia entre los pesos de la primera capa de convolución entre la primera ejecución del entrenamiento y la segunda ejecución del entrenamiento. La gráfica muestra que existe una pequeña diferencia en los pesos de las dos redes.

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

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

Establecer la opción de determinismo y entrenar redes

Utilice la función deep.gpu.deterministicAlgorithms para establecer el estado de determinismo de la GPU en true y capture el estado anterior de determinismo de la GPU para que pueda restablecerlo más adelante. Todas las llamadas posteriores a operaciones de deep learning de la GPU utilizan solo algoritmos deterministas.

previousState = deep.gpu.deterministicAlgorithms(true);

Entrene la red dos veces con la función trainnet, estableciendo el generador de números aleatorios y semilla de la CPU y la GPU cada vez. Usar únicamente algoritmos deterministas puede ralentizar el entrenamiento y la inferencia.

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

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

Compruebe si los parámetros que se pueden aprender de las redes entrenadas son iguales. Dado que solo se utilizan algoritmos deterministas, los parámetros que se pueden aprender de las dos redes son iguales.

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

Represente la diferencia entre los pesos de la primera capa de convolución entre la primera ejecución del entrenamiento y la segunda ejecución del entrenamiento. La gráfica muestra que no existe diferencia en los pesos de las dos redes.

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

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

Restablezca el estado de determinismo de la GPU a su valor original.

deep.gpu.deterministicAlgorithms(previousState);

Consulte también

| | (Parallel Computing Toolbox) | |

Temas