Online serving

Online serving lets you serve feature values for small batches of entities at low latency. For each request, you can only serve feature values from a single entity type. Vertex AI Feature Store (Legacy) returns only the latest non-null value of each feature.

Typically, you use online serving to serve feature values to deployed models for online inferences. For example, you might have a bike-sharing company and you want to predict how long a particular user will rent a bike. You can include real-time inputs from the user and data from the featurestore to perform an online inference. That way, you can determine resource allocation in real time.

Null values

For online serving results, if the latest value for a feature is null, Vertex AI Feature Store (Legacy) returns the latest non-null value. If there is no previous value, Vertex AI Feature Store (Legacy) returns null.

Before you begin

Check that the featurestore you're making calls against has an online store (the number of nodes must be greater than 0 ). Otherwise, online serving requests return an error. For more info, see Manage featurestores .

Serve values from a single entity

Serve feature values from a single entity for a particular entity type.

REST

To get feature values from an entity, send a POST request by using the featurestores.entityTypes.readFeatureValues method.

The following sample gets the latest values for two different features for a particular entity. Note that for the ids field you can specify ["*"] instead of the feature IDs to select all features for the entity.

Before using any of the request data, make the following replacements:

  • LOCATION_ID : Region where the featurestore is created. For example, us-central1 .
  • PROJECT_ID : Your project ID .
  • FEATURESTORE_ID : ID of the featurestore.
  • ENTITY_TYPE_ID : ID of the entity type.
  • ENTITY_ID : ID of the entity to get feature values for.
  • FEATURE_ID : ID of feature to get values for.

HTTP method and URL:

POST https:// LOCATION_ID 
-aiplatform.googleapis.com/v1/projects/ PROJECT_ID 
/locations/ LOCATION_ID 
/featurestores/ FEATURESTORE_ID 
/entityTypes/ ENTITY_TYPE_ID 
:readFeatureValues

Request JSON body:

{
  "entityId": " ENTITY_ID 
",
  "featureSelector": {
    "idMatcher": {
      "ids": [" FEATURE_ID_1 
", " FEATURE_ID_2 
"]
    }
  }
}

To send your request, choose one of these options:

curl

Save the request body in a file named request.json , and execute the following command:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https:// LOCATION_ID -aiplatform.googleapis.com/v1/projects/ PROJECT_ID /locations/ LOCATION_ID /featurestores/ FEATURESTORE_ID /entityTypes/ ENTITY_TYPE_ID :readFeatureValues"

PowerShell

Save the request body in a file named request.json , and execute the following command:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https:// LOCATION_ID -aiplatform.googleapis.com/v1/projects/ PROJECT_ID /locations/ LOCATION_ID /featurestores/ FEATURESTORE_ID /entityTypes/ ENTITY_TYPE_ID :readFeatureValues" | Select-Object -Expand Content

You should receive a JSON response similar to the following:

{
  "header": {
    "entityType": "projects/ PROJECT_NUMBER 
/locations/ LOCATION_ID 
/featurestores/ FEATURESTORE_ID 
/entityTypes/ ENTITY_TYPE_ID 
",
    "featureDescriptors": [
      {
        "id": " FEATURE_ID_1 
"
      },
      {
        "id": " FEATURE_ID_2 
"
      }
    ]
  },
  "entityView": {
    "entityId": " ENTITY_ID 
",
    "data": [
      {
        "value": {
          " VALUE_TYPE_1 
": " FEATURE_VALUE_1 
",
          "metadata": {
            "generateTime": "2019-10-28T15:38:10Z"
          }
        }
      },
      {
        "value": {
          " VALUE_TYPE_2 
": " FEATURE_VALUE_2 
",
          "metadata": {
            "generateTime": "2019-10-28T15:38:10Z"
          }
        }
      }
    ]
  }
}

Python

To learn how to install or update the Vertex AI SDK for Python, see Install the Vertex AI SDK for Python . For more information, see the Python API reference documentation .

  from 
  
 typing 
  
 import 
 List 
 , 
 Union 
 from 
  
 google.cloud 
  
 import 
 aiplatform 
 def 
  
 read_feature_values_sample 
 ( 
 project 
 : 
 str 
 , 
 location 
 : 
 str 
 , 
 entity_type_id 
 : 
 str 
 , 
 featurestore_id 
 : 
 str 
 , 
 entity_ids 
 : 
 Union 
 [ 
 str 
 , 
 List 
 [ 
 str 
 ]], 
 feature_ids 
 : 
 Union 
 [ 
 str 
 , 
 List 
 [ 
 str 
 ]] 
 = 
 "*" 
 , 
 ): 
 aiplatform 
 . 
 init 
 ( 
 project 
 = 
 project 
 , 
 location 
 = 
 location 
 ) 
 my_entity_type 
 = 
 aiplatform 
 . 
 featurestore 
 . 
 EntityType 
 ( 
 entity_type_name 
 = 
 entity_type_id 
 , 
 featurestore_id 
 = 
 featurestore_id 
 ) 
 my_dataframe 
 = 
 my_entity_type 
 . 
 read 
 ( 
 entity_ids 
 = 
 entity_ids 
 , 
 feature_ids 
 = 
 feature_ids 
 ) 
 return 
 my_dataframe 
 

Java

Before trying this sample, follow the Java setup instructions in the Vertex AI quickstart using client libraries . For more information, see the Vertex AI Java API reference documentation .

To authenticate to Vertex AI, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  import 
  
 com.google.cloud.aiplatform.v1. EntityTypeName 
 
 ; 
 import 
  
 com.google.cloud.aiplatform.v1. FeatureSelector 
 
 ; 
 import 
  
 com.google.cloud.aiplatform.v1. FeaturestoreOnlineServingServiceClient 
 
 ; 
 import 
  
 com.google.cloud.aiplatform.v1. FeaturestoreOnlineServingServiceSettings 
 
 ; 
 import 
  
 com.google.cloud.aiplatform.v1. IdMatcher 
 
 ; 
 import 
  
 com.google.cloud.aiplatform.v1. ReadFeatureValuesRequest 
 
 ; 
 import 
  
 com.google.cloud.aiplatform.v1. ReadFeatureValuesResponse 
 
 ; 
 import 
  
 java.io.IOException 
 ; 
 import 
  
 java.util.Arrays 
 ; 
 import 
  
 java.util.List 
 ; 
 import 
  
 java.util.concurrent.ExecutionException 
 ; 
 import 
  
 java.util.concurrent.TimeoutException 
 ; 
 public 
  
 class 
 ReadFeatureValuesSample 
  
 { 
  
 public 
  
 static 
  
 void 
  
 main 
 ( 
 String 
 [] 
  
 args 
 ) 
  
 throws 
  
 IOException 
 , 
  
 InterruptedException 
 , 
  
 ExecutionException 
 , 
  
 TimeoutException 
  
 { 
  
 // TODO(developer): Replace these variables before running the sample. 
  
 String 
  
 project 
  
 = 
  
 "YOUR_PROJECT_ID" 
 ; 
  
 // Feature Store ID 
  
 String 
  
 featurestoreId 
  
 = 
  
 "YOUR_FEATURESTORE_ID" 
 ; 
  
 // Entity Type ID 
  
 String 
  
 entityTypeId 
  
 = 
  
 "YOUR_ENTITY_TYPE_ID" 
 ; 
  
 // Entity ID 
  
 String 
  
 entityId 
  
 = 
  
 "YOUR_ENTITY_ID" 
 ; 
  
 // Features to read with batch or online serving. 
  
 List<String> 
  
 featureSelectorIds 
  
 = 
  
 Arrays 
 . 
 asList 
 ( 
 "title" 
 , 
  
 "genres" 
 , 
  
 "average_rating" 
 ); 
  
 String 
  
 location 
  
 = 
  
 "us-central1" 
 ; 
  
 String 
  
 endpoint 
  
 = 
  
 "us-central1-aiplatform.googleapis.com:443" 
 ; 
  
 int 
  
 timeout 
  
 = 
  
 300 
 ; 
  
 readFeatureValuesSample 
 ( 
  
 project 
 , 
  
 featurestoreId 
 , 
  
 entityTypeId 
 , 
  
 entityId 
 , 
  
 featureSelectorIds 
 , 
  
 location 
 , 
  
 endpoint 
 , 
  
 timeout 
 ); 
  
 } 
  
 /* 
 * Reads Feature values of a specific entity of an EntityType. 
 * See: https://cloud.google.com/vertex-ai/docs/featurestore/serving-online 
 */ 
  
 public 
  
 static 
  
 void 
  
 readFeatureValuesSample 
 ( 
  
 String 
  
 project 
 , 
  
 String 
  
 featurestoreId 
 , 
  
 String 
  
 entityTypeId 
 , 
  
 String 
  
 entityId 
 , 
  
 List<String> 
  
 featureSelectorIds 
 , 
  
 String 
  
 location 
 , 
  
 String 
  
 endpoint 
 , 
  
 int 
  
 timeout 
 ) 
  
 throws 
  
 IOException 
 , 
  
 InterruptedException 
 , 
  
 ExecutionException 
 , 
  
 TimeoutException 
  
 { 
  
  FeaturestoreOnlineServingServiceSettings 
 
  
 featurestoreOnlineServiceSettings 
  
 = 
  
  FeaturestoreOnlineServingServiceSettings 
 
 . 
 newBuilder 
 (). 
 setEndpoint 
 ( 
 endpoint 
 ). 
 build 
 (); 
  
 // Initialize client that will be used to send requests. This client only needs to be created 
  
 // once, and can be reused for multiple requests. After completing all of your requests, call 
  
 // the "close" method on the client to safely clean up any remaining background resources. 
  
 try 
  
 ( 
  FeaturestoreOnlineServingServiceClient 
 
  
 featurestoreOnlineServiceClient 
  
 = 
  
  FeaturestoreOnlineServingServiceClient 
 
 . 
 create 
 ( 
 featurestoreOnlineServiceSettings 
 )) 
  
 { 
  
  ReadFeatureValuesRequest 
 
  
 readFeatureValuesRequest 
  
 = 
  
  ReadFeatureValuesRequest 
 
 . 
 newBuilder 
 () 
  
 . 
 setEntityType 
 ( 
  
  EntityTypeName 
 
 . 
 of 
 ( 
 project 
 , 
  
 location 
 , 
  
 featurestoreId 
 , 
  
 entityTypeId 
 ). 
 toString 
 ()) 
  
 . 
 setEntityId 
 ( 
 entityId 
 ) 
  
 . 
 setFeatureSelector 
 ( 
  
  FeatureSelector 
 
 . 
 newBuilder 
 () 
  
 . 
  setIdMatcher 
 
 ( 
  IdMatcher 
 
 . 
 newBuilder 
 (). 
 addAllIds 
 ( 
 featureSelectorIds 
 ))) 
  
 . 
 build 
 (); 
  
  ReadFeatureValuesResponse 
 
  
 readFeatureValuesResponse 
  
 = 
  
 featurestoreOnlineServiceClient 
 . 
 readFeatureValues 
 ( 
 readFeatureValuesRequest 
 ); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
 "Read Feature Values Response" 
  
 + 
  
 readFeatureValuesResponse 
 ); 
  
 } 
  
 } 
 } 
 

