Pianifica lavori di notebook Amazon SageMaker e gestisci flussi di lavoro a più passaggi utilizzando le API

Organizza i tuoi lavori di notebook su Amazon SageMaker e gestisci flussi di lavoro con API a più passaggi

Amazon SageMaker Studio fornisce una soluzione completamente gestita per i data scientist per creare, addestrare e distribuire modelli di apprendimento automatico (ML) in modo interattivo. I lavori del quaderno di Amazon SageMaker consentono ai data scientist di eseguire i loro quaderni su richiesta o su un programma con pochi clic in SageMaker Studio. Con questo lancio, è possibile eseguire programmaticamente quaderni come lavori utilizzando le API fornite da Amazon SageMaker Pipelines, la funzionalità di orchestrizzazione del flusso di lavoro di ML di Amazon SageMaker. Inoltre, è possibile creare un flusso di lavoro di ML a più passi con più quaderni dipendenti utilizzando queste API.

SageMaker Pipelines è uno strumento nativo di orchestrazione del flusso di lavoro per la creazione di flussi di lavoro di ML che sfruttano l’integrazione diretta di SageMaker. Ogni flusso di lavoro di SageMaker è composto da passaggi, che corrispondono a singoli compiti come l’elaborazione, l’addestramento o l’elaborazione dei dati utilizzando Amazon EMR. I lavori del quaderno di SageMaker sono ora disponibili come tipo di passaggio integrato in SageMaker pipelines. È possibile utilizzare questo passaggio di lavoro del quaderno per eseguire facilmente quaderni come lavori con poche righe di codice utilizzando l’Amazon SageMaker Python SDK. Inoltre, è possibile collegare insieme più quaderni dipendenti per creare un flusso di lavoro nel formato di Grafi Aciclici Diretti (DAG). È quindi possibile eseguire questi lavori del quaderno o DAG e gestirli e visualizzarli utilizzando SageMaker Studio.

I data scientist attualmente utilizzano SageMaker Studio per sviluppare interattivamente i loro quaderni Jupyter e poi utilizzano i lavori del quaderno di SageMaker per eseguire questi quaderni come lavori programmati. Questi lavori possono essere eseguiti immediatamente o su un programma ricorrente senza la necessità di riscrivere il codice come moduli Python. Alcuni casi d’uso comuni per fare ciò includono:

  • Esecuzione di quaderni a lunga durata in background
  • Esecuzione regolare dell’inferenza del modello per generare report
  • Aumentare le dimensioni dalle piccole serie di dati di esempio al lavoro con dati big di scala petabyte
  • Riaddestramento e distribuzione di modelli in base a una cadenza
  • Pianificazione dei lavori per il monitoraggio della qualità del modello o della deriva dei dati
  • Esplorare lo spazio dei parametri per ottenere modelli migliori

Anche se questa funzionalità semplifica l’automazione dei quaderni autonomi per i lavoratori dei dati, i flussi di lavoro di ML sono spesso costituiti da diversi quaderni, ognuno dei quali svolge un compito specifico con dipendenze complesse. Ad esempio, un quaderno che monitora la deriva dei dati del modello dovrebbe avere un passaggio precedente che consente l’estrazione, la trasformazione e il caricamento (ETL) e l’elaborazione di nuovi dati e un passaggio successivo per l’aggiornamento e l’addestramento del modello nel caso si noti una deriva significativa. Inoltre, i data scientist potrebbero voler avviare questo intero flusso di lavoro su base ricorrente per aggiornare il modello in base ai nuovi dati. Per consentire di automatizzare facilmente i quaderni e creare flussi di lavoro complessi come questo, i lavori del quaderno di SageMaker sono ora disponibili come passaggio in SageMaker Pipelines. In questo post, mostriamo come è possibile risolvere i seguenti casi d’uso con poche righe di codice:

  • Eseguire programmaticamente un quaderno autonomo immediatamente o su un programma ricorrente
  • Creare flussi di lavoro multistep di quaderni come DAG per scopi di integrazione e distribuzione continua (CI/CD) che possono essere gestiti tramite l’interfaccia utente di SageMaker Studio

Panoramica della soluzione

Il diagramma seguente illustra l’architettura della nostra soluzione. È possibile utilizzare il SageMaker Python SDK per eseguire un singolo lavoro del quaderno o un flusso di lavoro. Questa funzionalità crea un lavoro di addestramento SageMaker per eseguire il quaderno.

Nelle seguenti sezioni, esploreremo un caso d’uso di machine learning e mostreremo i passaggi per creare un flusso di lavoro di notebook, passare parametri tra diversi passaggi del notebook, pianificare il flusso di lavoro e monitorarlo tramite SageMaker Studio.

