AI Platform Prediction으로 AI Explanations 사용

AI Platform Prediction에서 AI Explanations를 사용하여 모델을 배포하고 사용하는 방법에 관한 전반적인 가이드입니다.

시작하기 전에

AI Platform에서 모델을 학습시키고 배포하려면 먼저 다음과 같은 몇 가지 작업을 수행해야 합니다.

  • 로컬 개발 환경을 설정합니다.
  • 결제 및 필요한 API를 사용 설정한 상태로 GCP 프로젝트를 설정합니다.
  • 학습 패키지와 학습된 모델을 저장할 Cloud Storage 버킷을 만듭니다.

GCP 프로젝트를 설정하려면 샘플 노트북에 제공된 안내를 따르세요.

모델 저장

TensorFlow 1.15, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.10, 2.11이 지원됩니다. tf.saved_model.save를 사용하여 TensorFlow 2.11에 모델을 저장하지만 TensorFlow 1.15에는 사용하지 않습니다.

AI Explanations에서 사용할 모델을 저장하는 방법Explainable AI SDK를 사용하는 방법을 자세히 알아보세요.

설명 메타데이터 파일

모델을 배포하기 전에 AI Explanations가 모델의 올바른 부분에 대한 설명을 제공할 수 있도록 모델의 입력, 출력, 기준에 관한 정보가 담긴 메타데이터 파일을 제출해야 합니다.

모델의 입력 및 출력을 자동으로 검색할 수 있도록 Explainable AI SDK를 사용하는 것이 좋습니다. Explainable AI SDK가 설명 메타데이터 파일을 만들고 업로드하기 때문에 대부분의 경우 이렇게 하면 시간과 노력을 아낄 수 있습니다.

수동으로 설명 메타데이터 파일 만들기

고급 사용 사례의 경우 모델 입력 및 출력을 수동으로 지정해야 할 수 있습니다. 설명 메타데이터 파일을 수동으로 만들려면 다음 단계를 따르세요.

  • 설명을 제공할 입력 및 출력 텐서의 이름을 식별합니다. 수동으로 입력 및 출력 텐서 이름 찾기 아래의 섹션을 참조하세요. 입력 및 출력 텐서 식별 방법을 자세히 알아보세요.
  • 적절한 기준을 만들고 input_baselines에 지정합니다.
  • framework에 'tensorflow'를 지정합니다.
  • 파일 이름을 explanation_metadata.json으로 지정합니다.
  • explanation_metadata.json 파일을 저장된 모델이 저장된 동일한 Cloud Storage 버킷에 업로드합니다.

아래 예시는 explanation_metadata.json 파일을 보여줍니다.

{
    "inputs": {
      "data": {
        "input_tensor_name": "YOUR_INPUT_TENSOR_NAME"
        "input_baselines": [0]
      }
    },
    "outputs": {
      "duration": {
        "output_tensor_name": "YOUR_OUTPUT_TENSOR_NAME"
      }
    },
    "framework": "tensorflow"
}

이 예시에서 "data""duration"은 모델 빌드 및 학습 중 할당할 수 있는 입력 및 출력 텐서에 대한 의미 있는 이름입니다. 실제 입력 및 출력 텐서 이름은 name:index 형식을 따릅니다. 예를 들면 x:0 또는 Placeholder:0입니다.

input_baselines의 경우 하나의 기준을 지정하여 시작할 수 있습니다. 이 예시에서 [0]은 모두 검은색 이미지를 나타냅니다. 여러 기준을 지정하여 추가 정보를 제공할 수 있습니다. 기준 조정에 대해 자세히 알아보세요.

수동으로 입력 및 출력 텐서 이름 찾기

대부분의 경우 Explainable AI SDK를 사용하여 모델의 입력과 출력을 생성할 수 있습니다. 사전 학습된 TensorFlow 1.15 모델을 사용하는 경우에만 입력 및 출력 텐서 이름을 수동으로 찾아야 합니다.

입력 및 출력 텐서 이름을 찾는 가장 좋은 방법은 입력 및 출력 데이터의 유형과 모델 빌드 방법에 따라 다릅니다. 각 사례에 대한 자세한 설명과 예시는 [입력 및 출력 이해][understanding-inputs-outputs] 가이드를 참조하세요.

