온라인 예측 수행

AI Platform Prediction 온라인 예측은 지연 시간을 최소화하면서 호스팅된 모델을 통해 데이터를 실행하는 데 최적화된 서비스입니다. 소규모의 데이터 배치를 서비스에 전송하면 AI Platform에서 응답을 통해 예측을 반환합니다.

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

시작하기 전에

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

리전

온라인 예측은 특정 리전에서 사용할 수 있습니다. 또한 리전마다 사용할 수 있는 머신 유형이 다릅니다. 각 리전의 온라인 예측 가용성에 대한 자세한 내용은 리전 가이드를 참조하세요.

모델 및 버전 만들기

모델 및 버전 리소스를 생성할 때 온라인 예측을 실행하는 방법에 대해 다음과 같은 중요한 사항을 결정해야 합니다.

생성된 리소스 리소스 생성 시 결정 사항
모델 예측을 실행할 리전
모델 온라인 예측 로깅 사용
버전 사용할 런타임 버전
버전 사용할 Python 버전
버전 온라인 예측에 사용할 머신 유형

모델 또는 버전을 처음 생성한 후에는 위의 설정 내용을 업데이트할 수 없습니다. 설정 변경이 필요한 경우에는 새 모델이나 새로운 설정의 버전 리소스를 만든 후 모델을 다시 배포하세요.

온라인 예측에 사용할 수 있는 머신 유형

버전을 만들 때 AI Platform Prediction에서 온라인 예측 노드에 사용할 가상 머신의 유형을 선택할 수 있습니다. 머신 유형에 대해 자세히 알아보세요.

온라인 예측 요청을 위한 로그 요청

로그에는 비용이 발생하므로 AI Platform Prediction 예측 서비스는 기본적으로 요청에 대한 로그 정보를 제공하지 않습니다. 대량의 초당 쿼리 수(QPS)에 대해 온라인 예측을 수행하면 상당히 많은 수의 로그가 생성되며, 여기에는 Cloud Logging 가격 책정 또는 BigQuery 가격 책정이 적용됩니다.

온라인 예측 로깅을 사용 설정하려면 사용 설정하려는 로깅 유형에 따라모델 리소스를 생성하거나 모델 버전 리소스를 생성할 때 구성해야 합니다. 로깅에는 3가지 유형이 있으며 독립적으로 사용 설정할 수 있습니다.

  • 액세스 로깅: Cloud Logging에 대한 각 요청의 타임스탬프 및 지연 시간과 같은 정보를 로깅합니다.

    모델 리소스를 만들 때 액세스 로깅을 사용 설정할 수 있습니다.

  • 콘솔 로깅: 예측 노드의 stderrstdout 스트림을 Cloud Logging에 로깅하며, 디버깅에 유용합니다. 이 유형의 로깅은 Compute Engine(N1) 머신 유형의 경우 미리보기이며 기존(MLS1) 머신 유형의 경우 일반 안정화 버전입니다.

    모델 리소스를 만들 때 콘솔 로깅을 사용 설정할 수 있습니다.

  • 요청-응답 로깅: BigQuery 테이블에 대한 온라인 예측 요청 및 응답의 샘플을 로깅합니다. 이 유형의 로깅은 베타 버전입니다.

    모델 버전 리소스를 만들고 버전을 업데이트하여 요청-응답 로깅을 사용 설정할 수 있습니다.

gcloud

액세스 로깅을 사용 설정하려면 gcloud ai-platform models create 명령어를 사용하여 모델을 만들 때 --enable-logging 플래그를 포함하세요. 예를 들면 다음과 같습니다.

gcloud ai-platform models create MODEL_NAME \
  --region=us-central1 \
  --enable-logging

콘솔 로깅(미리보기)을 사용 설정하려면 gcloud beta 구성요소를 사용하고 --enable-console-logging 플래그를 포함하세요. 예를 들면 다음과 같습니다.

gcloud components install beta

gcloud beta ai-platform models create MODEL_NAME \
  --region=us-central1 \
  --enable-console-logging

현재 gcloud 도구를 사용하여 요청-응답 로깅(베타)을 사용 설정할 수는 없습니다. 이 유형의 로깅은 REST API에 projects.models.versions.patch 요청을 전송할 때만 사용 설정할 수 있습니다.

REST API

액세스 로깅을 사용 설정하려면 projects.models.create를 사용하여 모델을 만들 때 모델 리소스에서 onlinePredictionLoggingTrue로 설정합니다.

콘솔 로깅(베타)을 사용 설정하려면 모델 리소스에서 onlinePredictionConsoleLogging 필드를 True로 설정합니다.

요청-응답 로깅

