Utilizza i tuoi script di formazione e seleziona automaticamente il modello migliore utilizzando l'ottimizzazione degli iperparametri in Amazon SageMaker PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Utilizza i tuoi script di addestramento e seleziona automaticamente il modello migliore utilizzando l'ottimizzazione degli iperparametri in Amazon SageMaker

Il successo di qualsiasi pipeline di machine learning (ML) dipende non solo dalla qualità del modello utilizzato, ma anche dalla capacità di addestrare e iterare su questo modello. Uno dei modi principali per migliorare un modello ML è scegliere parametri sintonizzabili migliori, noti come iperparametri. Questo è noto come ottimizzazione dell'iperparametro (HPO). Tuttavia, l'esecuzione manuale di questa ottimizzazione può spesso essere ingombrante a causa delle dimensioni dello spazio di ricerca, che a volte comporta migliaia di iterazioni di addestramento.

Questo post mostra come Amazon Sage Maker ti consente non solo di portare il tuo algoritmo di modello utilizzando la modalità script, ma anche di utilizzare l'algoritmo HPO integrato. Imparerai come generare facilmente la metrica di valutazione scelta per Amazon Cloud Watch, da cui è possibile estrarre questa metrica per guidare l'algoritmo HPO automatico. È quindi possibile creare un processo di ottimizzazione HPO che orchestra diversi processi di addestramento e risorse di calcolo associate. Al termine, puoi vedere il miglior lavoro di formazione in base alla metrica di valutazione.

Panoramica della soluzione

Eseguiamo i seguenti passaggi:

  1. Utilizza la modalità script di SageMaker per portare il nostro modello su un container gestito da AWS.
  2. Refactoring del nostro script di formazione per stampare la nostra metrica di valutazione.
  3. Trova il parametro in CloudWatch Logs.
  4. Estrai il parametro da CloudWatch.
  5. Usa HPO per selezionare il modello migliore ottimizzando questa metrica di valutazione.
  6. Monitora l'HPO e trova il miglior lavoro di formazione.

Prerequisiti

Per questa procedura dettagliata, è necessario disporre dei seguenti prerequisiti:

Utilizza algoritmi personalizzati su un container gestito da AWS

Fare riferimento a Porta il tuo modello con la modalità script di Amazon SageMaker per uno sguardo più dettagliato su come portare un modello personalizzato in SageMaker utilizzando un container gestito da AWS.

Usiamo il set di dati MNIST per questo esempio. MNIST è un set di dati ampiamente utilizzato per la classificazione delle cifre scritte a mano, costituito da 70,000 immagini in scala di grigi 28 × 28 pixel etichettate di cifre scritte a mano. Il set di dati è suddiviso in 60,000 immagini di addestramento e 10,000 immagini di test, contenenti 10 classi (una per ogni cifra).

  1. Apri la tua istanza notebook ed esegui il seguente comando per scaricare il file mnist.py file:
    !wget https://raw.githubusercontent.com/aws/amazon-sagemaker-examples/main/hyperparameter_tuning/pytorch_mnist/mnist.py

    Prima di ottenere e archiviare i dati, creiamo una sessione SageMaker. Dovremmo anche specificare il bucket S3 e il prefisso da utilizzare per l'addestramento e i dati del modello. Dovrebbe trovarsi all'interno della stessa regione dell'istanza notebook, della formazione e dell'hosting. Il codice seguente utilizza il secchio predefinito se esiste già, o ne crea uno nuovo se non esiste. Dobbiamo anche includere l'ARN del ruolo IAM per fornire l'accesso ai tuoi dati alla formazione e all'hosting. Noi usiamo get_execution_role() per ottenere il ruolo IAM che hai creato per la tua istanza notebook.

  2. Crea una sessione con il seguente codice:
    import sagemaker
    from sagemaker.tuner import (
    IntegerParameter,
    CategoricalParameter,
    ContinuousParameter,
    HyperparameterTuner,
    )
    session = sagemaker.Session()
    bucket = session.default_bucket()
    prefix = "sagemaker/DEMO-custom-hpo"
    role = sagemaker.get_execution_role()

  3. Ora prendiamo i dati, memorizziamoli nella nostra cartella locale /datae caricalo su Amazon S3:
    from torchvision.datasets import MNIST
    from torchvision import transforms
    MNIST.mirrors = ["https://sagemaker-sample-files.s3.amazonaws.com/datasets/image/MNIST/"]
    MNIST(
    "data",
    download=True,
    transform=transforms.Compose(
    [transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]
    ),
    )
    inputs = session.upload_data(path="data", bucket=bucket, key_prefix=prefix)

    Ora possiamo creare uno stimatore per impostare il processo di addestramento PyTorch. Non ci concentriamo sul codice di formazione effettivo qui (mnist.py) in modo molto dettagliato. Diamo un'occhiata a come possiamo facilmente richiamare questo script di addestramento per inizializzare un job di addestramento.

  4. Nel codice seguente, includiamo uno script del punto di ingresso chiamato mnist.py che contiene il nostro codice di addestramento personalizzato:
    from sagemaker.pytorch import PyTorch
    estimator = PyTorch(
    entry_point="mnist.py",
    role=role,
    py_version="py3",
    framework_version="1.8.0",
    instance_count=1,
    instance_type="ml.c5.2xlarge",
    hyperparameters={"epochs": 5},
    )

  5. Per garantire che questo lavoro di addestramento sia stato configurato correttamente, con il codice di addestramento funzionante, possiamo avviare un lavoro di addestramento adattandolo ai dati che abbiamo caricato su Amazon S3. SageMaker garantisce che i nostri dati siano disponibili nel file system locale, quindi il nostro script di addestramento può semplicemente leggere i dati dal disco:
    estimator.fit({"training": inputs})