입력 데이터 유형 출력 데이터 유형 기타 기준 권장되는 방식
숫자 또는 문자열 숫자 입력이 직렬화된 양식이 아닙니다. 출력이 범주형 데이터로 처리되는 숫자 데이터가 아닙니다(예: 숫자 클래스 ID). 저장된 모델 CLI를 사용하여 입력 및 출력 텐서의 이름을 찾습니다. 프로그램이나 환경이 학습 코드에 액세스할 수 있다면 모델을 학습시키거나 저장하는 도중에 설명 메타데이터 파일을 빌드합니다.
모든 직렬화된 데이터 모두 모델을 내보낼 때 TensorFlow 파싱 작업을 서빙 입력 함수에 추가합니다. 파싱 작업의 출력을 사용하여 입력 텐서를 식별합니다.
모두 모두 모델에 전처리 작업이 포함됩니다. 전처리 단계 이후에 입력 텐서 이름을 가져오려면 tf.Tensorname 속성을 사용하여 입력 텐서 이름을 가져옵니다.
모두 확률, 로지트 또는 기타 유형의 부동 소수점 텐서 확률, 로지트 또는 기타 부동 소수점 텐서 유형이 아닌 출력의 설명을 가져오려고 합니다. 텐서보드로 그래프를 검사하여 올바른 출력 텐서를 찾습니다.
미분할 수 없는 데이터 모두 미분할 수 있는 입력이 필요한 적분 경사를 사용하려고 합니다. 미분할 수 없는 입력을 미분 가능한 텐서로 인코딩합니다. 원본 입력 텐서와 인코딩된 입력 텐서의 이름을 설명 메타데이터 파일에 추가합니다.

모델 및 버전 배포

AI Platform Prediction은 모델버전 리소스를 사용하여 학습된 모델을 구성합니다. AI Platform Prediction 모델은 머신러닝 모델 버전의 컨테이너입니다.

모델을 배포하려면 AI Platform Prediction에서 모델 리소스를 만들고 해당 모델의 한 버전을 만든 다음 모델 버전을 Cloud Storage에 저장된 모델 파일에 연결합니다.

모델 리소스 만들기

AI Platform Prediction은 모델 리소스를 사용하여 모델의 여러 버전을 구성합니다.

모델 버전의 모델 리소스를 만듭니다. 다음 Google Cloud CLI 명령어에서 MODEL_NAME을 원하는 모델 이름으로 바꿉니다. 모델 이름은 문자로 시작해야 하며 문자, 숫자, 밑줄만 포함해야 합니다.

AI Explanations를 사용하려면 리전 엔드포인트에 모델을 만들어야 합니다.

gcloud ai-platform models create MODEL_NAME \
  --region us-central1

자세한 내용은 AI Platform Prediction 모델 API를 참조하세요.

모델 버전 만들기

이제 이전에 Cloud Storage에 업로드한 학습된 모델을 사용하여 모델 버전을 만들 수 있습니다. 버전을 만들 때 다음 매개변수를 지정합니다.

  • name: AI Platform Prediction 모델 내에서 고유해야 합니다.
  • deploymentUri: Cloud Storage 내 사용자의 저장된 모델 디렉터리 경로입니다.
  • framework(필수사항): tensorflow 전용
  • runtimeVersion: AI Explanations를 지원하는 런타임 버전인 1.15, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.10, 2.11을 사용합니다.
  • pythonVersion: 런타임 버전 1.15 이상의 경우 '3.7'을 사용합니다.
  • machineType(필수사항): AI Platform Prediction이 예측 및 설명을 제공하는 노드에 사용하는 가상 머신의 유형입니다. AI Explanations를 지원하는 머신 유형을 선택하세요.
  • explanation-method: 사용할 특성 기여 분석 메서드의 유형으로, '샘플링된 Shapley', '통합 경사'또는 'xrai'가 있습니다.
  • 경로 또는 단계: 샘플링된 Shapley에 --num-paths를 사용하고 통합 경사 또는 XRAI에 --num-integral-steps를 사용합니다.

