

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Esecuzione di job di addestramento in un cluster eterogeneo
<a name="train-heterogeneous-cluster"></a>

Utilizzando la funzionalità di cluster eterogeneo di SageMaker Training, puoi eseguire un processo di formazione con diversi tipi di istanze ML per una migliore scalabilità e utilizzo delle risorse per diverse attività e scopi di formazione ML. Ad esempio, se il processo di addestramento su un cluster con istanze GPU presenta un basso utilizzo della GPU e problemi di collo di bottiglia della CPU a causa di attività che richiedono un uso intensivo della CPU, l'utilizzo di un cluster eterogeneo può contribuire a ridurre il carico di attività che richiedono un uso intensivo della CPU aggiungendo gruppi di istanze CPU più convenienti, risolvere tali problemi e ottenere un migliore utilizzo della GPU.

**Nota**  
Questa funzionalità è disponibile in SageMaker Python SDK v2.98.0 e versioni successive.

**Nota**  
Questa funzionalità è disponibile tramite le classi SageMaker AI [PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html)e Framework Estimator. [TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator) I framework supportati sono la versione PyTorch 1.10 o successiva e la versione 2.6 o successiva. TensorFlow 

Consulta anche il blog [Migliora il rapporto prezzo/prestazioni del tuo modello di formazione utilizzando i cluster eterogenei di Amazon SageMaker AI](https://aws.amazon.com/blogs/machine-learning/improve-price-performance-of-your-model-training-using-amazon-sagemaker-heterogeneous-clusters/).

**Topics**
+ [Configura un processo di formazione con un cluster eterogeneo in Amazon AI SageMaker](train-heterogeneous-cluster-configure.md)
+ [Esegui corsi di formazione distribuiti su un cluster eterogeneo in Amazon AI SageMaker](train-heterogeneous-cluster-configure-distributed.md)
+ [Modificare uno script di addestramento per assegnare gruppi di istanze](train-heterogeneous-cluster-modify-training-script.md)

# Configura un processo di formazione con un cluster eterogeneo in Amazon AI SageMaker
<a name="train-heterogeneous-cluster-configure"></a>

Questa sezione fornisce istruzioni su come eseguire un processo di addestramento utilizzando un cluster eterogeneo composto da più tipi di istanze.

Prima di iniziare, considera quanto segue. 
+ Tutti i gruppi di istanze condividono la stessa immagine Docker e lo stesso script di addestramento. Pertanto, lo script di addestramento deve essere modificato per rilevare a quale gruppo di istanze appartiene e modificare di conseguenza l'esecuzione.
+ La funzionalità di cluster eterogeneo non è compatibile con la modalità locale AI. SageMaker 
+ I flussi di CloudWatch log Amazon di un processo di formazione su cluster eterogenei non sono raggruppati per gruppi di istanze. È necessario capire dai log quali nodi si trovano in quale gruppo.

**Topics**
+ [Opzione 1: utilizzo dell' SageMaker SDK Python](#train-heterogeneous-cluster-configure-pysdk)
+ [Opzione 2: utilizzo del livello basso SageMaker APIs](#train-heterogeneous-cluster-configure-api)

## Opzione 1: utilizzo dell' SageMaker SDK Python
<a name="train-heterogeneous-cluster-configure-pysdk"></a>

Segui le istruzioni su come configurare i gruppi di istanze per un cluster eterogeneo utilizzando Python SageMaker SDK.

1. Per configurare i gruppi di istanze di un cluster eterogeneo per un processo di addestramento, usa la classe `sagemaker.instance_group.InstanceGroup`. Puoi specificare un nome personalizzato per ogni gruppo di istanze, il tipo di istanze e il numero di istanze per ogni gruppo di istanze. [Per ulteriori informazioni, consulta sagemaker.instance\$1group. InstanceGroup](https://sagemaker.readthedocs.io/en/stable/api/utility/instance_group.html)nella documentazione di *SageMaker AI Python SDK*.
**Nota**  
Per ulteriori informazioni sui tipi di istanze disponibili e sul numero massimo di gruppi di istanze che è possibile configurare in un cluster eterogeneo, consulta il riferimento alle API. [ InstanceGroup](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_InstanceGroup.html)

   Il seguente esempio di codice mostra come impostare due gruppi di istanze composti da due istanze denominate solo CPU `ml.c5.18xlarge` denominate `instance_group_1` e un’istanza GPU `ml.p3dn.24xlarge` denominata `instance_group_2`, come illustrato nel diagramma seguente.  
![\[Un esempio concettuale di come i dati possono essere assegnati in SageMaker Training Job.\]](http://docs.aws.amazon.com/it_it/sagemaker/latest/dg/images/HCTraining.png)

   Il diagramma precedente mostra un esempio concettuale di come i processi di preaddestramento, come la pre-elaborazione dei dati, possono essere assegnati al gruppo di istanze della CPU e trasmettere i dati pre-elaborati in streaming al gruppo di istanze della GPU.

   ```
   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
   )
   ```

1. [Utilizzando gli oggetti del gruppo di istanze, impostate i canali di input di formazione e assegnate i gruppi di istanze ai canali tramite l'`instance_group_names`argomento di sagemaker.inputs. TrainingInput](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html)classe. L'argomento `instance_group_names` accetta un elenco di stringhe di nomi di gruppi di istanze.

   L'esempio seguente mostra come impostare due canali di input di addestramento e assegnare i gruppi di istanze creati nell'esempio della fase precedente. Puoi anche specificare i percorsi dei bucket di Amazon S3 all'argomento `s3_data` affinché i gruppi di istanze elaborino i dati per i tuoi scopi di utilizzo.

   ```
   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"]
   )
   ```

   Per ulteriori informazioni sugli argomenti di `TrainingInput`, consulta i seguenti link.
   + Il [sagemaker.inputs. TrainingInput](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html)classe nella documentazione di *SageMaker Python SDK*
   + *L'API [S3](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html) nell'AI DataSource API Reference SageMaker *

1. Configura uno stimatore SageMaker AI con l'`instance_groups`argomento come mostrato nel seguente esempio di codice. L’argomento `instance_groups` accetta un elenco di oggetti `InstanceGroup`.
**Nota**  
La funzionalità di cluster eterogeneo è disponibile tramite le classi SageMaker AI [PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html)e [TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator)Framework Estimator. I framework supportati sono la versione PyTorch 1.10 o successiva e la versione 2.6 o successiva. TensorFlow Per trovare un elenco completo dei contenitori di framework disponibili, delle versioni del framework e delle versioni Python, consulta [SageMaker AI Framework Containers](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) nel repository AWS Deep Learning Container GitHub .

------
#### [ 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**  
La coppia `instance_type` e `instance_count` argument e l'`instance_groups`argomento della classe SageMaker AI estimator si escludono a vicenda. Per un addestramento omogeneo dei cluster, utilizza la coppia di argomenti `instance_type` e `instance_count`. Per un addestramento eterogeneo su cluster, usa `instance_groups`.
**Nota**  
Per trovare un elenco completo dei contenitori di framework disponibili, delle versioni del framework e delle versioni Python, consulta [SageMaker AI Framework Containers](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) nel repository AWS Deep Learning Container GitHub .

1. Configura il metodo `estimator.fit` con i canali di input di addestramento configurati con i gruppi di istanze e avvia il processo di addestramento.

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

## Opzione 2: utilizzo del livello basso SageMaker APIs
<a name="train-heterogeneous-cluster-configure-api"></a>

Se utilizzi AWS Command Line Interface o AWS SDK per Python (Boto3) e desideri utilizzare il livello basso SageMaker APIs per inviare una richiesta di lavoro di formazione con un cluster eterogeneo, consulta i seguenti riferimenti API.
+ [CreateTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html)
+ [ResourceConfig ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ResourceConfig.html)
+ [InstanceGroup](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_InstanceGroup.html)
+ [S3DataSource](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html)

# Esegui corsi di formazione distribuiti su un cluster eterogeneo in Amazon AI SageMaker
<a name="train-heterogeneous-cluster-configure-distributed"></a>

Tramite l'`distribution`argomento della classe SageMaker AI estimator, puoi assegnare un gruppo di istanze specifico per eseguire la formazione distribuita. Ad esempio, supponiamo di avere i seguenti due gruppi di istanze e di voler eseguire un addestramento multi-GPU su uno di essi. 

```
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)
```

Puoi impostare la configurazione di addestramento distribuito per uno dei gruppi di istanze. Ad esempio, i seguenti esempi di codice mostrano come assegnare `training_group_2` con due istanze `ml.p3dn.24xlarge` alla configurazione di addestramento distribuito.

**Nota**  
Attualmente, è possibile specificare solo un gruppo di istanze di un cluster eterogeneo per la configurazione di distribuzione.

**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 libreria parallela di dati SageMaker AI**

------
#### [ 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**  
Quando usi la libreria parallela di dati SageMaker AI, assicurati che il gruppo di istanze sia composto [dai tipi di istanze supportati dalla libreria](https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-data-parallel-support.html#distributed-data-parallel-supported-instance-types). 

Per ulteriori informazioni sulla libreria parallela di dati SageMaker AI, consulta [SageMaker AI Data Parallel Training](https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel.html).

**Con la libreria parallela di modelli SageMaker AI**

------
#### [ PyTorch ]

```
from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    ...
    instance_groups=[instance_group_1, instance_group_2],
    distribution={
        "smdistributed": {
            "modelparallel": {
                "enabled":True,
                "parameters": {
                    ...   # SageMaker AI 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 AI model parallel parameters
                } 
            }
        }, 
        "instance_groups": [instance_group_2]
    }
)
```

------

Per ulteriori informazioni sulla libreria parallela di modelli SageMaker AI, consulta [SageMaker AI Model Parallel Training](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel.html).

# Modificare uno script di addestramento per assegnare gruppi di istanze
<a name="train-heterogeneous-cluster-modify-training-script"></a>

Con la configurazione eterogenea del cluster illustrata nelle sezioni precedenti, hai preparato l'ambiente e le istanze di formazione per il tuo lavoro di SageMaker formazione. Per assegnare ulteriormente i gruppi di istanze a determinati processi di addestramento ed elaborazione dei dati, la fase successiva consiste nel modificare lo script di addestramento. Per impostazione predefinita, il processo di addestramento crea semplicemente repliche degli script di addestramento per tutti i nodi indipendentemente dalla dimensione dell'istanza, e ciò potrebbe comportare una perdita di prestazioni. 

Ad esempio, se mescoli istanze di CPU e istanze GPU in un cluster eterogeneo mentre passi uno script di addestramento approfondito della rete neurale all'`entry_point`argomento dello stimatore AI, lo script viene replicato su ogni istanza. SageMaker `entry_point` Ciò significa che, senza un'adeguata assegnazione delle attività, le istanze CPU eseguono anche l'intero script e avviano il processo di addestramento progettato per l'addestramento distribuito su istanze GPU. Pertanto, dovrai apportare modifiche alle funzioni di elaborazione specifiche che desideri scaricare ed eseguire sulle istanze della CPU. È possibile utilizzare le variabili di ambiente SageMaker AI per recuperare le informazioni del cluster eterogeneo e consentire l'esecuzione di processi specifici di conseguenza.

All'inizio del processo di formazione, lo script di formazione legge le informazioni sull'ambiente di formazione che includono la SageMaker configurazione di cluster eterogenei. La configurazione contiene informazioni come i gruppi di istanze correnti, gli host correnti di ciascun gruppo e in quale gruppo risiede l'host corrente.

È possibile interrogare le informazioni sul gruppo di istanze durante la fase di inizializzazione di un processo di formazione sull' SageMaker intelligenza artificiale nei seguenti modi.

**(Consigliato) Leggere le informazioni sul gruppo di istanze con il toolkit SageMaker di formazione**

Usa il modulo di ambiente Python fornito dalla libreria di [toolkit SageMaker di formazione](https://github.com/aws/sagemaker-training-toolkit). La libreria del toolkit è preinstallata nei [contenitori del SageMaker framework](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) per TensorFlow and PyTorch, quindi non è necessaria una fase di installazione aggiuntiva quando si utilizzano i contenitori predefiniti. Questo è il metodo consigliato per recuperare le variabili di ambiente SageMaker AI con un minor numero di modifiche al codice nello script di addestramento.

```
from sagemaker_training import environment

env = environment.Environment()
```

Variabili di ambiente relative alla SageMaker formazione generale e ai cluster eterogenei:
+ `env.is_hetero`— Restituisce un risultato booleano indipendentemente dal fatto che un cluster eterogeneo sia configurato o meno.
+ `env.current_host`— Restituisce l'host corrente.
+ `env.current_instance_type`— Restituisce il tipo di istanza dell'host corrente.
+ `env.current_instance_group`— Restituisce il nome del gruppo di istanze corrente.
+ `env.current_instance_group_hosts`— Restituisce un elenco di host nel gruppo di istanze corrente.
+ `env.instance_groups`— Restituisce un elenco di nomi di gruppi di istanze utilizzati per l'addestramento.
+ `env.instance_groups_dict`— Restituisce l'intera configurazione del cluster eterogeneo del processo di addestramento.
+ `env.distribution_instance_groups`— Restituisce un elenco di gruppi di istanze assegnati al `distribution` parametro della classe di stima AI SageMaker .
+ `env.distribution_hosts`— Restituisce un elenco di host appartenenti ai gruppi di istanze assegnati al `distribution` parametro della classe di stima SageMaker AI.

Ad esempio, si consideri il seguente esempio di cluster eterogeneo costituito da due gruppi di istanze.

```
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)
```

L'output di `env.instance_groups_dict` del cluster eterogeneo di esempio deve essere simile al seguente.

```
{
    "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"
    }
}
```

**(Facoltativo) Lettura delle informazioni sul gruppo di istanze dal file JSON di configurazione delle risorse**

Se preferisci recuperare le variabili di ambiente in formato JSON, puoi utilizzare direttamente il file JSON di configurazione delle risorse. Per impostazione predefinita, il file JSON in un'istanza di SageMaker formazione si trova in`/opt/ml/input/config/resourceconfig.json`.

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