Effettua il training e l’inferenza su migliaia di modelli di apprendimento automatico con Amazon SageMaker

Addestra e testa migliaia di modelli di machine learning con Amazon SageMaker

Man mano che il machine learning (ML) diventa sempre più diffuso in una vasta gamma di settori, le organizzazioni si trovano nella necessità di addestrare e utilizzare un gran numero di modelli di ML per soddisfare le diverse esigenze dei loro clienti. In particolare, per i fornitori di software come servizio (SaaS), la capacità di addestrare e servire migliaia di modelli in modo efficiente ed economico è fondamentale per rimanere competitivi in un mercato in continua evoluzione.

Addestrare e servire migliaia di modelli richiede un’infrastruttura robusta e scalabile, ed è qui che Amazon SageMaker può aiutare. SageMaker è una piattaforma completamente gestita che consente agli sviluppatori e ai data scientist di costruire, addestrare e distribuire rapidamente modelli di ML, offrendo anche i vantaggi in termini di risparmio economico dell’utilizzo dell’infrastruttura del cloud AWS.

In questo post, esploreremo come è possibile utilizzare le funzionalità di SageMaker, tra cui Amazon SageMaker Processing, i job di addestramento di SageMaker e i punti di distribuzione multi-modello (MME) di SageMaker, per addestrare e servire migliaia di modelli in modo economico. Per iniziare con la soluzione descritta, è possibile fare riferimento al notebook correlato su GitHub.

Caso d’uso: Previsione energetica

In questo post, assumiamo il ruolo di un’azienda ISV che aiuta i propri clienti a diventare più sostenibili monitorando il consumo energetico e fornendo previsioni. La nostra azienda ha 1.000 clienti che desiderano comprendere meglio il loro utilizzo energetico e prendere decisioni informate su come ridurre il loro impatto ambientale. A tal fine, utilizziamo un dataset sintetico e addestriamo un modello di ML basato su Prophet per ciascun cliente al fine di effettuare previsioni di consumo energetico. Con SageMaker, possiamo addestrare e servire in modo efficiente questi 1.000 modelli, fornendo ai nostri clienti informazioni precise e azioni concrete sul loro utilizzo energetico.

Il dataset generato presenta tre caratteristiche:

  • customer_id: si tratta di un identificatore numerico per ogni cliente, compreso tra 0 e 999.
  • timestamp: si tratta di un valore data/ora che indica il momento in cui è stato misurato il consumo energetico. I timestamp sono generati in modo casuale tra le date di inizio e fine specificate nel codice.
  • consumption: si tratta di un valore numerico decimale che indica il consumo energetico, misurato in un’unità arbitraria. I valori di consumo sono generati in modo casuale tra 0 e 1.000 con una stagionalità sinusoidale.

Panoramica della soluzione

Per addestrare e servire in modo efficiente migliaia di modelli di ML, possiamo utilizzare le seguenti funzionalità di SageMaker:

  • SageMaker Processing: SageMaker Processing è un servizio completamente gestito per la preparazione dei dati che consente di eseguire operazioni di elaborazione dei dati e valutazione dei modelli sui dati di input. È possibile utilizzare SageMaker Processing per trasformare i dati grezzi nel formato necessario per l’addestramento e l’inferenza, nonché per eseguire valutazioni batch e online dei modelli.
  • SageMaker training jobs: è possibile utilizzare SageMaker training jobs per addestrare modelli con una varietà di algoritmi e tipi di dati di input, e specificare le risorse di calcolo necessarie per l’addestramento.
  • SageMaker MMEs: i punti di distribuzione multi-modello consentono di ospitare più modelli su un singolo endpoint, semplificando la fornitura di previsioni da più modelli tramite una singola API. I punti di distribuzione multi-modello di SageMaker possono risparmiare tempo e risorse riducendo il numero di endpoint necessari per fornire previsioni da più modelli. I MME supportano la distribuzione sia di modelli basati su CPU che su GPU. Nota che nel nostro scenario utilizziamo 1.000 modelli, ma questa non è una limitazione del servizio stesso.

Il diagramma seguente illustra l’architettura della soluzione.

Il flusso di lavoro include i seguenti passaggi:

  1. Utilizziamo SageMaker Processing per elaborare i dati e creare un singolo file CSV per ogni cliente, salvandolo in Amazon Simple Storage Service (Amazon S3).
  2. Il job di addestramento di SageMaker è configurato per leggere l’output del job di SageMaker Processing e distribuirlo in modo round-robin alle istanze di addestramento. Nota che questo può essere ottenuto anche con Amazon SageMaker Pipelines.
  3. Gli artefatti del modello sono archiviati in Amazon S3 dal job di addestramento e vengono serviti direttamente dal MME di SageMaker.

Scalare l’addestramento a migliaia di modelli

La scalabilità dell’addestramento di migliaia di modelli è possibile tramite il parametro distribution della classe TrainingInput nel SageMaker Python SDK, che consente di specificare come i dati vengono distribuiti su più istanze di addestramento per un job di addestramento. Ci sono tre opzioni per il parametro distribution: FullyReplicated, ShardedByS3Key e ShardedByRecord. L’opzione ShardedByS3Key significa che i dati di addestramento sono suddivisi per chiave oggetto S3, con ciascuna istanza di addestramento che riceve un sottoinsieme univoco dei dati, evitando la duplicazione. Dopo che i dati sono copiati da SageMaker nei contenitori di addestramento, possiamo leggere la struttura di cartelle e file per addestrare un modello univoco per ogni file cliente. Di seguito è riportato un esempio di codice:

