def predict(app_name, api_name): try: payload = request.get_json() except Exception as e: return "Malformed JSON", status.HTTP_400_BAD_REQUEST model = local_cache["model"] api = local_cache["api"] response = {} if not util.is_dict(payload) or "samples" not in payload: util.log_pretty(payload, logging_func=logger.error) return prediction_failed(payload, "top level `samples` key not found in request") logger.info("Predicting " + util.pluralize(len(payload["samples"]), "sample", "samples")) predictions = [] samples = payload["samples"] if not util.is_list(samples): util.log_pretty(samples, logging_func=logger.error) return prediction_failed( payload, "expected the value of key `samples` to be a list of json objects" ) for i, sample in enumerate(payload["samples"]): util.log_indent("sample {}".format(i + 1), 2) is_valid, reason = is_valid_sample(sample) if not is_valid: return prediction_failed(sample, reason) for column in local_cache["required_inputs"]: sample[column["name"]] = util.upcast(sample[column["name"]], column["type"]) try: result = run_predict(sample) except CortexException as e: e.wrap("error", "sample {}".format(i + 1)) logger.error(str(e)) logger.exception( "An error occurred, see `cx logs api {}` for more details.".format(api["name"]) ) return prediction_failed(sample, str(e)) except Exception as e: logger.exception( "An error occurred, see `cx logs api {}` for more details.".format(api["name"]) ) return prediction_failed(sample, str(e)) predictions.append(result) if model["type"] == "regression": response["regression_predictions"] = predictions if model["type"] == "classification": response["classification_predictions"] = predictions response["resource_id"] = api["id"] return jsonify(response)
def predict(deployment_name, api_name): try: payload = request.get_json() except Exception as e: return "Malformed JSON", status.HTTP_400_BAD_REQUEST ctx = local_cache["ctx"] api = local_cache["api"] response = {} if not util.is_dict(payload) or "samples" not in payload: util.log_pretty(payload, logging_func=logger.error) return prediction_failed( payload, "top level `samples` key not found in request") logger.info("Predicting " + util.pluralize(len(payload["samples"]), "sample", "samples")) predictions = [] samples = payload["samples"] if not util.is_list(samples): util.log_pretty(samples, logging_func=logger.error) return prediction_failed( payload, "expected the value of key `samples` to be a list of json objects") for i, sample in enumerate(payload["samples"]): util.log_indent("sample {}".format(i + 1), 2) if util.is_resource_ref(api["model"]): is_valid, reason = is_valid_sample(sample) if not is_valid: return prediction_failed(sample, reason) for column in local_cache["required_inputs"]: column_type = ctx.get_inferred_column_type(column["name"]) sample[column["name"]] = util.upcast(sample[column["name"]], column_type) try: result = run_predict(sample) except CortexException as e: e.wrap("error", "sample {}".format(i + 1)) logger.error(str(e)) logger.exception( "An error occurred, see `cortex logs -v api {}` for more details." .format(api["name"])) return prediction_failed(sample, str(e)) except Exception as e: logger.exception( "An error occurred, see `cortex logs -v api {}` for more details." .format(api["name"])) # Show signature def for external models (since we don't validate input) schemaStr = "" signature_def = local_cache["metadata"]["signatureDef"] if (not util.is_resource_ref(api["model"]) and signature_def.get("predict") is not None # Just to be safe and signature_def["predict"].get("inputs") is not None # Just to be safe ): schemaStr = "\n\nExpected shema:\n" + util.pp_str( signature_def["predict"]["inputs"]) return prediction_failed(sample, str(e) + schemaStr) predictions.append(result) response["predictions"] = predictions response["resource_id"] = api["id"] return jsonify(response)