Creare una pipeline end-to-end MLOps utilizzando Amazon SageMaker Pipelines, GitHub e GitHub Actions

Come creare una pipeline end-to-end di MLOps con Amazon SageMaker Pipelines, GitHub e GitHub Actions

Modelli di apprendimento automatico (ML) non operano in isolamento. Per fornire valore, devono integrarsi nei sistemi di produzione e nell’infrastruttura esistente, il che richiede di considerare l’intero ciclo di vita dell’ML durante la progettazione e lo sviluppo. Le operazioni di ML, conosciute come MLOps, si concentrano sulla razionalizzazione, automazione e monitoraggio dei modelli di ML durante tutto il loro ciclo di vita. La costruzione di un robusto flusso di lavoro MLOps richiede una collaborazione interfunzionale. Data scientist, ingegneri ML, personale IT e team DevOps devono lavorare insieme per operazionalizzare i modelli dalla ricerca alla distribuzione e alla manutenzione. Con i processi e gli strumenti giusti, MLOps consente alle organizzazioni di adottare in modo affidabile ed efficiente l’ML in tutti i loro team.

Anche se i requisiti di integrazione continua e distribuzione continua (CI/CD) possono essere unici e riflettere le esigenze di ogni organizzazione, la scalabilità delle pratiche MLOps tra i team può essere semplificata utilizzando orchestrazioni e strumenti gestiti che possono accelerare il processo di sviluppo e rimuovere il carico di lavoro pesante indifferenziato.

Amazon SageMaker MLOps è una suite di funzionalità che include Amazon SageMaker Projects (CI/CD), Amazon SageMaker Pipelines e Amazon SageMaker Model Registry.

SageMaker Pipelines consente la creazione e la gestione semplice dei flussi di lavoro di ML, offrendo inoltre capacità di archiviazione e riutilizzo per le fasi del flusso di lavoro. Il SageMaker Model Registry centralizza il monitoraggio dei modelli, semplificando la distribuzione dei modelli. SageMaker Projects introduce pratiche di CI/CD all’ML, inclusi la parità dell’ambiente, il controllo della versione, i test e l’automazione. Ciò consente di stabilire rapidamente CI/CD nel tuo ambiente di ML, facilitando la scalabilità efficace in tutta l’azienda.

Le template di progetto integrate fornite da Amazon SageMaker includono l’integrazione con alcune delle loro strumenti di terze parti, come Jenkins per l’orchestrazione e GitHub per il controllo del codice sorgente, mentre molte utilizzano gli strumenti native di CI/CD di AWS come AWS CodeCommit, AWS CodePipeline e AWS CodeBuild. Tuttavia, in molti casi i clienti desiderano integrare SageMaker Pipelines con altri strumenti esistenti di CI/CD e quindi creare i loro template personalizzati.

In questo post, ti mostriamo una procedura dettagliata per raggiungere quanto segue:

  • Crea un template personalizzato del progetto SageMaker MLOps che si integri con GitHub e GitHub Actions
  • Rendi disponibili i tuoi template di progetto personalizzati in Amazon SageMaker Studio per il tuo team di data science con un provisioning con un solo clic

Panoramica della soluzione

In questo post costruiamo la seguente architettura. Creiamo un flusso di lavoro di creazione del modello automatizzato che include passaggi per la preparazione dei dati, l’addestramento del modello, la valutazione del modello e la registrazione del modello addestrato nel SageMaker Model Registry. Il modello di ML addestrato risultante viene quindi distribuito dal SageMaker Model Registry negli ambienti di staging e produzione previa approvazione manuale.

Panoramica della Soluzione

Approfondiamo gli elementi di questa architettura per comprendere la configurazione completa.

GitHub e GitHub Actions

GitHub è una piattaforma basata su web che fornisce il controllo della versione e la gestione del codice sorgente utilizzando Git. Consente alle squadre di collaborare su progetti di sviluppo software, tenere traccia delle modifiche e gestire i repository di codice. GitHub funge da posizione centralizzata per archiviare, versionare e gestire la base di codice di machine learning (ML). Ciò garantisce che la base di codice ML e le pipeline siano versionate, documentate e accessibili dai membri del team.