다른 유형의 로깅과 달리 요청-응답 로깅은 모델을 만들 때 사용 설정할 수 없습니다. 대신 기존 모델 버전에서 projects.models.versions.patch 메서드를 사용하여 사용 설정할 수 있습니다. (먼저 Google Cloud Console, gcloud 도구 또는 REST API를 사용하여 모델 버전을 만들어야 합니다.)

요청-응답 로깅을 사용 설정하려면 버전 리소스의 requestLoggingConfig 필드를 다음 항목으로 채웁니다.

  • samplingPercentage: 로깅할 요청의 비율을 정의하는 0 또는 1 사이의 숫자입니다. 예를 들어 모든 요청을 로깅하려면 이 값을 1로 설정하고, 10%의 요청을 로깅하려면 0.1로 설정합니다.
  • bigqueryTableName: 요청 및 응답을 로깅할 BigQuery 테이블의 정규화된 이름(PROJECT_ID.DATASET_NAME.TABLE_NAME)입니다. 이 테이블은 다음 스키마를 사용하여 이미 존재해야 합니다.

    필드 이름유형모드
    model문자열필수 항목
    model_version문자열필수 항목
    time타임스탬프필수 항목
    raw_data문자열필수 항목
    raw_prediction문자열null 허용
    groundtruth문자열null 허용

    BigQuery 테이블 생성 방법에 대해 알아보세요.

What-If 도구로 모델 검사

메모장 환경 내에서 What-If 도구(WIT)를 사용하여 대화형 대시보드를 통해 AI Platform Prediction 모델을 검사할 수 있습니다. What-If 도구는 텐서보드, Jupyter 메모장, Colab 메모장, JupyterHub와 통합됩니다. Notebooks TensorFlow 인스턴스에도 사전 설치되어 있습니다.

AI Platform에서 What-If 도구를 사용하는 방법을 알아보세요.

온라인 예측 입력 형식 지정

인스턴스 형식을 JSON 문자열로 지정

온라인 예측의 기본 형식은 데이터 인스턴스의 목록입니다. 학습 애플리케이션에서 입력을 구성한 방법에 따라서 일반 값 목록이 될 수도 또는 JSON 객체의 멤버가 될 수도 있습니다. TensorFlow 모델 및 커스텀 예측 루틴은 더 복잡한 입력을 수락할 수 있지만 대부분의 scikit-learn 및 XGBoost 모델은 번호 목록을 입력으로 예상합니다.

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

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

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

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

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

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

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

gcloud

예측 요청을 보낼 방법에 따라 두 가지 방법으로 입력 형식을 지정할 수 있습니다. gcloud ai-platform predict 명령어의 --json-request 플래그를 사용하는 것이 좋습니다. 또는 --json-instances 플래그를 줄바꿈으로 구분된 JSON 데이터와 함께 사용할 수 있습니다.

--json-request의 경우

각 인스턴스를 JSON 배열의 항목으로 만들고 배열을 JSON 파일의 instances 필드로 제공합니다. 예를 들면 다음과 같습니다.

instances.json

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

--json-instances의 경우

입력 파일이 인스턴스가 행마다 하나씩 JSON 객체로 포함된 줄바꿈으로 구분된 JSON 파일인지 확인합니다. 예를 들면 다음과 같습니다.

instances.jsonl

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

REST API

각 인스턴스를 JSON 배열의 항목으로 만들고 배열을 JSON 객체의 instances 필드로 제공합니다. 예를 들면 다음과 같습니다.

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

예측 입력의 바이너리 데이터

바이너리 데이터는 JSON이 지원하는 UTF-8 인코딩 문자열로 형식을 지정할 수 없습니다. 입력에 바이너리 데이터가 있는 경우 이 데이터를 표시하려면 base64 인코딩을 사용하고, 다음 특수 형식으로 지정해야 합니다.

  • 인코딩된 문자열은 b64라는 단일 키를 사용하여 JSON 객체로 형식을 지정해야 합니다. 다음 Python 2.7 예에서는 base64 라이브러리를 사용하여 원시 JPEG 데이터의 버퍼를 인코딩하여 인스턴스를 만듭니다.

    {"image_bytes": {"b64": base64.b64encode(jpeg_data)}}
    

    Python 3에서는 base64 인코딩이 바이트 시퀀스를 출력합니다. JSON으로 직렬화할 수 있도록 문자열로 변환해야 합니다.

    {'image_bytes': {'b64': base64.b64encode(jpeg_data).decode()}}
    
  • TensorFlow 모델 코드에서 바이너리 입력 및 출력 텐서의 별칭이 '_bytes'로 끝나도록 지정해야 합니다.

예측 요청

예측 요청에 입력 데이터 인스턴스를 JSON 문자열로 전송하여 온라인 예측을 요청합니다. 요청 및 응답 본문의 형식을 지정하려면 예측 요청 세부정보를 참조하세요.

모델 버전을 지정하지 않으면 예측 요청에 모델의 기본 버전이 사용됩니다.

