모델 모니터링 설정

모델 모니터링을 시작하려면 먼저 모델을 Vertex AI Model Registry에 등록한 후 모델 모니터를 만들어 모니터링 세부정보를 구성해야 합니다. 이 페이지에서는 모델을 등록하는 방법과 모니터링 구성에서 정의할 수 있는 모든 사양을 설명합니다.

Model Monitoring v2에서는 테이블 형식 모델만 지원합니다. 이러한 모델은 Vertex AI 또는 기타 서빙 인프라에 제공될 수 있습니다.

모델 등록

Vertex AI 엔드포인트, GKE 또는 BigQuery와 같은 모든 서빙 인프라에 배포된 모델을 모니터링할 수 있습니다. Vertex AI에서 제공하는 모델을 등록하려면 모델 가져오기를 참조하세요.

Vertex AI 외부에서 제공하는 모델의 경우 다른 리소스에서 제공되는 모델의 자리표시자인 참조 모델을 등록할 수 있습니다. 참조 모델을 등록할 때 다음 예시와 같이 모델 이름을 등록합니다.

Python SDK

model = aiplatform.Model.upload(
 display_name="MODEL_NAME"
)

참조 모델의 경우 Model Monitoring에서 Cloud Storage 또는 BigQuery의 데이터 세트를 지원할 수 있습니다. 참조 모델의 특성 기여 분석을 모니터링할 수 없습니다.

데이터 소스

다음 소스에 저장된 데이터의 측정항목을 모니터링할 수 있습니다. 중첩된 특성은 지원되지 않습니다. 중첩 데이터를 분석하려면 먼저 평면화합니다. 예를 들어 데이터가 BigQuery에 있으면 SQL을 사용하여 중첩된 특성을 변환할 수 있습니다.

BigQuery
BigQuery 테이블 URI 또는 SQL 쿼리를 제공할 수 있습니다. 기간을 지정하거나 지속적 모니터링을 설정하려면 데이터 세트에서 timestamp_field로 지정하는 타임스탬프 열이 테이블에 포함되어야 합니다.
Cloud Storage
데이터는 CSV 또는 JSONL 형식으로 저장되어야 합니다. CSV 파일의 경우 열 이름 헤더를 파일의 첫 번째 행으로 포함합니다.
Vertex AI 일괄 예측 작업
일괄 예측 작업을 모니터링하려면 정규화된 일괄 예측 작업 리소스 이름을 제공합니다. 일괄 예측 작업을 만들자마자 모니터링 작업을 실행할 수 있습니다. 일괄 작업이 완료될 때까지 기다리지 않아도 됩니다. Model Monitoring v2는 일괄 예측 작업이 완료된 직후에 모니터링 작업을 실행합니다.
Vertex AI 엔드포인트 로깅

엔드포인트를 모니터링하려면 먼저 엔드포인트에서 요청-응답 로깅을 사용 설정해야 합니다. 비공개 엔드포인트는 요청-응답 로깅을 지원하지 않으므로 지원되지 않습니다.

Model Monitoring v2에서는 Vertex AI 엔드포인트 요청 및 응답의 JSON 형식이 predict 메서드에서 사용하는 형식을 따라야 합니다. instances 객체는 request_payload 열의 로깅 테이블에 [INSTANCE_1, INSTANCE_2] 배열로 삽입됩니다. 마찬가지로 predictions 객체는 response_payload 열의 로깅 테이블에 [PREDICTION_1, PREDICTION_2] 배열로 삽입됩니다.

다른 메서드가 지원되지만(예: 원시 예측) 데이터는 predict 메서드의 API 참조에 설명된 대로 요청 및 응답 JSON 형식을 따라야 합니다.

Vertex AI 관리형 데이터 세트

Vertex AI에서 관리되는 데이터 세트 자세한 내용은 테이블 형식 데이터 세트 형식을 참조하세요.

지속적 모니터링

