本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
SageMaker Python 开发工具包故障排除指南
你可以使用 SageMaker Python 软件开发工具包在 Python 脚本或 Jupyter 笔记本中与 SageMaker Amazon AI 进行交互。尽管 SDK 提供了简化的工作流程,但您可能会遇到各种异常或错误。本疑难解答指南旨在帮助您了解和解决使用 SageMaker Python SDK 时可能出现的常见问题。它涵盖了与创建训练作业、处理作业和端点有关的场景,以及一般异常处理实践。按照以下各节提供的指导,您可以有效地诊断和解决常见问题。
SageMaker Python 开发工具包充当低级 SageMaker API 操作的封装器。用于访问 SDK 的 IAM 角色必须能够访问基础操作。将 A SageMaker I 完全访问策略添加到您的 IAM 角色是确保您有权使用 SageMaker Python SDK 的最直接方法。有关 SageMaker AI 完全访问策略的更多信息,请参阅 Amazon A SageMaker I 完全访问权限。
虽然不太方便,但提供更精细的权限是使用 SDK 的一种安全方法。以下各节都有关于所需权限的信息。
创建训练作业
重要
如果您未将 SageMaker AI 完全访问权限策略添加到您的 IAM 角色,则该角色必须具有调用CreateTrainingJob和DescribeTrainingJob操作的权限。
它还需要以下权限
-
访问 S3 中的输入/输出数据
-
运行 Amazon EC2 实例
-
日志 CloudWatch 指标
如果您的 SageMaker 训练任务需要访问亚马逊虚拟私有云(Amazon VPC)中的资源,请确保在创建处理任务时配置必要的 VPC 设置和安全组。
创建训练作业时,可能会遇到 botocore.exceptions.ClientError
或 ValueError
异常。
更新训练作业
重要
如果您未将 A SageMaker I 托管策略添加到您的 IAM 角色,则必须向该角色授予以下权限:
-
s3:GetObject
:提供从 Amazon S3 存储桶读取模型构件的权限 -
s3:PutObject
:如果适用,提供写入模型构件更新的权限 -
iam:GetRole
:提供权限,以获取运行训练作业所需的 IAM 角色信息 -
sagemaker:UpdateTrainingJob
— 提供使用操作修改训练UpdateTrainingJob作业的权限。 -
logs:PutLogEvents
— 提供在更新过程中向 Amazon CloudWatch 日志写入日志的权限。
更新训练作业时,可能会遇到 botocore.exceptions.ParamValidationError
或 botocore.exceptions.ClientError
。
创建处理任务
重要
如果您未将 A SageMaker I 托管策略添加到您的 IAM 角色,则必须向该角色授予以下权限:
-
sagemaker:CreateProcessingJob
:提供创建处理任务的权限 -
sagemaker:DescribeProcessingJob
:提供获取处理作业信息的权限 -
s3:GetObject
:提供从 Amazon S3 存储桶读取模型构件的权限 -
s3:PutObject
:如果适用,提供写入模型构件更新的权限 -
logs:PutLogEvents
— 提供在更新过程中向 Amazon CloudWatch 日志写入日志的权限。
如果处理任务需要访问 Amazon 虚拟私有云中的资源,则必须在创建的估算器中指定其 security_group_ids
和 subnets
。有关如何访问 Amazon VPC 中的资源的示例,请参阅使用 VPC 进行安全训练和推理
在创建处理作业时,您可能会遇到 ValueError
、UnexpectedStatusException
或 botocore.exceptions.ClientError
。
创建端点
重要
如果您未将 A SageMaker I 托管策略添加到您的 IAM 角色,则必须向该角色授予以下权限:
-
sagemaker:CreateModel
:提供创建要部署到端点的模型的权限 -
sagemaker:CreateEndpointConfig
:提供创建端点配置的权限,该配置定义了端点的行为,如实例类型和计数等。 -
sagemaker:CreateEndpoint
:提供使用您指定的端点创建端点配置的权限
此外,您还需要获得描述和列出模型、端点和端点配置的权限。
创建端点时,可能会遇到 UnexpectedStatusException
或 botocore.exceptions.ClientError
。
下面是 UnexpectedStatusException
的示例:
UnexpectedStatusException: Error hosting endpoint gpt2-large-2024-07-03-15-28-20-448: Failed. Reason: The primary container for production variant AllTraffic did not pass the ping health check. Please check CloudWatch logs for this endpoint.. Try changing the instance type or reference the troubleshooting page https://docs.aws.amazon.com/sagemaker/latest/dg/async-inference-troubleshooting.html
错误消息要求您查看 Amazon CloudWatch 日志。使用以下步骤检查日志。
查看日 CloudWatch 志
-
在左侧导航栏中选择端点。
-
选择发生故障的端点。
-
在终端节点详细信息页面上,选择查看登录信息 CloudWatch。
找到日志后,查找具体问题。以下是 CloudWatch 日志的示例:
NotImplementedError: gptq quantization is not supported for AutoModel, you can try to quantize it with text-generation-server quantize ORIGINAL_MODEL_ID NEW_MODEL_ID
有关解决 botocore.exceptions.ClientError
的信息,请参阅 异常处理指南。
更新端点
重要
如果您未将 A SageMaker I 托管策略添加到您的 IAM 角色,则必须向该角色授予以下权限:
-
sagemaker:UpdateEndpoint
:提供更新现有端点的权限,例如更改端点的实例类型或计数。 -
sagemaker:UpdateEndpointWeightsAndCapacities
:提供创建端点配置的权限,该配置定义了端点的行为,如实例类型和计数等。 -
sagemaker:DescribeEndpoint
:提供描述端点当前配置的权限,通常在更新前需要进行描述
此外,您可能需要权限来描述和列出端点和端点配置。
您可能会遇到 ValueError
,例如下面的情况:
ValueError: Endpoint with name 'abc' does not exist; please use an existing endpoint name
该错误表示指定的终端节点名称与您 AWS 账户中的任何现有终端节点都不匹配。使用以下步骤排除故障:
排除值错误的故障
-
使用以下代码列出所有端点:
import sagemaker sagemaker_session = sagemaker.Session() # List all endpoints endpoints = sagemaker_session.sagemaker_client.list_endpoints() print(endpoints)
-
验证您为
update_endpoint
函数指定的端点是否在列表中。 -
请确保您在正确的 AWS 地区开展业务。 SageMaker AI 终端节点是特定于区域的。
-
确保您使用的 IAM 角色拥有列出、描述或更新端点的权限。
异常处理指南
如果找不到帮助您解决具体问题的信息,以下代码示例可以为您处理异常提供灵感。
下面是一个通用示例,可以用来捕获大多数异常。
import sagemaker from botocore.exceptions import ParamValidationError, ClientError try: sagemaker.some_api_call(SomeParam='some_param') except ClientError as error: # Put your error handling logic here raise error except ParamValidationError as error: raise ValueError('The parameters you provided are incorrect: {}'.format(error)) except ValueError as error: # Catch generic ValueError exceptions
错误主要分为两大类:
-
特定于 SageMaker Python 软件开发工具包的错误
-
底层 AWS 服务特有的错误
底层 AWS 服务特有的错误始终是botocore.exceptions.ClientError
例外情况。botocore.exceptions.ClientError
有一个 Error
对象和一个 ResponseMetadata
对象。下面显示了客户错误的模板:
{ 'Error': { 'Code': 'SomeServiceException', 'Message': 'Details/context around the exception or error' }, 'ResponseMetadata': { 'RequestId': '1234567890ABCDEF', 'HostId': 'host ID data will appear here as a hash', 'HTTPStatusCode': 400, 'HTTPHeaders': {'header metadata key/values will appear here'}, 'RetryAttempts': 0 } }
下面举例说明使用 botocore.exceptions.ClientError
可以进行的具体错误处理:
try: sagemaker.some_api_call(SomeParam='some_param') except botocore.exceptions.ClientError as err: if err.response['Error']['Code'] == 'InternalError': # Generic error # We grab the message, request ID, and HTTP code to give to customer support print('Error Message: {}'.format(err.response['Error']['Message'])) print('Request ID: {}'.format(err.response['ResponseMetadata']['RequestId'])) print('Http code: {}'.format(err.response['ResponseMetadata']['HTTPStatusCode'])) raise err else if err.response['Error']['Code'] == 'ValidationException': raise ValueError(err.response['Error']['Message'])
有关如何处理ClientError
异常的更多信息,请参阅解析错误响应并从中 AWS 服务捕获异常