Node.js

Before trying this sample, follow the Node.js setup instructions in the Vertex AI quickstart using client libraries . For more information, see the Vertex AI Node.js API reference documentation .

To authenticate to Vertex AI, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .

  /** 
 * TODO(developer): Uncomment these variables before running the sample.\ 
 * (Not necessary if passing values as arguments) 
 */ 
 // const project = 'YOUR_PROJECT_ID'; 
 // const featurestoreId = 'YOUR_FEATURESTORE_ID'; 
 // const entityTypeId = 'YOUR_ENTITY_TYPE_ID'; 
 // const entityId = 'ENTITY_ID_TO_SERVE'; 
 // const location = 'YOUR_PROJECT_LOCATION'; 
 // const apiEndpoint = 'YOUR_API_ENDPOINT'; 
 // const timeout = <TIMEOUT_IN_MILLI_SECONDS>; 
 // Imports the Google Cloud Featurestore Service Client library 
 const 
  
 { 
 FeaturestoreOnlineServingServiceClient 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/aiplatform 
' 
 ). 
 v1 
 ; 
 // Specifies the location of the api endpoint 
 const 
  
 clientOptions 
  
 = 
  
 { 
  
 apiEndpoint 
 : 
  
 apiEndpoint 
 , 
 }; 
 // Instantiates a client 
 const 
  
 featurestoreOnlineServingServiceClient 
  
 = 
  
 new 
  
  FeaturestoreOnlineServingServiceClient 
 
 ( 
 clientOptions 
 ); 
 async 
  
 function 
  
 readFeatureValues 
 () 
  
 { 
  
 // Configure the entityType resource 
  
 const 
  
 entityType 
  
 = 
  
 `projects/ 
 ${ 
 project 
 } 
 /locations/ 
 ${ 
 location 
 } 
 /featurestores/ 
 ${ 
 featurestoreId 
 } 
 /entityTypes/ 
 ${ 
 entityTypeId 
 } 
 ` 
 ; 
  
 const 
  
 featureSelector 
  
 = 
  
 { 
  
 idMatcher 
 : 
  
 { 
  
 ids 
 : 
  
 [ 
 'age' 
 , 
  
 'gender' 
 , 
  
 'liked_genres' 
 ], 
  
 }, 
  
 }; 
  
 const 
  
 request 
  
 = 
  
 { 
  
 entityType 
 : 
  
 entityType 
 , 
  
 entityId 
 : 
  
 entityId 
 , 
  
 featureSelector 
 : 
  
 featureSelector 
 , 
  
 }; 
  
 // Read Feature Values Request 
  
 const 
  
 [ 
 response 
 ] 
  
 = 
  
 await 
  
 featurestoreOnlineServingServiceClient 
 . 
 readFeatureValues 
 ( 
 request 
 , 
  
 { 
  
 timeout 
 : 
  
 Number 
 ( 
 timeout 
 ), 
  
 }); 
  
 console 
 . 
 log 
 ( 
 'Read feature values response' 
 ); 
  
 console 
 . 
 log 
 ( 
 'Raw response:' 
 ); 
  
 console 
 . 
 log 
 ( 
 JSON 
 . 
 stringify 
 ( 
 response 
 , 
  
 null 
 , 
  
 2 
 )); 
 } 
 readFeatureValues 
 (); 
 

