You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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仓库托管代码,可以在容器启动时主动拉取:

  1. 在容器环境变量中配置Git仓库地址(比如私有CodeCommit仓库或公开Git仓库)
  2. 在推理脚本的开头或容器的entrypoint脚本中执行Git拉取命令
  3. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:05:38