GitHub Actions è un potente strumento di automazione all’interno dell’ecosistema di GitHub. Consente di creare flussi di lavoro personalizzati che automatizzano i processi del ciclo di vita dello sviluppo software, come la compilazione, i test e il rilascio del codice. Puoi creare flussi di lavoro basati su eventi che vengono attivati da eventi specifici, ad esempio quando il codice viene caricato in un repository o viene creata una pull request. Nell’implementazione di MLOps, è possibile utilizzare GitHub Actions per automatizzare varie fasi della pipeline di ML, come:

  • Validazione e preprocessing dei dati
  • Addestramento e valutazione del modello
  • Deployment e monitoraggio del modello
  • CI/CD per i modelli di ML

Con GitHub Actions, è possibile ottimizzare i flussi di lavoro di ML e garantire che i modelli vengano generati, testati e distribuiti in modo coerente, garantendo così deployments di ML efficienti e affidabili.

Nelle sezioni successive, iniziamo con la configurazione dei prerequisiti relativi ad alcuni dei componenti che utilizziamo come parte di questa architettura:

  • AWS CloudFormationAWS CloudFormation avvia il deployment del modello e stabilisce gli endpoint di SageMaker dopo che la pipeline di deployment del modello viene attivata dall’approvazione del modello addestrato.
  • Connessione AWS CodeStar – Utilizziamo AWS CodeStar per stabilire un collegamento con il repository di GitHub e utilizzarlo come integrazione di code repo con le risorse AWS, come SageMaker Studio.
  • Amazon EventBridgeAmazon EventBridge tiene traccia di tutte le modifiche al registro dei modelli. Mantiene anche una regola che avvia la funzione Lambda per il deployment della pipeline del modello quando lo stato della versione del pacchetto del modello cambia da PendingManualApproval a Approved all’interno del registro dei modelli.
  • AWS Lambda – Utilizziamo una funzione AWS Lambda per avviare il flusso di lavoro di deployment del modello in GitHub Actions dopo che un nuovo modello viene registrato nel registro dei modelli.
  • Amazon SageMaker – Configuriamo i seguenti componenti di SageMaker:
    • Pipeline – Questo componente consiste in un grafo aciclico diretto (DAG) che ci aiuta a creare il flusso di lavoro ML automatizzato per le fasi di preparazione dei dati, addestramento del modello e valutazione del modello. Il registro dei modelli tiene traccia delle versioni dei modelli, dei loro artefatti associati, delle lineage e delle informazioni sui metadati. Viene creato un gruppo di pacchetti del modello che contiene tutte le versioni del modello correlate. Il registro dei modelli è responsabile anche della gestione dello stato di approvazione della versione del modello per il deployment successivo.
    • Endpoint – Questo componente configura due endpoint in tempo reale HTTPS per l’effettuazione di inferenze. La configurazione di hosting può essere modificata, ad esempio, per il batch transform o per l’inferenza asincrona. L’endpoint di staging viene generato quando la pipeline di deployment del modello viene attivata dall’approvazione del modello addestrato dal Registro dei Modelli SageMaker. Questo endpoint viene utilizzato per convalidare il modello distribuito verificando che fornisca previsioni che soddisfino i nostri standard di accuratezza. Quando il modello è pronto per il deployment in produzione, un endpoint di produzione viene distribuito tramite una fase di approvazione manuale nel flusso di lavoro di GitHub Actions.
    • Repository di codice – Viene creato un repository Git come risorsa nel tuo account SageMaker. Utilizzando i dati esistenti dal repository di codice GitHub che hai inserito durante la creazione del tuo progetto SageMaker, viene stabilita un’associazione con lo stesso repository in SageMaker quando inizi il progetto. Questo crea un collegamento con un repository di GitHub in SageMaker, consentendo azioni interattive (pull/push) con il tuo repository.
    • Registro dei modelli – Questo monitora le varie versioni del modello e gli artefatti corrispondenti, che includono lineage e metadati. Viene creato un gruppo di pacchetti del modello che contiene versioni correlate del modello. Inoltre, il registro dei modelli supervisiona lo stato di approvazione della versione del modello, garantendo la sua prontezza per il deployment successivo.
  • AWS Secrets Manager – Per preservare in modo sicuro il tuo token di accesso personale a GitHub, è necessario stabilire un segreto in AWS Secrets Manager e inserire il tuo token di accesso in esso.
  • AWS Service Catalog – Utilizziamo il AWS Service Catalog per l’implementazione di progetti SageMaker, che includono componenti come un repository di codice SageMaker, una funzione Lambda, una regola EventBridge, un bucket S3 per gli artefatti, ecc., il tutto implementato tramite CloudFormation. Ciò consente alla tua organizzazione di utilizzare i modelli di progetto ripetutamente, assegnare progetti a ciascun utente e ottimizzare le operazioni.
  • Amazon S3 – Utilizziamo un bucket Amazon Simple Storage Service (Amazon S3) per conservare gli artefatti del modello prodotti dalla pipeline.