Serve values from multiple entities

Serve feature values from one or more entities for a particular entity type. For better performance, use the streamingReadFeatureValues method instead of sending parallel requests to the readFeatureValues method.

REST

To get feature values from multiple entities, send a POST request by using the featurestores.entityTypes.streamingReadFeatureValues method.

The following sample gets the latest values for two different features for two different entities. Note that for the ids field you can specify ["*"] instead of the feature IDs to select all features for the entity.

Before using any of the request data, make the following replacements:

  • LOCATION_ID : Region where the featurestore is created. For example, us-central1 .
  • PROJECT_ID : .
  • FEATURESTORE_ID : ID of the featurestore.
  • ENTITY_TYPE_ID : ID of the entity type.
  • ENTITY_ID : ID of the entity to get feature values for.
  • FEATURE_ID : ID of feature to get values for.

HTTP method and URL:

POST https:// LOCATION_ID 
-aiplatform.googleapis.com/v1/projects/ PROJECT_ID 
/locations/ LOCATION_ID 
/featurestores/ FEATURESTORE_ID 
/entityTypes/ ENTITY_TYPE_ID 
:streamingReadFeatureValues

Request JSON body:

{
  "entityIds": [" ENTITY_ID_1 
", " ENTITY_ID_2 
"],
  "featureSelector": {
    "idMatcher": {
      "ids": [" FEATURE_ID_1 
", " FEATURE_ID_2 
"]
    }
  }
}

To send your request, choose one of these options:

curl

Save the request body in a file named request.json , and execute the following command:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https:// LOCATION_ID -aiplatform.googleapis.com/v1/projects/ PROJECT_ID /locations/ LOCATION_ID /featurestores/ FEATURESTORE_ID /entityTypes/ ENTITY_TYPE_ID :streamingReadFeatureValues"

PowerShell

Save the request body in a file named request.json , and execute the following command:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https:// LOCATION_ID -aiplatform.googleapis.com/v1/projects/ PROJECT_ID /locations/ LOCATION_ID /featurestores/ FEATURESTORE_ID /entityTypes/ ENTITY_TYPE_ID :streamingReadFeatureValues" | Select-Object -Expand Content

You should receive a JSON response similar to the following:

[{
  "header": {
    "entityType": "projects/ PROJECT_NUMBER 
/locations/ LOCATION_ID 
/featurestores/ FEATURESTORE_ID 
/entityTypes/ ENTITY_TYPE_ID 
",
    "featureDescriptors": [
      {
        "id": " FEATURE_ID_1 
"
      },
      {
        "id": " FEATURE_ID_2 
"
      }
    ]
  }
},
{
  "entityView": {
    "entityId": " ENTITY_ID_1 
",
    "data": [
      {
        "value": {
          " VALUE_TYPE_1 
": " FEATURE_VALUE_A 
",
          "metadata": {
            "generateTime": "2019-10-28T15:38:10Z"
          }
        }
      },
      {
        "value": {
          " VALUE_TYPE_2 
": " FEATURE_VALUE_B 
",
          "metadata": {
            "generateTime": "2019-10-28T15:38:10Z"
          }
        }
      }
    ]
  }
},
{
  "entityView": {
    "entityId": " ENTITY_ID_2 
",
    "data": [
      {
        "value": {
          " VALUE_TYPE_1 
": " FEATURE_VALUE_C 
",
          "metadata": {
            "generateTime": "2019-10-28T21:21:37Z"
          }
        }
      },
      {
        "value": {
          " VALUE_TYPE_2 
": " FEATURE_VALUE_D 
",
          "metadata": {
            "generateTime": "2019-10-28T21:21:37Z"
          }
        }
      }
    ]
  }
}]

Additional languages

You can install and use the following Vertex AI client libraries to call the Vertex AI API. Cloud Client Libraries provide an optimized developer experience by using the natural conventions and styles of each supported language.

What's next

Create a Mobile Website
View Site in Mobile | Classic
Share by: