Solución de problemas del Compilador de entrenamiento de SageMaker - Amazon SageMaker AI

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Solución de problemas del Compilador de entrenamiento de SageMaker

importante

Amazon Web Services (AWS) anuncia que no habrá nuevos lanzamientos o versiones del Compilador de entrenamiento de SageMaker. Puede seguir utilizando el Compilador de entrenamiento de SageMaker a través de los contenedores de aprendizaje profundo (DLC) de AWS existentes para entrenamiento de SageMaker. Es importante tener en cuenta que, si bien los DLC existentes siguen siendo accesibles, ya no recibirán parches ni actualizaciones de AWS, de acuerdo con la Política de compatibilidad del marco de contenedores de aprendizaje profundo de AWS.

Si se produce un error, puede utilizar la siguiente lista para intentar solucionar los problemas del trabajo de entrenamiento. Si necesita más ayuda, póngase en contacto con el equipo de SageMaker AI a través de AWS Soporte o Foros para desarrolladores de AWS para Amazon SageMaker AI.

El trabajo de entrenamiento no converge como se esperaba en comparación con el trabajo de entrenamiento nativo

Los problemas de convergencia van desde “el modelo no aprende cuando el Compilador de entrenamiento de SageMaker está encendido” hasta “el modelo aprende pero es más lento que el marco nativo”. En esta guía de solución de problemas, asumimos que la convergencia es correcta sin el Compilador de entrenamiento de SageMaker (en el marco nativo) y consideramos que esta es la base de referencia.

Ante estos problemas de convergencia, el primer paso es identificar si el problema se limita a la entrenamiento distribuida o si se debe a una entrenamiento con una sola GPU. El entrenamiento distribuido con Compilador de entrenamiento de SageMaker es una extensión del entrenamiento con una sola GPU con pasos adicionales.

  1. Configure un clúster con varias instancias o GPU.

  2. Distribuya los datos de entrada a todos los trabajadores.

  3. Sincronice las actualizaciones del modelo de todos los trabajadores.

Por lo tanto, cualquier problema de convergencia en la entrenamiento con una sola GPU se propaga a la entrenamiento distribuida con varios trabajadores.

Diagrama para solucionar los problemas de convergencia en los trabajos de entrenamiento al utilizar el Compilador de entrenamiento de SageMaker.

Los problemas de convergencia se producen en el entrenamiento con una sola GPU

Si el problema de convergencia se debe al entrenamiento con una sola GPU, es probable que se deba a una configuración incorrecta de los hiperparámetros o de las API torch_xla.

Comprobar los hiperparámetros

El entrenamiento con el Compilador de entrenamiento de SageMaker provoca un cambio en la huella de memoria de un modelo. El compilador decide de forma inteligente entre la reutilización y el recálculo, lo que provoca el correspondiente aumento o disminución del consumo de memoria. Para aprovechar esto, es esencial volver a ajustar el tamaño del lote y los hiperparámetros asociados al migrar un trabajo de entrenamiento al Compilador de entrenamiento de SageMaker. Sin embargo, los ajustes incorrectos de los hiperparámetros suelen provocar oscilaciones, pérdidas de entrenamiento y, posiblemente, una convergencia más lenta. En raras ocasiones, los hiperparámetros agresivos pueden provocar que el modelo no aprenda (la métrica de pérdida de entrenamiento no disminuye ni devuelve NaN). Para identificar si el problema de convergencia se debe a los hiperparámetros, realice una prueba paralela de dos trabajos de entrenamiento con y sin el Compilador de entrenamiento de SageMaker manteniendo todos los hiperparámetros iguales.

Compruebe si las API torch_xla están configuradas correctamente para el entrenamiento con una sola GPU

