gcf/gcf-ai-platform-example/main.py (45 lines of code) (raw):
"""
Provides two Google Cloud Functions to infer models and obtain model
meta information using the AI Platform Prediction API.
"""
import json
from flask import current_app as app
import googleapiclient.discovery
def _generate_payload(sentence):
"""
Helper function to prep the payload data structure. Also a good
place to manipulate the payload (e.g., lower-casing if needed)
Args:
sentence: sentence to be used for the inference (str)
Returns:
dictionary of the prediction payload, the input data is nested below a
"instances" key as a list of dicts with the different input tensors
More details: https://cloud.google.com/ml-engine/docs/v1/predict-request
"""
return {"instances": [{"sentence": sentence}]}
def _get_model_meta(service, project, model='demo_model', version=None):
"""
Helper function to gather the model meta information. Depending on
the type of the model (default/other), we have to hit different
service endpoints.
Args:
service: Google API Service object
project: GCP project id (str)
model: AI Platform model name (str, default: 'demo_model')
version: AI Platform model version identifier (str, default: None)
Returns:
dictionary with the meta information
model identifier (name)
"""
url = f'projects/{project}/models/{model}'
if version:
url += f'/versions/{version}'
response = service.projects().models().versions().get(name=url).execute()
meta = response
else:
response = service.projects().models().get(name=url).execute()
meta = response['defaultVersion']
model_id = meta['name']
return meta, model_id
def _get_model_prediction(service, project, model='demo_model',
version=None, body=None):
"""
Helper function to infer a model prediction
Args:
service: Google API Service object
project: GCP project id (str)
model: AI Platform model name (str, default: 'demo_model')
version: AI Platform model version identifier (str, default: None)
body: Payload dictionary with a list of input key-value pairs as values
to an `instances` key
Returns:
Inference results, the response also contains the error message if the
inference fails
"""
if body is None:
raise NotImplementedError(
f"_get_model_prediction didn't get any payload for model {model}")
url = f'projects/{project}/models/{model}'
if version:
url += f'/versions/{version}'
response = service.projects().predict(name=url, body=body).execute()
return response
def _connect_service():
"""
Helper function to load the API service. In case, API credentials are
required, add them to the kwargs
Args:
None
Returns:
Google API Service object containing the API information for the
requested service
"""
kwargs = {'serviceName': 'ml', 'version': 'v1'}
return googleapiclient.discovery.build(**kwargs)
def get_demo_inference_endpoint(request):
"""
Endpoint to demonstrate requesting an inference from a model
hosted via Google's AI Platform.
Args:
request object with an argument `sentence`
Expected content type is 'application/json'
Returns:
JSON formatted response with prediction results
"""
request_json = request.get_json(silent=True)
sentence = request_json['sentence']
service = _connect_service()
project = 'yourGCPProjectName'
model = 'demo_model'
response = _get_model_prediction(service, project,
model=model,
body=_generate_payload(sentence))
return json.dumps(response)
def get_demo_inference_meta_endpoint():
"""
Endpoint to demonstrate requesting the meta information from Google's AI Platform
Args:
None
Returns:
JSON formated response with model meta information
"""
service = _connect_service()
project = 'yourGCPProjectName'
model = 'demo_model'
response = _get_model_meta(service, project, model=model)
return json.dumps(response)