Earth Engine korzysta z narzędzi i usług Google do wykonywania obliczeń na dużą skalę. Aby ułatwić przeprowadzanie dużych analiz geoprzestrzennych, platforma i interfejs API Earth Engine ukrywa większość złożoności infrastruktury równoległego przetwarzania.
EECU
Omówienie
Jednostka obliczeniowa Earth Engine (EECU) to mechanizm reprezentujący ilość chwilowej mocy obliczeniowej. Earth Engine śledzi całkowity ślad obliczeniowy zadań jako funkcję wykorzystania EECU w czasie (EECU-sekund, EECU-godzin itp.). Google ma wiele różnych typów rdzeni procesora, architektur itp. EECU to przydatna abstrakcja, która pozwala mówić o mocy obliczeniowej.
Motywacja
Użytkownicy EE często chcą szacować moc obliczeniową wymaganą do ich procesów roboczych, a EECU to spójne dane do porównań.
Porównanie z danymi procesora
Liczba, typ i architektura maszyn pracujących nad danym wynikiem mogą się zmieniać z czasem. Ponieważ różne fizyczne rdzenie mogą mieć różne parametry wydajności, Earth Engine abstrahuje wszystkie przetwarzanie za pomocą EECU. Godzina EECU (lub inna jednostka czasu EECU) nie odpowiada rzeczywistemu czasowi, więc zadanie, które zużywa 10 godzin EECU, może mieć czas działania wynoszący zaledwie kilka minut.
stabilność i przewidywalność;
Wysyłanie tych samych (lub podobnych) zapytań do Earth Engine może czasami skutkować bardzo różnymi wynikami obliczeń. Typowe przyczyny różnic:
- buforowanie, np. ponowne używanie wyników poprzednich obliczeń (w tym częściowych lub pośrednich wyników);
- różne dane źródłowe, takie jak różne liczby obrazów satelitarnych, geometrie o różnej złożoności itp.
- zmiany algorytmu na platformie EE, w tym optymalizacja skuteczności, poprawki błędów itp.
- zmiany w bibliotekach klienta, zwłaszcza jeśli korzystasz z kodu lub pakietów EE innych użytkowników;
Porównanie cen
Zapoznaj się z przykładowymi benchmarkami obliczeń w Earth Engine.
Dane o nieudanych żądaniach
Earth Engine nie udostępnia danych o skuteczności w przypadku nieudanych żądań/zadań, ponieważ te liczby byłyby niedokładne lub wprowadzały w błąd. Jeśli na przykład zadanie nie powiedzie się, ponieważ zadanie pracownika przestało odpowiadać, przetwarzanie przez tego pracownika nie zostanie uwzględnione w łącznej wartości.
Narzędzie do profilowania
Profilator dostarcza informacji o czasie EECU i wykorzystaniu pamięci (na podstawie algorytmu i zasobu) wynikających z obliczeń wykonanych podczas jego włączenia. Każdy wiersz w wyniku działania narzędzia do profilowania odpowiada algorytmowi, obliczeniu, wczytaniu zasobów lub operacji pomocniczej zgodnie z opisem w kolumnie „Opis”. Kolumny w profilu:
- Opis
- Tekstowy opis obliczeń, algorytmu, obciążenia zasobów lub operacji związanych z nadwyżką.
- Liczba
- Wskaźnik proporcjonalny do liczby wywołań operacji opisanej w sekcji „Opis”.
- Compute
- Wskaźnik czasu EECU zajętego przez operacje.
- Bieżąca pamięć
Ta kolumna pojawia się tylko wtedy, gdy wystąpił błąd, ponieważ skrypt
używa zbyt dużo pamięci. Pokazuje ilość pamięci używanej przez dowolny węzeł obliczeniowy w momencie wystąpienia błędu.
- Peak Mem
Maksymalna pamięć używana przez dowolny węzeł obliczeniowy podczas operacji.
Włączanie profilowania
Edytor kodu
Użyj przycisku „Uruchom z profilerem”, zgodnie z opisem w przewodniku po edytorze kodu.
Python
Aby włączyć profilowanie, dodaj do skryptu Pythona ten kod:
with ee.profilePrinting():
print(ee.Number(3.14).add(0.00159).getInfo())
Profil zostanie wydrukowany po zakończeniu kontekstu, niezależnie od tego, czy wystąpił w nim błąd.
Aby zapisać profil jako ciąg znaków, zapisz go w buforze ciągów znaków:
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())
Oto sugestia dotycząca przekształcenia ciągu znaków profilu w tabelę, aby ułatwić analizę w Colab i notatnikach Jupyter (pamiętaj, że jest to tylko jedno z podejść i może nie być odpowiednie we wszystkich przypadkach):
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)