Accedi ai repository privati utilizzando il decoratore @remote per i carichi di lavoro di training di Amazon SageMaker

Accedi ai repository privati con @remote per il training su Amazon SageMaker

Man mano che sempre più clienti cercano di mettere in produzione carichi di lavoro di machine learning (ML), vi è un forte impulso nelle organizzazioni per accorciare il ciclo di sviluppo del codice ML. Molte organizzazioni preferiscono scrivere il loro codice ML in uno stile pronto per la produzione, sotto forma di metodi e classi Python, invece di uno stile esplorativo (scrivere codice senza utilizzare metodi o classi) perché questo aiuta a spedire il codice pronto per la produzione più velocemente.

Con Amazon SageMaker, è possibile utilizzare il decoratore @remote per eseguire un job di addestramento di SageMaker semplicemente annotando il proprio codice Python con il decoratore @remote. Il SDK Python di SageMaker tradurrà automaticamente il proprio ambiente di lavoro esistente e qualsiasi codice di elaborazione dei dati e set di dati associati in un job di addestramento di SageMaker che viene eseguito sulla piattaforma di addestramento di SageMaker.

Eseguire una funzione Python localmente spesso richiede diverse dipendenze, che potrebbero non essere presenti nell’ambiente di runtime Python locale. È possibile installarle tramite strumenti di gestione dei pacchetti e delle dipendenze come pip o conda.

Tuttavia, le organizzazioni che operano in settori regolamentati come banche, assicurazioni e sanità operano in ambienti che hanno rigorosi controlli sulla privacy dei dati e sulla rete. Questi controlli spesso richiedono di non avere accesso a Internet disponibile in nessuno dei loro ambienti. Il motivo di questa restrizione è avere il pieno controllo sul traffico in uscita e in ingresso in modo da poter ridurre le possibilità che attori senza scrupoli inviino o ricevano informazioni non verificate attraverso la loro rete. Spesso è anche obbligatorio avere un’isolazione di rete del genere come parte delle regole di conformità audit e industriali. Per quanto riguarda l’ML, ciò limita i data scientist dal scaricare pacchetti da repository pubblici come PyPI, Anaconda o Conda-Forge.

Per fornire ai data scientist accesso agli strumenti di loro scelta rispettando anche le restrizioni dell’ambiente, le organizzazioni spesso creano il proprio repository di pacchetti privato ospitato nel proprio ambiente. È possibile configurare repository di pacchetti privati su AWS in modi multipli:

  • Utilizzando AWS CodeArtifact
  • Utilizzando Amazon Simple Storage (Amazon S3)
  • Ospitando un repository su Amazon Elastic Compute Cloud (Amazon EC2)

In questo post, ci concentriamo sulla prima opzione: utilizzare CodeArtifact.

Panoramica della soluzione

Il diagramma di architettura seguente mostra l’architettura della soluzione.

I passaggi di alto livello per implementare la soluzione sono i seguenti:

  • Impostare una virtual private cloud (VPC) senza accesso a Internet utilizzando un template AWS CloudFormation.
  • Utilizzare un secondo template CloudFormation per configurare CodeArtifact come repository privato PyPI e fornire connettività alla VPC e configurare un ambiente Amazon SageMaker Studio per utilizzare il repository privato PyPI.
  • Allenare un modello di classificazione basato sul dataset MNIST utilizzando il decoratore @remote dal SDK Python open-source di SageMaker. Tutte le dipendenze saranno scaricate dal repository privato PyPI.

Si noti che l’utilizzo di SageMaker Studio in questo post è opzionale. È possibile scegliere di lavorare in qualsiasi ambiente di sviluppo integrato (IDE) a propria scelta. È sufficiente configurare correttamente le credenziali dell’interfaccia a linea di comando AWS (AWS CLI). Per ulteriori informazioni, fare riferimento alla Configurazione di AWS CLI.

Prerequisiti

È necessario disporre di un account AWS con un ruolo di Identity and Access Management (IAM) con le autorizzazioni per gestire le risorse create come parte della soluzione. Per ulteriori dettagli, fare riferimento alla Creazione di un account AWS.