Prerequisiti

Dovresti avere i seguenti requisiti:

Dovrai inoltre completare ulteriori passaggi di configurazione prima di implementare la soluzione.

Configura una connessione AWS Codestar

Se non hai già una connessione AWS Codestar al tuo account GitHub, consulta Crea una connessione a GitHub per istruzioni su come crearne una. Il tuo AWS Codestar connection ARN sarà simile a questo:

arn:aws:codestar-connections:us-west-2:account_id:connection/aEXAMPLE-8aad-4d5d-8878-dfcab0bc441f

In questo esempio, aEXAMPLE-8aad-4d5d-8878-dfcab0bc441f è l’ID univoco per questa connessione. Useremo questo ID quando creeremo il nostro progetto SageMaker più avanti in questo esempio.

Configura chiavi di accesso segrete per il tuo token GitHub

Per memorizzare in modo sicuro il tuo token di accesso personale a GitHub, è necessario creare un segreto in Secrets Manager. Se non hai un token di accesso personale a GitHub, consulta Gestione dei tuoi token di accesso personale per istruzioni su come crearne uno.

Puoi creare un token di accesso classico o fine-grained. Tuttavia, assicurati che il token abbia accesso ai contenuti e alle azioni del repository (workflows, runs e artefatti).

Completa i seguenti passaggi per memorizzare il tuo token in Secrets Manager:

  1. Nella console di Secrets Manager, scegli Memorizza un nuovo segreto.
  2. Seleziona Altro tipo di segreto per Scegli tipo di segreto.
  3. Fornisci un nome per il tuo segreto nel campo Chiave e aggiungi il tuo token di accesso personale nel campo Valore corrispondente.
  4. Scegli Avanti, inserisci un nome per il tuo segreto e scegli nuovamente Avanti.
  5. Scegli Memorizza per salvare il tuo segreto.

Memorizzando il tuo token di accesso personale a GitHub in Secrets Manager, puoi accedervi in modo sicuro all’interno del tuo flusso di lavoro MLOps garantendone la riservatezza.

Crea un utente IAM per GitHub Actions

Per consentire a GitHub Actions di distribuire endpoint SageMaker nel tuo ambiente AWS, è necessario creare un utente Identity and Access Management (IAM) AWS e concedergli le autorizzazioni necessarie. Per istruzioni, consulta Creazione di un utente IAM nel tuo account AWS. Utilizza il file iam/GithubActionsMLOpsExecutionPolicy.json (fornito nell’esempio di codice) per fornire le autorizzazioni sufficienti a questo utente per distribuire i tuoi endpoint.

Dopo aver creato l’utente IAM, genera una chiave di accesso. Utilizzerai questa chiave, che consiste sia in un ID di chiave di accesso che in una chiave di accesso segreta, nel successivo passaggio di configurazione dei segreti di GitHub.

Configura il tuo account GitHub

Ecco i passaggi per preparare il tuo account GitHub per eseguire questo esempio.

Clona il repository GitHub

Puoi riutilizzare un repository GitHub esistente per questo esempio. Tuttavia, è più facile se crei un nuovo repository. Questo repository conterrà tutto il codice sorgente sia per la creazione che per il rilascio di SageMaker pipeline.

Copia i contenuti della directory di codice sorgente nella radice del tuo repository GitHub. Ad esempio, la directory .github dovrebbe trovarsi nella radice del tuo repository GitHub.

Crea un segreto GitHub contenente la tua chiave di accesso utente IAM