# Si assume che i dati di addestramento siano già in un bucket S3, passare la cartella principale
s3_input_train = sagemaker.inputs.TrainingInput(
    s3_data='s3://my-bucket/customer_data',
    distribution='ShardedByS3Key'
)

# Creare un estimatore SageMaker e impostare l'input di addestramento
estimator = sagemaker.estimator.Estimator(...)
estimator.fit(inputs=s3_input_train)

Ogni job di addestramento di SageMaker memorizza il modello salvato nella cartella /opt/ml/model del contenitore di addestramento prima di archiviarlo in un file model.tar.gz, per poi caricarlo su Amazon S3 al termine del job di addestramento. Gli utenti avanzati possono automatizzare questo processo anche con SageMaker Pipelines. Quando si memorizzano più modelli tramite lo stesso job di addestramento, SageMaker crea un singolo file model.tar.gz contenente tutti i modelli addestrati. Ciò significa che, per servire il modello, è necessario prima decomprimere l’archivio. Per evitare ciò, vengono utilizzati i checkpoint per salvare lo stato dei singoli modelli. SageMaker fornisce la funzionalità di copiare i checkpoint creati durante il job di addestramento su Amazon S3. Qui, i checkpoint devono essere salvati in una posizione predefinita, con il valore predefinito /opt/ml/checkpoints. Questi checkpoint possono essere utilizzati per riprendere l’addestramento in un momento successivo o come modello da distribuire su un endpoint. Per un riepilogo generale su come la piattaforma di addestramento di SageMaker gestisce i percorsi di archiviazione per i dataset di addestramento, gli artefatti di modello, i checkpoint e gli output tra l’archiviazione cloud di AWS e i job di addestramento in SageMaker, fare riferimento alla documentazione Amazon SageMaker Training Storage Folders for Training Datasets, Checkpoints, Model Artifacts, and Outputs.

Il codice seguente utilizza una funzione model.save() fittizia all’interno dello script train.py che contiene la logica di addestramento:

import tarfile
import boto3
import os

[... parsing degli argomenti...]

for customer in os.list_dir(args.input_path):
    
    # Leggi i dati localmente all'interno del job di addestramento
    df = pd.read_csv(os.path.join(args.input_path, customer, 'data.csv'))
    
    # Definisci e addestra il modello
    model = MyModel()
    model.fit(df)
            
    # Salva il modello nella cartella di output
    with open(os.path.join(output_dir, 'model.json'), 'w') as fout:
        fout.write(model_to_json(model))
    
    # Crea l'archivio model.tar.gz contenente il modello e lo script di addestramento
    with tarfile.open(os.path.join(output_dir, '{customer}.tar.gz'), "w:gz") as tar:
        tar.add(os.path.join(output_dir, 'model.json'), "model.json")
        tar.add(os.path.join(args.code_dir, "training.py"), "training.py")

Scala l’inferenza a migliaia di modelli con SageMaker MMEs

SageMaker MME consente di servire contemporaneamente più modelli creando una configurazione dell’endpoint che include una lista di tutti i modelli da servire, per poi creare un endpoint utilizzando quella configurazione. Non è necessario ridistribuire l’endpoint ogni volta che si aggiunge un nuovo modello, perché l’endpoint servirà automaticamente tutti i modelli memorizzati nei percorsi S3 specificati. Ciò è possibile grazie a Multi Model Server (MMS), un framework open-source per il servizio di modelli di machine learning che può essere installato in contenitori per fornire l’interfaccia che soddisfa i requisiti per le nuove API del contenitore MME. Inoltre, è possibile utilizzare altri server di modelli, tra cui TorchServe e Triton. MMS può essere installato nel proprio contenitore personalizzato tramite il toolkit per l’inferenza di SageMaker. Per ulteriori informazioni su come configurare il Dockerfile per includere MMS e utilizzarlo per servire i propri modelli, fare riferimento alla documentazione Build Your Own Container for SageMaker Multi-Model Endpoints.

Il seguente frammento di codice mostra come creare un MME utilizzando il SageMaker Python SDK:

from sagemaker.multidatamodel import MultiDataModel

# Crea la definizione del MultiDataModel
multimodel = MultiDataModel(
    name='customer-models',
    model_data_prefix=f's3://{bucket}/scaling-thousand-models/models',
    model=your_model,
)

# Distribuisci su un endpoint in tempo reale
predictor = multimodel.deploy(
    initial_instance_count=1,
    instance_type='ml.c5.xlarge',
)

Quando il MME è attivo, possiamo invocarlo per generare previsioni. Le invocazioni possono essere effettuate con qualsiasi SDK AWS così come con il SageMaker Python SDK, come mostrato nel seguente frammento di codice:

predictor.predict(
    data='{"period": 7}',             # i dati da inviare, in questo caso JSON
    target_model='{customer}.tar.gz'  # il nome del modello di destinazione
)

Quando si chiama un modello, il modello viene inizialmente caricato da Amazon S3 sull’istanza, il che può comportare un avvio a freddo quando si chiama un nuovo modello. I modelli utilizzati frequentemente vengono memorizzati nella cache in memoria e su disco per fornire inferenze a bassa latenza.

Conclusione

SageMaker è una piattaforma potente ed economica per addestrare e servire migliaia di modelli di machine learning. Le sue funzionalità, tra cui SageMaker Processing, i job di addestramento e i MME, consentono alle organizzazioni di addestrare ed erogare efficientemente migliaia di modelli su larga scala, beneficiando anche dei vantaggi di risparmio dei costi dell’infrastruttura del cloud AWS. Per saperne di più su come utilizzare SageMaker per addestrare e servire migliaia di modelli, consultare Elaborazione dei dati, Addestrare un modello con Amazon SageMaker e Ospitare più modelli in un unico contenitore dietro un endpoint.