Impostare una VPC senza connessione a Internet

Creare uno stack di CloudFormation utilizzando il template vpc.yaml. Questo template crea le seguenti risorse:

  • Una VPC con due subnet private su due zone di disponibilità senza connettività a Internet
  • Un endpoint VPC Gateway per accedere ad Amazon S3
  • Endpoint VPC di interfaccia per SageMaker, CodeArtifact e alcuni altri servizi per consentire alle risorse nella VPC di connettersi ai servizi AWS tramite AWS PrivateLink

Fornire un nome per lo stack, ad esempio No-Internet, e completare il processo di creazione dello stack.

Attendere il completamento del processo di creazione dello stack.

Configurare un repository privato e SageMaker Studio utilizzando il VPC

Il passaggio successivo è distribuire un altro stack CloudFormation utilizzando il modello sagemaker_studio_codeartifact.yaml. Questo modello crea le seguenti risorse:

  • Un dominio SageMaker collegato al VPC creato nel passaggio precedente
  • Un dominio CodeArtifact
  • Un repository privato di CodeArtifact collegato a un repository pubblico PyPI upstream

Fornire un nome stack e mantenere i valori predefiniti o regolare i parametri per il nome del dominio CodeArtifact, nome del repository privato, nome del profilo utente per SageMaker Studio e nome per il repository pubblico PyPI upstream. È inoltre necessario fornire il nome dello stack VPC creato nel passaggio precedente.

Quando la creazione dello stack è completa, il dominio SageMaker dovrebbe essere visibile sulla console di SageMaker.

Per verificare che non sia disponibile una connessione internet in SageMaker Studio, avviare SageMaker Studio. Scegliere File, Nuovo e Terminale per avviare un terminale e provare a eseguire il comando curl su una risorsa internet. Dovrebbe fallire la connessione, come mostrato nella seguente schermata.

Allenare un classificatore di immagini utilizzando un decoratore @remote con il repository privato PyPI

In questa sezione, utilizziamo il decoratore @remote per eseguire un lavoro di addestramento PyTorch che produce un modello di classificazione di immagini MNIST. Per raggiungere questo obiettivo, configuriamo un file di configurazione, sviluppiamo lo script di addestramento ed eseguiamo il codice di addestramento.

Configurare un file di configurazione

Configuriamo un file config.yaml e forniamo le configurazioni necessarie per fare quanto segue:

  • Eseguire un lavoro di addestramento SageMaker nel VPC senza connessione internet creato in precedenza
  • Scaricare i pacchetti richiesti collegandosi al repository privato PyPI creato in precedenza

Il file ha l’aspetto del seguente codice:

SchemaVersion: '1.0'
SageMaker:
  PythonSDK:
    Modules:
      RemoteFunction:
        Dependencies: '../config/requirements.txt'
        InstanceType: 'ml.m5.xlarge'
        PreExecutionCommands:
            - 'aws codeartifact login --tool pip --domain <domain-name> --domain-owner <AWS account number> --repository <private repository name> --endpoint-url <VPC-endpoint-url-prefixed with https://>
        RoleArn: '<execution role ARN for running training job>'
        S3RootUri: '<s3 bucket to store the job output>'
        VpcConfig:
            SecurityGroupIds: 
            - '<security group id used by SageMaker Studio>'
            Subnets: 
            - '<VPC subnet id 1>'
            - '<VPC subnet id 2>'

Il campo Dependencies contiene il percorso per requirements.txt, che contiene tutte le dipendenze necessarie. Notare che tutte le dipendenze verranno scaricate dal repository privato. Il file requirements.txt contiene il seguente codice:

torch
torchvision
sagemaker>=2.156.0,<3

La sezione PreExecutionCommands contiene il comando per connettersi al repository privato PyPI. Per ottenere l’URL del punto di accesso del VPC di CodeArtifact, utilizzare il seguente codice:

response = ec2.describe_vpc_endpoints(
    Filters=[
        {
            'Name': 'service-name',
            'Values': [
                f'com.amazonaws.{boto3_session.region_name}.codeartifact.api'
            ]
        },
    ]
)

