Source code for sagemaker.serve.model_server.multi_model_server.prepare
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
# ANY KIND, either express or implied. See the License for the specific
# language governing permissions and limitations under the License.
"""Shared resources for prepare step of model deployment"""
from __future__ import absolute_import
import logging
from sagemaker.serve.model_server.tgi.prepare import _copy_jumpstart_artifacts
from sagemaker.serve.utils.local_hardware import _check_disk_space, _check_docker_disk_usage
from pathlib import Path
import shutil
from typing import List
from sagemaker.core.helper.session_helper import Session
from sagemaker.serve.spec.inference_spec import InferenceSpec
from sagemaker.serve.detector.dependency_manager import capture_dependencies
from sagemaker.serve.validations.check_integrity import (
compute_hash,
)
from sagemaker.core.remote_function.core.serialization import _MetaData
logger = logging.getLogger(__name__)
def _create_dir_structure(model_path: str) -> tuple:
"""Create the expected model directory structure for the Multi Model server"""
model_path = Path(model_path)
if not model_path.exists():
model_path.mkdir(parents=True)
elif not model_path.is_dir():
raise ValueError("model_dir is not a valid directory")
code_dir = model_path.joinpath("code")
code_dir.mkdir(exist_ok=True, parents=True)
_check_disk_space(model_path)
_check_docker_disk_usage()
return model_path, code_dir
[docs]
def prepare_mms_js_resources(
model_path: str,
js_id: str,
shared_libs: List[str] = None,
dependencies: str = None,
model_data: str = None,
) -> tuple:
"""Prepare serving when a JumpStart model id is given
Args:
model_path (str) : Argument
js_id (str): Argument
shared_libs (List[]) : Argument
dependencies (str) : Argument
model_data (str) : Argument
Returns:
( str ) :
"""
model_path, code_dir = _create_dir_structure(model_path)
return _copy_jumpstart_artifacts(model_data, js_id, code_dir)
[docs]
def prepare_for_mms(
model_path: str,
shared_libs: List[str],
dependencies: dict,
session: Session,
image_uri: str,
inference_spec: InferenceSpec = None,
) -> str:
"""Prepares for InferenceSpec using model_path, writes inference.py, and captures dependencies to generate secret_key.
Args:to
model_path (str) : Argument
shared_libs (List[]) : Argument
dependencies (dict) : Argument
session (Session) : Argument
inference_spec (InferenceSpec, optional) : Argument
(default is None)
Returns:
( str ) : secret_key
"""
model_path = Path(model_path)
if not model_path.exists():
model_path.mkdir()
elif not model_path.is_dir():
raise Exception("model_dir is not a valid directory")
if inference_spec:
inference_spec.prepare(str(model_path))
code_dir = model_path.joinpath("code")
code_dir.mkdir(exist_ok=True)
shutil.copy2(Path(__file__).parent.joinpath("inference.py"), code_dir)
logger.info("Finished writing inference.py to code directory")
shared_libs_dir = model_path.joinpath("shared_libs")
shared_libs_dir.mkdir(exist_ok=True)
for shared_lib in shared_libs:
shutil.copy2(Path(shared_lib), shared_libs_dir)
capture_dependencies(dependencies=dependencies, work_dir=code_dir)
with open(str(code_dir.joinpath("serve.pkl")), "rb") as f:
buffer = f.read()
hash_value = compute_hash(buffer=buffer)
with open(str(code_dir.joinpath("metadata.json")), "wb") as metadata:
metadata.write(_MetaData(hash_value).to_json())