온라인 예측 가져오기

Vertex AI의 온라인 예측 서비스를 사용하면 자체 예측 모델 엔드포인트에 동기식 요청을 할 수 있습니다.

이 페이지에서는 짧은 지연 시간으로 온라인 예측을 제공할 수 있도록 모델에 요청을 보내는 방법을 보여줍니다.

시작하기 전에

온라인 예측 API를 사용하려면 프로젝트와 적절한 사용자 인증 정보가 있어야 합니다.

온라인 예측을 받기 전에 다음 단계를 따르세요.

  1. Vertex AI용 프로젝트를 설정합니다.
  2. 온라인 예측에 액세스하는 데 필요한 권한을 얻으려면 프로젝트 IAM 관리자에게 Vertex AI 예측 사용자 (vertex-ai-prediction-user) 역할을 부여해 달라고 요청하세요.

    이 역할에 대한 자세한 내용은 IAM 권한 준비를 참고하세요.

  3. 지원되는 컨테이너 중 하나를 타겟팅하는 예측 모델을 만들고 학습시킵니다.

  4. 예측 클러스터를 만들고 프로젝트에서 외부 트래픽이 수신되도록 합니다.

  5. 예측용 모델 아티팩트 내보내기

  6. 모델에 엔드포인트 배포하기

  7. 예측 모델의 Endpoint 커스텀 리소스 세부정보를 표시합니다.

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'
    

    다음을 바꿉니다.

    • PREDICTION_CLUSTER_KUBECONFIG: 예측 클러스터의 kubeconfig 파일 경로입니다.
    • PREDICTION_ENDPOINT: 엔드포인트의 이름
    • PROJECT_NAMESPACE: 예측 프로젝트 네임스페이스의 이름입니다.

    출력에 status 필드가 표시되어야 하며, endpointFQDN 필드에 엔드포인트 정규화된 도메인 이름이 표시되어야 합니다. 요청에 사용할 이 엔드포인트 URL 경로를 등록합니다.

환경 변수 설정

Python 스크립트를 사용하여 모델 엔드포인트에 요청을 보내고 승인된 API 호출을 프로그래매틱 방식으로 실행하기 위해 프로젝트에서 서비스 계정을 설정하는 경우 스크립트에서 환경 변수를 정의하여 실행 시 서비스 계정 키와 같은 값에 액세스할 수 있습니다.

다음 단계에 따라 Python 스크립트에서 필수 환경 변수를 설정하세요.

  1. 온라인 예측 API와 상호작용할 JupyterLab 노트북을 만듭니다.

  2. JupyterLab 노트북에서 Python 스크립트를 만듭니다.

  3. Python 스크립트에 다음 코드를 추가합니다.

    import os
    
    os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "APPLICATION_DEFAULT_CREDENTIALS_FILENAME"
    

    APPLICATION_DEFAULT_CREDENTIALS_FILENAME를 프로젝트에서 생성한 서비스 계정 키가 포함된 JSON 파일의 이름(예: my-service-key.json)으로 바꿉니다.

  4. Python 스크립트를 prediction.py와 같은 이름으로 저장합니다.

  5. Python 스크립트를 실행하여 환경 변수를 설정합니다.

    python SCRIPT_NAME
    

    SCRIPT_NAME을 Python 스크립트에 지정한 이름(예: prediction.py)으로 바꿉니다.

엔드포인트에 요청 전송

모델의 엔드포인트에 요청하여 온라인 예측을 가져옵니다.

curl

curl 요청을 하려면 다음 단계를 따르세요.

  1. 요청 본문에 대해 request.json이라는 JSON 파일을 만듭니다.

    타겟 컨테이너에 필요한 요청 본문 세부정보를 사용하여 온라인 예측을 위한 입력을 추가하고 형식을 지정해야 합니다.

  2. 인증 토큰 가져오기

  3. 요청을 합니다.

    curl -X POST -H "Content-Type: application/json; charset=utf-8" -H "Authorization: Bearer TOKEN"
    https://ENDPOINT:443/v1/model:predict -d @request.json
    

    다음을 바꿉니다.

    • TOKEN: 획득한 인증 토큰입니다.
    • ENDPOINT: 온라인 예측 요청의 모델 엔드포인트입니다.

