일괄 예측 수행

당장 예측할 필요가 없거나 예측할 인스턴스가 많은 경우 일괄 예측 서비스를 사용할 수 있습니다. 이 페이지에서는 AI Platform Prediction의 일괄 예측 작업을 시작하는 방법을 설명합니다.

온라인 예측과 일괄 예측 비교에 대해 알아보거나 예측 개념의 개요를 읽어보세요.

시작하기 전에

예측을 요청하려면 먼저 다음을 수행해야 합니다.

  • 모델 리소스 및 버전 리소스를 만들거나 프로젝트에서 액세스할 수 있는 Cloud Storage 위치에 TensorFlow 저장 모델을 배치합니다.

    • 일괄 예측에 버전 리소스를 사용하도록 선택한 경우 버전을 mls1-c1-m2 머신 유형으로 만들어야 합니다.
  • 프로젝트가 액세스할 수 있는 Cloud Storage 위치를 설정합니다.

    • 입력 데이터 파일. 파일 위치는 여러 곳일 수 있으며, 프로젝트에 각 위치에서 읽을 수 있는 권한이 있어야 합니다.

    • 출력 파일. 출력 경로는 하나만 지정할 수 있으며, 프로젝트에 이 경로에 데이터를 쓸 수 있는 권한이 있어야 합니다.

  • 입력 파일이 일괄 예측에 올바른 형식으로 되어 있는지 확인합니다.

일괄 예측 작업 구성

일괄 예측 작업을 시작하려면 몇 가지 구성 데이터를 수집해야 합니다. API를 직접 호출할 때 사용하는 PredictionInput 객체에 포함된 데이터와 동일한 데이터입니다.

데이터 형식

입력 파일에 사용하는 입력 형식 유형입니다. 지정된 작업의 모든 입력 파일은 동일한 데이터 형식을 사용해야 합니다. 다음 값 중 하나로 설정하세요.

JSON

입력 파일은 각 행에 하나의 인스턴스가 있는 일반 텍스트입니다. 이 형식에 대한 설명은 예측 개념 페이지에 나와 있습니다.

TF_RECORD

TensorFlow TFRecord 형식을 사용합니다.

TF_RECORD_GZIP

GZIP으로 압축된 TFRecord 파일입니다.

입력 경로

입력 데이터 파일의 URI이며 Cloud Storage 위치에 있어야 합니다. 다음 항목을 지정할 수 있습니다.

  • 특정 파일의 경로: 'gs://path/to/my/input/file.json'

  • 해당 디렉터리에 있는 모든 파일을 나타내기 위해 하나의 별표 와일드 카드를 사용하는 디렉터리 경로: 'gs://path/to/my/input/*'

  • 지정된 순서로 시작되는 모든 파일을 나타내기 위해 끝에 하나의 별표 와일드 카드를 사용하는 부분 파일 이름 경로: 'gs://path/to/my/input/file*'

여러 URI를 결합할 수 있습니다. Python에서는 이러한 URI의 목록을 만듭니다. gcloud 명령줄 도구를 사용하거나 API를 직접 호출하면 여러 URI를 쉼표로 구분하고 URI 사이에 공백이 없도록 하여 나열할 수 있습니다. --input-paths 플래그의 올바른 형식은 다음과 같습니다.

 --input-paths gs://a/directory/of/files/*,gs://a/single/specific/file.json,gs://a/file/template/data*
출력 경로

예측 서비스에서 결과를 저장할 Cloud Storage 위치 경로입니다. 프로젝트에 이 위치에 쓸 수 있는 권한이 있어야 합니다.

모델 이름 및 버전 이름

예측에 사용할 모델 이름 및 버전 이름(선택사항)입니다. 버전을 지정하지 않으면 모델의 기본 버전이 사용됩니다. 일괄 예측의 경우 버전은 mls1-c1-m2 머신 유형을 사용해야 합니다.

모델 URI를 제공하는 경우(다음 섹션 참조) 이 필드를 생략합니다.

모델 URI

