Omówienie obliczeń

Earth Engine opiera się na narzędziach i usługach Google do wykonywania obliczeń na ogromną skalę. Aby ułatwić przeprowadzanie dużych analiz geoprzestrzennych, platforma i interfejs API Earth Engine ukrywają wiele złożonych aspektów infrastruktury przetwarzania równoległego.

Jednostki EECU

Przegląd

Jednostka obliczeniowa Earth Engine (EECU) to mechanizm reprezentujący ilość chwilowej mocy obliczeniowej. Earth Engine śledzi łączny ślad obliczeniowy zadań jako funkcję wykorzystania EECU w czasie (sekundy EECU, godziny EECU itp.). Google ma wiele różnych typów rdzeni procesorów, architektur itp., Jednostki EECU są przydatną abstrakcją, która pozwala mówić o mocy obliczeniowej.

Motywacja

Użytkownicy EE często chcą oszacować ilość mocy obliczeniowej wymaganej do obsługi ich przepływów pracy, a EECU zapewniają spójny wskaźnik do porównań.

Porównanie ze wskaźnikami procesora

Liczba, typ i architektura maszyn pracujących nad konkretnym wynikiem mogą się zmieniać z czasem. Ponieważ różne rdzenie fizyczne mogą mieć różne charakterystyki wydajności, Earth Engine abstrakcyjnie przedstawia wszystkie procesy za pomocą EECU. Godzina EECU (lub dowolna inna jednostka czasu EECU) nie odpowiada czasowi zegarowemu, więc zadanie, które zużywa 10 godzin EECU, może mieć obserwowany czas działania wynoszący zaledwie kilka minut.

Stabilność i przewidywalność

Wysyłanie tych samych (lub podobnych) żądań do Earth Engine może czasami skutkować bardzo różnymi ilościami obliczeń. Typowe przyczyny różnic:

  • buforowanie, np. ponowne wykorzystywanie wyników poprzednich obliczeń (w tym wyników częściowych lub pośrednich);
  • różne dane podstawowe, takie jak różna liczba zdjęć satelitarnych, geometrie o różnej złożoności itp.
  • zmiany algorytmów na platformie EE, w tym optymalizacje wydajnoś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;

Testy porównawcze

Zapoznaj się z przykładowymi testami porównawczymi obliczeń w Earth Engine.

Dane dotyczące nieudanych żądań

Earth Engine nie podaje wskaźników skuteczności w przypadku nieudanych żądań lub zadań, ponieważ te liczby byłyby niedokładne lub mylące. Jeśli na przykład zadanie nie powiedzie się, ponieważ zadanie robocze przestanie odpowiadać, zużycie zasobów przez ten proces roboczy nie będzie mogło zostać uwzględnione w sumie.

Narzędzie do profilowania

Profiler dostarcza informacji o czasie EECU i wykorzystaniu pamięci (na algorytm i zasób) wynikających z obliczeń wykonywanych, gdy jest on włączony. Każdy wiersz w danych wyjściowych profilera odpowiada algorytmowi, obliczeniu, wczytaniu zasobu lub operacji narzutu, zgodnie z opisem w kolumnie „Opis”. Kolumny w profilerze:

Opis
Opis tekstowy obliczeń, algorytmu, wczytywania zasobów lub operacji narzutu, które są profilowane.
Liczba
Wskaźnik proporcjonalny do liczby wywołań operacji opisanej w polu „Opis”.
Zasoby obliczeniowe
Wskaźnik czasu EECU wykorzystanego przez operacje.
Bieżąca pamięć

Ta kolumna pojawia się tylko wtedy, gdy wystąpił błąd, ponieważ skrypt

wykorzystała za dużo pamięci. Pokazuje ilość pamięci używanej w danym węźle obliczeniowym w momencie wystąpienia błędu.

Maksymalne wykorzystanie pamięci

Maksymalna ilość pamięci używanej w ramach operacji na pojedynczym węźle obliczeniowym.

Włączanie profilera

Edytor kodu

Użyj przycisku „Uruchom z profilerem”, jak opisano w przewodniku po edytorze kodu.

Python

Aby włączyć profiler, dodaj do skryptu w Pythonie 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 w kontekście wystąpił błąd.

Aby zapisać profil jako ciąg znaków, zapisz go w buforze ciągu 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, jak przekształcić ciąg profilu w tabelę, aby ułatwić analizę w Colab i Jupyter Notebooks (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)