def testGetModelMetadataREST(self): """Test ModelStatus implementation over REST API with columnar inputs.""" model_path = self._GetSavedModelBundlePath() host, port = TensorflowModelServerTest.RunServer( 'default', model_path)[2].split(':') # Prepare request url = 'http://{}:{}/v1/models/default/metadata'.format(host, port) # Send request resp_data = None try: resp_data = tensorflow_model_server_test_base.CallREST(url, None) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) try: model_metadata_file = self._GetModelMetadataFile() with open(model_metadata_file) as f: expected_metadata = json.load(f) # Verify response # Note, we sort the JSON object before comparing. Formally JSON lists # (aka arrays) are considered ordered and general comparison should NOT # sort. In this case, the "metadata" does not have any ordering making # the sort OK (and the test robust). self.assertEqual( tensorflow_model_server_test_base.SortedObject( json.loads(resp_data)), tensorflow_model_server_test_base.SortedObject( expected_metadata)) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e))
def testGetStatusREST(self): """Test ModelStatus implementation over REST API with columnar inputs.""" model_path = self._GetSavedModelBundlePath() host, port = TensorflowModelServerTest.RunServer( 'default', model_path)[2].split(':') # Prepare request url = 'http://{}:{}/v1/models/default'.format(host, port) # Send request resp_data = None try: resp_data = tensorflow_model_server_test_base.CallREST(url, None) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) # Verify response self.assertEqual( json.loads(resp_data), { 'model_version_status': [{ 'version': '123', 'state': 'AVAILABLE', 'status': { 'error_code': 'OK', 'error_message': '' } }] })
def testRegressREST(self): """Test Regress implementation over REST API.""" model_path = self._GetSavedModelBundlePath() host, port = TensorflowModelServerTest.RunServer( 'default', model_path)[2].split(':') # Prepare request url = 'http://{}:{}/v1/models/default:regress'.format(host, port) json_req = { 'signature_name': 'regress_x_to_y', 'examples': [{ 'x': 2.0 }] } # Send request resp_data = None try: resp_data = tensorflow_model_server_test_base.CallREST( url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) # Verify response self.assertEqual(json.loads(resp_data), {'results': [3.0]})
def testPredictColumnarREST(self): """Test Predict implementation over REST API with columnar inputs.""" model_path = self._GetSavedModelBundlePath() host, port = TensorflowModelServerTest.RunServer('default', model_path)[2].split(':') # Prepare request url = 'http://{}:{}/v1/models/default:predict'.format(host, port) json_req = {'inputs': [2.0, 3.0, 4.0]} # Send request resp_data = None try: resp_data = tensorflow_model_server_test_base.CallREST(url, json_req) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) # Verify response self.assertEqual(json.loads(resp_data), {'outputs': [3.0, 3.5, 4.0]})
def testPrometheusEndpoint(self): """Test ModelStatus implementation over REST API with columnar inputs.""" model_path = self._GetSavedModelBundlePath() host, port = TensorflowModelServerTest.RunServer( 'default', model_path, monitoring_config_file=self._GetMonitoringConfigFile())[2].split(':') # Prepare request url = 'http://{}:{}/monitoring/prometheus/metrics'.format(host, port) # Send request resp_data = None try: resp_data = tensorflow_model_server_test_base.CallREST(url, None) except Exception as e: # pylint: disable=broad-except self.fail('Request failed with error: {}'.format(e)) # Verify that there should be some metric type information. self.assertIn('# TYPE', resp_data.decode('utf-8') if resp_data is not None else None)