Per il nostro problema di machine learning in questo esempio, stiamo costruendo un modello di analisi del sentiment, che è un tipo di compito di classificazione del testo. Le applicazioni più comuni dell’analisi del sentiment includono il monitoraggio dei social media, la gestione del supporto clienti e l’analisi dei feedback dei clienti. Il dataset utilizzato in questo esempio è il Stanford Sentiment Treebank (SST2) dataset, che consiste in recensioni di film insieme a un numero intero (0 o 1) che indica il sentiment positivo o negativo della recensione.

Di seguito è riportato un esempio di un file data.csv corrispondente al dataset SST2, che mostra i valori nelle sue prime due colonne. Notare che il file non dovrebbe avere intestazioni.

Colonna 1 Colonna 2
0 nascondere nuove secrezioni dalle unità genitoriali
0 contiene solo battute sforzate e non ha spirito
1 che ama i suoi personaggi e comunica qualcosa di bello sulla natura umana
0 rimane completamente soddisfatto di rimanere sempre lo stesso
0 sulle peggiori insulsaggini della vendetta dei nerd che i registi potevano tirare su
0 è troppo tragico per meritare un trattamento così superficiale
1 dimostra che il regista di grandi successi hollywoodiani come Patriot Games può ancora realizzare un film piccolo, personale ed emozionante.

In questo esempio di machine learning, dobbiamo svolgere diverse attività:

  1. Eseguire ingegneria delle caratteristiche per preparare questo dataset in un formato comprensibile per il nostro modello.
  2. Dopo l’ingegneria delle caratteristiche, eseguire una fase di addestramento che utilizza Transformers.
  3. Configurare l’inferenza in batch con il modello ottimizzato per aiutare a prevedere il sentiment per le nuove recensioni che arrivano.
  4. Configurare una fase di monitoraggio dei dati in modo da poter monitorare regolarmente i nuovi dati per eventuali variazioni di qualità che potrebbero richiedere di riallenare i pesi del modello.

Con il lancio di un job di notebook come step nelle pipeline di SageMaker, possiamo orchestrare questo flusso di lavoro, che è composto da tre step distinti. Ogni step del flusso di lavoro è sviluppato in un notebook diverso, che viene quindi convertito in step di job di notebook indipendenti e collegati come pipeline:

  • Preelaborazione – Scaricare il dataset pubblico SST2 da Amazon Simple Storage Service (Amazon S3) e creare un file CSV per il notebook nel Passaggio 2. Il dataset SST2 è un dataset di classificazione del testo con due etichette (0 e 1) e una colonna per la categorizzazione del testo.
  • Addestramento – Prendere il file CSV formattato e eseguire un fine-tuning con BERT per la classificazione del testo utilizzando le librerie Transformers. Utilizziamo un notebook di preparazione dei dati di test come parte di questo step, che è una dipendenza per il fine-tuning e il passaggio di inferenza in batch. Quando il fine-tuning è completo, questo notebook viene eseguito utilizzando la magia run e prepara un dataset di test per l’inferenza di esempio con il modello ottimizzato.
  • Trasformazione e monitoraggio – Eseguire l’inferenza in batch e impostare la qualità dei dati con il monitoraggio del modello per avere un suggerimento di dataset di base.

Eseguire i notebook

Il codice di esempio per questa soluzione è disponibile su GitHub.

Creare un passaggio di lavoro del notebook di SageMaker è simile alla creazione di altri passaggi di SageMaker Pipeline. In questo esempio di notebook, utilizziamo il SDK di Python di SageMaker per orchestrare il flusso di lavoro. Per creare un passaggio del notebook in SageMaker Pipelines, è possibile definire i seguenti parametri:

  • Notebook di input – Il nome del notebook che orchestrerà questo passaggio del notebook. Qui è possibile specificare il percorso locale del notebook di input. Opzionalmente, se questo notebook esegue altri notebook, è possibile specificarli nel parametro AdditionalDependencies per il passaggio del lavoro del notebook.
  • URI dell’immagine – L’immagine Docker alla base del passaggio del lavoro del notebook. Può essere un’immagine predefinita fornita da SageMaker o un’immagine personalizzata definita e pubblicata in Amazon Elastic Container Registry (Amazon ECR). Fare riferimento alla sezione delle considerazioni alla fine di questo post per le immagini supportate.
  • Nome del kernel – Il nome del kernel che si sta utilizzando su SageMaker Studio. Questa specifica del kernel è registrata nell’immagine fornita.
  • Tipo di istanza (opzionale) – Il tipo di istanza di Amazon Elastic Compute Cloud (Amazon EC2) dietro al lavoro del notebook che è stato definito e che verrà eseguito.
  • Parametri (opzionali) – I parametri che è possibile passare e che saranno accessibili per il notebook. Questi possono essere definiti come coppie chiave-valore. Inoltre, questi parametri possono essere modificati tra diverse esecuzioni del lavoro del notebook o tra diverse esecuzioni della pipeline.