각 매개변수에 대한 자세한 내용은 버전 리소스용 AI Platform 학습 및 예측 API를 참조하세요.

  1. 환경 변수를 설정하여 저장된 모델이 있는 Cloud Storage 디렉터리, 모델 이름, 버전 이름, 프레임워크 선택 사항의 경로를 저장합니다.

    MODEL=your_model_name
    MODEL_DIR="gs://your_bucket_name/"
    VERSION=your_version_name
    FRAMEWORK=tensorflow
    
  2. 버전을 만듭니다.

    EXPLAIN_METHOD="integrated-gradients"
    gcloud beta ai-platform versions create $VERSION \
    --model $MODEL \
    --origin $MODEL_DIR \
    --runtime-version 1.15 \
    --framework $FRAMEWORK \
    --python-version 3.7 \
    --machine-type n1-standard-4 \
    --explanation-method $EXPLAIN_METHOD \
    --num-integral-steps 25 \
    --region us-central1
    

    버전을 만드는 데 몇 분 정도 걸립니다. 준비되면 다음 출력이 표시됩니다.

    Creating version (this might take a few minutes)......done.
  3. 모델 배포 상태를 확인하고 모델이 올바르게 배포되었는지 확인합니다.

    gcloud ai-platform versions describe $VERSION_NAME \
      --model $MODEL_NAME \
      --region us-central1
    

    상태가 READY인지 확인합니다. 다음과 비슷한 출력이 표시됩니다.

    createTime: '2018-02-28T16:30:45Z'
    deploymentUri: gs://your_bucket_name
    framework: TENSORFLOW
    machineType: n1-standard-4
    name: projects/your_project_id/models/your_model_name/versions/your_version_name
    pythonVersion: '3.7'
    runtimeVersion: '1.15'
    state: READY

설명에 지원되는 머신 유형

AI Explanations 요청의 경우 다음 머신 유형 중 하나를 사용하여 모델 버전을 배포해야 합니다. 머신 유형을 지정하지 않으면 배포할 수 없습니다.

다음 표에서는 사용 가능한 머신 유형을 비교합니다.

이름 vCPU 메모리(GB)
n1-standard-2 2 7.5
n1-standard-4 4 15
n1-standard-8 8 30
n1-standard-16 16 60
n1-standard-32 32 120

이러한 머신 유형은 리전 엔드포인트에서만 사용할 수 있습니다. 다른 AI Platform Prediction 기능 지원에 대해 자세히 알아보세요.

각 머신 유형의 가격 책정에 대해 알아보세요. Compute Engine 문서에서 Compute Engine(N1) 머신 유형의 세부 사양에 대해 자세히 알아보세요.

입력 데이터 형식 지정

온라인 예측의 기본 형식은 데이터 인스턴스 목록입니다. 학습 애플리케이션에서 입력을 구성한 방법에 따라서 일반 값 목록이 될 수도 또는 JSON 객체의 구성원이 될 수도 있습니다. 복잡한 입력 및 예측을 위한 바이너리 데이터의 형식을 지정하는 방법을 알아보세요.

이 예시에서는 TensorFlow 모델에 대한 입력 텐서와 인스턴스 키를 보여줍니다.

{"values": [1, 2, 3, 4], "key": 1}

JSON 문자열 구성은 다음 규칙을 따르는 한 복잡해도 괜찮습니다.

  • 인스턴스 데이터의 최상위 수준은 키-값 쌍의 사전인 JSON 객체여야 합니다.

  • 인스턴스 객체의 개별 값은 문자열, 숫자, 목록일 수 있습니다. JSON 객체를 삽입할 수 없습니다.

  • 목록에는 같은 유형의 항목만 포함되어야 합니다(다른 목록 포함). 문자열과 숫자 값을 함께 사용할 수 없습니다.

projects.explain 호출의 메시지 본문으로 온라인 예측을 위한 입력 인스턴스를 전달합니다. 예측 요청 본문의 형식 요구 사항에 대해 자세히 알아보세요.

  1. gcloud로 요청을 제출하려면 입력 파일이 줄 바꿈으로 구분된 JSON 파일이며 한 줄에 하나의 인스턴스가 있고 각 인스턴스가 한 개의 JSON 객체인지 확인하세요.

    {"values": [1, 2, 3, 4], "key": 1}
    {"values": [5, 6, 7, 8], "key": 2}
    

