Panoramica del calcolo

Earth Engine si basa sugli strumenti e sui servizi di Google per eseguire calcoli su larga scala. Per semplificare l'esecuzione di analisi geospaziali di grandi dimensioni, la piattaforma e l'API Earth Engine nascondono gran parte della complessità dell'infrastruttura di elaborazione parallela sottostante.

EECU

Panoramica

Un'unità di calcolo di Earth Engine (EECU) è un meccanismo per rappresentare una quantità di potenza di elaborazione istantanea. Earth Engine monitora l'impronta computazionale totale delle attività in funzione del loro utilizzo delle EECU nel tempo (secondi EECU, ore EECU e così via). Poiché Google ha molti tipi diversi di core, architetture e così via, Le EECU sono un'astrazione utile per parlare di potenza di calcolo.

Motivazione

Gli utenti di EE spesso vogliono fare stime sulla quantità di potenza di elaborazione necessaria per i loro flussi di lavoro e le EECU forniscono una metrica coerente per fare confronti.

Confronto con le metriche della CPU

Il numero, il tipo e l'architettura delle macchine che lavorano su un determinato risultato possono cambiare nel tempo. Poiché core fisici diversi possono avere caratteristiche di prestazioni diverse, Earth Engine esegue l'astrazione di tutte le elaborazioni utilizzando le EECU. Un'ora EECU (o qualsiasi altra unità di tempo EECU) non corrisponde a un tempo apparente, pertanto un job che consuma 10 ore EECU potrebbe avere un tempo di esecuzione osservato di solo alcuni minuti.

Stabilità e prevedibilità

L'invio delle stesse richieste (o di richieste simili) a Earth Engine a volte può comportare calcoli molto diversi. I fattori più comuni che determinano le differenze sono:

  • Memorizzazione nella cache, ad esempio il riutilizzo dei risultati di calcoli precedenti (inclusi risultati parziali o intermedi)
  • Dati di base diversi, ad esempio numeri variabili di immagini satellitari, geometrie di complessità diversa e così via.
  • modifiche all'algoritmo sulla piattaforma EE, tra cui ottimizzazioni del rendimento, correzioni di bug e così via.
  • Modifiche alle librerie client, in particolare se dipendono da codice o pacchetti EE di altri utenti

Benchmark

Consulta i benchmark di calcolo di Earth Engine di esempio.

Metriche per le richieste non riuscite

Earth Engine non fornisce metriche sul rendimento per richieste/attività non riuscite, poiché questi numeri sarebbero imprecisi o fuorvianti. Ad esempio, se un job non va a buon fine perché un'attività del worker non risponde, il consumo di elaborazione del worker non verrà conteggiato nel totale.

Profiler

Il profiler fornisce informazioni sul tempo EECU e sull'utilizzo della memoria (per algoritmo e asset) derivanti dal calcolo eseguito quando è attivato. Ogni riga dell'output del profiler corrisponde a un algoritmo, calcolo, caricamento di asset o operazione di overhead, come descritto nella colonna "Descrizione". Le colonne nel profiler sono:

Descrizione
Una descrizione testuale del calcolo, dell'algoritmo, del caricamento delle risorse o dell'operazione di overhead di cui viene eseguito il profilo.
Conteggio
Un indicatore proporzionale al numero di volte in cui è stata invocata l'operazione descritta in "Descrizione".
Computing
Un indicatore del tempo EECU impiegato dalle operazioni.
Mem corrente

Questa colonna viene visualizzata solo se si è verificato un errore perché lo script

ha utilizzato troppa memoria. Mostra la quantità di memoria in uso su qualsiasi singolo nodo di calcolo al momento dell'errore.

Peak Mem

La memoria massima utilizzata su un singolo nodo di calcolo per l'operazione.

Attivazione del profiler

Editor di codice

Utilizza il pulsante "Esegui con il profiler", come descritto nella guida Editor di codice.

Python

Includi il seguente codice nello script Python per attivare il profiler:

with ee.profilePrinting():
   print(ee.Number(3.14).add(0.00159).getInfo())

Il profilo verrà stampato al termine del contesto, indipendentemente dal fatto che si sia verificato o meno un errore al suo interno.

Per acquisire il profilo come stringa, scrivilo in un buffer di stringhe:

import io

out = io.StringIO()
with ee.profilePrinting(destination=out) as p:
    print(ee.Number(3.14).add(0.00159).getInfo())

print('Output:')
print(out.getvalue())

Ecco un suggerimento per trasformare la stringa del profilo in una tabella per semplificarne l'analisi in Colab e Jupyter Notebook (tieni presente che questo è solo un approccio e potrebbe non essere adatto a tutti i casi):

import re
import pandas as pd

lines = out.getvalue().split('\n')

column_names = re.split(r'\s{1,}', lines[0])
column_names = [name.strip() for name in column_names if name.strip()]

data = [
    [element for element in re.split(r'\s{2,}', line) if element.strip()]
    for line in lines[1:-1]
]

df = pd.DataFrame(data, columns=column_names)
display(df)