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 不会为失败的请求/任务提供性能指标,因为这些数字不准确或具有误导性。例如,如果作业因工作器任务无响应而失败,则该工作器的处理消耗无法计入总消耗。
Profiler
该性能分析器可提供有关启用该分析器期间执行的计算所产生的 EECU 时间和内存用量(按算法和素材资源)的信息。性能分析器输出的每一行都对应于“Description”(说明)列中所述的算法、计算、资源加载或开销操作。性能分析器中的列如下所示:
- 说明
- 对要分析的计算、算法、资源加载或开销操作的文本说明。
- 计数
- 一个指示器,与“Description”中所述操作的调用次数成正比。
- 计算
- 操作所用 EECU 时间的指标。
- 当前内存
只有在脚本出现以下错误时,此列才会显示
使用的内存过多。它显示了错误发生时任何单个计算节点上使用的内存量。
- 峰值内存
任何单个计算节点在执行操作时使用的内存上限。
启用性能分析器
使用“使用性能分析器运行”按钮,如代码编辑器指南中所述。
在 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)