Solución de problemas de paralelismo de modelos - Amazon SageMaker

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 de paralelismo de modelos

Si se produce un error, puede utilizar la siguiente lista para intentar solucionar los problemas del trabajo de entrenamiento. Si el problema persiste, póngase en contacto con Soporte de AWS.

Consideraciones sobre el uso del SageMaker depurador con la biblioteca de paralelismo de SageMaker modelos

SageMaker El depurador no está disponible para la biblioteca de paralelismo de modelos. SageMaker El depurador está activado de forma predeterminada para todos los trabajos SageMaker TensorFlow y para los de PyTorch entrenamiento, y es posible que aparezca un error parecido al siguiente:

FileNotFoundError: [Errno 2] No such file or directory: '/opt/ml/checkpoints/metadata.json.sagemaker-uploading

Para solucionar este problema, deshabilite el depurador pasando debugger_hook_config=Falseal crear un marco estimator como se muestra en el siguiente ejemplo.

bucket=sagemaker.Session().default_bucket() base_job_name="sagemaker-checkpoint-test" checkpoint_in_bucket="checkpoints" # The S3 URI to store the checkpoints checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket) estimator = TensorFlow( ... distribution={"smdistributed": {"modelparallel": { "enabled": True }}}, checkpoint_s3_uri=checkpoint_s3_bucket, checkpoint_local_path="/opt/ml/checkpoints", debugger_hook_config=False )

Guardar puntos de control

Es posible que aparezca el siguiente error al guardar los puntos de control de un modelo grande en: SageMaker

InternalServerError: We encountered an internal error. Please try again

Esto podría deberse a una SageMaker limitación al cargar el punto de control local en Amazon S3 durante el entrenamiento. Para deshabilitar los puntos de control SageMaker, utilice el siguiente ejemplo para cargar los puntos de control de forma explícita.

Si te encuentras con el error anterior, no lo utilices checkpoint_s3_uri con la SageMaker estimator llamada. Al guardar puntos de control para modelos más grandes, recomendamos guardar los puntos de control en un directorio personalizado y pasar los mismos a la función auxiliar (como el argumento local_path).

