계산 개요

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은 실패한 요청/태스크에 대한 실적 측정항목을 제공하지 않습니다. 이러한 수치는 부정확하거나 오해의 소지가 있기 때문입니다. 예를 들어 작업자 태스크가 응답하지 않아 작업이 실패하면 해당 작업자의 처리 소비가 합계에 포함되지 않습니다.

프로파일러

프로파일러는 사용 설정된 동안 수행된 계산으로 인한 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)