跳至內容

如何對 Amazon SageMaker AI 無伺服器推論端點的問題進行疑難排解?

3 分的閱讀內容
0

當我使用 Amazon SageMaker AI 無伺服器推論端點來處理工作負載時,收到錯誤訊息。

解決方法

根據您收到的錯誤訊息進行疑難排解。

映像檔容器大小對於無伺服器推論端點而言過大

無伺服器推論端點支援自攜容器 (BYOC),類似於即時端點。由於 AWS Lambda 支援這種特定類型的推論,因此對於這種特定類型的推論,容器大小必須小於 10 GB。

如果您的容器超出 10 GB 的限制,那麼您會收到類似以下內容的錯誤訊息:

"Image size 11271073144 is greater than the supported size 10737418240" (映像檔大小 11271073144 超過支援的大小 10737418240)

若要解決此問題,請執行下列其中一個動作:

  • 移除未使用的套件並最小化 Docker 檔案中的圖層數量,以減少映像檔大小並最佳化 Docker 容器。
  • 使用較小的基本映像檔並建立新的端點組態。指定託管即時端點所需的執行個體類型和其他相關參數。
  • 從無伺服器端點轉換為即時端點。建立新的端點組態,以指定執行個體類型和其他參數來託管即時端點。然後,使用新組態更新現有端點。
  1. 若要建立新的端點組態,請使用下列範本:
    import boto3
    
    client = boto3.client('sagemaker', region_name = 'us-east-1')
    
    endpoint_config_name = 'new-endpoint-config'
    production_variants = [
        {
            'VariantName': 'AllTraffic',
            'ModelName': 'ModelName',
            'InitialInstanceCount': 1,
            'InstanceType': 'ml.m5.xlarge',
            'InitialVariantWeight': 1.0
        }
    ]
    
    create_endpoint_config_response = client.create_endpoint_config(
        EndpointConfigName=endpoint_config_name,
        ProductionVariants=production_variants
    )
    **注意:**將 YourVariantName 替換為您執行個體變體的名稱,將 YourModelName 替換為您模型的名稱。將 1 替換為您的初始執行個體計數數字。將 ml.m5.xlarge 替換為您的執行個體類型。將 1.0 替換為執行個體的初始變體權重。
  2. 使用新組態建立新端點,將其從無伺服器轉換為即時端點。或者,使用新組態更新現有的無伺服器端點。
    建立新端點範例:
    endpoint_name = 'new-endpoint'
    
    create_endpoint_response = client.create_endpoint(
        EndpointName=endpoint_name,
        EndpointConfigName=endpoint_config_name
    )
    更新現有端點範例:
    endpoint_name = 'my-old-endpoint'
    
    update_endpoint_response = client.update_endpoint(
        EndpointName=endpoint_name,
        EndpointConfigName=endpoint_config_name
    )

若要確定容器大小,請從 Amazon Elastic Container Registry (ECR) 擷取映像檔 URI。然後,執行以下 Docker 命令來取得 Docker 映像檔詳細資訊:

docker images

無伺服器推論端點中的記憶體或磁碟空間不足

SageMaker AI 無伺服器端點的最大記憶體分配為 6 GB,暫時性磁碟儲存容量為 5 GB。

如果無伺服器端點的記憶體超過限制,那麼您會收到類似以下內容的錯誤訊息:

"UnexpectedStatusException: Error hosting endpoint: Failed.Reason: Ping failed due to insufficient memory." (「UnexpectedStatusException:託管端點時發生錯誤:失敗。原因:由於記憶體不足,Ping 失敗。」)

若要解決該問題,請從下列選項中選擇:

  • 調整 MemorySizeInMB 參數。
  • 最佳化您的工作者組態。
  • 將端點部署為即時端點,並提供您所需的執行個體詳細資訊。

調整 MemorySizeInMB 參數

  1. 使用增加的 MemorySizeInMB 建立新的無伺服器端點組態。
    範例:
    import boto3
    
    client = boto3.client('sagemaker', region_name='us-east-1')
    
    endpoint_config_name = "new-endpoint-config"
    
    endpoint_config_response = client.create_endpoint_config(
        EndpointConfigName=endpoint_config_name,
        ProductionVariants=[
            {
                "VariantName": YourVariantName,
                "ModelName": YourModelName,
                "ServerlessConfig": {
                    "MemorySizeInMB": NewMemorySize,
                    "MaxConcurrency": 1,
                },
            },
        ],
    )
    **注意:**將 YourVariantName 替換為您變體的名稱,將 YourModelName 替換為您模型的名稱。將 NewMemorySize 替換為記憶體大小限制。您可以使用的最大值為 6 GB。
  2. 使用新組態更新無伺服器端點。
    範例:
    endpoint_name = 'my-old-endpoint'
    
    update_endpoint_response = client.update_endpoint(
        EndpointName=endpoint_name,
        EndpointConfigName=endpoint_config_name
    )

