能否通过AWS CDK的CfnCodeRepository为CfnModel传递代码?
问题解答:能否用CfnCodeRepository给CfnModel传递推理代码?
不行,CfnCodeRepository无法直接给CfnModel传递推理代码。原因是CfnCodeRepository是SageMaker专为训练作业、Notebook实例这类场景设计的Git代码库管理资源,推理模型的CfnModel没有集成直接从CodeRepository加载代码的逻辑——推理容器的代码加载机制仅支持从S3的tar.gz包或本地路径读取。
不过可以用以下两种方案实现代码与模型分离部署:
方案1:将推理代码单独打包到S3,与模型分开存储
把推理脚本单独打包成tar.gz文件上传到S3,然后在CfnModel的容器环境变量中分别指定模型地址和代码地址,无需将代码与模型打包在一起:
# 推理代码单独打包后的S3地址 inference_code_s3_url = "s3://your-bucket/path/to/inference_code.tar.gz" sklearn_container = aws_sagemaker.CfnModel.ContainerDefinitionProperty( image=skl_image, image_config=aws_sagemaker.CfnModel.ImageConfigProperty(repository_access_mode="Platform"), container_hostname="SklearnContainer", model_data_url="LINK TO MODEL TAR.GZ ON S3", # 模型仍用单独的S3地址 environment={ 'SAGEMAKER_CONTAINER_LOG_LEVEL': '10', 'SAGEMAKER_SUBMIT_DIRECTORY': inference_code_s3_url, # 指向单独的代码包 'SAGEMAKER_PROGRAM': 'clf_inference.py', # 脚本位于代码包根目录 'SAGEMAKER_REGION': region } ) containers = [sklearn_container] role = XXX multi_model = aws_sagemaker.CfnModel( self, id="SOME-MODEL-ID", execution_role_arn=role.role_arn, model_name='SOME-MODEL-NAME', containers=containers)
这种方式的好处是更新推理代码时,只需重新上传代码包并更新模型的环境变量,无需重新打包模型文件。
方案2:自定义容器启动逻辑,从Git仓库拉取代码
如果一定要用Git仓库托管代码,可以在容器启动时主动拉取:
- 在容器环境变量中配置Git仓库地址(比如私有CodeCommit仓库或公开Git仓库)
- 在推理脚本的开头或容器的entrypoint脚本中执行Git拉取命令
- 调整
SAGEMAKER_PROGRAM指向拉取后的脚本路径
示例逻辑(推理脚本开头添加拉取代码的代码):
import os import git # 从环境变量读取Git仓库地址 git_repo = os.environ['GIT_REPO'] # 拉取到容器内的代码目录 clone_path = '/opt/ml/code' # 拉取代码 git.Repo.clone_from(git_repo, clone_path) # 后续执行推理逻辑
注意:需要确保SageMaker执行角色拥有访问目标Git仓库的权限(比如CodeCommit需要附加codecommit:GitPull权限),且容器镜像中已安装Git和gitpython库(或直接用shell命令拉取)。
内容的提问来源于stack exchange,提问作者Katie
相关产品推荐
相关产品推荐