Si el problema de convergencia persiste con los hiperparámetros de referencia, debe comprobar si se ha hecho algún uso incorrecto de las API torch_xla, específicamente de las que se utilizan para actualizar el modelo. Básicamente, torch_xla sigue acumulando instrucciones (aplazando la ejecución) en forma de gráfico hasta que se le indique explícitamente que ejecute el gráfico acumulado. La función torch_xla.core.xla_model.mark_step() facilita la ejecución del gráfica acumulado. La ejecución del gráfico debe sincronizarse mediante esta función después de cada actualización del modelo y antes de imprimir y registrar cualquier variable. Si no incluye el paso de sincronización, el modelo podría utilizar valores obsoletos de la memoria durante las impresiones, los registros y las sucesivas pasadas, en lugar de utilizar los valores más recientes que deben sincronizarse después de cada iteración y actualización del modelo.

Puede resultar más complicado cuando se utiliza el Compilador de entrenamiento de SageMaker con técnicas de escalado de gradiente (posiblemente mediante el uso de AMP) o de recorte de gradiente. El orden apropiado para calcular los gradientes con AMP es el siguiente.

  1. Cálculo de gradientes con escalado

  2. Desescalado del gradiente, recorte del gradiente y, a continuación, escalado

  3. Actualización del modelo

  4. Sincronizar la ejecución del gráfico con mark_step()

Para encontrar las API adecuadas para las operaciones mencionadas en la lista, consulte la guía para migrar el script de entrenamiento al Compilador de entrenamiento de SageMaker.

Considerar la posibilidad de utilizar el ajuste automático de modelos

Si el problema de convergencia surge al volver a ajustar el tamaño del lote y los hiperparámetros asociados, como la tasa de aprendizaje, al utilizar el Compilador de entrenamiento de SageMaker, considere la posibilidad de utilizar el ajuste automático del modelo para ajustar los hiperparámetros. Puede consultar el cuaderno de ejemplo sobre cómo ajustar los hiperparámetros con el Compilador de entrenamiento de SageMaker.

Problemas de convergencia que se producen en el entrenamiento distribuida

Si el problema de convergencia persiste en el entrenamiento distribuido, es probable que se deba a una configuración incorrecta de la inicialización del peso o de las API torch_xla.

Comprobar la inicialización del peso entre los trabajadores

Si el problema de la convergencia surge al ejecutar un trabajo de entrenamiento distribuido con varios trabajadores, asegúrese de que haya un comportamiento determinista uniforme en todos los trabajadores estableciendo un valor inicial constante cuando proceda. Tenga cuidado con técnicas como la inicialización del peso, que implica laasignación al azar. Cada trabajador podría terminar entrenando a un modelo diferente en ausencia de una semilla constante.

Compruebe si las API torch_xla están configuradas correctamente para la entrenamiento distribuido

Si el problema persiste, es probable que se deba al uso incorrecto de las API torch_xla para el entrenamiento distribuido. Asegúrese de añadir lo siguiente en su estimador para configurar un clúster para el entrenamiento distribuido con el Compilador de entrenamiento de SageMaker.

distribution={'torchxla': {'enabled': True}}

Esto debería ir acompañado de una función _mp_fn(index) en el script de entrenamiento, que se invoque una vez por trabajador. Sin la función mp_fn(index), podría terminar dejando que cada uno de los trabajadores entrenar el modelo de forma independiente sin compartir las actualizaciones del modelo.

A continuación, asegúrese de utilizar la API torch_xla.distributed.parallel_loader.MpDeviceLoader junto con el muestreador de datos distribuido, tal y como se indica en la documentación sobre la migración del script de entrenamiento al Compilador de entrenamiento de SageMaker, como en el siguiente ejemplo.

torch.utils.data.distributed.DistributedSampler()

Esto garantiza que los datos de entrada se distribuyan correctamente entre todos los trabajadores.

Por último, para sincronizar las actualizaciones del modelo de todos los trabajadores, utilice torch_xla.core.xla_model._fetch_gradients para recopilar los gradientes de todos los trabajadores y torch_xla.core.xla_model.all_reduce combinar todos los gradientes recopilados en una sola actualización.

Puede resultar más complicado cuando se utiliza el Compilador de entrenamiento de SageMaker con técnicas de escalado de gradiente (posiblemente mediante el uso de AMP) o de recorte de gradiente. El orden apropiado para calcular los gradientes con AMP es el siguiente.

  1. Cálculo de gradientes con escalado

  2. Sincronización de gradientes entre todos los trabajadores

  3. Desescalado del gradiente, recorte del gradiente y, a continuación, escalado de gradiente

  4. Actualización del modelo

  5. Sincronizar la ejecución del gráfico con mark_step()

