本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
註冊模型版本
您可以透過建立一個指定模型所屬模型群組的模型版本來註冊 Amazon SageMaker AI 模型。模型版本必須包含模型成品 (模型的訓練權重),以及選擇性地包含模型的推論程式碼。
推論管道是一種 SageMaker AI 模型,由兩個到十五個處理推論請求的容器線性序列容器構成。您可以透過指定容器和相關聯的環境變數來註冊推論管道。如需與推論管道相關的詳細資訊,請參閱Amazon SageMaker AI 中的推論管道。
您可以透過指定容器和關聯的環境變數,在推論管道中註冊模型。若要使用 適用於 Python (Boto3) 的 AWS SDK、Amazon SageMaker Studio 主控台或在 SageMaker AI 模型建置管道中建立步驟,建立具有推論管道的模型版本,請使用下列步驟。
註冊模型版本 (SageMaker AI Pipeline)
若要使用 SageMaker AI 模型建置管道註冊模型版本,請在管道中建立 RegisterModel 步驟。如需與作為管道的一部分建立 RegisterModel 相關的詳細資訊,請參閱步驟 8:定義 RegisterModel 步驟以建立模型套件。
註冊模型版本 (Boto3)
若要使用 Boto3 註冊模型版本,請呼叫 create_model_package API 操作。
首先,設定要傳遞至 create_model_package API 操作的參數字典。
# Specify the model source model_url = "s3://your-bucket-name/model.tar.gz" modelpackage_inference_specification = { "InferenceSpecification": { "Containers": [ { "Image":image_uri, "ModelDataUrl":model_url} ], "SupportedContentTypes": [ "text/csv" ], "SupportedResponseMIMETypes": [ "text/csv" ], } } # Alternatively, you can specify the model source like this: # modelpackage_inference_specification["InferenceSpecification"]["Containers"][0]["ModelDataUrl"]=model_url create_model_package_input_dict = { "ModelPackageGroupName" : model_package_group_name, "ModelPackageDescription" : "Model to detect 3 different types of irises (Setosa, Versicolour, and Virginica)", "ModelApprovalStatus" : "PendingManualApproval" } create_model_package_input_dict.update(modelpackage_inference_specification)
然後呼叫 create_model_package API 操作,傳入您剛剛設定的參數字典。
create_model_package_response = sm_client.create_model_package(**create_model_package_input_dict) model_package_arn = create_model_package_response["ModelPackageArn"] print('ModelPackage Version ARN : {}'.format(model_package_arn))
註冊模型版本 (Studio 或 Studio Classic)
若要在 Amazon SageMaker Studio 主控台中註冊模型版本,請根據您是使用 Studio 還是 Studio Classic 完成以下步驟。
從其他帳戶註冊模型版本
若要向不同 AWS 帳戶建立的模型群組註冊模型版本,您必須新增跨帳戶 AWS Identity and Access Management 資源政策以啟用該帳戶。例如,組織中的一個 AWS 帳戶負責訓練模型,另一個帳戶負責管理、部署和更新模型。您可以建立 IAM 資源政策,並將政策套用至您想要在此案例中授予存取權的特定帳戶資源。如需 中跨帳戶資源政策的詳細資訊 AWS,請參閱AWS Identity and Access Management 《 使用者指南》中的跨帳戶政策評估邏輯。
若要啟用跨帳戶探索能力,允許其他帳戶從資源擁有者帳戶檢視模型套件群組,請參閱跨帳戶探索能力。
注意
在跨帳戶模型部署訓練期間,您還必須使用 KMS 金鑰來對輸出資料設定動作進行加密。
若要在 SageMaker AI 中啟用跨帳戶模型註冊庫,您必須為包含模型版本的模型群組提供跨帳戶資源政策。下列範例為模型群組建立了跨帳戶政策,並將這些政策套用至特定資源。
必須為在模型群組中註冊模型跨帳戶存取權的來源帳戶設定下列組態。在此範例中,來源帳戶是模型訓練帳戶,該帳戶將訓練模型,然後將模型跨帳戶存取權註冊到模型註冊表帳戶的模型註冊表中。
此範例假設您先前已定義下列變數:
-
sm_client- SageMaker AI Boto3 用戶端。 -
model_package_group_name- 您要授予存取權的模型群組。 -
model_package_group_arn- 您要授與跨帳戶存取權的模型群組 ARN。 -
bucket- 存放模型訓練成品的 Amazon S3 儲存貯體。
若要能夠部署在不同帳戶中建立的模型,使用者必須擁有可以存取 SageMaker AI 動作的角色 (例如具有 AmazonSageMakerFullAccess 受管政策的角色)。如需 SageMaker AI 受管政策的相關資訊,請參閱 AWS Amazon SageMaker AI 的 受管政策。
必要的 IAM 資源政策
下圖展示允許跨帳戶模型註冊時所必要的政策。如圖所示,這些政策必須在模型訓練期間處於作用中狀態,模型才能正確註冊至模型註冊表帳戶。
下列程式碼範例示範了 Amazon ECR、Amazon S3 和 AWS KMS 政策。
Amazon ECR 政策範例
Amazon S3 政策範例
範例 AWS KMS 政策
將資源政策套用至帳戶
下列政策組態會套用前一節中討論的政策,且必須放入模型訓練帳戶。
import json # The Model Registry account id of the Model Group model_registry_account = "111111111111" # The model training account id where training happens model_training_account = "222222222222" # 1. Create a policy for access to the ECR repository # in the model training account for the Model Registry account Model Group ecr_repository_policy = {"Version": "2012-10-17", "Statement": [{"Sid": "AddPerm", "Effect": "Allow", "Principal": { "AWS": f"arn:aws:iam::{model_registry_account}:root" }, "Action": [ "ecr:BatchGetImage", "ecr:Describe*" ] }] } # Convert the ECR policy from JSON dict to string ecr_repository_policy = json.dumps(ecr_repository_policy) # Set the new ECR policy ecr = boto3.client('ecr') response = ecr.set_repository_policy( registryId = model_training_account, repositoryName = "decision-trees-sample", policyText = ecr_repository_policy ) # 2. Create a policy in the model training account for access to the S3 bucket # where the model is present in the Model Registry account Model Group bucket_policy = {"Version": "2012-10-17", "Statement": [{"Sid": "AddPerm", "Effect": "Allow", "Principal": {"AWS": f"arn:aws:iam::{model_registry_account}:root" }, "Action": [ "s3:GetObject", "s3:GetBucketAcl", "s3:GetObjectAcl" ], "Resource": [ "arn:aws:s3:::{bucket}/*", "Resource: arn:aws:s3:::{bucket}" ] }] } # Convert the S3 policy from JSON dict to string bucket_policy = json.dumps(bucket_policy) # Set the new bucket policy s3 = boto3.client("s3") response = s3.put_bucket_policy( Bucket =bucket, Policy = bucket_policy) # 3. Create the KMS grant for the key used during training for encryption # in the model training account to the Model Registry account Model Group client = boto3.client("kms") response = client.create_grant( GranteePrincipal=model_registry_account, KeyId=kms_key_id Operations=[ "Decrypt", "GenerateDataKey", ], )
下列組態必須放入模型群組所在的模型註冊表帳戶。
# The Model Registry account id of the Model Group model_registry_account = "111111111111" # 1. Create policy to allow the model training account to access the ModelPackageGroup model_package_group_policy = {"Version": "2012-10-17", "Statement": [ { "Sid": "AddPermModelPackageVersion", "Effect": "Allow", "Principal": {"AWS": f"arn:aws:iam::{model_training_account}:root"}, "Action": ["sagemaker:CreateModelPackage"], "Resource": f"arn:aws:sagemaker:{region}:{model_registry_account}:model-package/{model_package_group_name}/*" } ] } # Convert the policy from JSON dict to string model_package_group_policy = json.dumps(model_package_group_policy) # Set the new policy response = sm_client.put_model_package_group_policy( ModelPackageGroupName =model_package_group_name, ResourcePolicy = model_package_group_policy)
最後,透過模型訓練帳戶使用 create_model_package 動作跨帳戶註冊模型套件。
# Specify the model source model_url = "s3://{bucket}/model.tar.gz" #Set up the parameter dictionary to pass to the create_model_package API operation modelpackage_inference_specification = { "InferenceSpecification": { "Containers": [ { "Image": f"{model_training_account}.dkr.ecr.us-east-2.amazonaws.com/decision-trees-sample:latest", "ModelDataUrl": model_url } ], "SupportedContentTypes": [ "text/csv" ], "SupportedResponseMIMETypes": [ "text/csv" ], } } # Alternatively, you can specify the model source like this: # modelpackage_inference_specification["InferenceSpecification"]["Containers"][0]["ModelDataUrl"]=model_url create_model_package_input_dict = { "ModelPackageGroupName" :model_package_group_arn, "ModelPackageDescription" : "Model to detect 3 different types of irises (Setosa, Versicolour, and Virginica)", "ModelApprovalStatus" : "PendingManualApproval" } create_model_package_input_dict.update(modelpackage_inference_specification) # Create the model package in the Model Registry account create_model_package_response = sm_client.create_model_package(**create_model_package_input_dict) model_package_arn = create_model_package_response["ModelPackageArn"] print('ModelPackage Version ARN : {}'.format(model_package_arn))