如何解决在使用 Amazon SageMaker Python 软件开发工具包时出现的“botocore.exceptions.ClientError: An error occurred (ThrottlingException)”等限流错误?
简短描述
对任何 AWS 服务的 API 调用不能超过每个账户和每个 AWS 区域允许的最大 API 请求速率。这些 API 调用可能是来自应用程序、AWS 命令行界面(AWS CLI)或者 AWS 管理控制台。如果 API 请求超出最大速率,则您会收到“Rate Exceeded”(超出速率)错误,然后 API 调用会受限。
您可能会在调用 SageMaker API 时因 Boto3 中的默认重试配置而收到此错误。您可以覆盖此配置,以提高重试尝试次数以及连接和读取响应的超时。
您可以通过将带有自定义重试配置的 SageMaker boto3 客户端添加到 SageMaker Python 软件开发工具包客户端来解决此错误。
解决方法
1. 创建带有自定义重试配置的 SageMaker boto3 客户端。示例:
import boto3
from botocore.config import Config
sm_boto = boto3.client('sagemaker', config=Config(connect_timeout=5, read_timeout=60, retries={'max_attempts': 20}))
print(sm_boto.meta.config.retries)
2. 使用上一步中的 boto3 客户端创建一个 SageMaker Python 软件开发工具包客户端。示例:
import sagemaker
sagemaker_session = sagemaker.Session(sagemaker_client = sm_boto)
region = sagemaker_session.boto_session.region_name
print(sagemaker_session.sagemaker_client.meta.config.retries)
3. 使用来自 SageMaker Python 软件开发工具包的多个请求测试 SageMaker API。示例:
import multiprocessing
def worker(TrainingJobName):
print(sagemaker_session.sagemaker_client
.describe_training_job(TrainingJobName=TrainingJobName)
['TrainingJobName'])
return
if __name__ == '__main__':
jobs = []
TrainingJobName = 'your-job-name'
for i in range(10):
p = multiprocessing.Process(target=worker, args=(TrainingJobName,))
jobs.append(p)
p.start()
4. 使用 sagemaker_session 参数创建 sagemaker.estimator.Estimator 实例类。示例:
estimator = sagemaker.estimator.Estimator(container,
role,
train_instance_count=1,
train_instance_type='ml.c4.4xlarge',
train_volume_size = 30,
train_max_run = 360000,
input_mode= 'File',
output_path=s3_output_location,
sagemaker_session=sagemaker_session )
5. 要确认重试配置是否解决了限流异常,请从您在上一步中创建的估算器中启动培训作业:
estimator.fit()
相关信息
Boto3 文档