Tenga en cuenta que esta lista de verificación incluye un elemento adicional para sincronizar a todos los trabajadores, en comparación con la lista de verificación para el entrenamiento con una sola GPU.

El trabajo de entrenamiento falla debido a que falta la configuración de PyTorch/XLA

Si un trabajo de entrenamiento falla y aparece el mensaje de error Missing XLA configuration, es posible que se deba a un error de configuración en la cantidad de GPU por instancia que utilice.

XLA requiere variables de entorno adicionales para compilar el trabajo de entrenamiento. La variable de entorno que falta más comúnmente es GPU_NUM_DEVICES. Para que el compilador funcione correctamente, debe establecer esta variable de entorno igual al número de GPU por instancia.

Existen tres enfoques para configurar la variable de entorno GPU_NUM_DEVICES:

  • Método 1: utilice el argumento environment de la clase de estimador de SageMaker AI. Por ejemplo, si usa una instancia ml.p3.8xlarge que tiene cuatro GPU, haga lo siguiente:

    # Using the SageMaker Python SDK's HuggingFace estimator hf_estimator=HuggingFace( ... instance_type="ml.p3.8xlarge", hyperparameters={...}, environment={ ... "GPU_NUM_DEVICES": "4" # corresponds to number of GPUs on the specified instance }, )
  • Método 2: utilice el argumento hyperparameters de la clase de estimador de SageMaker AI y analícelo en su script de entrenamiento.

    1. Para especificar el número de GPU, añada un par clave-valor al argumento hyperparameters.

      Por ejemplo, si usa una instancia ml.p3.8xlarge que tiene cuatro GPU, haga lo siguiente:

      # Using the SageMaker Python SDK's HuggingFace estimator hf_estimator=HuggingFace( ... entry_point = "train.py" instance_type= "ml.p3.8xlarge", hyperparameters = { ... "n_gpus": 4 # corresponds to number of GPUs on specified instance } ) hf_estimator.fit()
    2. En su script de entrenamiento, analice el hiperparámetro n_gpus y especifíquelo como entrada para la variable de entorno GPU_NUM_DEVICES.

      # train.py import os, argparse if __name__ == "__main__": parser = argparse.ArgumentParser() ... # Data, model, and output directories parser.add_argument("--output_data_dir", type=str, default=os.environ["SM_OUTPUT_DATA_DIR"]) parser.add_argument("--model_dir", type=str, default=os.environ["SM_MODEL_DIR"]) parser.add_argument("--training_dir", type=str, default=os.environ["SM_CHANNEL_TRAIN"]) parser.add_argument("--test_dir", type=str, default=os.environ["SM_CHANNEL_TEST"]) parser.add_argument("--n_gpus", type=str, default=os.environ["SM_NUM_GPUS"]) args, _ = parser.parse_known_args() os.environ["GPU_NUM_DEVICES"] = args.n_gpus
  • Método 3: codifique de forma rígida la variable de entorno GPU_NUM_DEVICES en su script de entrenamiento. Por ejemplo, añada lo siguiente a su script si utiliza una instancia que tenga cuatro GPU.

    # train.py import os os.environ["GPU_NUM_DEVICES"] = 4
sugerencia

Para saber el número de dispositivos de GPU en las instancias de machine learning que desea utilizar, consulte Computación acelerada en la página de tipos de instancias de Amazon EC2.

El compilador de entrenamiento de SageMaker no reduce el tiempo total de entrenamiento

Si el tiempo total de entrenamiento no disminuye con el Compilador de entrenamiento de SageMaker, le recomendamos encarecidamente que consulte la página Prácticas recomendadas y consideraciones sobre el Compilador de entrenamiento de SageMaker para comprobar la configuración del entrenamiento, la estrategia de relleno para la forma del tensor de entrada y los hiperparámetros.