in tensorflow/inference/docker/build_artifacts/sagemaker/python_service.py [0:0]
def _handle_invocation_post(self, req, res, model_name=None):
if SAGEMAKER_MULTI_MODEL_ENABLED:
if model_name:
if self._gunicorn_workers > 1:
if model_name not in self._mme_tfs_instances_status or not self._check_pid(
self._mme_tfs_instances_status[model_name][0].pid
):
with lock():
self._sync_local_mme_instance_status()
self._sync_model_handlers()
if model_name not in self._mme_tfs_instances_status:
res.status = falcon.HTTP_404
res.body = json.dumps(
{"error": "Model {} is not loaded yet.".format(model_name)}
)
return
else:
log.info("model name: {}".format(model_name))
rest_ports = [
status.rest_port for status in self._mme_tfs_instances_status[model_name]
]
rest_port = self._pick_port(rest_ports)
log.info("rest port: {}".format(str(rest_port)))
grpc_ports = [
status.grpc_port for status in self._mme_tfs_instances_status[model_name]
]
grpc_port = grpc_ports[rest_ports.index(rest_port)]
log.info("grpc port: {}".format(str(grpc_port)))
data, context = tfs_utils.parse_request(
req,
rest_port,
grpc_port,
self._tfs_default_model_name,
model_name=model_name,
)
else:
res.status = falcon.HTTP_400
res.body = json.dumps({"error": "Invocation request does not contain model name."})
return
else:
# Randomly pick port used for routing incoming request.
grpc_port = self._pick_port(self._tfs_grpc_ports)
rest_port = self._pick_port(self._tfs_rest_ports)
data, context = tfs_utils.parse_request(
req,
rest_port,
grpc_port,
self._tfs_default_model_name,
channel=self._channels[grpc_port],
)
try:
res.status = falcon.HTTP_200
handlers = self._handlers
if SAGEMAKER_MULTI_MODEL_ENABLED and model_name in self.model_handlers:
log.info(
"Model-specific inference script for the model {} exists, importing handlers.".format(
model_name
)
)
handlers = self.model_handlers[model_name]
elif not self._default_handlers_enabled:
log.info(
"Universal inference script exists at path {}, importing handlers.".format(
INFERENCE_SCRIPT_PATH
)
)
else:
log.info(
"Model-specific inference script and universal inference script both do not exist, using default handlers."
)
res.body, res.content_type = handlers(data, context)
except Exception as e: # pylint: disable=broad-except
log.exception("exception handling request: {}".format(e))
res.status = falcon.HTTP_500
res.body = json.dumps({"error": str(e)}).encode("utf-8") # pylint: disable=E1101