예약 실행이라고도 하는 지속적 모니터링을 통해 설정한 일정에 따라 모니터링 작업을 실행할 수 있습니다. 시간 사양이 있는 지속적 모델 모니터링만 BigQuery 및 Vertex AI 엔드포인트 로깅을 데이터 소스로 지원합니다.

BigQuery를 시간 사양이 있는 지속적 모니터링의 소스로 사용하려면 테이블에 타임스탬프 열이 있어야 합니다. Vertex AI 엔드포인트 로깅으로 생성된 BigQuery 테이블의 경우 테이블에 이미 logging_time 타임스탬프 열이 포함되어 있습니다.

일반적인 BigQuery 최적화 기법으로 타임스탬프를 기준으로 테이블을 분할하여 쿼리 성능을 개선하고 쿼리에서 읽는 바이트 수를 줄여 비용을 제어하는 것이 좋습니다.

지원되는 데이터 유형

숫자 및 범주 특성 모두 지원됩니다. 불리언, 범주형, 문자열 또는 정수 값의 배열과 같은 배열이 있는 열을 포함할 수 있습니다. Model Monitoring v2는 배열의 각 요소가 고유 값이 되도록 배열을 평면화합니다.

숫자 특성은 다음 데이터 유형에 매핑됩니다.

  • 부동 소수점 수
  • 정수

범주형 특성은 다음 데이터 유형에 매핑됩니다.

  • 불리언
  • 문자열
  • 범주형

모델 스키마

Model Monitoring v2는 모델 스키마를 사용하여 데이터를 파싱합니다. 이 스키마는 모델 모니터를 만들 때 필요합니다. AutoML Tables의 경우에는 모델 스키마를 지정할 필요가 없습니다. Vertex AI Model Monitoring에서 자동으로 가져옵니다.

다음 예시에서는 예상되는 스키마의 일반적인 구조를 보여줍니다.

Python SDK

ml_monitoring.spec.ModelMonitoringSchema(
  feature_fields=[
      ml_monitoring.spec.FieldSchema(
          name="FEATURE_NAME",
          data_type="DATA_TYPE",
          repeated=BOOLEAN
      )
  ],
    prediction_fields = [
      model_monitor.spec.FieldSchema(
          name="PREDICTION_NAME",
          data_type="DATA_TYPE",
          repeated=BOOLEAN
      )
  ],
  ground_truth_fields = [
      model_monitor.spec.FieldSchema(
          feature="GROUND_TRUTH_NAME",
          data_type="DATA_TYPE",
          repeated=BOOLEAN
      )
  ]
)

열에 값 배열이 포함된 경우 repeatedtrue로 설정합니다.

AutoML Tables의 경우 Model Monitoring v2에서 모델 스키마를 가져오면 대상 열을 제외하고 학습 데이터 세트에 있는 특성을 입력 특성으로 사용합니다. 예측 출력은 predicted_{target_column} 열로 설정됩니다. 또한 예측 출력 값에 대한 Model Monitoring v2 추출 방법은 모델 유형에 따라 다릅니다. AutoML Tables 분류 모델의 경우 Vertex AI Model Monitoring은 argmax 라벨 분포를 모니터링합니다. AutoML Tables 회귀 모델의 경우 Vertex AI Model Monitoring은 값 분포를 모니터링합니다.

기준 및 대상 데이터 세트

기준 데이터 세트는 시간 경과에 따라 측정항목을 측정하는 데 사용하는 참조점을 나타냅니다. 대상 데이터 세트에는 기준 데이터 세트와 비교하는 데 사용하는 최신 데이터가 포함됩니다. Model Monitoring v2는 모델 품질을 추적하는 데 도움이 되도록 두 데이터 세트 간의 측정항목을 계산합니다. 지원되는 모든 데이터 소스에서 기준 및 대상 데이터 세트를 가져올 수 있습니다.

대상 및 기준의 예시로 서빙 데이터 세트(대상)를 모델 학습 데이터 세트 (기준)와 비교하거나 서빙 데이터 세트(대상)를 이전 기간의 서빙 데이터 세트(기준)와 비교할 수 있습니다.