사용할 저장된 모델의 URI를 지정하여 AI Platform Prediction에 배포되지 않은 모델에서 예측을 수행할 수 있습니다. 저장된 모델은 Cloud Storage에 저장해야 합니다.

요약하면 일괄 예측에 사용할 모델을 지정할 때 선택할 수 있는 옵션은 세 가지이며, 이 옵션은 다음과 같습니다.

  • 모델 이름 자체 - 모델의 기본 버전 사용

  • 모델 및 버전 이름 - 특정 모델 버전 사용

  • 모델 URI - Cloud Storage에 있지만 AI Platform Prediction에는 배포되지 않은 저장된 모델 사용

리전

작업을 실행할 Google Compute Engine 리전입니다. 특히 매우 큰 데이터 세트를 사용하는 경우 최상의 성능을 얻기 위해서는 동일한 리전에서 예측 작업을 실행하고 입력 및 출력 데이터를 저장해야 합니다. AI Platform Prediction의 일괄 예측은 다음 리전에서 사용할 수 있습니다.

  -   us-central1
  -   us-east1
  -   europe-west1
  -   asia-east1

모델 학습 및 온라인 예측을 포함하여 AI Platform Prediction 서비스에 사용할 수 있는 리전을 완전히 이해하려면 리전 가이드를 참조하세요.

작업 이름

작업의 이름은 다음의 규칙을 따라야 합니다.

  • 대소문자가 혼합된 문자, 숫자, 밑줄만 사용할 수 있습니다.
  • 문자로 시작해야 합니다.
  • 128자(영문 기준) 이하여야 합니다.
  • 프로젝트에 사용된 적이 있는 모든 학습 및 일괄 예측 작업 이름과 달라야 합니다. 여기에는 성공 여부나 상태와 관계없이 프로젝트에서 만든 모든 작업이 포함됩니다.
배치 크기(선택사항)

배치당 레코드 수입니다. 서비스는 모델을 호출하기 전에 메모리에 있는 레코드의 batch_size 수를 버퍼링합니다. 지정하지 않을 경우 기본값은 64입니다.

라벨(선택사항)

작업에 라벨을 추가하여 리소스를 보거나 모니터링할 때 작업을 카테고리로 구성하고 정렬할 수 있습니다. 예를 들어 팀(engineering 또는 research 등의 라벨 추가) 또는 개발 단계(prod 또는 test)를 기준으로 작업을 정렬할 수 있습니다. 예측 작업에 라벨을 추가하려면 KEY=VALUE 쌍 목록을 제공합니다.

최대 작업자 수(선택사항)

이 작업의 처리 클러스터에서 사용할 최대 예측 노드 수입니다. 이 옵션은 일괄 예측의 자동 확장 기능에 대한 상한값을 지정합니다. 값을 지정하지 않으면 기본값 10이 사용됩니다. 지정된 값과 관계없이 확장은 예측 노드 할당량에 의해 제한됩니다.

런타임 버전(선택사항)

작업에 사용할 AI Platform Prediction 버전입니다. 이 옵션은 AI Platform Prediction에 배포되지 않은 모델에 사용할 런타임 버전을 지정합니다. 배포된 모델 버전의 경우 이 값을 항상 생략해야 하고, 이렇게 하면 모델 버전을 배포할 때 지정된 버전을 사용하도록 서비스에 알립니다.

서명 이름(선택사항)

저장된 모델에 서명이 여러 개 있는 경우 이 옵션을 사용하여 커스텀 TensorFlow 서명 이름을 지정합니다. 이렇게 하면 TensorFlow 저장된 모델에 정의된 대체 입력/출력 맵을 선택할 수 있습니다. 서명 사용에 대한 안내는 저장된 모델에 대한 TensorFlow 문서와 커스텀 모델의 출력 지정에 대한 가이드를 참조하세요. 기본값은 serving_default 값이 있는 DEFAULT_SERVING_SIGNATURE_DEF_KEY입니다.

다음 예시에서는 구성 데이터를 저장할 변수를 정의합니다.

