Entrenar con un clúster heterogéneo - 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.

Entrenar con un clúster heterogéneo

Con la función de clúster heterogéneo de SageMaker Training, puede ejecutar un trabajo de formación con varios tipos de instancias de aprendizaje automático para ampliar y utilizar mejor los recursos para diferentes tareas y propósitos de formación de aprendizaje automático. Por ejemplo, si su trabajo de entrenamiento en un clúster con instancias de GPU tiene un bajo uso de la GPU y problemas de cuello de botella de la CPU debido a tareas que hacen un uso intensivo de la CPU, el uso de un clúster heterogéneo puede ayudarle a reducir la carga de tareas que hacen un uso intensivo de la CPU al agregar grupos de instancias de CPU más rentables, resolver estos problemas de cuello de botella y lograr un mejor uso de la GPU.

nota

Esta función está disponible en el SDK de SageMaker Python v2.98.0 y versiones posteriores.

nota

Esta función está disponible a través de las clases de estimador SageMaker PyTorchy TensorFlowframework. Los marcos compatibles son la PyTorch versión 1.10 o posterior y TensorFlow la versión 2.6 o posterior.

Cómo configurar un clúster heterogéneo

En esta sección se proporcionan instrucciones sobre cómo ejecutar un trabajo de entrenamiento con un clúster heterogéneo que consta de varios tipos de instancias.

Uso del SDK SageMaker de Python

Sigue las instrucciones sobre cómo configurar grupos de instancias para un clúster heterogéneo mediante el SDK de SageMaker Python.

  1. Para configurar grupos de instancias de un clúster heterogéneo para un trabajo de entrenamiento, utilice la clase sagemaker.instance_group.InstanceGroup. Puede especificar un nombre personalizado para cada grupo de instancias, el tipo de instancia y la cantidad de instancias para cada grupo de instancias. Para obtener más información, consulta sagemaker.instance_group. InstanceGroupen la documentación del SDK de SageMaker Python.

    nota

    Para obtener más información sobre los tipos de instancias disponibles y la cantidad máxima de grupos de instancias que puedes configurar en un clúster heterogéneo, consulta la referencia de la InstanceGroupAPI.

    En el siguiente ejemplo de código, se muestra cómo configurar dos grupos de instancias que constan de dos instancias ml.c5.18xlarge que solo utilizan CPU denominadas instance_group_1 y una instancia de GPU de ml.p3dn.24xlarge denominada instance_group_2, tal y como se muestra en el siguiente diagrama.

    The preceding diagram shows a conceptual example of how pre-training processes, such as data preprocessing, can be assigned to the CPU instance group and stream the preprocessed data to the GPU instance group.
    from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "instance_group_1", "ml.c5.18xlarge", 2 ) instance_group_2 = InstanceGroup( "instance_group_2", "ml.p3dn.24xlarge", 1 )
  2. Con los objetos de grupos de instancias, configura los canales de entrada de entrenamiento y asigna grupos de instancias a los canales mediante el instance_group_names argumento de sagemaker.inputs. TrainingInputclase. El argumento instance_group_names acepta una lista de cadenas de nombres de grupos de instancias.

    En el siguiente ejemplo, se muestra cómo configurar dos canales de entrada de entrenamiento y cómo asignar los grupos de instancias creados en el ejemplo del paso anterior. También puedes especificar las rutas de los buckets de Amazon S3 al argumento s3_data para que los grupos de instancias procesen los datos para sus fines de uso.

    from sagemaker.inputs import TrainingInput training_input_channel_1 = TrainingInput( s3_data_type='S3Prefix', # Available Options: S3Prefix | ManifestFile | AugmentedManifestFile s3_data='s3://your-training-data-storage/folder1', distribution='FullyReplicated', # Available Options: FullyReplicated | ShardedByS3Key input_mode='File', # Available Options: File | Pipe | FastFile instance_groups=["instance_group_1"] ) training_input_channel_2 = TrainingInput( s3_data_type='S3Prefix', s3_data='s3://your-training-data-storage/folder2', distribution='FullyReplicated', input_mode='File', instance_groups=["instance_group_2"] )

    Para obtener más información sobre los argumentos de TrainingInput, consulte los siguientes enlaces.

  3. Configure un SageMaker estimador con el instance_groups argumento tal y como se muestra en el siguiente ejemplo de código. El argumento instance_groups acepta una lista de objetos InstanceGroup

    PyTorch
    from sagemaker.pytorch import PyTorch estimator = PyTorch( ... entry_point='my-training-script.py', framework_version='x.y.z', # 1.10.0 or later py_version='pyxy', job_name='my-training-job-with-heterogeneous-cluster', instance_groups=[instance_group_1, instance_group_2] )
    TensorFlow
    from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... entry_point='my-training-script.py', framework_version='x.y.z', # 2.6.0 or later py_version='pyxy', job_name='my-training-job-with-heterogeneous-cluster', instance_groups=[instance_group_1, instance_group_2] )
    nota

    El instance_type par de instance_count argumentos y y el instance_groups argumento de la clase SageMaker estimadora se excluyen mutuamente. Para el entrenamiento de clústeres homogéneos, utilice el par de argumentos instance_type y instance_count. Para el entrenamiento de clústeres heterogéneos, utilice instance_groups.

    nota

    Para obtener una lista completa de los contenedores de framework, las versiones de framework y las versiones de Python disponibles, consulte SageMaker Framework Containers en el GitHub repositorio de AWS Deep Learning Container.

  4. Configure el método estimator.fit con los canales de entrada de entrenamiento configurados con los grupos de instancias e inicie el trabajo de entrenamiento.

    estimator.fit( inputs={ 'training': training_input_channel_1, 'dummy-input-channel': training_input_channel_2 } )

Uso de las API de bajo nivel SageMaker

Si utilizas las API AWS Command Line Interface o AWS SDK for Python (Boto3) y quieres utilizar SageMaker las API de bajo nivel para enviar una solicitud de trabajo de formación con un clúster heterogéneo, consulta las siguientes referencias de API.

Entrenamiento distribuido con un clúster heterogéneo

Mediante el distribution argumento de la clase SageMaker Estimator, puedes asignar un grupo de instancias específico para ejecutar un entrenamiento distribuido. Por ejemplo, supongamos que tiene los dos grupos de instancias siguientes y quiere ejecutar un entrenamiento con varias GPU en uno de ellos.

from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup("instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup("instance_group_2", "ml.p3dn.24xlarge", 2)

Puede establecer la configuración de entrenamiento distribuido para uno de los grupos de instancias. Por ejemplo, en los siguientes ejemplos de código se muestra cómo asignar training_group_2 con dos instancias de ml.p3dn.24xlarge a la configuración de entrenamiento distribuido.

nota

Actualmente, solo se puede especificar un grupo de instancias de un clúster heterogéneo en la configuración de distribución.

Con MPI

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "mpi": { "enabled": True, "processes_per_host": 8 }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "mpi": { "enabled": True, "processes_per_host": 8 }, "instance_groups": [instance_group_2] } )

Con la biblioteca paralela de SageMaker datos

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "dataparallel": { "enabled": True } }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "dataparallel": { "enabled": True } }, "instance_groups": [instance_group_2] } )
nota

