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 時間とメモリ使用量(アルゴリズムとアセットごと)に関する情報を提供します。プロファイラ出力の各行は、[説明] 列に説明されているアルゴリズム、計算、アセットの読み込み、またはオーバーヘッド オペレーションに対応しています。プロファイラ内の列は次のとおりです。
- 説明
- プロファイリング対象の計算、アルゴリズム、アセットの読み込み、オーバーヘッド オペレーションのテキストによる説明。
- カウント
- [説明] で説明されているオペレーションが呼び出された回数に比例するインジケーター。
- コンピューティング
- オペレーションに要した EECU 時間の指標。
- 現在のメモリ
この列は、スクリプトが
メモリを使いすぎた。エラーが発生した時点で、単一のコンピューティング ノードで使用されているメモリの量が表示されます。
- ピークメモリ
オペレーションで単一のコンピューティング ノードで使用される最大メモリ。
プロファイラの有効化
コードエディタ
コードエディタ ガイドで説明されているように、[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 ノートブックで分析を容易にするために、プロファイル文字列をテーブルに変換する方法を示します(これは 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)