Vertex AI의 온라인 예측 서비스를 사용하면 자체 예측 모델 엔드포인트에 동기 요청을 할 수 있습니다.
이 페이지에서는 지연 시간이 짧은 온라인 예측을 제공할 수 있도록 모델에 요청을 보내는 방법을 보여줍니다.
시작하기 전에
온라인 Prediction API를 사용하려면 프로젝트와 적절한 사용자 인증 정보가 있어야 합니다.
온라인 예측을 가져오기 전에 다음 단계를 따르세요.
- Vertex AI용 프로젝트를 설정합니다.
온라인 예측에 액세스하는 데 필요한 권한을 얻으려면 프로젝트 IAM 관리자에게 Vertex AI 예측 사용자 (
vertex-ai-prediction-user) 역할을 부여해 달라고 요청하세요.이 역할에 대한 자세한 내용은 IAM 권한 준비를 참고하세요.
예측 클러스터를 만들고 프로젝트에서 수신 외부 트래픽을 허용하는지 확인합니다.
예측 모델의
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 스크립트에서 필수 환경 변수를 설정합니다.
온라인 Prediction API와 상호작용할 JupyterLab 노트북을 만듭니다.
JupyterLab 노트북에서 Python 스크립트를 만듭니다.
Python 스크립트에 다음 코드를 추가합니다.
import os os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "APPLICATION_DEFAULT_CREDENTIALS_FILENAME"APPLICATION_DEFAULT_CREDENTIALS_FILENAME을 프로젝트에서 만든 서비스 계정 키가 포함된 JSON 파일의 이름(예:my-service-key.json)으로 바꿉니다.Python 스크립트를
prediction.py와 같은 이름으로 저장합니다.Python 스크립트를 실행하여 환경 변수를 설정합니다.
python SCRIPT_NAMESCRIPT_NAME을 Python 스크립트에 지정한 이름(예:prediction.py)으로 바꿉니다.
엔드포인트에 요청 전송
모델의 엔드포인트에 요청하여 온라인 예측을 가져옵니다.
curl
다음 단계에 따라 curl 요청을 합니다.
요청 본문에 대해
request.json이라는 JSON 파일을 만듭니다.타겟 컨테이너에 필요한 요청 본문 세부정보를 사용하여 온라인 예측의 입력을 추가하고 형식을 지정해야 합니다. 타겟 컨테이너
요청을 합니다.
curl -X POST -H "Content-Type: application/json; charset=utf-8" -H "Authorization: Bearer TOKEN" https://ENDPOINT_HOSTNAME:443/v1/model:predict -d @request.json다음을 바꿉니다.
TOKEN: 가져온 인증 토큰입니다.ENDPOINT_HOSTNAME: 온라인 예측 요청을 위한 모델 엔드포인트 FQDN입니다.
성공하면 온라인 예측 요청에 대한 JSON 응답이 표시됩니다.
다음 출력은 예를 보여줍니다.
{
"predictions": [[-357.10849], [-171.621658]
]
}
응답에 대한 자세한 내용은 응답 본문 세부정보를 참고하세요.
Python
다음 단계에 따라 Python 스크립트에서 온라인 예측 서비스를 사용합니다.
요청 본문에 대해
request.json이라는 JSON 파일을 만듭니다.타겟 컨테이너에 필요한 요청 본문 세부정보를 사용하여 온라인 예측의 입력을 추가하고 형식을 지정해야 합니다. 타겟 컨테이너
만든 Python 스크립트에 다음 코드를 추가합니다.
import json import os from typing import Sequence import grpc from absl import app from absl import flags import google 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) _ENDPOINT_HOSTNAME = flags.DEFINE_string("endpoint_hostname", None, "Prediction endpoint FQDN", required=True) _PROJECT_NAME = flags.DEFINE_string("project_name", None, "project name", required=True) _ENDPOINT_NAME = flags.DEFINE_string("endpoint_name", None, "endpoint name", required=True) os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "path-to-ca-cert-file.cert" def get_sts_token(endpoint_hostname): creds = None try: creds, _ = google.auth.default() creds = creds.with_gdch_audience("https://"+endpoint_hostname+":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(endpoint_hostname, 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=endpoint_hostname+":443", credentials=creds))) return client def predict_func(client, instances): # The endpoint resource name is required for authorization. # A wrong value might lead to an access denied error. endpoint_resource_name = f"projects/{_PROJECT_NAME.value}/locations/{_PROJECT_NAME.value}/endpoints/{_ENDPOINT_NAME.value}" resp = client.predict( endpoint=endpoint_resource_name, instances=instances, metadata=[("x-vertex-ai-endpoint-id", _ENDPOINT_NAME.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(_ENDPOINT_HOSTNAME.value) client = predict_client_secure(_ENDPOINT_HOSTNAME.value, token) predict_func(client=client, instances=instances) if __name__=="__main__": app.run(main)Python 스크립트를
prediction.py와 같은 이름으로 저장합니다.예측 서버에 요청을 합니다.
python SCRIPT_NAME --input request.json \ --endpoint_hostname ENDPOINT_FQDN \ --project_name PROJECT_NAME \ --endpoint_name ENDPOINT_NAME \다음을 바꿉니다.
SCRIPT_NAME: Python 스크립트의 이름(예:prediction.py)입니다.ENDPOINT_FQDN: 온라인 예측 요청을 위한 엔드포인트의 정규화된 도메인 이름입니다.PROJECT_NAME: 엔드포인트의 프로젝트 이름입니다.ENDPOINT_NAME: 호출할 엔드포인트의 이름입니다.
성공하면 온라인 예측 요청에 대한 JSON 응답이 표시됩니다. 응답에 대한 자세한 내용은 응답 본문 세부정보를 참고하세요.