计算概览

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 平台上的算法变更 ,包括性能优化、bug 修复等
  • 客户端库的变更,特别是当您依赖其他用户的 EE 代码或软件包时

基准

探索 Earth Engine 计算基准示例

失败请求的指标

Earth Engine 不提供失败请求/任务的性能指标,因为这些数字不准确或具有误导性。例如,如果作业因工作器任务无响应而失败,则该工作器的处理消耗将无法计入总数。

性能分析器

性能分析器提供有关启用时执行的计算所产生的 EECU 时间和内存用量(按算法和资产)的信息。性能分析器输出中的每一行都对应于“说明”列中所述的算法、计算、资产加载或开销操作。性能分析器中的列包括:

说明
正在分析的计算、算法、资产加载或开销操作的文本说明。
计数
与“说明”中所述操作的调用次数成正比的指标。
计算
操作所用 EECU 时间的指标。
当前内存量

仅当脚本

使用的内存过多而导致错误时,才会显示此列。它显示了发生错误时任何单个计算节点上正在使用的内存量。

峰值内存量

操作在任何单个计算节点上使用的最大内存量。

启用性能分析器

代码编辑器

使用“使用性能分析器运行”按钮,如代码编辑器 指南中所述。

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)