대상 데이터 세트

대상 데이터 세트를 선택하면 Model Monitoring v2에서 전체 데이터 세트를 처리하거나 개발자가 Model Monitoring v2에서 검사할 데이터 양을 지정하는 기간을 설정할 수 있습니다. 예를 들어 24시간 기간을 지정하면 Model Monitoring v2에서 최근 24시간 데이터만 기준 데이터 세트와 비교합니다.

데이터 드리프트 분석에서 부적절한 볼륨 데이터가 처리되는 경우 드리프트가 휘발성일 수 있습니다. 기간이 길면 낮은 샘플 수로 인해 트리거된 알림을 방지할 수 있습니다.

기준 데이터 세트

기준 데이터 세트를 모델 학습 데이터가 포함된 Vertex AI 관리형 데이터 세트와 같은 지원되는 데이터 소스로 설정할 수 있습니다. 대상 데이터 세트와 마찬가지로 Model Monitoring v2에서 전체 데이터 세트나 특정 기간을 처리하도록 선택할 수 있습니다.

시간 사양

다음 두 가지 방법으로 모니터링 시간 사양을 설정할 수 있습니다.

  • 시간 범위: 시작 시간과 종료 시간 쌍이 포함됩니다.
  • 기간 및 오프셋: 포함할 데이터 양과 비교 데이터 세트 간의 기간을 지정합니다.

예를 들어 최근 데이터를 이전에 수집된 데이터와 비교하려면 오프셋을 설정하면 됩니다. 오프셋은 대상 데이터 세트와 기준 데이터 세트 사이의 기간을 지정합니다. 예를 들어 대상 데이터 세트를 1일 기간으로 설정하고, 기준도 일주일 오프셋과 1일 기간으로 설정했다고 가정해 보겠습니다.

이 경우 대상 데이터 세트에는 모니터링 작업 시작 시간 24시간 전의 데이터가 포함됩니다. 기준 데이터 세트에는 동일한 24시간이지만 정확히 일주일 전의 데이터가 포함됩니다.

모델 모니터 만들기

모델 모니터를 만들어 모니터링 세부정보를 Vertex AI Model Registry에 등록된 모델 버전과 연결합니다. 결과 리소스를 모델 모니터라고 합니다. 모델 버전당 모델 모니터 하나만 만들 수 있습니다.

모델 모니터를 만들 때 모델 이름, 버전, 스키마를 지정합니다. AutoML 모델과 같은 일부 모델에서는 스키마가 자동으로 제공됩니다.

모델 모니터에서 선택적으로 모니터링 목표, 학습 데이터 세트, 모니터링 출력 위치, 알림 설정을 설정할 수 있습니다. 모니터링 작업을 실행하면 Model Monitoring v2에서 이러한 설정을 기본값으로 사용합니다.

Console

  1. Google Cloud 콘솔에서 Monitoring 페이지로 이동합니다.

    Monitoring으로 이동

  2. 모니터링 구성을 클릭합니다.

  3. 모니터링할 모델과 버전을 선택합니다.

  4. 해당하는 경우 예측 출력의 입력 특성 스키마와 정답(사용 가능한 경우)을 정의합니다.

  5. 선택사항: 학습 데이터 세트에서 드리프트를 모니터링하려면 데이터 세트 위치를 지정합니다.

  6. 선택사항: 모니터링 결과를 내보내기 위해 기존 Cloud Storage 버킷을 지정하려면 고급 옵션을 펼친 후 버킷을 선택합니다.

  7. 모니터링 목표를 구성하려면 계속을 클릭하거나 설정을 클릭하여 모델 모니터를 만듭니다.

    이 구성은 작업을 실행할 때 기본값으로 사용됩니다.

  8. 모니터링할 목표를 선택합니다. 목표마다 모니터링할 측정항목과 알림 임곗값을 설정할 수 있습니다.

  9. 경고와 알림을 모니터링할 수 있도록 Cloud Monitoring에서 이메일 주소와 알림 채널(선택사항)을 지정합니다.

