Earth Engine dibuat berdasarkan alat dan layanan Google untuk melakukan komputasi dalam skala besar. Untuk memudahkan menjalankan analisis geospasial yang besar, platform dan API Earth Engine menyembunyikan sebagian besar kompleksitas infrastruktur pemrosesan paralel yang mendasarinya.
EECU
Ringkasan
Unit Komputasi Earth Engine (EECU) adalah mekanisme untuk merepresentasikan jumlah daya pemrosesan instan. Earth Engine melacak total jejak komputasi tugas sebagai fungsi dari penggunaan EECU-nya sepanjang waktu (EECU-detik, EECU-jam, dll.). Karena Google memiliki berbagai jenis inti prosesor, arsitektur, dll., EECU menjadi abstraksi yang berguna untuk membahas daya komputasi.
Motivasi
Pengguna EE sering kali ingin membuat estimasi tentang jumlah daya pemrosesan yang diperlukan untuk alur kerja mereka, dan EECU memberikan metrik yang konsisten untuk membuat perbandingan.
Perbandingan dengan metrik CPU
Jumlah, jenis, dan arsitektur mesin yang bekerja pada hasil tertentu dapat berubah seiring waktu. Karena inti fisik yang berbeda dapat memiliki karakteristik performa yang berbeda, Earth Engine memisahkan semua pemrosesan menggunakan EECU. Jam EECU (atau unit waktu EECU lainnya) tidak sesuai dengan waktu jam dinding, sehingga tugas yang menghabiskan 10 jam EECU mungkin memiliki runtime yang diamati hanya beberapa menit.
Stabilitas dan prediktabilitas
Mengirim permintaan yang sama (atau serupa) ke Earth Engine terkadang dapat menghasilkan jumlah komputasi yang sangat berbeda. Penyebab umum perbedaan meliputi:
- caching, seperti menggunakan kembali hasil komputasi sebelumnya (termasuk hasil sebagian atau menengah)
- data pokok yang berbeda, seperti jumlah citra satelit yang bervariasi, geometri dengan kompleksitas berbeda, dll.
- perubahan algoritma di platform EE, termasuk pengoptimalan performa, perbaikan bug, dll.
- perubahan pada library klien, terutama jika Anda bergantung pada kode atau paket EE pengguna lain
Tolok Ukur
Jelajahi contoh benchmark komputasi Earth Engine.
Metrik untuk permintaan yang gagal
Earth Engine tidak memberikan metrik performa untuk permintaan/tugas yang gagal, karena angka ini tidak akurat atau menyesatkan. Misalnya, jika tugas gagal karena tugas pekerja menjadi tidak responsif, konsumsi pemrosesan pekerja tersebut tidak akan dapat diperhitungkan dalam total.
Profiler
Profiler memberikan informasi tentang waktu EECU dan penggunaan memori (per algoritma dan aset) yang dihasilkan dari komputasi yang dilakukan saat diaktifkan. Setiap baris dalam output profiler sesuai dengan algoritma, komputasi, pemuatan aset, atau operasi overhead seperti yang dijelaskan di kolom 'Deskripsi'. Kolom dalam profiler adalah:
- Deskripsi
- Deskripsi tekstual tentang komputasi, algoritma, pemuatan aset, atau operasi overhead yang sedang dibuat profilnya.
- Jumlah
- Indikator yang sebanding dengan frekuensi operasi yang dijelaskan dalam 'Deskripsi' dipanggil.
- Compute
- Indikator waktu EECU yang digunakan oleh operasi.
- Current Mem
Kolom ini hanya muncul jika terjadi error karena skrip
menggunakan terlalu banyak memori. Metrik ini menunjukkan jumlah memori yang digunakan di satu node komputasi pada saat error terjadi.
- Peak Mem
Memori maksimum yang digunakan di satu node komputasi untuk operasi.
Mengaktifkan profiler
Editor Kode
Gunakan tombol "Run with Profiler", seperti yang dijelaskan dalam panduan Editor Kode.
Python
Sertakan kode berikut dalam skrip Python Anda untuk mengaktifkan profiler:
with ee.profilePrinting():
print(ee.Number(3.14).add(0.00159).getInfo())
Profil akan dicetak saat konteks berakhir, terlepas dari apakah error terjadi dalam konteks atau tidak.
Untuk mengambil profil sebagai string, tulis profil ke buffering string:
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())
Berikut adalah saran untuk mengubah string profil menjadi tabel agar analisis lebih mudah di Colab dan Jupyter Notebook (perhatikan bahwa ini hanyalah salah satu pendekatan dan mungkin tidak cocok untuk semua kasus):
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)