為即時推論容器使用私有 Docker 登錄檔 - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

為即時推論容器使用私有 Docker 登錄檔

Amazon SageMaker 託管可讓您使用儲存在 Amazon ECR 中的映像來建立容器,以便依預設進行即時推論。或者,您可以從私有 Docker 登錄檔中的映像建立即時推論容器。私有登錄檔須可從您帳戶中的 Amazon VPC 存取。您基於私有 Docker 登錄檔中儲存的映像建立的模型須設定為連線至可存取私有 Docker 登錄檔的相同 VPC。如需將您的模型連線至 VPC 的資訊,請參閱 讓 SageMaker 託管端點能夠存取 Amazon VPC 中的資源

Docker 登錄檔須使用來自已知公有憑證授權單位 (CA) 的 TLS 憑證。

注意

您的私人 Docker 登錄必須允許來自您在 VPC 組態中為模型指定的安全群組的輸入流量,以便 SageMaker 主機能夠從登錄中提取模型映像。

SageMaker DockerHub 如果 VPC 內有通往開放互聯網的路徑,則可以從中提取模型圖像。

將映像存儲在 Amazon 彈性容器登錄檔以外的私有 Docker 登錄檔中

若要使用私有 Docker 登錄來存放映像以進行 SageMaker 即時推論,請建立可從 Amazon VPC 存取的私有登錄。如需建立 Docker 登錄檔的相關資訊,請參閱 Docker 文件中的部署登錄伺服器。Docker 登錄檔須符合下列規定:

  • 登錄檔須為 Docker 登錄檔 HTTP API V2 登錄檔。

  • Docker 登錄檔須可從您在建立模型時指定的 VpcConfig 參數中指定的相同 VPC 存取。

使用來自私有 Docker 登錄檔的映像進行即時推論

當您創建模型並將其部署到 SageMaker 託管時,可以指定它使用私有 Docker 註冊表中的映像來構建推論容器。在傳遞給 create_model 函數呼叫的 PrimaryContainer 參數中的 ImageConfig 物件中指定此值。

若要將儲存在私有 Docker 登錄檔中的映像用於推論容器
  1. 建立映像組態物件,並為 RepositoryAccessMode 欄位指定 Vpc 的值。

    image_config = { 'RepositoryAccessMode': 'Vpc' }
  2. 如果您的私有 Docker 登錄檔需要驗證,請將 RepositoryAuthConfig 物件新增至映像組態物件。對於RepositoryAuthConfig物件的RepositoryCredentialsProviderArn欄位,請指定函數的 Amazon 資源名稱 (ARN),該 AWS Lambda 函數提供可對私人 Docker 登錄 SageMaker 進行驗證的登入資料。如需如何建立 Lambda 函數以提供驗證的相關資訊,請參閱 允許 SageMaker 向私人 Docker 註冊表進行身份驗證

    image_config = { 'RepositoryAccessMode': 'Vpc', 'RepositoryAuthConfig': { 'RepositoryCredentialsProviderArn': 'arn:aws:lambda:Region:Acct:function:FunctionName' } }
  3. 使用您在上一步建立的映像組態物件,建立要傳遞至 create_model 的主要容器物件。

    摘要形式提供您的映像。如果您使用:latest標籤提供圖像,則可能會提 SageMaker 取比預期更新版本的圖像。使用摘要形式可確保 SageMaker 提取預期的圖像版本。

    primary_container = { 'ContainerHostname': 'ModelContainer', 'Image': 'myteam.myorg.com/docker-local/my-inference-image:<IMAGE-TAG>', 'ImageConfig': image_config }
  4. 指定模型名稱與您要傳遞至 create_model 的執行角色。

    model_name = 'vpc-model' execution_role_arn = 'arn:aws:iam::123456789012:role/SageMakerExecutionRole'
  5. 為您的模型的 VPC 組態指定一個或多個安全群組和子網路。私有 Docker 登錄檔須允許來自您指定的安全群組的傳入流量。您指定的子網路須與私有 Docker 登錄檔位於同一 VPC 中。

    vpc_config = { 'SecurityGroupIds': ['sg-0123456789abcdef0'], 'Subnets': ['subnet-0123456789abcdef0','subnet-0123456789abcdef1'] }
  6. 獲取一個 Boto3 SageMaker 客戶端。

    import boto3 sm = boto3.client('sagemaker')
  7. 使用您在上一步為 PrimaryContainerVpcConfig 參數指定的值,呼叫 create_model 來建立模型。

    try: resp = sm.create_model( ModelName=model_name, PrimaryContainer=primary_container, ExecutionRoleArn=execution_role_arn, VpcConfig=vpc_config, ) except Exception as e: print(f'error calling CreateModel operation: {e}') else: print(resp)
  8. 最後,使用您在上一步建立的模型呼叫 create_endpoint_configcreate_endpoint 來建立託管端點。

    endpoint_config_name = 'my-endpoint-config' sm.create_endpoint_config( EndpointConfigName=endpoint_config_name, ProductionVariants=[ { 'VariantName': 'MyVariant', 'ModelName': model_name, 'InitialInstanceCount': 1, 'InstanceType': 'ml.t2.medium' }, ], ) endpoint_name = 'my-endpoint' sm.create_endpoint( EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name, ) sm.describe_endpoint(EndpointName=endpoint_name)