code_artifact_api_vpc_endpoint = response['VpcEndpoints'][0]['DnsEntries'][0]['DnsName']

endpoint_url = f'https://{code_artifact_api_vpc_endpoint}'
endpoint_url

Generalmente, otteniamo due endpoint VPC per CodeArtifact e possiamo utilizzarne uno qualsiasi nei comandi di connessione. Per ulteriori dettagli, fare riferimento a “Utilizzare CodeArtifact da una VPC”.

Inoltre, le configurazioni come “execution role”, “output location” e “configurazioni VPC” sono fornite nel file di configurazione. Queste configurazioni sono necessarie per eseguire il lavoro di formazione di SageMaker. Per conoscere tutte le configurazioni supportate, fare riferimento al file di configurazione.

Non è obbligatorio utilizzare il file “config.yaml” per lavorare con il decoratore @remote. Questo è solo un modo più pulito per fornire tutte le configurazioni al decoratore @remote. Tutte le configurazioni potrebbero anche essere fornite direttamente negli argomenti del decoratore, ma ciò riduce la leggibilità e la manutenibilità delle modifiche a lungo termine. Inoltre, il file di configurazione può essere creato da un amministratore e condiviso con tutti gli utenti in un ambiente.

Sviluppare lo script di formazione

Successivamente, prepariamo il codice di formazione in file Python semplici. Abbiamo suddiviso il codice in tre file:

  • load_data.py – Contiene il codice per scaricare l’insieme di dati MNIST
  • model.py – Contiene il codice per l’architettura della rete neurale per il modello
  • train.py – Contiene il codice per la formazione del modello utilizzando load_data.py e model.py

In “train.py”, è necessario decorare la funzione di formazione principale nel seguente modo:

@remote(include_local_workdir=True)
def perform_train(train_data,
                  test_data,
                  *,
                  batch_size: int = 64,
                  test_batch_size: int = 1000,
                  epochs: int = 3,
                  lr: float = 1.0,
                  gamma: float = 0.7,
                  no_cuda: bool = True,
                  no_mps: bool = True,
                  dry_run: bool = False,
                  seed: int = 1,
                  log_interval: int = 10,
                  ):
    # codice di formazione nativo PyTorch........

Ora siamo pronti per eseguire il codice di formazione.

Eseguire il codice di formazione con un decoratore @remote

Possiamo eseguire il codice da un terminale o da qualsiasi prompt eseguibile. In questo post, utilizziamo una cella del notebook SageMaker Studio per dimostrarlo:

!python ./train.py

L’esecuzione del comando precedente avvia il lavoro di formazione. Nei log, possiamo vedere che sta scaricando i pacchetti dal repository PyPI privato.

Questo conclude l’implementazione di un decoratore @remote che funziona con un repository privato in un ambiente senza accesso a Internet.

Pulizia

Per eliminare le risorse, seguire le istruzioni in CLEANUP.md.

Conclusioni

In questo post, abbiamo imparato come utilizzare efficacemente le capacità del decoratore @remote lavorando in ambienti restrittivi senza accesso a Internet. Abbiamo anche appreso come integrare le capacità del repository privato CodeArtifact con l’aiuto del supporto del file di configurazione in SageMaker. Questa soluzione rende lo sviluppo iterativo molto più semplice e veloce. Un altro vantaggio aggiunto è che è comunque possibile continuare a scrivere il codice di formazione in modo più naturale e orientato agli oggetti e utilizzare le capacità di SageMaker per eseguire lavori di formazione su un cluster remoto con modifiche minime al codice. Tutto il codice mostrato in questo post è disponibile nel repository GitHub.

Come prossimo passo, ti incoraggiamo a esaminare la funzionalità del decoratore @remote e l’API del SDK Python e utilizzarla nel tuo ambiente e IDE preferiti. Sono disponibili esempi aggiuntivi nel repository amazon-sagemaker-examples per iniziare rapidamente. Puoi anche consultare il post Esegui il tuo codice di apprendimento automatico locale come lavori di formazione Amazon SageMaker con modifiche minime al codice per ulteriori dettagli.