예측 및 설명 요청

예측 및 설명을 요청하세요.

gcloud beta ai-platform explain \
  --model $MODEL \
  --version $VERSION \
  --json-instances='your-data.txt' \
  --region us-central1

설명 응답 이해하기

모델을 배포한 후에는 Explainable AI SDK를 사용하여 테이블 형식 및 이미지 데이터 모두에 대해 설명을 요청하고 특성 기여 분석을 시각화할 수 있습니다.

import explainable_ai_sdk

m = explainable_ai_sdk.load_model_from_ai_platform(PROJECT_ID, MODEL_NAME, VERSION, region=REGION)
explanations = m.explain([instance_dict])
explanations[0].visualize_attributions()

테이블 형식 모델의 경우 기여 분석이 막대 그래프에 표시됩니다. 이미지 모델의 경우 모델을 배포할 때 지정한 시각화 설정을 사용하여 입력 이미지에 기여 분석이 표시됩니다.

설명 응답의 각 필드에 대한 자세한 내용은 API 참조의 전체 응답 예시를 참조하세요.

예시 노트북을 참조하여 설명 응답을 파싱하는 방법을 알아보세요.

TensorFlow 2:

TensorFlow 1.15:

설명 확인

다음 코드 예시는 설명 배치를 점검하고 기준을 조정해야 하는지 확인하는 데 도움을 줍니다.

코드에서 explanation_metadata.json 파일에 지정한 내용에 따라 입력 키 값을 업데이트하기만 하면 됩니다.