Il nostro esempio consta di un totale di cinque notebook:

  • nb-job-pipeline.ipynb – Questo è il nostro notebook principale in cui definiamo la nostra pipeline e il flusso di lavoro.
  • preprocess.ipynb – Questo notebook è il primo passo nel nostro flusso di lavoro e contiene il codice che preleverà l’AWS dataset pubblico e creerà un file CSV da esso.
  • training.ipynb – Questo notebook è il secondo passo nel nostro flusso di lavoro e contiene il codice per eseguire l’addestramento e il fine-tuning locale utilizzando il CSV dal passaggio precedente. Questo passaggio dipende anche dal notebook prepare-test-set.ipynb per scaricare un dataset di test per l’elaborazione di esempio con il modello sintonizzato.
  • prepare-test-set.ipynb – Questo notebook crea un dataset di test che il nostro notebook di addestramento utilizzerà nel secondo passaggio della pipeline e per l’elaborazione di esempio con il modello sintonizzato.
  • transform-monitor.ipynb – Questo notebook è il terzo passaggio nel nostro flusso di lavoro e prende il modello di base BERT e avvia un lavoro di trasformazione batch di SageMaker, configurando anche la qualità dei dati con il monitoraggio del modello.

In seguito, illustreremo il notebook principale nb-job-pipeline.ipynb, che combina tutti i sottoblocchi in una pipeline ed esegue il flusso di lavoro completo. È importante notare che, sebbene l’esempio seguente esegua il notebook una sola volta, è possibile anche pianificare l’esecuzione della pipeline per eseguire il notebook più volte. Consultare la documentazione di SageMaker per istruzioni dettagliate.

Per il nostro primo passaggio del lavoro del notebook, passiamo un parametro con un bucket S3 predefinito. Possiamo utilizzare questo bucket per archiviare eventuali artefatti che vogliamo rendere disponibili per gli altri passaggi della pipeline. Per il primo notebook (preprocess.ipynb), scarichiamo l’AWS public SST2 train dataset e creiamo un file CSV di addestramento che spingiamo in questo bucket S3. Di seguito il codice:

# Parametriprint(default_s3_bucket)!aws s3 cp s3://sagemaker-sample-files/datasets/text/SST2/sst2.train sst2.train# leggeremo solo le prime 500 righe per una rapida esecuzionewith open('sst2.train', 'r') as f:    lines = f.readlines()[:500] data = []for line in lines:    label, text = line.strip().split(' ', 1)    data.append((int(label), text))df = pd.DataFrame(data, columns=['label', 'text'])df.to_csv("train.csv", index=False) #crea file csv con un dataset più piccolo!aws s3 cp "train.csv" {default_s3_bucket}

Puoi quindi convertire questo notebook in un NotebookJobStep con il seguente codice nel nostro notebook principale:

# fornisci il bucket S3 per scaricare i file di artefatti innb_job_params = {"default_s3_bucket": notebook_artifacts}preprocess_nb_step = NotebookJobStep(name=preprocess_step_name,description=preprocess_description,notebook_job_name=preprocess_job_name,image_uri=image_uri,kernel_name=kernel_name,display_name=display_name,role=role,input_notebook=preprocess_notebook,instance_type="ml.m5.4xlarge",parameters=nb_job_params,)

Ora che abbiamo un file CSV di esempio, possiamo iniziare ad addestrare il nostro modello nel notebook di addestramento. Il nostro notebook di addestramento prende lo stesso parametro con il bucket S3 e scarica il set di dati di addestramento da quella posizione. Quindi eseguiamo il fine-tuning utilizzando l’oggetto trainer dei Transformers con il seguente frammento di codice:

from transformers import TrainingArguments, Trainertraining_args = TrainingArguments(output_dir="test_trainer", evaluation_strategy="epoch")trainer = Trainer(    model=model,    args=training_args,    train_dataset=small_train_dataset,    eval_dataset=small_eval_dataset,    compute_metrics=compute_metrics,)trainer.train()