允許 SageMaker 向私人 Docker 註冊表進行身份驗證

若要從需要驗證的私有 Docker 登錄中提取推論映像,請建立提供登入資料的 AWS Lambda 函數,並在呼叫 create_model 時提供 Lambda 函數的 Amazon 資源名稱 (ARN)。 SageMaker 執行時create_model,它會呼叫您指定的 Lambda 函數,以取得要向 Docker 登錄進行驗證的認證。

建立 Lambda 函數

創建一個 AWS Lambda 函數,該函數返回具有以下形式的響應:

def handler(event, context): response = { "Credentials": {"Username": "username", "Password": "password"} } return response

視您為私有 Docker 登錄檔設定驗證的方式而定,Lambda 函數傳回的憑證可能表示下列其中一項:

  • 如果您將私有 Docker 登錄檔設置為使用基本驗證,請提供登入的憑據以向登錄檔進行驗證。

  • 如果您將私有 Docker 登錄檔設置為使用承載字符驗證,則登入憑證將傳送至您的授權伺服器,該伺服器傳回可用於驗證私有 Docker 登錄檔的承載字符。

將您的執行角色許可給予 Lambda

您用來呼叫的執行角色create_model必須具有呼叫 AWS Lambda 函數的權限。將以下內容新增到執行角色的許可政策中。

{ "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:*:*:function:*myLambdaFunction*" ] }

你的 Lambda 函數的名稱在myLambdaFunction哪裡。如需編輯角色許可政策的資訊,請參閱 AWS Identity and Access Management 使用者指南中的修改角色許可政策 (主控台)

注意

附加AmazonSageMakerFullAccess受管政策的執行角色有權以其名稱呼叫任何 Lambda 函數。SageMaker

為 Lambda 建立介面 VPC 端點

建立介面端點,以便 Amazon VPC 可以與您的 AWS Lambda 函數通訊,而不必透過網際網路傳送流量。如需此使用方法的資訊,請參閱 AWS Lambda 開發人員指南中的設定 Lambda 的介面 VPC 端點

SageMaker 託管會透過您的 VPC 傳送請求lambda.region.amazonaws.com,以呼叫您的 Lambda 函數。如果您在建立介面端點時選擇私有 DNS 名稱,Amazon Route 53 會將呼叫路由傳送至 Lambda 介面端點。如果您使用不同的 DNS 供應商,請務必將 lambda.region.amazonaws.com 對應到您的 Lambda 介面端點。