다음을 통해 공유


기능 집합 구체화 개념

구체화는 원본 데이터의 기능 값을 계산합니다. 시작 시간 및 종료 시간 값은 기능 기간을 정의합니다. 구체화 작업은 이 기능 기간의 기능을 계산합니다. 구체화된 기능 값은 온라인 또는 오프라인 구체화 저장소에 저장됩니다. 데이터 구체화 후 모든 기능 쿼리는 구체화 저장소에서 해당 값을 사용할 수 있습니다.

구체화가 없으면 기능 집합 쿼리는 값을 반환하기 전에 기능을 계산하기 위해 즉시 원본에 변환을 적용합니다. 이 프로세스는 프로토타이핑 단계에 적합합니다. 그러나 프로덕션 환경에서 학습 및 유추 작업의 경우 학습 또는 유추 전에 기능을 구체화해야 합니다. 해당 단계에서 구체화하면 안정성과 가용성이 향상됩니다.

기능 구체화 탐색

구체화 작업 UI는 오프라인 및 온라인 구체화 저장소의 데이터 구체화 상태와 구체화 작업 목록을 표시합니다.

기능 집합 구체화 작업 사용자 인터페이스를 보여 주는 스크린샷.

기능 기간에서:

  • 위쪽의 시계열 차트는 오프라인 및 온라인 저장소에 대한 구체화 상태와 함께 기능 기간에 속하는 데이터 간격을 보여 줍니다.
  • 아래쪽의 작업 목록에는 선택한 기능 기간과 겹치는 처리 기간이 있는 모든 구체화 작업이 표시됩니다.

데이터 구체화 상태 및 데이터 간격

데이터 간격은 기능 집합이 기능 값을 다음 상태 중 하나로 구체화하는 기간입니다.

  • 완료(녹색) - 성공적인 데이터 구체화
  • 완료되지 않음(빨간색) - 이 데이터 간격에 대해 하나 이상의 취소되거나 실패한 구체화 작업이 있음
  • 보류 중(파란색) - 이 데이터 간격에 대해 하나 이상의 구체화 작업이 진행 중임
  • 없음(회색) - 이 데이터 간격에 대해 구체화 작업이 제출되지 않음

구체화 작업이 기능 집합에 대해 실행되면 데이터 간격을 만들거나 병합합니다.

  • 타임라인에서 두 데이터 간격이 연속되고 데이터 구체화 상태가 같으면 하나의 데이터 간격이 됩니다.
  • 데이터 간격에서 기능 데이터의 일부가 다시 구체화되고 해당 부분이 다른 데이터 구체화 상태가 되면 해당 데이터 간격이 여러 데이터 간격으로 분할됩니다.

사용자가 기능 기간을 선택하면 해당 창에 데이터 구체화 상태가 서로 다른 여러 데이터 간격이 표시될 수 있습니다. 타임라인에 분리된 여러 데이터 간격이 표시될 수 있습니다. 예를 들어 이전 스냅샷의 오프라인 구체화 저장소에는 정의된 기능 기간에 대해 16개의 데이터 간격이 있습니다.

언제든지 기능 집합에는 최대 2,000개의 데이터 간격이 있을 수 있습니다. 기능 집합이 해당 제한에 도달하면 더 이상 구체화 작업을 실행할 수 없습니다. 그런 다음 사용자는 구체화를 사용하도록 설정된 새 기능 집합 버전을 만들어야 합니다. 새 기능 집합 버전의 경우 오프라인 및 온라인 저장소의 기능을 처음부터 구체화합니다.

제한을 방지하려면 사용자가 데이터 간격의 공백을 채우기 위한 백필 작업을 미리 실행해야 합니다. 이렇게 하면 데이터 간격이 병합되고 총개수가 줄어듭니다.

데이터 구체화 작업

데이터 구체화 작업을 실행하기 전에 기능 집합 수준에서 오프라인 및/또는 온라인 데이터 구체화를 사용하도록 설정합니다.

from azure.ai.ml.entities import (
    MaterializationSettings,
    MaterializationComputeResource,
)

# Turn on both offline and online materialization on the "accounts" featureset.

accounts_fset_config = fs_client._featuresets.get(name="accounts", version="1")