In questo passaggio, memorizziamo i dettagli della chiave di accesso del nuovo utente creato nel nostro segreto GitHub.

  1. Sul sito web di GitHub, vai al tuo repository e scegli Impostazioni.
  2. Nella sezione sicurezza, seleziona Segreti e variabili e scegli Azioni.
  3. Scegli Nuovo segreto del repository.
  4. Per Nome, inserisci AWS_ACCESS_KEY_ID
  5. Per Segreto, inserisci l’ID della chiave di accesso associata all’utente IAM che hai creato in precedenza.
  6. Scegli Aggiungi segreto.
  7. Ripeti la stessa procedura per AWS_SECRET_ACCESS_KEY

Configura gli ambienti GitHub

Per creare un passaggio di approvazione manuale nelle nostre pipeline di rilascio, utilizziamo un ambiente GitHub. Completa i seguenti passaggi:

  1. Vai al menu Impostazioni, Ambienti del tuo repository GitHub e crea un nuovo ambiente chiamato produzione.
  2. Per Regole di protezione ambiente, seleziona Revisori richiesti.
  3. Aggiungi i nomi degli utenti GitHub desiderati come revisori. Per questo esempio, puoi scegliere il tuo nome utente.

N.B.: la funzionalità di ambiente non è disponibile in alcuni tipi di piani GitHub. Per ulteriori informazioni, consulta Utilizzo degli ambienti per il rilascio.

Effettua il deployment della funzione Lambda

Nelle seguenti operazioni, compressiamo il file lambda_function.py in un file .zip, che viene quindi caricato in un bucket S3.

Il codice di esempio pertinente per questo può essere trovato nel seguente repository GitHub. In particolare, il file lambda_function.py si trova nella directory lambda_functions/lambda_github_workflow_trigger.

È consigliabile creare un fork del codice di esempio e clonarlo invece. Ciò ti darà la libertà di modificare il codice e sperimentare con diversi aspetti dell’esempio.

  1. Dopo aver ottenuto una copia del codice, vai alla directory appropriata e usa il comando zip per comprimere lambda_function.py. Gli utenti di Windows e MacOS possono utilizzare il proprio sistema di gestione file nativo, Risorse del computer o Finder rispettivamente, per generare un file .zip.
cd lambda_functions/lambda_github_workflow_triggerzip lambda-github-workflow-trigger.zip lambda_function.py
  1. Carica il file lambda-github-workflow-trigger.zip su un bucket S3.

Tale bucket verrà successivamente accessibile da Service Catalog. Puoi scegliere qualsiasi bucket a cui hai accesso, purché Service Catalog sia in grado di recuperare dati da esso nei passaggi successivi.

A partire da questo punto, è necessario avere installata e configurata la AWS CLI v2. Un’alternativa sarebbe utilizzare AWS CloudShell, che include tutti gli strumenti necessari preinstallati, eliminando la necessità di ulteriori configurazioni.

  1. Per caricare il file nel bucket S3, utilizza il seguente comando:
aws s3 cp lambda-github-workflow-trigger.zip s3://your-bucket/

Ora costruiamo un livello Lambda per le dipendenze legate alla funzione lambda_function che abbiamo appena caricato.

  1. Configura un ambiente virtuale Python e installa le dipendenze:
mkdir lambda_layercd lambda_layerpython3 -m venv .envsource .env/bin/activatepip install pygithubdeactivate
  1. Genera il file .zip con i seguenti comandi:
mv .env/lib/python3.9/site-packages/ pythonzip -r layer.zip python
  1. Pub

    Tornando nei dettagli del portfolio, dovresti vedere qualcosa di simile alla seguente schermata (con ID diversi).

    Portfolio del catalogo dei servizi
    1. Nella scheda Limitazioni, scegli Crea limitazione.
    2. Per il Prodotto, scegli build-deploy-github (il prodotto appena creato).
    3. Per il tipo di Limitazione, scegli Avvia.
    4. Sotto Limitazione di avvio, per il Metodo, scegli Seleziona ruolo IAM.
    5. Scegli AmazonSageMakerServiceCatalogProductsLaunchRole.
    6. Scegli Crea.
    7. Nella scheda Gruppi, ruoli e utenti, scegli Aggiungi gruppi, ruoli, utenti.
    8. Nella scheda Ruoli, seleziona il ruolo che hai utilizzato durante la configurazione del tuo dominio SageMaker Studio. Qui si trova il ruolo del dominio SageMaker.
    Limitazione di avvio del catalogo dei servizi
    1. Scegli Aggiungi accesso.

    Esegui il deploy del progetto da SageMaker Studio

    Nelle sezioni precedenti hai preparato l’ambiente personalizzato del progetto MLOps. Ora creiamo un progetto utilizzando questo modello:

    1. Nella console di SageMaker, vai al dominio in cui desideri creare questo progetto.
    2. Nel menu Avvia, scegli Studio.

    Verrai reindirizzato all’ambiente di SageMaker Studio.

    1. In SageMaker Studio, nel riquadro di navigazione sotto Deloyments, scegli Progetti.
    2. Scegli Crea progetto.
    3. In cima alla lista dei modelli, scegli Modelli di organizzazione.

    Se hai seguito con successo tutti i passaggi precedenti, dovresti essere in grado di vedere un nuovo modello di progetto personalizzato denominato Build-Deploy-GitHub.

    1. Seleziona quel modello e scegli Seleziona modello di progetto.
    2. Inserisci una descrizione facoltativa.
    3. Per il Nome del proprietario del repository GitHub, inserisci il proprietario del tuo repository GitHub. Ad esempio, se il tuo repository si trova su https://github.com/pooyavahidi/my-repo, il proprietario sarebbe pooyavahidi.
    4. Per il Nome del repository GitHub, inserisci il nome del repository in cui hai copiato il codice di base. Sarà solo il nome del repo. Ad esempio, in https://github.com/pooyavahidi/my-repo, il repo è my-repo.
    5. Per l’ID univoco della connessione CodeStar, inserisci l’ID univoco della connessione AWS CodeStar che hai creato.
    6. Per il Nome del segreto nel Secrets Manager in cui viene memorizzato il token GitHub, inserisci il nome del segreto nel Secrets Manager in cui hai creato e memorizzato il token GitHub.
    7. Per il File di flusso di lavoro GitHub per il deploy, inserisci il nome del file di flusso di lavoro GitHub (a .github/workflows/deploy.yml) in cui hai le istruzioni di deploy. Per questo esempio, puoi mantenerlo predefinito, cioè deploy.yml.
    8. Scegli Crea progetto.
    Progetto di SageMaker Studio
    1. Dopo aver creato il tuo progetto, assicurati di aggiornare le variabili d’ambiente AWS_REGION e SAGEMAKER_PROJECT_NAME nei tuoi file di workflow di GitHub di conseguenza. I file di lavoro si trovano nel tuo repository di GitHub (copiati dal codice sorgente), all’interno della cartella .github/workflows. Assicurati di aggiornare sia i file build.yml che deploy.yml.
    ...env:  AWS_REGION: <regione>     SAGEMAKER_PROJECT_NAME: <nome del tuo progetto>...

    Ora il tuo ambiente è pronto per essere utilizzato! Puoi eseguire direttamente le pipeline, apportare modifiche e pushare tali modifiche al tuo repository di GitHub per attivare la pipeline di costruzione automatizzata e vedere come tutti i passaggi di costruzione e distribuzione sono automatizzati.

    Pulizia

    Per pulire le risorse, segui i seguenti passaggi:

    • Elimina gli stack di CloudFormation utilizzati per il progetto SageMaker e i punti di disponibilità SageMaker.
    • Elimina il dominio SageMaker.
    • Elimina le risorse del catalogo di servizi.
    • Elimina il collegamento di connessione AWS CodeStar con il repository di GitHub.
    • Elimina l’utente IAM che hai creato per GitHub Actions.
    • Elimina il segreto in Secrets Manager che memorizza i dettagli di accesso personale per GitHub.

    Sommario

    In questo post, abbiamo esaminato il processo di utilizzo di un modello di progetto SageMaker MLOps personalizzato per costruire e organizzare automaticamente una pipeline di CI/CD. Questa pipeline integra efficacemente i tuoi meccanismi esistenti di CI/CD con le funzionalità di SageMaker per la manipolazione dei dati, l’addestramento del modello, l’approvazione del modello e la distribuzione del modello. Nel nostro scenario, ci siamo concentrati sull’integrazione di GitHub Actions con i progetti e le pipeline di SageMaker. Per una comprensione approfondita dei dettagli di implementazione, visita il repository di GitHub. Sentiti libero di sperimentare con questo e non esitare a lasciare eventuali domande che potresti avere nella sezione dei commenti.