gcloud

gcloud 명령줄 도구를 사용하여 작업을 시작할 때에는 변수를 생성할 필요가 없습니다. 하지만 변수를 생성하면 작업 제출 명령어를 훨씬 더 쉽게 입력하고 읽을 수 있습니다.

DATA_FORMAT="text" # JSON data format
INPUT_PATHS='gs://path/to/your/input/data/*'
OUTPUT_PATH='gs://your/desired/output/location'
MODEL_NAME='census'
VERSION_NAME='v1'
REGION='us-east1'
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="census_batch_predict_$now"
MAX_WORKER_COUNT="20"
BATCH_SIZE="32"
LABELS="team=engineering,phase=test,owner=sara"

Python

Python용 Google API 클라이언트 라이브러리를 사용하는 경우 Python 사전을 사용하여 JobPredictionInput 리소스를 나타낼 수 있습니다.

  1. AI Platform Prediction REST API에서 사용하는 구문으로 프로젝트 이름 및 모델 이름이나 버전 이름의 형식을 지정합니다.

    • project_name -> 'projects/project_name'
    • model_name -> 'projects/project_name/models/model_name'
    • version_name -> 'projects/project_name/models/model_name/versions/version_name'
  2. Job 리소스의 사전을 만들고 다음 두 개의 항목으로 채웁니다.

    • 작업 이름을 값으로 사용하려는 이름이 'jobId'인 키

    • PredictionInput의 필수 구성원이 모두 포함된 다른 사전 객체와 사용할 선택적 구성원이 포함된 'predictionInput'이라는 키

    다음 예시는 구성 정보를 입력 변수로 사용하여 예측 요청 본문을 반환하는 함수를 보여줍니다. 이 예는 기본 항목 외에도 프로젝트 이름, 모델 이름, 현재 시간을 기반으로 고유한 작업 식별자를 생성합니다.

    import time
    import re
    
    def make_batch_job_body(project_name, input_paths, output_path,
            model_name, region, data_format='JSON',
            version_name=None, max_worker_count=None,
            runtime_version=None):
    
        project_id = 'projects/{}'.format(project_name)
        model_id = '{}/models/{}'.format(project_id, model_name)
        if version_name:
            version_id = '{}/versions/{}'.format(model_id, version_name)
    
        # Make a jobName of the format "model_name_batch_predict_YYYYMMDD_HHMMSS"
        timestamp = time.strftime('%Y%m%d_%H%M%S', time.gmtime())
    
        # Make sure the project name is formatted correctly to work as the basis
        # of a valid job name.
        clean_project_name = re.sub(r'\W+', '_', project_name)
    
        job_id = '{}_{}_{}'.format(clean_project_name, model_name,
                               timestamp)
    
        # Start building the request dictionary with required information.
        body = {'jobId': job_id,
                'predictionInput': {
                    'dataFormat': data_format,
                    'inputPaths': input_paths,
                    'outputPath': output_path,
                    'region': region}}
    
        # Use the version if present, the model (its default version) if not.
        if version_name:
            body['predictionInput']['versionName'] = version_id
        else:
            body['predictionInput']['modelName'] = model_id
    
        # Only include a maximum number of workers or a runtime version if specified.
        # Otherwise let the service use its defaults.
        if max_worker_count:
            body['predictionInput']['maxWorkerCount'] = max_worker_count
    
        if runtime_version:
            body['predictionInput']['runtimeVersion'] = runtime_version
    
        return body
    

일괄 예측 작업 제출

작업을 제출하려면 projects.jobs.create 또는 명령줄 도구에서 이에 해당하는 gcloud ai-platform jobs submit prediction을 간단하게 호출할 수 있습니다.

gcloud

다음 예에서는 이전 섹션에 정의된 변수를 사용하여 일괄 예측을 시작합니다.

gcloud ai-platform jobs submit prediction $JOB_NAME \
    --model $MODEL_NAME \
    --input-paths $INPUT_PATHS \
    --output-path $OUTPUT_PATH \
    --region $REGION \
    --data-format $DATA_FORMAT