最佳化您的工作者組態

若要避免記憶體錯誤,請只在容器中建立一個使用所有可用 CPU 資源的工作者。這種方法與即時端點不同,在即時端點中,某些 SageMaker AI 容器可能會為每個 vCPU 建立一個工作者。

對於使用 SageMaker AI 推論工具組的預先建置容器,請將 SAGEMAKER_MODEL_SERVER_WORKERS 設定為 1 來修改推論的模型建立。

範例:

import boto3

client = boto3.client('sagemaker', region_name='us-east-1')

response = client.create_model(
    ModelName='YourModelName',
    Containers=[
    {
        'Image': "YourImage"
        'Mode': 'SingleModel',
        'ModelDataUrl': "YourModelDataURL",
        'Environment': {
            'SAGEMAKER_CONTAINER_LOG_LEVEL': '20',
            'SAGEMAKER_MODEL_SERVER_WORKERS': '1'
        }
    }
    ],
    ExecutionRoleArn=role
)

**注意:**將 YourModelName 替換為您的模型名稱,將 YourImage 替換為您的映像檔名稱,並將 YourModelDataUrl 替換為您的模型資料網址。

將端點部署為即時端點,並提供您所需的執行個體詳細資訊

如需如何將端點部署為即時端點的資訊,請參閱本文中的「從無伺服器端點轉換到即時端點」。

磁碟空間不足

如果無伺服器端點沒有可用的磁碟空間,那麼您可能會收到下列錯誤訊息:

"No space left on device" (「OSError: [Errno 28] 裝置上沒有剩餘空間」)

若要解決此問題,請執行下列動作:

  • 在解壓縮時,請確認壓縮模型大小未超過可用的磁碟空間。檔案解壓縮後大小為壓縮後的三倍。
  • 請使用較小的模型成品,然後確定 .tar 封存中的所有檔案都是部署所必需的。
  • 如果無法使用無伺服器推論,請部署到即時端點以自訂執行個體規格。

無伺服器推論端點中的冷啟動情境

由於資源佈建的隨需性質和 SageMaker AI 無伺服器推論的限制,因此沒有明確的方法可預熱 SageMaker AI 無伺服器推論端點。如需詳細資訊,請參閱最小化冷啟動

對於配置的 ProvisionedConcurrency,SageMaker AI 會將端點保持在暖狀態,以在毫秒內回應。若要將冷啟動延遲問題降至最低,請使用 ProvisionedConcurrency 更新您的端點。如需詳細資訊,請參閱使用 Amazon CloudWatch 監控 Amazon SageMaker AI 的指標

請完成下列步驟:

  1. 建立一個新的無伺服器端點組態,其中 ProvisionedConcurrency 小於或等於 MaxConcurrency
    組態範例:
    import boto3
    client = boto3.client('sagemaker', region_name='us-east-1')
    
    endpoint_config_name = "new-endpoint-config"
    
    endpoint_config_response = client.create_endpoint_config(
        EndpointConfigName=endpoint_config_name,
        ProductionVariants=[
            {
                "VariantName": YourVariantName,
                "ModelName": YourModelName,
                "ServerlessConfig": {
                    "MemorySizeInMB": NewMemorySize,
                    "MaxConcurrency": 1,
                    "ProvisionedConcurrency": 1,
                },
            },
        ],
    )
    **注意:**將 YourVariantName 替換為您變體的名稱,將 YourModelName 替換為您模型的名稱。將 NewMemorySize 替換為記憶體大小限制。您可以使用的最大值為 6 GB。
  2. 使用新組態更新端點。
    範例:
    endpoint_name = 'my-serverless-endpoint'
    update_endpoint_response = client.update_endpoint(
        EndpointName=endpoint_name,
        EndpointConfigName=endpoint_config_name
    )

**注意:**最佳做法是使用 SageMaker AI 無伺服器推論基準測試工具組來確定無伺服器端點最有效率的部署組態。

相關資訊

使用 Amazon SageMaker AI 無伺服器推論部署模型

AWS 官方已更新 7 個月前