gcloud

  1. 매개변수를 보유할 환경 변수를 만듭니다. 특정 모델 버전을 지정하려면 버전 값을 포함합니다.

    MODEL_NAME="[YOUR-MODEL-NAME]"
    INPUT_DATA_FILE="instances.json"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    
  2. gcloud ai-platform predict를 사용해 인스턴스를 배포된 모델로 전송합니다. --version은 선택사항입니다.

    gcloud ai-platform predict \
      --model=$MODEL_NAME \
      --version=$VERSION_NAME \
      --json-request=$INPUT_DATA_FILE \
      --region=REGION
    

    REGION모델을 만든 리전 엔드포인트의 리전으로 바꿉니다. 전역 엔드포인트에서 모델을 만든 경우 --region 플래그를 생략합니다.

  3. gcloud 도구는 응답을 파싱하고 사람이 읽을 수 있는 형식으로 예측을 터미널에서 출력합니다. predict 명령어와 함께 --format 플래그를 사용하면 JSON, CSV 등의 다른 출력 형식을 지정할 수 있습니다. 사용 가능한 출력 형식을 참조하세요.

Python

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

# Create the AI Platform service object.
# To authenticate set the environment variable
# GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file>
service = googleapiclient.discovery.build('ml', 'v1')

def predict_json(project, model, instances, version=None):
    """Send json data to a deployed model for prediction.

    Args:
        project (str): project where the AI Platform Model is deployed.
        model (str): model name.
        instances ([Mapping[str: Any]]): Keys should be the names of Tensors
            your deployed model expects as inputs. Values should be datatypes
            convertible to Tensors, or (potentially nested) lists of datatypes
            convertible to tensors.
        version: str, version of the model to target.
    Returns:
        Mapping[str: any]: dictionary of prediction results defined by the
            model.
    """
    name = 'projects/{}/models/{}'.format(project, model)

    if version is not None:
        name += '/versions/{}'.format(version)

    response = service.projects().predict(
        name=name,
        body={'instances': instances}
    ).execute()

    if 'error' in response:
        raise RuntimeError(response['error'])

    return response['predictions']

자바

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

/*
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpContent;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.UriTemplate;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.discovery.Discovery;
import com.google.api.services.discovery.model.JsonSchema;
import com.google.api.services.discovery.model.RestDescription;
import com.google.api.services.discovery.model.RestMethod;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/*
 * Sample code for sending an online prediction request to Cloud Machine Learning Engine.
 */

public class OnlinePredictionSample {
  public static void main(String[] args) throws Exception {
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    Discovery discovery = new Discovery.Builder(httpTransport, jsonFactory, null).build();

    RestDescription api = discovery.apis().getRest("ml", "v1").execute();
    RestMethod method = api.getResources().get("projects").getMethods().get("predict");

    JsonSchema param = new JsonSchema();
    String projectId = "YOUR_PROJECT_ID";
    // You should have already deployed a model and a version.
    // For reference, see https://cloud.google.com/ml-engine/docs/deploying-models.
    String modelId = "YOUR_MODEL_ID";
    String versionId = "YOUR_VERSION_ID";
    param.set(
        "name", String.format("projects/%s/models/%s/versions/%s", projectId, modelId, versionId));

    GenericUrl url =
        new GenericUrl(UriTemplate.expand(api.getBaseUrl() + method.getPath(), param, true));
    System.out.println(url);

    String contentType = "application/json";
    File requestBodyFile = new File("input.txt");
    HttpContent content = new FileContent(contentType, requestBodyFile);
    System.out.println(content.getLength());

    List<String> scopes = new ArrayList<>();
    scopes.add("https://www.googleapis.com/auth/cloud-platform");

    GoogleCredentials credential = GoogleCredentials.getApplicationDefault().createScoped(scopes);
    HttpRequestFactory requestFactory =
        httpTransport.createRequestFactory(new HttpCredentialsAdapter(credential));
    HttpRequest request = requestFactory.buildRequest(method.getHttpMethod(), url, content);

    String response = request.execute().parseAsString();
    System.out.println(response);
  }
}

온라인 예측 문제해결

온라인 예측에서 발생하는 일반적인 오류는 다음과 같습니다.

  • 메모리 부족 오류
  • 입력 데이터 형식이 잘못됨
  • 단일 온라인 예측 요청은 1.5MB 이하의 데이터를 포함해야 합니다. gcloud 도구를 사용하여 생성된 요청은 파일당 100개 이하의 인스턴스를 처리할 수 있습니다. 더 많은 인스턴스에 대한 요청을 동시에 수행하려면 일괄 예측을 사용하세요.

예측용으로 AI Platform Prediction에 배포하기 전에 모델 크기를 축소해 보세요.

온라인 예측 문제 해결에 대해 자세히 알아보세요.

다음 단계