accounts_fset_config.materialization_settings = MaterializationSettings(
    offline_enabled=True,
    online_enabled=True,
    resource=MaterializationComputeResource(instance_type="standard_e8s_v3"),
    spark_configuration={
        "spark.driver.cores": 4,
        "spark.driver.memory": "36g",
        "spark.executor.cores": 4,
        "spark.executor.memory": "36g",
        "spark.executor.instances": 2,
    },
    schedule=None,
)

fs_poller = fs_client.feature_sets.begin_create_or_update(accounts_fset_config)
print(fs_poller.result())

데이터 구체화 작업을 다음과 같이 제출할 수 있습니다.

Warning

오프라인 및/또는 온라인 데이터 구체화가 기능 집합 수준에서 사용하지 않도록 설정된 경우 오프라인 및/또는 온라인 구체화에서 이미 구체화된 데이터는 더 이상 사용할 수 없습니다. 오프라인 및/또는 온라인 구체화 저장소의 데이터 구체화 상태가 None으로 초기화됩니다.

다음을 통해 백필 작업을 제출할 수 있습니다.

  • 데이터 구체화 상태
  • 취소되거나 실패한 구체화 작업의 작업 ID

데이터 구체화 상태별 데이터 백필

사용자는 다음을 사용하여 백필 요청을 제출할 수 있습니다.

  • 데이터 구체화 상태 값 목록 - 완료되지 않음, 완료 또는 없음
  • 기능 기간(선택 사항)
from datetime import datetime
from azure.ai.ml.entities import DataAvailabilityStatus

st = datetime(2022, 1, 1, 0, 0, 0, 0)
et = datetime(2023, 6, 30, 0, 0, 0, 0)

poller = fs_client.feature_sets.begin_backfill(
    name="transactions",
    version="1",
    feature_window_start_time=st,
    feature_window_end_time=et,
    data_status=[DataAvailabilityStatus.NONE],
)
print(poller.result().job_ids)

백필 요청을 제출한 후 일치하는 데이터 구체화 상태(완료되지 않음, 완료 또는 없음)가 있는 각 데이터 간격에 대해 새 구체화 작업이 만들어집니다. 또한 관련 데이터 간격은 정의된 기능 기간 내에 있어야 합니다. 데이터 구체화 상태가 데이터 간격에 대해 Pending인 경우 해당 간격에 대해 구체화 작업이 제출되지 않습니다.

기능 기간의 시작 시간과 종료 시간은 모두 백필 요청에서 선택 사항입니다.

  • 기능 기간 시작 시간이 제공되지 않으면 시작 시간은 None의 데이터 구체화 상태가 없는 첫 번째 데이터 간격의 시작 시간으로 정의됩니다.
  • 기능 기간 종료 시간이 제공되지 않으면 종료 시간은 None의 데이터 구체화 상태가 없는 마지막 데이터 간격의 종료 시간으로 정의됩니다.

참고 항목

기능 집합에 대해 백필 또는 되풀이 작업이 제출되지 않은 경우 기능 기간 시작 시간 및 종료 시간으로 첫 번째 백필 작업을 제출해야 합니다.

이 예제에는 다음과 같은 현재 데이터 간격 및 구체화 상태 값이 있습니다.

시작 시간 종료 시간 데이터 구체화 상태
2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None
2023-04-02T04:00:00.000 2023-04-03T04:00:00.000 Incomplete
2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 None
2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete
2023-04-05T04:00:00.000 2023-04-06T04:00:00.000 None

이 백필 요청에는 다음 값이 있습니다.

  • 데이터 구체화 data_status=[DataAvailabilityStatus.Complete, DataAvailabilityStatus.Incomplete]
  • 기능 기간 시작 = 2023-04-02T12:00:00.000
  • 기능 기간 끝 = 2023-04-04T12:00:00.000

다음과 같은 구체화 작업을 만듭니다.

  • 작업 1: 프로세스 기능 기간 [2023-04-02T12:00:00.000, 2023-04-03T04:00:00.000)
  • 작업 2: 프로세스 기능 기간 [2023-04-04T04:00:00.000, 2023-04-04T12:00:00.000)

두 작업이 모두 성공적으로 완료되면 새 데이터 간격 및 구체화 상태 값이 다음과 같이 됩니다.

