Modelbuilder cannot save a PyTorch model
Describe the bug If I try to use modelbuilder to create a deployable model using a pytorch then try to save it I get the following error:-
sagemaker.config INFO - Applied value from config key = SageMaker.PythonSDK.Modules.Session.DefaultS3Bucket sagemaker.config INFO - Applied value from config key = SageMaker.PythonSDK.Modules.Session.DefaultS3ObjectKeyPrefix ModelBuilder: INFO: Save path: /tmp/sagemaker/save/2025-03-13-10-03-56 ModelBuilder: INFO: Saving model to /tmp/sagemaker/save/2025-03-13-10-03-56 ModelBuilder: INFO: Inferred Framework string: <class 'sagemaker.model.FrameworkModel'> ModelBuilder: INFO: Inferred Python version tuple: ('3', '11', '11')
TypeError Traceback (most recent call last) Cell In[22], line 1 ----> 1 modelBuilder.save()
File /opt/conda/lib/python3.11/site-packages/sagemaker/serve/builder/model_builder.py:986, in ModelBuilder.save(self, save_path, s3_path, sagemaker_session, role_arn) 972 self.role_arn = role_arn 974 save_handler = SaveHandler( 975 model=self.model, 976 schema_builder=self.schema_builder, (...) 983 metadata=Metadata(), 984 ) --> 986 return save_handler.save()
File /opt/conda/lib/python3.11/site-packages/sagemaker/serve/save_retrive/version_1_0_0/save/save_handler.py:170, in SaveHandler.save(self) 167 if not Path(self.save_path).exists(): 168 Path(self.save_path).mkdir(parents=True, exist_ok=True) --> 170 inferred = detect_framework_and_its_versions( 171 self.model if self.model else self.inference_spec.load(self.model_loader_path) 172 ) 173 self.framework = inferred[0][0] 174 self.framework_version = inferred[0][1]
File /opt/conda/lib/python3.11/site-packages/sagemaker/serve/save_retrive/version_1_0_0/save/utils.py:178, in detect_framework_and_its_versions(model) 176 raise Exception("Unable to import xgboost, check if pytorch is installed") 177 else: --> 178 raise Exception("Unable to determine framework for tht base model" % framework_string) 180 logger.info("Inferred framework and its version: %s %s", fw, vs) 182 return [(fw, vs), py_tuple]
TypeError: not all arguments converted during string formatting
To reproduce from sagemaker.pytorch import PyTorch
hyperparameters = {'epochs': 5}
mnistfashion_estimator = PyTorch(entry_point='Training.py', source_dir='model', role=role, framework_version='2.3.0', py_version='py311', hyperparameters=hyperparameters, instance_count=1, instance_type="ml.p3.2xlarge")
mnistfashion_estimator.fit(inputs) model = mnistfashion_estimator.create_model()
model_path = "s://{0}/{1}/{2}/dev/{3}".format(bucket, project.domain_id, project.id, 'model') model_path
import sagemaker from sagemaker import Model from sagemaker.serve import ModelBuilder #from sagemaker.model import ModelBuilder
modelBuilder = ModelBuilder(model=model, s3_model_data_url=path) modelBuilder.save()
Expected behavior I would expect the model to be saved without error.
Screenshots or logs If applicable, add screenshots or logs to help explain your problem.
System information
- SageMaker Python SDK version: 2.227.0
- Framework: PyTorch
- Framework version: 2.3.0
- Python version: py311
- GPU
- Custom Docker image: n
Additional context Looking at the code here: - def detect_framework_and_its_versions(model: object) -> bool: """Placeholder docstring""" model_base = model.class.base
if object == model_base:
model_base = model.__class__
framework_string = str(model_base)
logger.info("Inferred Framework string: %s", framework_string)
py_tuple = platform.python_version_tuple()
logger.info("Inferred Python version tuple: %s", py_tuple)
fw = ""
vs = ""
if "torch" in framework_string:
The class will always be PyTorchModel but the base class will be sagemaker.model.FrameworkModel meaning this function will never match on a valid class.