def preprocess(self, request, context): """Takes request data and de-serializes the data into an object for prediction. When an InvokeEndpoint operation is made against an Endpoint running SageMaker model server, the model server receives two pieces of information: - The request Content-Type, for example "application/json" - The request data, which is at most 5 MB (5 * 1024 * 1024 bytes) in size. The input_fn is responsible to take the request data and pre-process it before prediction. Args: input_data (obj): The request data. content_type (str): The context for the request Returns: (obj): The data-frame ready for prediction. """ logging.info('Inside the Pre-processing Function') request_processor = context.request_processor[0] request_property = request_processor.get_request_properties() content_type = utils.retrieve_content_type_header(request_property) logging.info(content_type) bytes_data = request[0].get('body') s = str(bytes_data, 'utf-8') logging.info(s) data = StringIO(s) df = pd.io.json.read_json(data, orient='columns') logging.info(df) return df
def transform(self, data, context): """Take a request with input data, deserialize it, make a prediction, and return a serialized response. Args: data (obj): the request data. context (obj): metadata on the incoming request data. Returns: list[obj]: The serialized prediction result wrapped in a list if inference is successful. Otherwise returns an error message with the context set appropriately. """ try: properties = context.system_properties model_dir = properties.get("model_dir") self.validate_and_initialize(model_dir=model_dir) input_data = data[0].get("body") request_processor = context.request_processor[0] request_property = request_processor.get_request_properties() content_type = utils.retrieve_content_type_header(request_property) accept = request_property.get("Accept") or request_property.get( "accept") if not accept or accept == content_types.ANY: accept = self._environment.default_accept if content_type in content_types.UTF8_TYPES: input_data = input_data.decode("utf-8") result = self._transform_fn(self._model, input_data, content_type, accept) response = result response_content_type = accept if isinstance(result, tuple): # handles tuple for backwards compatibility response = result[0] response_content_type = result[1] context.set_response_content_type(0, response_content_type) return [response] except Exception as e: # pylint: disable=broad-except trace = traceback.format_exc() if isinstance(e, BaseInferenceToolkitError): return self.handle_error(context, e, trace) else: return self.handle_error( context, GenericInferenceToolkitError( http_client.INTERNAL_SERVER_ERROR, str(e)), trace, )
def transform(self, data, context): """Take a request with input data, deserialize it, make a prediction, and return a serialized response. Args: data (obj): the request data. context (obj): metadata on the incoming request data. Returns: list[obj]: the serialized prediction result wrapped in a list. """ if not self._initialized: try: sys_properties = context._system_properties model_dir = sys_properties.get('model_dir') self.validate_and_initialize(model_dir) except Exception as e: if isinstance(e, BaseInferenceToolkitError): logging.error("Error loading model: {}".format(e)) return self.handle_error(context, e.status_code, e.message) else: raise e self._initialized = True try: input_data = data[0].get('body') request_processor = context.request_processor[0] request_property = request_processor.get_request_properties() content_type = utils.retrieve_content_type_header(request_property) accept = request_property.get('Accept') or request_property.get('accept') if not accept or accept == content_types.ANY: accept = self._environment.default_accept result = self._transform_fn(self._model, input_data, content_type, accept) response = result response_content_type = accept if isinstance(result, tuple): # handles tuple for backwards compatibility response = result[0] response_content_type = result[1] context.set_response_content_type(0, response_content_type) return [response] except Exception as e: if isinstance(e, BaseInferenceToolkitError): logging.error(e) return self.handle_error(context, e.status_code, e.message) else: raise e
def transform(self, data, context): """Take a request with input data, deserialize it, make a prediction, and return a serialized response. Args: data (obj): the request data. context (obj): metadata on the incoming request data. Returns: list[obj]: the serialized prediction result wrapped in a list. """ self.validate_and_initialize() input_data = data[0].get('body') request_processor = context.request_processor[0] request_property = request_processor.get_request_properties() content_type = utils.retrieve_content_type_header(request_property) accept = request_property.get('Accept') or request_property.get( 'accept') if not accept or accept == content_types.ANY: accept = self._environment.default_accept if content_type in content_types.UTF8_TYPES: input_data = input_data.decode('utf-8') result = self._transform_fn(self._model, input_data, content_type, accept) response = result response_content_type = accept if isinstance(result, tuple): # handles tuple for backwards compatibility response = result[0] response_content_type = result[1] context.set_response_content_type(0, response_content_type) return [response]
def test_content_type_header(content_type_key): request_property = {content_type_key: CONTENT_TYPE} result = retrieve_content_type_header(request_property) assert result == CONTENT_TYPE
def transform(self, data, context): """Take a request with input data, deserialize it, make a prediction, and return a serialized response. NOTE: This is almost a copy of the original Transformer method, except it does not decode the utf-8 data. This is done for backwards compatibility. See line removed here: https://github.com/aws/sagemaker-inference-toolkit/blob/master/src/sagemaker_inference/transformer.py#L123 Args: data (obj): the request data. context (obj): metadata on the incoming request data. Returns: list[obj]: the serialized prediction result wrapped in a list. """ if not self._initialized: try: sys_properties = context._system_properties model_dir = sys_properties.get('model_dir') self.validate_and_initialize(model_dir) except Exception as e: if isinstance(e, BaseInferenceToolkitError): logging.error("Error loading model: {}".format(e)) return self.handle_error(context, e.status_code, e.message) else: raise e self._initialized = True try: input_data = data[0].get('body') request_processor = context.request_processor[0] request_property = request_processor.get_request_properties() content_type = utils.retrieve_content_type_header(request_property) accept = request_property.get('Accept') or request_property.get( 'accept') if not accept or accept == content_types.ANY: accept = self._environment.default_accept result = self._transform_fn(self._model, input_data, content_type, accept) response = result response_content_type = accept if isinstance(result, tuple): # handles tuple for backwards compatibility response = result[0] response_content_type = result[1] context.set_response_content_type(0, response_content_type) return [response] except Exception as e: if isinstance(e, BaseInferenceToolkitError): logging.error(e) return self.handle_error(context, e.status_code, e.message) else: return self.handle_error(context, http.HTTPStatus.BAD_REQUEST, e.message)