Python SDK

from vertexai.resources.preview import ml_monitoring
from google.cloud.aiplatform_v1beta1.types import ExplanationSpec, ExplanationParameters, ExplanationMetadata

# Define Monitoring Schema. For AutoML models, this is optional if the schema information is available.
MONITORING_SCHEMA=ml_monitoring.spec.ModelMonitoringSchema(
  feature_fields=[
      ml_monitoring.spec.FieldSchema(
          name="sepal_length_cm",
          data_type="float"
      ),
      ml_monitoring.spec.FieldSchema(
          name="sepal_width_cm",
          data_type="float"
      ),
      ml_monitoring.spec.FieldSchema(
          name="petal_length_cm",
          data_type="float"
      ),
      ml_monitoring.spec.FieldSchema(
          name="petal_width_cm",
          data_type="float"
      )
  ],
  prediction_fields = [
      ml_monitoring.spec.FieldSchema(
          name="predicted_species",
          data_type="categorical"
      )
  ]
)

TRAINING_DATASET = ml_monitoring.spec.MonitoringInput(
  gcs_uri=GCS_INPUT_URI,
  data_format=DATA_FORMAT,
)

DEFAULT_FEATURE_DRIFT_SPEC=ml_monitoring.spec.DataDriftSpec(
  categorical_metric_type="l_infinity",
  numeric_metric_type="jensen_shannon_divergence",
  default_categorical_alert_threshold=0.1,
  default_numeric_alert_threshold=0.1,
)

DEFAULT_PREDICTION_OUTPUT_DRIFT_SPEC=ml_monitoring.spec.DataDriftSpec(
  categorical_metric_type="l_infinity",
  numeric_metric_type="jensen_shannon_divergence",
  default_categorical_alert_threshold=0.1,
  default_numeric_alert_threshold=0.1,
)

DEFAULT_FEATURE_ATTRIBUTION_SPEC=ml_monitoring.spec.FeatureAttributionSpec(
  default_alert_condition=0.0003,
  feature_alert_conditions={"sepal_length_cm":0.0001},
)

EXPLANATION_SPEC=ExplanationSpec(
  parameters=ExplanationParameters(
      {"sampled_shapley_attribution": {"path_count": 2}}
  ),
  metadata=ExplanationMetadata(
      inputs={
          "sepal_length_cm": ExplanationMetadata.InputMetadata({
              "input_tensor_name": "sepal_length_cm",
              "encoding": "IDENTITY",
              "modality": "numeric",
          }),
          ...
      },
      ...
  )
)

DEFAULT_OUTPUT_SPEC = ml_monitoring.spec.output.OutputSpec(
  gcs_base_dir=GCS_OUTPUT_BASE_DIR
)

DEFAULT_NOTIFICATION_SPEC = ml_monitoring.spec.NotificationSpec(
  user_emails=['email@example.com']
)

my_model_monitor = ml_monitoring.ModelMonitor.create(
  display_name=MONITORING_JOB_DISPLAY_NAME,
  model_name=MODEL_RESOURCE_NAME,
  model_version_id=MODEL_VERSION_ID,
  model_monitoring_schema=MONITORING_SCHEMA,
  # The following fields are optional for creating the model monitor.
  training_dataset=TRAINING_DATASET,
  tabular_objective_spec=ml_monitoring.spec.TabularObjective(
      feature_drift_spec=DEFAULT_FEATURE_DRIFT_SPEC,
      prediction_output_drift_spec=DEFAULT_PREDICTION_OUTPUT_DRIFT_SPEC,
      feature_attribution_spec=DEFAULT_FEATURE_ATTRIBUTION_SPEC,
  ),
  explanation_config=DEFAULT_FEATURE_ATTRIBUTION_SPEC,
  output_spec=DEFAULT_OUTPUT_SPEC,
  notification_spec=DEFAULT_NOTIFICATION_SPEC
)