시작 시간 종료 시간 데이터 구체화 상태
2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None
2023-04-02T04:00:00.000 2023-04-02T12:00:00.000 Incomplete
2023-04-02T12:00:00.000 2023-04-03T04:00:00.000 Complete
2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 None
2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete
2023-04-05T04:00:00.000 2023-04-06T04:00:00.000 None

2023년 4월 2일에 새 데이터 간격이 하나 만들어집니다. 그날의 절반이 이제 다른 구체화 상태인 Complete를 가지기 때문입니다. 새 구체화 작업이 2023년 4월 4일의 절반 동안 실행되었지만 구체화 상태가 변경되지 않았기 때문에 데이터 간격이 변경(분할)되지 않습니다.

사용자가 기능 기간 시작 및 종료 시간을 설정하지 않고 데이터 구체화 data_status=[DataAvailabilityStatus.Complete, DataAvailabilityStatus.Incomplete]만 사용하여 백필 요청을 수행하는 경우, 요청은 이 섹션의 앞부분에서 언급한 매개 변수의 기본값을 사용하고 다음 작업을 만듭니다.

  • 작업 1: 프로세스 기능 기간 [2023-04-02T04:00:00.000, 2023-04-03T04:00:00.000)
  • 작업 2: 프로세스 기능 기간 [2023-04-04T04:00:00.000, 2023-04-05T04:00:00.000)

이러한 최신 요청 작업의 기능 기간과 이전 예제에 표시된 요청 작업을 비교합니다.

작업 ID별 데이터 백필

작업 ID를 사용하여 백필 요청을 만들 수도 있습니다. 이는 실패하거나 취소된 구체화 작업을 다시 시도하는 편리한 방법입니다. 먼저 다시 시도할 작업의 작업 ID를 찾습니다.

  • 기능 집합 구체화 작업 UI로 이동합니다.
  • 실패 상태 값이 있는 특정 작업의 표시 이름을 선택합니다.
  • 작업 개요 페이지의 Name 속성 아래에서 Featurestore-Materialization-으로 시작하는 관련 작업 ID 값을 찾습니다.

poller = fs_client.feature_sets.begin_backfill(
    name="transactions",
    version=version,
    job_id="<JOB_ID_OF_FAILED_MATERIALIZATION_JOB>",
)
print(poller.result().job_ids)

실패하거나 취소된 구체화 작업의 작업 ID를 사용하여 백필 작업을 제출할 수 있습니다. 이 경우 원래 실패하거나 취소된 구체화 작업에 대한 기능 기간 데이터 상태가 Incomplete이 되어야 합니다. 이 조건이 충족되지 않으면 ID별 백필 작업으로 인해 사용자 오류가 발생합니다. 예를 들어 실패한 구체화 작업에는 기능 기간 시작 시간 2023-04-01T04:00:00.000 값과 종료 시간 2023-04-09T04:00:00.000 값이 있을 수 있습니다. 이 실패한 작업의 ID를 사용하여 제출된 백필 작업은 2023-04-01T04:00:00.000~2023-04-09T04:00:00.000 시간 범위에서 모든 곳의 데이터 상태가 Incomplete인 경우에만 성공합니다.

지침 및 모범 사례

적절한 source_delay 및 되풀이되는 일정 설정

원본 데이터의 source_delay 속성은 데이터 생성의 이벤트 시간과 비교하여 사용 준비 데이터의 취득 시간 사이의 지연을 나타냅니다. t 시간에 발생한 이벤트는 업스트림 데이터 파이프라인 대기 시간으로 인해 t + x 시간에 원본 데이터 테이블에 배치됩니다. 값은 x 원본 지연입니다.

source_delay 개념을 보여 주는 일러스트레이션.

적절한 설정을 위해 되풀이 구체화 작업 일정은 대기 시간을 고려합니다. 되풀이 작업은 [schedule_trigger_time - source_delay - schedule_interval, schedule_trigger_time - source_delay) 시간 범위에 대한 기능을 생성합니다.

materialization_settings:
  schedule:
    type: recurrence
    interval: 1
    frequency: Day
    start_time: "2023-04-15T04:00:00.000"

