如何通过AWS监控发送至SageMaker端点的请求负载大小以计费?
监控SageMaker端点输入数据大小的实现方案
下面是几种在AWS生态内实现该需求的可行方案:
1. 在入口层统计数据大小
如果你的应用有API网关作为SageMaker端点的前置入口,可以在API网关的集成请求阶段挂载Lambda函数,通过函数读取请求体的字节长度,将数据上报到CloudWatch自定义指标,或者直接存入DynamoDB用于后续计费核算。
要是客户端直接调用SageMaker端点,那就在客户端代码里计算请求数据的字节数,再通过AWS SDK把数据推送到CloudWatch自定义指标,或者写入计费相关的数据库。
2. 自定义模型容器日志记录
改造你的SageMaker模型容器,在推理代码里读取输入请求的字节大小,以结构化日志(比如JSON格式)输出。之后可以用CloudWatch Logs Insights分析这些日志提取指标,或者用Lambda订阅CloudWatch Logs实时处理日志,把数据大小同步到计费系统。
示例Python推理代码片段:
import json import sys def handler(data, context): # 计算输入数据字节大小 data_size = sys.getsizeof(json.dumps(data)) # 输出结构化日志 print(json.dumps({"event_type": "inference_request", "data_size_bytes": data_size})) # 执行推理逻辑 return {"result": "your_inference_result"}
3. 用Lambda做中间代理
搭建一个Lambda函数作为SageMaker端点的代理,所有客户请求先发到这个Lambda。在Lambda里计算请求体的字节大小,完成统计后再转发请求到SageMaker端点。同时把数据大小信息写入CloudWatch自定义指标或者计费数据库,方便后续汇总计费。
示例Lambda代理代码片段:
import boto3 import json sagemaker_runtime = boto3.client('sagemaker-runtime') ENDPOINT_NAME = 'your-target-endpoint' def lambda_handler(event, context): request_body = event['body'] # 计算请求数据字节大小 data_size = len(request_body.encode('utf-8')) # 上报到CloudWatch自定义指标 cloudwatch = boto3.client('cloudwatch') cloudwatch.put_metric_data( Namespace='SageMaker/Inference', MetricData=[ { 'MetricName': 'RequestDataSizeBytes', 'Dimensions': [ {'Name': 'EndpointName', 'Value': ENDPOINT_NAME}, {'Name': 'CustomerId', 'Value': event['requestContext']['authorizer']['customerId']} # 假设从授权信息取客户ID ], 'Value': data_size, 'Unit': 'Bytes' } ] ) # 转发请求到SageMaker端点 response = sagemaker_runtime.invoke_endpoint( EndpointName=ENDPOINT_NAME, ContentType='application/json', Body=request_body ) result = json.loads(response['Body'].read().decode()) return { 'statusCode': 200, 'body': json.dumps(result) }
4. 借助AWS X-Ray追踪数据
开启X-Ray对SageMaker端点的追踪,在X-Ray分段中添加自定义注解记录请求数据大小。之后可以通过X-Ray的API或控制台查询这些注解数据,不过这种方式更适合单请求详情追踪,批量统计需要结合其他工具处理。
内容的提问来源于stack exchange,提问作者bnicholl
相关产品推荐
相关产品推荐

