Earth Engine, büyük ölçekte hesaplamalar yapmak için Google'ın araç ve hizmetlerinin üzerine kurulmuştur. Earth Engine platformu ve API'si, büyük coğrafi analizleri kolayca çalış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ünü temsil eden bir mekanizmadır. Earth Engine, görevlerin toplam hesaplama ayak izini zaman içindeki EECU kullanımlarına göre (EECU-saniye, EECU-saat vb.) izler. Google'da birçok farklı türde işlemci çekirdeği, mimari vb. bulunduğundan, EECU'lar, işlem gücünden bahsederken kullanışlı bir soyutlama sağlar.
Motivasyon
EE kullanıcıları genellikle iş akışları için gereken işlem gücü miktarı hakkında tahminler yapmak ister ve 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 çekirdekler farklı performans özelliklerine sahip olabileceğinden Earth Engine, EECU'ları kullanarak tüm işlemeyi soyutlar. Bir EECU saati (veya başka bir EECU zaman birimi), duvar saati zamanına karşılık gelmez. Bu nedenle, 10 EECU saati 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'e aynı (veya benzer) istekleri göndermek bazen çok farklı miktarlarda hesaplama yapılmasına neden olabilir. Farklılıkların yaygın nedenleri şunlardır:
- Önceki hesaplamaların sonuçlarını (kısmi veya ara sonuçlar dahil) yeniden kullanma gibi önbelleğe alma
- Uydu görüntüleri, farklı karmaşıklıkta geometriler vb. gibi farklı temel veriler
- Performans optimizasyonları, hata düzeltmeleri vb. 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ı inceleyin.
Başarısız isteklerle ilgili metrikler
Bu sayılar yanlış veya yanıltıcı olacağından Earth Engine, başarısız olan istekler/görevler için performans metrikleri sağlamaz. Örneğin, bir iş, çalışan görevi yanıt vermediği için başarısız olursa bu çalışanın işleme tüketimi toplamda dikkate alınamaz.
Profiler
Profiler, etkinleştirildiğinde gerçekleştirilen hesaplama sonucunda ortaya çıkan EECU süresi ve bellek kullanımı (algoritma ve öğe başına) hakkında bilgi sağlar. Profiler çıktısındaki her satır, "Açıklama" sütununda belirtildiği gibi bir algoritmaya, hesaplamaya, öğe yüklemeye veya ek işleme karşılık gelir. Profiler'daki sütunlar şunlardır:
- Açıklama
- Profil oluşturulan hesaplamanın, algoritmanın, öğe yükünün veya ek işlemin metin açıklaması.
- Sayı
- "Açıklama" bölümünde belirtilen işlemin çağrılma sayısıyla orantılı bir gösterge.
- İşlem
- İşlemlerin EECU süresinin göstergesi.
- Geçerli bellek
Bu sütun yalnızca komut dosyası nedeniyle bir hata oluştuysa görünür.
çok fazla bellek kullanılıyorsa Hata oluştuğu sırada tek bir işlem düğümünde kullanılan bellek miktarını gösterir.
- En yüksek bellek
İşlem için herhangi bir tek işlem düğümünde kullanılan maksimum bellek.
Profiler'ı etkinleştirme
Kod Düzenleyici
Kod Düzenleyici Kılavuzu'nda açıklandığı şekilde "Profiler ile Çalıştır" düğmesini kullanın.
Python
Profil oluşturucuyu 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ğlamda hata oluşup oluşmadığına bakılmaksızın, bağlam sona erdiğinde profil yazdırılır.
Profili dize olarak yakalamak için profili bir dize arabelleğ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())
Profil dizesini Colab ve Jupyter not defterlerinde daha kolay analiz edilebilecek bir tabloya dönüştürmeyle ilgili bir öneri aşağıda verilmiştir (bunun yalnızca bir yaklaşım olduğunu ve her durumda 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)