Python

Python용 Google API 클라이언트 라이브러리에서 일괄 예측 작업을 시작하면 다른 클라이언트 SDK 절차와 비슷한 패턴을 따릅니다.

  1. 호출에 사용할 요청 본문을 준비합니다(이전 섹션 참조).

  2. ml.projects.jobs.create를 호출하여 요청을 작성합니다.

  3. 요청에 대한 execute를 호출하여 응답을 받으면 HTTP 오류를 확인합니다.

  4. 응답을 사전으로 사용하여 Job 리소스에서 값을 가져옵니다.

HTTP 요청을 직접 작성하지 않아도 Python용 Google API 클라이언트 라이브러리를 사용하여 AI Platform Training and Prediction API를 호출할 수 있습니다. 다음 코드 샘플을 실행하기 전에 인증을 설정해야 합니다.

    import googleapiclient.discovery as discovery

    project_id = 'projects/{}'.format(project_name)

    ml = discovery.build('ml', 'v1')
    request = ml.projects().jobs().create(parent=project_id,
                                          body=batch_predict_body)

    try:
        response = request.execute()

        print('Job requested.')

        # The state returned will almost always be QUEUED.
        print('state : {}'.format(response['state']))

    except errors.HttpError as err:
        # Something went wrong, print out some information.
        print('There was an error getting the prediction results.' +
              'Check the details:')
        print(err._get_reason())

일괄 예측 작업 모니터링

일괄 예측 작업을 완료하는 데 시간이 오래 걸릴 수 있습니다. Google Cloud Console에서 작업 진행 상황을 모니터링할 수 있습니다.

  1. Google Cloud Console의 AI Platform Prediction 작업 페이지로 이동합니다.

    Cloud Console 작업 페이지로 이동

  2. 작업 ID 목록에서 작업 이름을 클릭하여 작업 세부정보 페이지를 엽니다.

  3. 현재 상태가 페이지 상단에 작업 이름과 함께 표시됩니다.

  4. 자세한 내용을 확인하려면 로그 보기를 클릭하여 Cloud Logging의 작업 항목을 볼 수 있습니다.

다른 방법으로도 일괄 예측 작업의 진행 상황을 추적할 수 있습니다. 이 방법은 학습 작업 모니터링과 같은 패턴을 따릅니다. 학습 작업을 모니터링하는 방법을 설명하는 페이지에서 더 자세히 알아보세요. 예측 작업을 처리하려면 페이지에 안내된 내용을 약간 조정해야 할 수 있지만 메커니즘은 동일합니다.

예측 결과 가져오기

서비스는 사용자가 지정한 Cloud Storage 위치에 예측을 기록합니다. 파일 출력에는 두 가지 유형이 있습니다.

  • prediction.errors_stats-NNNNN-of-NNNNN이라는 파일은 작업 중에 발생한 문제에 대한 정보를 포함합니다.

  • prediction.results-NNNNN-of-NNNNN이라는 파일은 모델의 출력으로 정의된 예측 자체를 포함합니다.

파일 이름에는 찾아야 하는 총 파일 수를 표시하는 색인 번호(위에서는 각 자릿수를 'N'으로 표시)가 포함되어 있습니다. 예를 들어 결과 파일이 6개인 작업에는 prediction.results-00000-of-00006부터 prediction.results-00005-of-00006까지가 포함됩니다.

예측 결과는 텍스트 파일에 JSON 객체로 형식이 지정됩니다. 결과는 원하는 텍스트 편집기에서 열 수 있습니다. 명령줄에서 간단히 보려면 gsutil cat을 사용합니다.

gsutil cat $OUTPUT_PATH/prediction.results-NNNNN-of-NNNNN|less

단일 입력 파일만 사용하더라도 예측 결과가 일반적으로 입력 인스턴스와 동일한 순서로 출력되지 않습니다. 인스턴스 키를 일치시켜 인스턴스의 예측을 찾을 수 있습니다.

다음 단계