Addestramento di Resnet50 su Cloud TPU con PyTorch

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo tutorial mostra come addestrare il modello ResNet-50 su un dispositivo Cloud TPU con PyTorch. Puoi applicare lo stesso pattern ad altri modelli di classificazione delle immagini ottimizzati per TPU che utilizzano PyTorch e il set di dati ImageNet.

Il modello di questo tutorial è basato sul Deep Learning Residual Learning for Image Recognition, che introduce per prima l'architettura di rete residua (ResNet). Il tutorial utilizza la variante a 50 livelli, ResNet-50, e mostra come addestrare il modello utilizzando PyTorch/XLA.

Obiettivi

  • Prepara il set di dati.
  • Eseguire il job di addestramento.
  • Verifica i risultati di output.

Costi

Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:

  • Compute Engine
  • Cloud TPU

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono beneficiare di una prova gratuita.

Prima di iniziare

Prima di iniziare questo tutorial, verifica che il tuo progetto Google Cloud sia configurato correttamente.

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  4. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

  6. Questa procedura dettagliata utilizza i componenti fatturabili di Google Cloud. Controlla la pagina dei prezzi di Cloud TPU per una stima dei costi. Al termine, pulisci le risorse che crei per evitare addebiti inutili.

Configura un'istanza di Compute Engine

  1. Apri una finestra di Cloud Shell.

    Apri Cloud Shell

  2. Crea una variabile per l'ID del tuo progetto.

    export PROJECT_ID=project-id
    
  3. Configurare Google Cloud CLI in modo da utilizzare il progetto in cui vuoi creare Cloud TPU.

    gcloud config set project ${PROJECT_ID}
    

    La prima volta che esegui questo comando in una nuova VM di Cloud Shell, viene visualizzata una pagina Authorize Cloud Shell. Fai clic su Authorize in fondo alla pagina per consentire a gcloud di effettuare chiamate API Google Cloud con le tue credenziali.

  4. Avvia la risorsa Compute Engine richiesta per questo tutorial.

    gcloud compute instances create resnet50-tutorial \
    --zone=us-central1-a \
    --machine-type=n1-highmem-96  \
    --image-family=torch-xla \
    --image-project=ml-images  \
    --boot-disk-size=300GB \
    --scopes=https://www.googleapis.com/auth/cloud-platform
    

    Se prevedi di addestrare Resnet50 con dati reali, scegli il tipo di macchina con il maggior numero di CPU possibile. Resnet50 è generalmente vincolato a input, quindi l'addestramento può essere molto lento a meno che non ci siano molti worker per l'inserimento dei dati e una RAM sufficiente per gestire un numero elevato di thread worker. Per ottenere risultati migliori, seleziona n1-highmem-96 tipo di macchina.

    Se prevedi di scaricare ImageNet, specifica una dimensione del disco di almeno 300 GB. Se prevedi di utilizzare solo dati falsi, puoi specificare la dimensione predefinita del disco di 20 GB. Questo tutorial consiglia di utilizzare entrambi i set di dati.

Avvia una risorsa Cloud TPU

  1. Dalla macchina virtuale Compute Engine, avvia una risorsa Cloud TPU utilizzando il seguente comando:

    (vm) $ gcloud compute tpus create resnet50-tutorial \
    --zone=us-central1-a \
    --network=default \
    --version=pytorch-1.13 \
    --accelerator-type=v3-8
    
  2. Identificare l'indirizzo IP della risorsa Cloud TPU.

    (vm) $ gcloud compute tpus list --zone=us-central1-a
    

Crea e configura l'ambiente PyTorch

  1. Connettiti alla nuova istanza di Compute Engine.

    gcloud compute ssh resnet50-tutorial --zone=us-central1-a
    

A partire da questo punto, un prefisso (vm)$ indica che devi eseguire il comando sull'istanza VM di Compute Engine.

  1. Avvia un ambiente conda.

    (vm) $ conda activate torch-xla-1.13
    
  2. Configura le variabili di ambiente per la risorsa Cloud TPU.

    (vm) $ export TPU_IP_ADDRESS=ip-address
    
    (vm) $ export XRT_TPU_CONFIG="tpu_worker;0;$TPU_IP_ADDRESS:8470"
    

Addestramento con il set di dati falsi

Ti consigliamo di utilizzare il set di dati fasulli per l'esecuzione iniziale anziché il set reale ImageNet, poiché fake_data viene installato automaticamente nella VM e richiede meno tempo e meno risorse per l'elaborazione.

(vm) $ python /usr/share/torch-xla-1.13/pytorch/xla/test/test_train_mp_imagenet.py --fake_data --model=resnet50 --num_epochs=2 --batch_size=128 --log_steps=20

Addestramento con il set di dati reale

Se sembra tutto a posto quando utilizzi il flag --fake_data, puoi provare ad addestrare dati reali, ad esempio ImageNet.

In generale, test_train_mp_imagenet.py utilizza torchvision.datasets.ImageFolder per consentirti di utilizzare qualsiasi set di dati strutturato correttamente. Consulta la documentazione di ImageFolder.

Alcune modifiche suggerite dalla riga di comando per utilizzare dati reali, supponendo che il set di dati sia stato archiviato in ~/imagenet:

(vm) $ python /usr/share/torch-xla-1.13/pytorch/xla/test/test_train_mp_imagenet.py --datadir=~/imagenet --model=resnet50 --num_epochs=90 --num_workers=8 --batch_size=128 --log_steps=200

Richiesta di quota di CPU aggiuntiva

Pianifica e richiedi risorse aggiuntive con qualche giorno di anticipo per assicurarti che ci sia tempo sufficiente per soddisfare la tua richiesta.

  1. Vai alla pagina Quote.

    Vai alla pagina Quote

  2. Dal menu Servizio, seleziona API Cloud TPU.
  3. Seleziona la regione o le zone in cui vuoi utilizzare le CPU.
  4. Dal menu Metrica, seleziona Nessuno e inserisci le CPU nella casella di ricerca.
  5. Seleziona CPU.
  6. Nell'elenco, seleziona API Compute Engine - CPU, quindi fai clic su Modifica quote nella parte superiore della pagina.
  7. Inserisci l'importo della quota richiesta e una descrizione (obbligatoria), poi fai clic su Fine. Una richiesta viene inviata al tuo provider di servizi per l'approvazione.

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

  1. Disconnettiti dall'istanza Compute Engine, se non lo hai già fatto:

    (vm)$ exit
    

    Il prompt ora dovrebbe essere user@projectname, a indicare che ti trovi in Cloud Shell.

  2. In Cloud Shell, esegui ctpu delete con i flag --zone e --name che hai utilizzato durante la configurazione della VM di Compute Engine e Cloud TPU. Questa operazione elimina sia la VM sia la Cloud TPU.

    $ ctpu delete --project=${PROJECT_ID} \
      --name=resnet50-tutorial \
      --zone=us-central1-a
    
  3. Esegui ctpu status per assicurarti di non avere istanze allocate per evitare addebiti non necessari per l'utilizzo di TPU. L'eliminazione può richiedere qualche minuto. Una risposta come quella riportata di seguito indica che non sono presenti altre istanze allocate:

    $ ctpu status --project=${PROJECT_ID} \
      --zone=us-central1-a
    
    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-a"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    

Passaggi successivi

Prova le collaborazioni di PyTorch: