Earth Engine は、大規模な計算を実行するための Google のツールとサービスを基盤として構築されています。大規模な地理空間分析を簡単に実行できるように、Earth Engine プラットフォームと API では、基盤となる並列処理インフラストラクチャの複雑さの多くが隠蔽されています。
EECU
概要
Earth Engine コンピューティング ユニット(EECU)は、瞬間的な処理能力の量を表すメカニズムです。Earth Engine は、タスクの合計コンピューティング フットプリントを、時間の経過に伴う EECU 使用量の関数(EECU 秒、EECU 時間など)として追跡します。Google にはさまざまなタイプのプロセッサ コア、アーキテクチャなどがあるため、EECU は、コンピューティング能力を説明する際に便利な抽象化です。
目的
EE ユーザーは、ワークフローに必要な処理能力を見積もる必要があることがよくあります。EECU は、比較を行うための一貫した指標を提供します。
CPU 指標との比較
特定の結果を処理するマシンの数、タイプ、アーキテクチャは、時間の経過とともに変化する可能性があります。物理コアによってパフォーマンス特性が異なるため、Earth Engine は EECU を使用してすべての処理を抽象化します。EECU 時間(または EECU 時間のその他の単位)は、実時間に対応していません。そのため、10 EECU 時間を消費するジョブの実行時間は、数分程度になることがあります。
安定性と予測可能性
Earth Engine に同じ(または類似の)リクエストを送信すると、計算量が大きく異なる場合があります。差異の一般的な要因は次のとおりです。
- キャッシュ保存。以前の計算結果(部分的な結果や中間結果を含む)を再利用するなど。
- 異なる基盤データ(衛星画像の数の違い、複雑さの異なるジオメトリなど)。
- EE プラットフォームのアルゴリズムの変更(パフォーマンスの最適化、バグ修正など)。
- クライアント ライブラリの変更(特に、他のユーザーの EE コードまたはパッケージに依存している場合)
ベンチマーク
Earth Engine の計算ベンチマークのサンプルを確認する。
失敗したリクエストの指標
Earth Engine では、失敗したリクエストやタスクのパフォーマンス指標は提供されません。これらの数値は不正確または誤解を招く可能性があるためです。たとえば、ワーカータスクが応答しなくなったためにジョブが失敗した場合、そのワーカーの処理消費量は合計に反映されません。
Profiler
プロファイラは、有効になっている間に実行された計算の結果として、EECU 時間とメモリ使用量(アルゴリズムとアセットごと)に関する情報を提供します。プロファイラの出力の各行は、[Description] 列に記載されているアルゴリズム、計算、アセットの読み込み、オーバーヘッド オペレーションに対応しています。プロファイラの列は次のとおりです。
- 説明
- プロファイリング対象の計算、アルゴリズム、アセットの読み込み、オーバーヘッド オペレーションのテキストによる説明。
- 数
- 「説明」に記載されているオペレーションが呼び出された回数に比例するインジケーター。
- コンピューティング
- オペレーションにかかった EECU 時間のインジケーター。
- 現在のメモリ
この列は、スクリプトが原因でエラーが発生した場合にのみ表示されます。
メモリ使用量が多すぎます。エラーが発生した時点で、単一のコンピューティング ノードで使用されているメモリの量が表示されます。
- ピークメモリ
オペレーションで単一のコンピューティング ノードで使用される最大メモリ。
プロファイラの有効化
コードエディタ
コードエディタ ガイドの説明に沿って、[Run with Profiler] ボタンを使用します。
Python
プロファイラを有効にするには、Python スクリプトに次のコードを追加します。
with ee.profilePrinting():
print(ee.Number(3.14).add(0.00159).getInfo())
コンテキスト内でエラーが発生したかどうかにかかわらず、コンテキストが終了するとプロファイルが出力されます。
プロファイルを文字列としてキャプチャするには、プロファイルを文字列バッファに書き込みます。
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 と Jupyter Notebook で簡単に分析できるように、プロファイル文字列をテーブルに変換するための提案です(これは 1 つのアプローチであり、すべてのケースに適しているとは限りません)。
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)