이 예제에서는 2023년 4월 15일부터 오전 4시에 트리거되는 일별 작업을 정의합니다. source_delay 설정에 따라 2023년 5월 1일의 작업 실행은 다른 시간 범위에 기능을 생성합니다.

  • source_delay=0[2023-04-30T04:00:00.000, 2023-05-01T04:00:00.000) 기간에서 기능 값 생성
  • source_delay=2hours[2023-04-30T02:00:00.000, 2023-05-01T02:00:00.000) 기간에서 기능 값 생성
  • source_delay=4hours[2023-04-30T00:00:00.000, 2023-05-01T00:00:00.000) 기간에서 기능 값 생성

구체화 저장소 업데이트

온라인 기능 저장소 또는 오프라인 구체화 저장소를 업데이트하기 전에 해당 기능 저장소의 모든 기능 집합에서 해당하는 오프라인 및/또는 온라인 구체화를 사용하지 않도록 설정해야 합니다. 일부 기능 집합에 구체화를 사용하도록 설정한 경우 업데이트 작업은 UserError로 실패합니다.

기능 집합에서 오프라인 및/또는 온라인 구체화를 사용하지 않도록 설정하면 오프라인 및/또는 온라인 구체화 저장소에 있는 데이터의 구체화 상태가 초기화됩니다. 초기화로 인해 구체화된 데이터를 사용할 수 없게 됩니다. 나중에 기능 집합에서 오프라인 및/또는 온라인 구체화를 사용하도록 설정하면 사용자는 해당 구체화 작업을 다시 제출해야 합니다.

온라인 데이터 부트스트랩

온라인 데이터 부트스트랩은 제출된 오프라인 구체화 작업이 성공적으로 완료된 경우에만 적용됩니다. 처음에는 기능 집합에 대해 오프라인 구체화만 사용하도록 설정되었고 나중에 온라인 구체화를 사용하도록 설정한 경우 다음과 같이 됩니다.

  • 온라인 저장소에 있는 데이터의 기본 데이터 구체화 상태는 None이 됩니다.

  • 온라인 구체화 작업이 제출되면 오프라인 저장소에서 Complete 구체화 상태의 데이터가 온라인 기능을 계산하는 데 사용됩니다. 이를 온라인 데이터 부트스트래핑이라고 합니다. 온라인 데이터 부트스트래핑은 오프라인 구체화 저장소에 저장된 이미 계산된 기능을 다시 사용하므로 계산 비용을 절감합니다. 이 표에는 온라인 데이터 부트스트래핑을 발생시키는 데이터 간격의 오프라인 및 온라인 데이터 상태 값이 요약되어 있습니다.

    시작 시간 종료 시간 오프라인 데이터 상태 온라인 데이터 상태 온라인 데이터 부트스트랩
    2023-04-01T04:00:00.000 2023-04-02T04:00:00.000 None None 아니요
    2023-04-02T04:00:00.000 2023-04-03T04:00:00.000 Incomplete None 아니요
    2023-04-03T04:00:00.000 2023-04-04T04:00:00.000 Pending None 제출된 구체화 작업 없음
    2023-04-04T04:00:00.000 2023-04-05T04:00:00.000 Complete None

원본 데이터 오류 및 수정 문제 해결

일부 시나리오에서는 데이터 구체화 후 오류 또는 기타 이유로 인해 원본 데이터를 수정합니다. 이러한 경우 여러 데이터 간격에서 특정 기능 기간에 대해 기능 데이터를 새로 고치면 잘못되거나 부실한 기능 데이터를 해결할 수 있습니다. 기능 기간에서 데이터 상태 None CompleteIncomplete에 대한 잘못된거나 부실한 기능 데이터 해결에 대한 구체화 요청을 제출합니다.

기능 기간에 Pending 데이터 상태의 데이터 간격이 포함되지 않은 경우에만 기능 데이터 새로 고침에 대한 구체화 요청을 제출해야 합니다.

공백 채우기

구체화 저장소에서 구체화된 데이터에 다음의 이유로 공백이 있을 수 있습니다.

  • 기능 기간에 대해 구체화 작업이 제출되지 않았습니다.
  • 기능 기간에 대해 제출된 구체화 작업이 실패했거나 취소되었습니다.

이 경우 공백을 채우기 위해 data_status=[DataAvailabilityStatus.NONE,DataAvailabilityStatus.Incomplete]에 대한 기능 기간에 구체화 요청을 제출합니다. 단일 구체화 요청은 기능 기간의 모든 공백을 채웁니다.

다음 단계