Earth Engine, Google'ın büyük ölçekte hesaplama yapmak için kullandığı araç ve hizmetlerin üzerine kurulmuştur. Earth Engine platformu ve API, büyük coğrafi analizleri çalıştırmayı kolaylaştırmak için temel paralel işleme altyapısının karmaşıklığının büyük bir kısmını gizler.
EECU'lar
Genel Bakış
Earth Engine Compute Unit (EECU), anlık işlem gücü miktarını temsil eden bir mekanizmadır. Earth Engine, görevlerin toplam hesaplama ayak izini, zaman içindeki EECU kullanımı (EECU-saniye, EECU-saat vb.) işlevi olarak izler. Google'ın birçok farklı türde işlemci çekirdeği, mimari vb. olduğundan EECU'lar, hesaplama gücünden bahsetmek için faydalı bir soyutlamadır.
Motivasyon
BT kullanıcıları genellikle iş akışları için gereken işlem gücü miktarı hakkında tahminlerde bulunmak ister. EECU'lar, karşılaştırma yapmak için tutarlı bir metrik sağlar.
CPU metrikleriyle karşılaştırma
Belirli bir sonuç üzerinde çalışan makinelerin sayısı, türü ve mimarisi zaman içinde değişebilir. Farklı fiziksel çekirdeklerin farklı performans özelliklerine sahip olabileceğinden Earth Engine, EECU'ları kullanarak tüm işlemleri soyutlar. Bir EECU-saat (veya başka bir EECU-zaman birimi), duvar saati zamanına karşılık gelmez. Bu nedenle, 10 EECU-saat tüketen bir işin gözlemlenen çalışma süresi yalnızca birkaç dakika olabilir.
Kararlılık ve öngörülebilirlik
Earth Engine'a aynı (veya benzer) istekleri göndermek bazen çok farklı miktarlarda hesaplamaya neden olabilir. Farklılıkların yaygın nedenleri şunlardır:
- Önceki hesaplamaların sonuçlarını yeniden kullanmak (kısmi veya ara sonuçlar dahil) gibi önbelleğe alma
- Farklı sayıda uydu görüntüsü, farklı karmaşıklıkta geometriler vb. gibi farklı temel veriler
- Performans optimizasyonları ve hata düzeltmeleri dahil olmak üzere EE platformundaki algoritma değişiklikleri
- İstemci kitaplıklarında yapılan değişiklikler (özellikle diğer kullanıcıların EE koduna veya paketlerine bağlıysanız)
Karşılaştırmalar
Örnek Earth Engine hesaplama karşılaştırmalarını keşfedin.
Başarısız istekler için metrikler
Earth Engine, başarısız istek/görevler için performans metrikleri sağlamaz. Bu sayılar yanlış veya yanıltıcı olabilir. Örneğin, bir iş bir çalışan görevi yanıt vermediği için başarısız olursa bu çalışanın işleme tüketimi toplama dahil edilemez.
Profiler
Profilleyici, etkinken yapılan hesaplamadan kaynaklanan EECU süresi ve bellek kullanımı (algoritma ve öğe başına) hakkında bilgi sağlar. Profilleyici çıkışındaki her satır, "Açıklama" sütununda açıklandığı gibi bir algoritmaya, hesaplamaya, öğe yükleme işlemine veya ek işleme karşılık gelir. Profilleyicideki sütunlar şunlardır:
- Açıklama
- Profil oluşturulan hesaplamanın, algoritmanın, öğe yükünün veya ek yük işleminin metin açıklaması.
- Sayı
- "Açıklama" bölümünde açıklanan işlemin çağrılma sayısıyla orantılı bir gösterge.
- İşlem
- İşlemlerin EECU süresini gösteren bir gösterge.
- Mevcut Bellek
Bu sütun yalnızca komut dosyası
çok fazla bellek kullanıyordu. Hata oluştuğu anda herhangi bir hesaplama düğümünde kullanılan bellek miktarını gösterir.
- Peak Mem
İşlem için herhangi bir işlem düğümünde kullanılan maksimum bellek.
Profil oluşturucuyu etkinleştirme
Kod Düzenleyici
Kod Düzenleyici kılavuzunda açıklandığı gibi "Profilleyici ile çalıştır" düğmesini kullanın.
Python
Profilleyiciyi etkinleştirmek için Python komut dosyanıza aşağıdaki kodu ekleyin:
with ee.profilePrinting():
print(ee.Number(3.14).add(0.00159).getInfo())
Bağlam sona erdiğinde, bağlamda hata olup olmadığına bakılmaksızın profil yazdırılır.
Profili dize olarak yakalamak için bir dize arabelleği içine yazın:
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())
Colab ve Jupyter Notebook'larda daha kolay analiz edebilmek için profil dizesini tabloya dönüştürmeyle ilgili bir öneriyi burada bulabilirsiniz (bunun yalnızca bir yaklaşım olduğunu ve her duruma uygun olmayabileceğini unutmayın):
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)