SageMaker部署模型重复上传报错:权限不足问题咨询
问题
使用SageMaker部署模型时遇到权限问题:模型数据已存储在S3并传入PyTorchModel,但部署时仍尝试重新上传至S3根目录路径,因无该路径权限失败。
错误信息
S3UploadFailedError: Failed to upload
/tmp/tmpoy3pcol_/temp-model.tar.gz to
xyz_bucket/text_trove/model.tar.gz: An error occurred (AccessDenied)
when calling the CreateMultipartUpload operation: Access Denied
代码示例
sess = sagemaker.Session( default_bucket = "xyz_bucket" ) bucket = sess.default_bucket() pretrained_model_data = sess.upload_data( path="model-tiny.tar.gz", bucket=bucket, key_prefix="abc/pqr/test/summarizer" ) model=PyTorchModel(py_version='py3', name="text_trove", image_uri="texttrove/tt_sagemaker_py3.8_cuda11.0_torch_2.0:latest", entry_point="inference.py", source_dir=".", role=role, model_data=pretrained_model_data, sagemaker_session= sess ) predictor = model.deploy( initial_instance_count=1, instance_type=instance_type, serializer=JSONSerializer(), deserializer=JSONDeserializer(), sagemaker_session=sess, tags=[{"Key":"app_group","Value":"xyzzy_tag"}] )
疑问
- 为何模型已在S3中,部署时仍会尝试重新上传?
- 如何修改
model.deploy()的S3前缀,使其上传至可访问的嵌套路径而非根目录?
解答
问题1:已存在的模型仍被重新上传的原因
你在PyTorchModel中指定了source_dir=".",SageMaker会自动将当前目录下的推理代码(inference.py)及相关依赖打包成新的tar.gz文件,上传到S3的默认路径下。这个操作和你传入的model_data(预训练模型权重)是独立的——model_data指向的是模型权重,但SageMaker需要单独上传推理代码包,这就是你看到的重新上传行为。
问题2:修改上传路径至可访问的嵌套路径
有两种简洁的解决方式:
方式1:在PyTorchModel中指定model_data_prefix参数
直接在初始化PyTorchModel时添加该参数,指定你有权限的嵌套路径,示例如下:
model=PyTorchModel(py_version='py3', name="text_trove", image_uri="texttrove/tt_sagemaker_py3.8_cuda11.0_torch_2.0:latest", entry_point="inference.py", source_dir=".", role=role, model_data=pretrained_model_data, sagemaker_session= sess, model_data_prefix="abc/pqr/test/summarizer/code" # 替换为你有权限的嵌套路径 )
该参数会控制SageMaker上传代码包的S3前缀,避免使用根目录下的默认路径。
方式2:手动打包代码并上传到指定路径
如果不需要SageMaker自动打包代码,可以手动将source_dir目录下的文件打包成tar.gz,上传到有权限的S3路径,再将该路径传入PyTorchModel的model_data(需确保镜像能正确加载代码和模型权重)。不过这种方式需要额外处理代码与模型的关联逻辑,推荐优先使用第一种方式。
内容的提问来源于stack exchange,提问作者Rahul Sharma