Dopo il fine-tuning, vogliamo eseguire alcuni test di inferenza batch per vedere come si comporta il modello. Questo viene fatto utilizzando un notebook separato (prepare-test-set.ipynb) nella stessa posizione locale che crea un set di dati di test su cui eseguire l’inferenza utilizzando il nostro modello addestrato. Possiamo eseguire il notebook aggiuntivo nel nostro notebook di addestramento con la seguente cella magica:

%run 'prepare-test-set.ipynb'

Definiamo questa dipendenza extra del notebook nel parametro AdditionalDependencies nel secondo passaggio del lavoro del notebook:

train_nb_step = NotebookJobStep(name=training_step_name,description=training_description,notebook_job_name=training_job_name,input_notebook=training_notebook,additional_dependencies=[test_data_prep_notebook],image_uri=image_uri,kernel_name=kernel_name,display_name=display_name,instance_type="ml.m5.12xlarge",role=role,parameters=nb_job_params,)

Dobbiamo anche specificare che il passaggio del lavoro del notebook di addestramento (Passaggio 2) dipende dal passaggio del lavoro del notebook di pre-elaborazione (Passaggio 1) utilizzando la chiamata API add_depends_on come segue:

train_nb_step.add_depends_on([preprocess_nb_step])

Il nostro ultimo passaggio, eseguirà il modello BERT in una trasformazione batch SageMaker, configurando anche la cattura dei dati e la qualità tramite SageMaker Model Monitor. Nota che questo è diverso dall’utilizzo delle fasi integrate di Transform o Capture tramite Pipelines. Il nostro notebook per questo passaggio eseguirà quelle stesse API, ma sarà tracciato come un passaggio del lavoro del notebook. Questo passaggio dipende dal Passaggio del lavoro di addestramento che abbiamo definito in precedenza, quindi catturiamo anche ciò con il flag depends_on.

batch_monitor_step = NotebookJobStep(name=batch_monitor_step_name,description=batch_monitor_description,notebook_job_name=batch_monitor_job_name,input_notebook=batch_monitor_notebook,image_uri=image_uri,kernel_name=kernel_name,display_name=display_name,instance_type="ml.m5.12xlarge",role=role,parameters=nb_job_params,)batch_monitor_step.add_depends_on([train_nb_step])

Dopo che i vari passaggi del nostro flusso di lavoro sono stati definiti, possiamo creare ed eseguire il pipeline end-to-end:

# crea la pipelinepipeline = Pipeline(name=pipeline_name,steps=[preprocess_nb_step, train_nb_step, batch_monitor_step],)# esegui la pipelinepipeline.create(session.get_execution_role())execution = pipeline.start(parameters={})execution.wait(delay=30, max_attempts=60)execution_steps = execution.list_steps()print(execution_steps)

Monitora l’esecuzione della pipeline

Puoi monitorare l’andamento delle esecuzioni dei passaggi del notebook tramite il DAG delle pipeline di SageMaker, come mostrato nella seguente schermata:

Puoi inoltre monitorare facoltativamente le singole esecuzioni del notebook sulla dashboard dei job del notebook e attivare/disattivare i file di output che sono stati creati tramite l’interfaccia utente di SageMaker Studio. Quando si utilizza questa funzionalità al di fuori di SageMaker Studio, è possibile definire gli utenti che possono tenere traccia dello stato dell’esecuzione sulla dashboard dei job del notebook utilizzando i tag. Per ulteriori dettagli sui tag da includere, vedi Visualizza i tuoi job del notebook e scarica gli output nella dashboard di Studio UI.

Per questo esempio, abbiamo inserito i job del notebook risultanti in una directory chiamata outputs nel tuo percorso locale con il codice di esecuzione della tua pipeline. Come mostrato nella seguente immagine, puoi vedere l’output del tuo notebook di input e anche eventuali parametri definiti per quella fase.

Pulizia

Se hai seguito l’esempio, assicurati di eliminare la pipeline creata, i job del notebook e i dati s3 scaricati dai notebook di esempio.

Considerazioni

Di seguito sono riportate alcune importanti considerazioni per questa funzionalità:

Conclusione

Con questo lancio, gli operatori di dati possono ora eseguire i loro notebook in modo programmato con poche righe di codice utilizzando il SageMaker Python SDK. Inoltre, è possibile creare workflow complessi a più passaggi utilizzando i notebook, riducendo significativamente il tempo necessario per passare da un notebook a una pipeline CI/CD. Dopo aver creato la pipeline, è possibile utilizzare SageMaker Studio per visualizzare ed eseguire i DAG per le proprie pipeline e gestire e confrontare le esecuzioni. Che tu stia pianificando flussi di lavoro di ML end-to-end o solo una parte di essi, ti incoraggiamo a provare i workflow basati su notebook.