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 时间和内存用量(按算法和资产)的信息,这些信息来自启用性能分析器后执行的计算。性能分析器输出中的每一行都对应于一个算法、计算、资源加载或开销操作,如“说明”列中所述。性能分析器中的列包括:
- 说明
- 对正在分析的计算、算法、资源加载或开销操作的文本说明。
- 计数
- 一个指标,与“说明”中所述操作的调用次数成正比。
- 计算
- 操作所用 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)