예제 #1
0
    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
예제 #4
0
    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]
예제 #5
0
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
예제 #6
0
    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)