성공하면 온라인 예측 요청에 대한 JSON 응답이 표시됩니다.

다음 출력은 예시를 보여줍니다.

{
    "predictions": [[-357.10849], [-171.621658]
    ]
}

응답에 대한 자세한 내용은 응답 본문 세부정보를 참고하세요.

Python

Python 스크립트에서 온라인 예측 서비스를 사용하려면 다음 단계를 따르세요.

  1. 요청 본문에 대해 request.json이라는 JSON 파일을 만듭니다.

    타겟 컨테이너에 필요한 요청 본문 세부정보를 사용하여 온라인 예측을 위한 입력을 추가하고 형식을 지정해야 합니다.

  2. 최신 버전의 Vertex AI Platform 클라이언트 라이브러리를 설치합니다.

  3. Python 스크립트에서 필수 환경 변수를 설정합니다.

  4. API 요청을 인증합니다.

  5. 만든 Python 스크립트에 다음 코드를 추가합니다.

    import json
    import os
    from typing import Sequence
    
    import grpc
    from absl import app
    from absl import flags
    
    from google.auth.transport import requests
    from google.protobuf import json_format
    from google.protobuf.struct_pb2 import Value
    from google.cloud.aiplatform_v1.services import prediction_service
    
    _INPUT = flags.DEFINE_string("input", None, "input", required=True)
    _HOST = flags.DEFINE_string("host", None, "Prediction endpoint", required=True)
    _ENDPOINT_ID = flags.DEFINE_string("endpoint_id", None, "endpoint id", required=True)
    
    os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "path-to-ca-cert-file.cert"
    
    # ENDPOINT_RESOURCE_NAME is a placeholder value that doesn't affect prediction behavior.
    ENDPOINT_RESOURCE_NAME="projects/000000000000/locations/us-central1/endpoints/00000000000000"
    
    def get_sts_token(host):
      creds = None
      try:
        creds, _ = google.auth.default()
        creds = creds.with_gdch_audience(host+":443")
        req = requests.Request()
        creds.refresh(req)
        print("Got token: ")
        print(creds.token)
      except Exception as e:
        print("Caught exception" + str(e))
        raise e
    return creds.token
    
    # predict_client_secure builds a client that requires TLS
    def predict_client_secure(host, token):
      with open(os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"], 'rb') as f:
        channel_creds = grpc.ssl_channel_credentials(f.read())
    
      call_creds = grpc.access_token_call_credentials(token)
    
      creds = grpc.composite_channel_credentials(
        channel_creds,
        call_creds,
      )
    
      client = prediction_service.PredictionServiceClient(
          transport=prediction_service.transports.grpc.PredictionServiceGrpcTransport(
           channel=grpc.secure_channel(target=host+":443", credentials=creds)))
    
      return client
    
    def predict_func(client, instances):
      resp = client.predict(
        endpoint=ENDPOINT_RESOURCE_NAME,
        instances=instances,
        metadata=[("x-vertex-ai-endpoint-id", _ENDPOINT_ID.value)]
      )
      print(resp)
    
    def main(argv: Sequence[str]):
      del argv  # Unused.
      with open(_INPUT.value) as json_file:
          data = json.load(json_file)
          instances = [json_format.ParseDict(s, Value()) for s in data["instances"]]
    
      token = get_sts_token(_HOST.value)
      client = predict_client_secure(_HOST.value, token)
      predict_func(client=client, instances=instances)
    
    if __name__=="__main__":
      app.run(main)
    
  6. Python 스크립트를 prediction.py와 같은 이름으로 저장합니다.

  7. 예측 서버에 요청합니다.

    python SCRIPT_NAME --input request.json \
        --host ENDPOINT \
        --endpoint_id ENDPOINT_ID \
    

    다음을 바꿉니다.

    • SCRIPT_NAME: Python 스크립트의 이름입니다(예: prediction.py).
    • ENDPOINT: 온라인 예측 요청의 모델 엔드포인트입니다.
    • ENDPOINT_ID: 엔드포인트 ID의 값입니다.

성공하면 온라인 예측 요청에 대한 JSON 응답이 표시됩니다. 응답에 대한 자세한 내용은 응답 본문 세부정보를 참고하세요.