Tuttavia, non stiamo creando un singolo lavoro di formazione. Utilizziamo la funzionalità di ottimizzazione automatica del modello di SageMaker attraverso l'uso di un lavoro di ottimizzazione degli iperparametri. L'ottimizzazione del modello è completamente indipendente dall'algoritmo del modello effettivo. Per ulteriori informazioni su tutti gli iperparametri che è possibile ottimizzare, fare riferimento a Esegui l'ottimizzazione automatica del modello con SageMaker.

Per ogni iperparametro che vogliamo ottimizzare, dobbiamo definire quanto segue:

  • Un nome
  • Un tipo (i parametri possono essere interi, continui o categorici)
  • Una gamma di valori da esplorare
  • Un tipo di ridimensionamento (lineare, logaritmico, logaritmico inverso o automatico); questo ci consente di controllare come verrà esplorato un intervallo di parametri specifico

Dobbiamo anche definire la metrica per cui stiamo ottimizzando. Può essere qualsiasi valore numerico purché sia ​​visibile nel registro di addestramento ed è possibile passare un'espressione regolare per estrarlo.

Se guardiamo alla riga 181 in mnist.py, possiamo vedere come stampiamo sul logger:

logger.info(
"Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)n".format(
test_loss, correct, len(test_loader.dataset), 100.0 * correct / len(test_loader.dataset)
)

In effetti, possiamo vedere questo output nei log del processo di addestramento che abbiamo appena eseguito. Aprendo il gruppo di log /aws/sagemaker/TrainingJobs sulla console CloudWatch, dovremmo avere un evento di log che inizia con pytorch-training- seguito da un timestamp e da un nome generato.

Lo screenshot seguente evidenzia il registro che stiamo cercando.

Iniziamo ora a creare il nostro lavoro di ottimizzazione degli iperparametri.

  1. Come accennato, dobbiamo prima definire alcune informazioni sugli iperparametri, sotto l'oggetto come segue:
    hyperparameter_ranges = {
    "lr": ContinuousParameter(0.001, 0.1),
    "batch-size": CategoricalParameter([32, 64, 128, 256, 512]),
    }

    Qui abbiamo definito i nostri due iperparametri. Il tasso di apprendimento (lr) è un parametro continuo (quindi un valore continuo) compreso tra 0.001 e 0.1. La dimensione batch (dimensione batch) è un parametro categoriale con i valori discreti precedenti.

    Successivamente, specifichiamo la metrica oggettiva che vorremmo mettere a punto e la sua definizione. Ciò include l'espressione regolare (regex) necessaria per estrarre tale parametro dai log di CloudWatch del processo di addestramento che abbiamo visto in precedenza. Specifichiamo anche un nome descrittivo perdita media del test e il tipo di obiettivo come Riduci a icona, quindi l'ottimizzazione dell'iperparametro cerca di ridurre al minimo la metrica dell'obiettivo durante la ricerca della migliore impostazione dell'iperparametro.

  2. Specificare la metrica con il seguente codice:
    metric_definitions = [{"Name": "average test loss", "Regex": "Test set: Average loss: ([0-9.]+)"}]
    objective_metric_name = "average test loss"
    objective_type = "Minimize"

    Ora siamo pronti per creare il nostro HyperparameterTuner oggetto. Oltre al nome, al tipo e alla definizione della metrica oggettiva, trasmettiamo il file hyperparameter_ranges oggetto e lo stimatore che abbiamo precedentemente creato. Specifichiamo anche il numero di lavori che vogliamo eseguire in totale, insieme al numero che dovrebbe essere eseguito in parallelo. Abbiamo scelto come numero massimo di lavori 9, ma in genere si opta per un numero molto più elevato (ad esempio 50) per prestazioni ottimali.

  3. creare il HyperparameterTuner oggetto con il seguente codice:
    tuner = HyperparameterTuner(
    estimator,
    objective_metric_name,
    hyperparameter_ranges,
    metric_definitions,
    max_jobs=9,
    max_parallel_jobs=3,
    objective_type=objective_type,
    )

Prima di iniziare il lavoro di ottimizzazione, vale la pena notare come vengono determinate le combinazioni di iperparametri. Per ottenere buoni risultati, devi scegliere gli intervalli giusti da esplorare. Per impostazione predefinita, viene utilizzata la strategia di ricerca bayesiana, descritta più avanti Come funziona l'ottimizzazione degli iperparametri.

Con l'ottimizzazione bayesiana, l'ottimizzazione degli iperparametri viene trattata come a regressione problema. Per risolvere questo problema di regressione, fa ipotesi su quali combinazioni di iperparametri otterranno i migliori risultati ed esegue processi di addestramento per testare questi valori. Utilizza la regressione per scegliere il set successivo di valori di iperparametri da testare. C'è un chiaro compromesso exploit/esplorazione che la strategia di ricerca fa qui. Può scegliere valori di iperparametri vicini alla combinazione che ha prodotto il miglior lavoro di formazione precedente per migliorare in modo incrementale le prestazioni. Oppure, può scegliere valori più lontani, per cercare di esplorare una nuova gamma di valori che non è ancora ben compresa.

Tuttavia, puoi specificare altre strategie di ricerca. Le seguenti strategie sono supportate in SageMaker:

  • Ricerca a griglia – Prova ogni possibile combinazione nell'intervallo di iperparametri specificato.
  • Ricerca casuale – Prova combinazioni casuali nell'intervallo di valori specificato. Non dipende dai risultati dei processi di addestramento precedenti, pertanto è possibile eseguire il numero massimo di processi di addestramento simultanei senza influire sulle prestazioni dell'ottimizzazione.
  • Ricerca iperbanda – Utilizza sia i risultati intermedi che quelli finali dei processi di addestramento per riallocare le epoche a configurazioni di iperparametri ben utilizzate e interrompe automaticamente quelle con prestazioni inferiori.

Puoi anche provare a portare il tuo algoritmo, come spiegato in Porta il tuo algoritmo di ottimizzazione degli iperparametri su Amazon SageMaker.

  1. Quindi lanciamo l'addestramento sull'oggetto sintonizzatore stesso (non lo stimatore), chiamando .fit() e passando nel percorso S3 al nostro set di dati treno e test:
    tuner.fit({"training": inputs})

Possiamo quindi seguire l'avanzamento del nostro lavoro di messa a punto sulla console SageMaker, su Lavori di ottimizzazione degli iperparametri pagina. Il lavoro di ottimizzazione aumenta le risorse di calcolo sottostanti necessarie orchestrando ogni singola esecuzione di training e il calcolo associato.

Quindi è facile vedere tutti i singoli lavori di formazione che sono stati completati o sono in corso, insieme al valore metrico obiettivo associato. Nello screenshot seguente, possiamo vedere che il primo lotto di lavori di addestramento è completo, che ne contiene tre in totale secondo quanto specificato max_parallel_jobs valore di 3. Al termine, possiamo trovare il miglior lavoro di formazione, quello che riduce al minimo la perdita media del test, sul Miglior lavoro di formazione scheda.

Screenshot dell'elenco dei lavori di formazione

ripulire

Per evitare di incorrere in addebiti futuri, eliminare le risorse inizializzate. Questi sono il bucket S3, il ruolo IAM e l'istanza notebook SageMaker.

Conclusione

In questo post, abbiamo discusso di come portare il nostro modello in SageMaker e quindi utilizzare l'ottimizzazione automatica degli iperparametri per selezionare il lavoro di addestramento migliore. Abbiamo utilizzato il popolare set di dati MNIST per vedere come possiamo specificare una metrica obiettivo personalizzata per la quale il lavoro HPO dovrebbe essere ottimizzato. Estraendo questo parametro obiettivo da CloudWatch e specificando vari valori di iperparametro, possiamo avviare e monitorare facilmente il processo HPO.

Se hai bisogno di maggiori informazioni o vuoi vedere come i nostri clienti utilizzano HPO, fai riferimento a Ottimizzazione automatica del modello di Amazon SageMaker. Adatta oggi stesso il tuo modello per l'ottimizzazione automatizzata degli iperparametri in SageMaker.


Circa l'autore

Utilizza i tuoi script di formazione e seleziona automaticamente il modello migliore utilizzando l'ottimizzazione degli iperparametri in Amazon SageMaker PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.Sam Prezzo è un consulente per i servizi professionali specializzato in AI/ML e analisi dei dati presso Amazon Web Services. Lavora a stretto contatto con i clienti del settore pubblico nel settore sanitario e delle scienze della vita per risolvere problemi complessi. Quando non lo fa, a Sam piace suonare la chitarra e giocare a tennis, e vedere i suoi gruppi indie preferiti.

Timestamp:

Di più da Apprendimento automatico di AWS