计算概览

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”(说明)列中所述的算法、计算、资源加载或开销操作。性能分析器中的列如下所示:

说明
对要分析的计算、算法、资源加载或开销操作的文本说明。
计数
一个指示器,与“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)