{
    "inputs": {
      "YOUR_INPUT_KEY_VALUE": {
        "input_tensor_name": "YOUR_INPUT_TENSOR_NAME"
        "input_baselines": [0]
      }
    ...
}

예를 들어 입력 키 값이 'data'라면 다음 코드 스니펫의 4번 행의 동일한 값이 'data'가 됩니다.

def check_explanations(example, mean_tgt_value=None, variance_tgt_value=None):
  passed_test = 0
  total_test = 1
  attribution_vals = example['attributions_by_label'][0]['attributions']['YOUR-INPUT-KEY-VALUE']

  baseline_score = example['attributions_by_label'][0]['baseline_score']
  sum_with_baseline = np.sum(attribution_vals) + baseline_score
  predicted_val = example['attributions_by_label'][0]['example_score']

  # Check 1
  # The prediction at the input is equal to that at the baseline.
  #  Please use a different baseline. Some suggestions are: random input, training
  #  set mean.
  if abs(predicted_val - baseline_score) <= 0.05:
    print('Warning: example score and baseline score are too close.')
    print('You might not get attributions.')
  else:
    passed_test += 1

  # Check 2 (only for models using Integrated Gradient explanations)
  # Ideally, the sum of the integrated gradients must be equal to the difference
  # in the prediction probability at the input and baseline. Any discrepancy in
  # these two values is due to the errors in approximating the integral.
  if explain_method == 'integrated-gradients':
    total_test += 1
    want_integral = predicted_val - baseline_score
    got_integral = sum(attribution_vals)
    if abs(want_integral-got_integral)/abs(want_integral) > 0.05:
        print('Warning: Integral approximation error exceeds 5%.')
        print('Please try increasing the number of integrated gradient steps.')
    else:
        passed_test += 1

  print(passed_test, ' out of ', total_test, ' sanity checks passed.')

설명을 파싱할 때 앞서 받은 각 기여 분석에 대해 다음을 확인할 수 있습니다.

for i in attributions_resp['explanations']:
  check_explanations(i)

근사치 오류를 사용하여 결과 향상

AI Explanations 특성 기여 분석 메서드(샘플링된 Shapley, 통합 경사, XRAI)는 모두 Shapley 값의 변형을 기반으로 합니다. Shapley 값의 계산 비용이 매우 높기 때문에 AI Explanations는 정확한 값 대신 근사치를 제공합니다. 특성 기여 분석 결과와 함께 AI Explanations는 근사치 오류도 반환합니다. 근사치 오류가 0.05를 초과할 경우 오류를 줄이기 위해 입력을 조정하세요.

다음 입력을 변경하여 근사치 오류를 줄이고 정확한 값에 더 가까운 근사치를 얻을 수 있습니다.

  • 적분 단계 수 또는 경로 수를 늘립니다.
  • 선택한 입력 기준을 변경합니다.
  • 입력 기준을 더 추가합니다. 통합 경사 및 XRAI 메서드에 추가 기준을 사용하면 지연 시간이 늘어납니다. 샘플링된 Shapley 메서드에 추가 기준을 사용하면 지연 시간이 늘어나지 않습니다.

단계 또는 경로 증가

근사치 오류를 줄이려면 다음을 늘릴 수 있습니다.

  • 샘플링된 Shapley 경로 수
  • 통합 경사 또는 XRAI의 적분 단계 수

모델 배포 중 버전 리소스를 만들 때 이러한 매개변수를 설정합니다.

기준 조정

explanation_metadata.json 파일에서 input_baselines를 설정할 수 있습니다. 이 섹션에서는 테이블 형식 및 이미지 데이터의 예시를 제공합니다. 입력 기준은 학습 데이터와 관련해서 중앙값, 최솟값, 최댓값, 임의 값을 나타낼 수 있습니다.

일반적으로 다음과 같습니다.

  • 중앙값을 나타내는 하나의 기준으로 시작합니다.
  • 이 기준을 임의 값을 나타내는 항목으로 변경합니다.
  • 최솟값 및 최댓값을 나타내는 두 기준을 시도합니다.
  • 임의 값을 나타내는 또 다른 기준을 추가합니다.

테이블 형식 데이터 예시

다음 Python 코드는 테이블 형식 데이터의 설명 메타데이터 파일 콘텐츠를 만듭니다. 샘플링된 Shapley 또는 통합 경사를 사용하여 테이블 형식 데이터의 특성 기여 분석을 얻을 수 있습니다. 이 코드는 테이블 형식 데이터의 예시 노트북의 일부입니다.

input_baselines는 여러 기준을 지정할 수 있는 목록입니다. 이 예시에서는 기준을 하나만 설정합니다. 기준은 학습 데이터의 중앙값 목록입니다(이 예시의 train_data).

explanation_metadata = {
    "inputs": {
      "data": {
        "input_tensor_name": model.input.name,
        "input_baselines": [train_data.median().values.tolist()],
        "encoding": "bag_of_features",
        "index_feature_mapping": train_data.columns.tolist()
      }
    },
    "outputs": {
      "duration": {
        "output_tensor_name": model.output.name
      }
    },
  "framework": "tensorflow"
  }

최솟값 및 최댓값을 나타내는 두 기준을 설정하려면 [train_data.min().values.tolist(), train_data.max().values.tolist()]와 같이 input_baselines를 설정합니다.

이미지 데이터 예시

다음 Python 코드는 이미지 데이터의 설명 메타데이터 파일 콘텐츠를 만듭니다. 통합 경사를 사용하여 이미지 데이터의 특성 기여 분석을 가져올 수 있습니다. 이 코드는 이미지 데이터의 예시 노트북의 일부입니다.

input_baselines는 여러 기준을 지정할 수 있는 목록입니다. 이 예시에서는 기준을 하나만 설정합니다. 기준은 임의 값 목록입니다. 학습 데이터 세트에 많은 흑백 이미지가 포함된 경우 이미지 기준에 임의 값을 사용하는 것이 좋습니다.

그렇지 않으면 흑백 이미지 표시를 위해 input_baselines[0, 1]로 설정합니다.

random_baseline = np.random.rand(192,192,3)

explanation_metadata = {
    "inputs": {
      "data": {
        "input_tensor_name": "input_pixels:0",
        "modality": "image",
        "input_baselines": [random_baseline.tolist()]
      }
    },
    "outputs": {
      "probability": {
        "output_tensor_name": "dense/Softmax:0"
      }
    },
  "framework": "tensorflow"
  }

다음 단계