import os def aws_s3_sync(source, destination): """aws s3 sync in quiet mode and time profile""" import time, subprocess cmd = ["aws", "s3", "sync", "--quiet", source, destination] print(f"Syncing files from {source} to {destination}") start_time = time.time() p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.wait() end_time = time.time() print("Time Taken to Sync: ", (end_time-start_time)) return def sync_local_checkpoints_to_s3(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from local path to s3 """ import boto3 #check if local path exists if not os.path.exists(local_path): raise RuntimeError("Provided local path {local_path} does not exist. Please check") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(local_path, s3_uri) return def sync_s3_checkpoints_to_local(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from s3 to local path """ import boto3 #try to create local path if it does not exist if not os.path.exists(local_path): print(f"Provided local path {local_path} does not exist. Creating...") try: os.makedirs(local_path) except Exception as e: raise RuntimeError(f"Failed to create {local_path}") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(s3_uri, local_path) return

Uso de funciones auxiliares:

#base_s3_uri - user input s3 uri or save to model directory (default) #curr_host - to save checkpoints of current host #iteration - current step/epoch during which checkpoint is saved # save checkpoints on every node using local_rank if smp.local_rank() == 0: base_s3_uri = os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', ''))) curr_host = os.environ['SM_CURRENT_HOST'] full_s3_uri = f'{base_s3_uri}/checkpoints/{curr_host}/{iteration}' sync_local_checkpoints_to_s3(local_path=checkpoint_dir, s3_uri=full_s3_uri)

Convergencia mediante modelos paralelos y TensorFlow

Al utilizar el entrenamiento con SageMaker varios nodos TensorFlow y la biblioteca de paralelismo de modelos, es posible que la pérdida no converja como se esperaba porque el orden de los archivos de entrada del entrenamiento puede ser diferente en cada nodo. Esto puede provocar que distintos rangos del mismo grupo de paralelismo de modelos funcionen en diferentes archivos de entrada, lo que provoca incoherencias. Para evitarlo, asegúrese de que los archivos de entrada estén ordenados de la misma manera en todos los rangos antes de convertirlos en conjuntos de datos. TensorFlow Una forma de lograrlo es ordenar los nombres de los archivos de entrada en el script de entrenamiento.

Estancamiento o bloqueo de trabajos de entrenamiento distribuido

Si su trabajo de entrenamiento tiene problemas de estancamiento, falla o no responde, lee los siguientes elementos de solución de problemas para identificar cuál es la causa del problema. Si necesita más ayuda, póngase en contacto con el equipo de formación SageMaker distribuida a través de AWS Support.

  • Si ve un trabajo de entrenamiento distribuido que se detiene en la etapa de inicialización de la NCCL, tenga en cuenta lo siguiente:

    • Si utiliza una de las instancias habilitadas para EFA (instancias ml.p4d o ml.p3dn) con una VPC personalizada y su subred, asegúrese de que el grupo de seguridad utilizado tenga conexiones entrantes y salientes para todos los puertos desde y hacia el mismo SG. Por lo general, también necesita conexiones salientes a cualquier IP como regla independiente (para acceso a Internet). Para obtener instrucciones sobre cómo agregar reglas entrantes y salientes para la comunicación EPT, consulte SageMaker el trabajo de formación distribuido se detiene durante la inicialización.

  • Si ve un trabajo de entrenamiento distribuido a la hora de verificar los puntos de control de todo el modelo, esto podría deberse a que la llamada state_dict() al modelo u optimizador no se haya realizado en todos los rangos con rdp_rank()==0 (cuando se utiliza paralelismo de tensores) o dp_rank()==0 (cuando se utiliza solo paralelismo de canalización). Estos rangos deben comunicarse para crear el punto de control que vaya a guardarse. También pueden ocurrir problemas de estancamiento similares al comprobar el optimizador parcial si shard_optimizer_state está habilitado.

    Para obtener más información sobre el punto de control de un modelo con paralelismo de modelos, consulte las Instrucciones generales para guardar y cargar y Controlar un PyTorch modelo distribuido (para la biblioteca de paralelismo de modelos entre las versiones 1.6.0 y SageMaker 1.9.0).

  • Si el trabajo de entrenamiento se bloquea con un Error de memoria sin memoria CUDA, esto significa que la configuración de entrenamiento distribuido debe ajustarse para adaptarse al modelo del clúster de GPU. Para obtener más información sobre las prácticas recomendadas, consulte Establecer la configuración correcta para un modelo determinado.

  • Si el trabajo de entrenamiento se bloquea con un error ECC incorregible, esto significa que una de las GPU del clúster se ha estropeado. Si necesita soporte técnico, comparta el ARN del trabajo con el equipo de AWS y reinicie su trabajo de entrenamiento desde un punto de control si es posible.

  • En raras ocasiones, una configuración de trabajo que funcionaba anteriormente pero que se aproxima a los límites de la memoria de la GPU podría fallar posteriormente con un clúster diferente debido a un Error de memoria sin memoria CUDA. Esto podría deberse a que algunas GPU tienen menos memoria disponible de lo habitual debido a errores de ECC.

  • Caída del tiempo de espera podría ocurrir cuando se ejecuta un trabajo multinodo que no utiliza todas las GPU del nodo. Para evitar esto, utilice todas las GPU del nodo asegurándose de que el processes_per_host se establece en el número de GPU de cada instancia. Por ejemplo, esto es processes_per_host=8 para las instancias ml.p3.16xlarge, ml.p3dn.24xlarge, y ml.p4d.24xlarge.

  • Si descubre que su trabajo de formación lleva mucho tiempo durante la fase de descarga de datos, asegúrese de que la ruta de Amazon S3 que proporcionó checkpoint_s3_uri para la SageMaker Estimator clase sea única para el trabajo de formación actual. Si esta ruta se reutiliza en varios trabajos de entrenamiento que se ejecutan simultáneamente, todos esos puntos de control se cargan y descargan en la misma ruta de Amazon S3 y podrían aumentar significativamente el tiempo de carga de los puntos de control.

  • Utilice FSx para Lustre cuando se esté ocupando de grandes datos y modelos.

    • Si el conjunto de datos es grande y recuperarlo lleva mucho tiempo, le recomendamos mantener el conjunto de datos en FSx para Lustre.

    • Cuando los modelos de entrenamiento superan los 10 000 millones de parámetros, recomendamos utilizar FSx para Lustre para puntos de control.

    • Después de crear un sistema de archivos, asegúrese de esperar a que el estado se convierta en disponible antes de comenzar un trabajo de entrenamiento con él.

Recibir un error de la NCCL para un trabajo de formación PyTorch

Si se produce el siguiente error, podría deberse a un proceso que se está quedando sin memoria de la GPU.

NCCL error in: ../torch/lib/c10d/ProcessGroupNCCL.cpp:825, unhandled system error, NCCL version 2.7.8 ncclSystemError: System call (socket, malloc, munmap, etc) failed.

Puede resolverlo reduciendo el tamaño del lote o active_microbatches. Si la partición automática no da como resultado una partición equilibrada, es posible que deba considerar la creación de particiones manuales. Para obtener más información, consulte Paralelismo de canalización entre nodos.

Recibir RecursionError un trabajo PyTorch de formación

La biblioteca no admite llamadas super.forward() dentro de la llamada de reenvío de un módulo. Si no puede crear super.forward(), es posible que reciba el siguiente mensaje de error.

RecursionError: maximum recursion depth exceeded

Para corregir el error, en lugar de llamar super.forward(), debe llamar super()._orig_forward().