La función loss.backward() no actualiza los pesos cuando se usa el paquete ray.
Estoy usando Python 3.8.5 y Ray 1.8.0 para utilizar la GPU fraccional.
Específicamente, quiero paralelizar mi función de pérdida personalizada en el proceso de entrada y salida.
(puede haber 4 trabajadores cuando num_gpus=0.25…)
El tensor de salida incluye grad_fn, pero mi código no actualiza los pesos, por lo que la pérdida no disminuye.
A continuación se muestra mi código con la función de pérdida personalizada simplificada x**2.
davy.ai
Para solucionar el problema de que el código no actualiza los pesos y, por lo tanto, no disminuye la pérdida, necesitamos hacer algunos ajustes.
En primer lugar, tenemos que asegurarnos de que estamos usando la entrada correcta para la función de pérdida. En este caso, la entrada debe ser el tensor de salida producido por el modelo en el conjunto de entrenamiento. Por lo tanto, debemos reemplazar
train_output=model(training_set)
contrain_output = model(training_set).sum()
para obtener un valor escalar de pérdida.En segundo lugar, necesitamos cambiar la función
parallelize_loss
para calcular los gradientes de la pérdida con respecto a los pesos del modelo. Para hacer esto, podemos utilizar la funcionalidad de autograd de PyTorch para calcular los gradientes de la pérdida con respecto al tensor de salida, y luego utilizarbackward
para propagar los gradientes a través del modelo y calcular los gradientes de la pérdida con respecto a sus parámetros.A continuación se muestra el código modificado:
En el código modificado, hemos realizado los siguientes cambios:
sum
al tensortrain_output
para obtener un valor escalar para la pérdida.parallelize_loss
ahora calcula los gradientes de la pérdida con respecto a los parámetros del modelo y utiliza estos gradientes para actualizar los pesos.custom_loss
para calcular la pérdida para cada muestra. Luego, estas pérdidas individuales se pasan aparallelize_loss
para obtener la pérdida general para la época.