Cuando utilices la biblioteca SageMaker data parallel, asegúrate de que el grupo de instancias esté formado por los tipos de instancias compatibles con la biblioteca.

Para obtener más información sobre la biblioteca SageMaker de datos paralelos, consulte SageMaker Data Parallel Training.

Con la biblioteca de SageMaker modelos paralelos

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # SageMaker model parallel parameters } } }, "instance_groups": [instance_group_2] } )
TensorFlow
from sagemaker.tensorflow import TensorFlow estimator = TensorFlow( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # SageMaker model parallel parameters } } }, "instance_groups": [instance_group_2] } )

Para obtener más información sobre la biblioteca paralela de SageMaker modelos, consulte SageMaker Model Parallel Training.

Modifique el script de entrenamiento para asignar grupos de instancias

Con la configuración de clústeres heterogéneos de las secciones anteriores, ha preparado el entorno y las instancias de SageMaker formación para su trabajo de formación. Para seguir asignando los grupos de instancias a determinadas tareas de entrenamiento y procesamiento de datos, el siguiente paso es modificar el script de entrenamiento. De forma predeterminada, el trabajo de entrenamiento simplemente crea réplicas de los scripts de entrenamiento para todos los nodos, independientemente del tamaño de la instancia, lo que podría provocar una pérdida de rendimiento.

Por ejemplo, si mezclas instancias de CPU e instancias de GPU en un clúster heterogéneo y, al mismo tiempo, pasas un guion de entrenamiento de redes neuronales profundas al entry_point argumento del SageMaker estimador, el entry_point script se replica en cada instancia. Esto significa que, sin la asignación de tareas adecuada, las instancias de CPU también ejecutan todo el script e inician el trabajo de entrenamiento diseñado para el entrenamiento distribuido en instancias de GPU. Por lo tanto, debe realizar cambios en las funciones de procesamiento específicas que quiera descargar y ejecutar en las instancias de CPU. Puede usar las variables de SageMaker entorno para recuperar la información del clúster heterogéneo y permitir que los procesos específicos se ejecuten en consecuencia.

Consulta la información del grupo de instancias durante la fase de inicialización de un trabajo de formación SageMaker

Cuando comienza el trabajo de formación, el guion de formación lee la información del entorno de SageMaker formación, que incluye la configuración de clústeres heterogéneos. La configuración contiene información como los grupos de instancias actuales, los hosts actuales de cada grupo y en qué grupo reside el host actual.

Puede recuperar la información del grupo de instancias de las siguientes maneras.

(Recomendado) Leer la información de los grupos de instancias con el kit de herramientas de SageMaker formación

Utilice el módulo Python del entorno que proporciona la biblioteca del kit de herramientas de SageMaker formación. La biblioteca del kit de herramientas viene preinstalada en los contenedores del SageMaker marco TensorFlow y PyTorch, por lo tanto, no es necesario realizar ningún paso de instalación adicional cuando se utilizan los contenedores prediseñados. Esta es la forma recomendada de recuperar las variables de SageMaker entorno con menos cambios de código en el script de entrenamiento.

from sagemaker_training import environment env = environment.Environment()

Variables de entorno relacionadas con el SageMaker entrenamiento general y los clústeres heterogéneos:

  • env.is_hetero: devuelve un resultado booleano independientemente de si un clúster heterogéneo está configurado o no.

  • env.current_host: devuelve el host actual.

  • env.current_instance_type: devuelve el tipo de instancia del host actual.

  • env.current_instance_group: devuelve el nombre del grupo de instancias actual.

  • env.current_instance_group_hosts: devuelve una lista de los hosts del grupo de instancias actual.

  • env.instance_groups: devuelve una lista de los nombres de los grupos de instancias utilizados para el entrenamiento.

  • env.instance_groups_dict: devuelve la configuración de clúster heterogénea completa del trabajo de entrenamiento.

  • env.distribution_instance_groups— Devuelve una lista de grupos de instancias asignados al distribution parámetro de la clase SageMaker estimadora.

  • env.distribution_hosts— Devuelve una lista de hosts que pertenecen a los grupos de instancias asignados al distribution parámetro de la clase SageMaker estimadora.

Por ejemplo, considere el siguiente ejemplo de un clúster heterogéneo que consta de dos grupos de instancias.

from sagemaker.instance_group import InstanceGroup instance_group_1 = InstanceGroup( "instance_group_1", "ml.c5.18xlarge", 1) instance_group_2 = InstanceGroup( "instance_group_2", "ml.p3dn.24xlarge", 2)

El resultado de env.instance_groups_dict del clúster heterogéneo de ejemplo debería ser similar al siguiente.

{ "instance_group_1": { "hosts": [ "algo-2" ], "instance_group_name": "instance_group_1", "instance_type": "ml.c5.18xlarge" }, "instance_group_2": { "hosts": [ "algo-3", "algo-1" ], "instance_group_name": "instance_group_2", "instance_type": "ml.p3dn.24xlarge" } }

(Opcional) Leer la información del grupo de instancias del archivo JSON de configuración de recursos

Si prefiere recuperar las variables de entorno en formato JSON, puede usar directamente el archivo JSON de configuración de recursos. El archivo JSON de una instancia de SageMaker entrenamiento se encuentra en, de forma /opt/ml/input/config/resourceconfig.json predeterminada, en.

file_path = '/opt/ml/input/config/resourceconfig.json' config = read_file_as_json(file_path) print(json.dumps(config, indent=4, sort_keys=True))

Consideraciones

Tenga en cuenta los siguientes aspectos al utilizar la característica de clúster heterogéneo.

  • Todos los grupos de instancias comparten la misma imagen de Docker y el mismo script de entrenamiento. Por lo tanto, debe modificar su script de entrenamiento para detectar a qué grupo de instancias pertenece y bifurcar la ejecución en consecuencia.

  • La función de clúster heterogéneo no se admite en el modo SageMaker local.

  • Los flujos de CloudWatch registro de Amazon de un trabajo de formación en clústeres heterogéneos no están agrupados por grupos de instancias. Tiene que averiguar a partir de los registros qué nodos están en cada grupo.

  • La función de clúster heterogéneo está disponible a través de las clases de estimadores SageMaker PyTorchy TensorFlowFramework. Los marcos compatibles son la PyTorch versión 1.10 o posterior y la versión 2.6 o posterior. TensorFlow Para obtener una lista completa de los contenedores de framework, las versiones de framework y las versiones de Python disponibles, consulte SageMaker Framework Containers en el GitHub repositorio de AWS Deep Learning Container.

  • Una estrategia de entrenamiento distribuida solo se puede aplicar a un grupo de instancias.

Ejemplos, blogs y estudios de casos

En el siguiente blog se analizan casos prácticos sobre el uso de la formación en clústeres SageMaker heterogéneos.