计算概览

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 笔记本中更轻松地进行分析(请注意,这只是一种方法,可能不适用于所有情况):

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)