Earth Engine dibangun di atas 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 perkiraan 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. Satu jam EECU (atau unit waktu EECU lainnya) tidak sesuai dengan waktu jam dinding, sehingga tugas yang menggunakan 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 algoritme pada 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
Pelajari contoh tolok ukur 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 worker menjadi tidak responsif, konsumsi pemrosesan worker 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 dalam kolom 'Deskripsi'. Kolom di profiler adalah:
- Deskripsi
- Deskripsi tekstual dari komputasi, algoritma, pemuatan aset, atau operasi overhead yang sedang diprofilkan.
- Jumlah
- Indikator yang sebanding dengan frekuensi operasi yang dijelaskan dalam 'Deskripsi' dipanggil.
- Compute
- Indikator waktu EECU yang digunakan oleh operasi.
- Memori Saat Ini
Kolom ini hanya muncul jika terjadi error karena skrip
menggunakan terlalu banyak memori. Metrik ini menunjukkan jumlah memori yang digunakan pada satu node komputasi saat error terjadi.
- Memori Puncak
Memori maksimum yang digunakan pada 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 terjadi error dalam konteks tersebut 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 lebih mudah dianalisis 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)