예제 #1
0
    def predict(self, batch):
        """
        PREDICT COMMAND = {
            "command": "predict",
            "batch": [ REQUEST_INPUT ]
        }
        :param batch: list of request
        :return:

        """
        headers, input_batch, req_id_map = Service.retrieve_data_for_inference(
            batch)

        self.context.request_ids = req_id_map
        self.context.request_processor = headers
        metrics = MetricsStore(req_id_map, self.context.model_name)
        self.context.metrics = metrics

        start_time = time.time()

        # noinspection PyBroadException
        try:
            ret = self._entry_point(input_batch, self.context)
        except MemoryError:
            logger.error("System out of memory", exc_info=True)
            return create_predict_response(None, req_id_map,
                                           "Out of resources", 507)
        except Exception:  # pylint: disable=broad-except
            logger.warning("Invoking custom service failed.", exc_info=True)
            return create_predict_response(None, req_id_map,
                                           "Prediction failed", 503)

        if not isinstance(ret, list):
            logger.warning("model: %s, Invalid return type: %s.",
                           self.context.model_name, type(ret))
            return create_predict_response(None, req_id_map,
                                           "Invalid model predict output", 503)

        if len(ret) != len(input_batch):
            logger.warning(
                "model: %s, number of batch response mismatched, expect: %d, got: %d.",
                self.context.model_name, len(input_batch), len(ret))
            return create_predict_response(
                None, req_id_map, "number of batch response mismatched", 503)

        duration = round((time.time() - start_time) * 1000, 2)
        metrics.add_time(PREDICTION_METRIC, duration)

        return create_predict_response(ret,
                                       req_id_map,
                                       "Prediction success",
                                       200,
                                       context=self.context)
    def test_create_predict_response_with_error(self):
        msg = codec.create_predict_response(None, {0: "request_id"}, "failed",
                                            200)

        assert msg == b"\x00\x00\x00\xc8\x00\x00\x00\x06failed\x00\x00\x00\x0a" \
                      b"request_id\x00\x00\x00\x00\x00\x00\x00\x05error\xff\xff\xff\xff"
    def test_create_predict_response(self):
        msg = codec.create_predict_response(["OK"], {0: "request_id"},
                                            "success", 200)

        assert msg == b'\x00\x00\x00\xc8\x00\x00\x00\x07success\x00\x00\x00\nrequest_id' \
                      b'\x00\x00\x00\x00\x00\x00\x00\x02OK\xff\xff\xff\xff'