首页/新闻资讯/正文详情

Moto 中的 sagemaker-metrics 服务:BatchPutMetrics 模拟实现与工作原理

发布时间:2026/9/26 2:20:31 来源:云帆数科 栏目:资讯中心
Moto 中的 sagemaker-metrics 服务:BatchPutMetrics 模拟实现与工作原理
Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载导读本文聚焦开源项目 Moto 中sagemaker-metricsSageMaker Metrics服务模块的模拟实现讲解如何在本地开发与测试环境中通过 Moto 模拟 Amazon SageMaker 实验追踪指标上报BatchPutMetrics接口。读完本文你将掌握该服务的启用方式、batch_put_metrics的请求/响应结构、与 SageMaker Trial Component 共享的底层数据模型以及如何借助现有测试用例验证模拟行为。一、服务定位SageMaker Metrics 在 Moto 中模拟了什么sagemaker-metrics是 Amazon SageMaker 的一个辅助服务负责接收实验运行Trial Component的训练指标上报供 SageMaker 实验追踪功能聚合展示。Moto 在 moto/sagemakermetrics/ 目录下实现了该服务的模拟后端其官方服务文档见 docs/docs/services/sagemaker-metrics.rst。该文档中.. autoclass:: moto.sagemakermetrics.models.SageMakerMetricsBackend直接引用源码中的后端类作为文档主体并给出了功能实现清单[ ] batch_get_metrics—— 未实现批量读取指标暂不支持[X] batch_put_metrics—— 已实现批量上报指标。也就是说当前 Moto 对 sagemaker-metrics 的支持集中在“写入”一侧可以把指标写入对应 SageMaker Trial Component并能在之后通过 SageMaker 的describe_trial_component读到聚合结果但暂不提供独立的批量查询 API。二、模块结构五个文件的职责划分sagemaker-metrics模块遵循 Moto 每个 AWS 服务一贯的分层架构包含五个文件文件职责moto/sagemakermetrics/init.py导出后端单例sagemakermetrics_backendsmoto/sagemakermetrics/models.py定义SageMakerMetricsBackend实现业务逻辑moto/sagemakermetrics/responses.py定义SageMakerMetricsResponse解析 HTTP 请求并序列化响应moto/sagemakermetrics/urls.py注册服务 URL 路由与 dispatch 入口moto/sagemakermetrics/exceptions.py服务相关异常定义路由层 urls.py 定义了模拟服务的接入点URL 基础为https://metrics.sagemaker.{region}.amazonaws.com支持两个路径——根路径{0}/$以及操作路径{0}/BatchPutMetrics$二者都交给SageMakerMetricsResponse.dispatch统一分发。这意味着当你的 boto3 客户端以sagemaker-metrics为服务名发起调用时Moto 的 URL 拦截机制会把请求路由到该响应处理器。三、核心 APIbatch_put_metrics 的完整调用链3.1 请求处理入口响应层 responses.py 中SageMakerMetricsResponse通过sagemakermetrics_backends[self.current_account][self.region]获取当前账号、当前区域的 backend 实例这与 Moto 的多账号/多区域隔离机制一致。batch_put_metrics方法从请求体提取两个参数TrialComponentName目标实验组件的名称MetricData指标数据列表。随后调用后端方法并将返回的errors以 JSON 字符串返回。请求处理返回的是json.dumps(errors)其中Errors字段默认是空列表仅在校验失败时填充错误项。3.2 后端业务逻辑后端 models.py 中的SageMakerMetricsBackend是核心实现其batch_put_metrics方法的处理流程如下校验 Trial Component 是否存在通过self.sagemaker_backend.trial_components字典查找若不存在则在返回结果中追加{Code: VALIDATION_ERROR, MetricIndex: 0}并提前返回写入或初始化指标对每条MetricData取出Step步数与MetricName指标名。若指标名在 Trial Component 中尚不存在则以MetricName、Timestamp时间戳和空的Values字典初始化一条新指标按 Step 追加数据点以Step为键、原始指标数据为值更新Values字典。因此同一指标名下的不同 Step 会各自保留数据点为后续聚合计算提供原始样本。值得注意的实现细节是SageMakerMetricsBackend在初始化时直接引用了同区域同账号的 SageMaker backendsagemaker_backends[account_id][region_name]这意味着sagemaker-metrics与sagemaker两个服务共享同一个trial_components状态存储——正是这种共享设计使得通过batch_put_metrics写入的指标可以立即被 SageMaker 的describe_trial_component读取。3.3 底层指标数据结构batch_put_metrics依赖 moto/sagemaker/models.py 中定义的类型别名与FakeTrialComponent模型METRIC_INFO_TYPE dict[str, str | int | float | datetime]单条指标信息METRIC_STEP_TYPE dict[int, METRIC_INFO_TYPE]以 Step 为键的指标数据点集合FakeTrialComponent.metricsTrial Component 对象上的指标字典结构为{MetricName: {MetricName: ..., Timestamp: ..., Values: {step: metric}}}见 models.py。聚合逻辑在FakeTrialComponent.gen_metrics_response_object()见 models.py中完成它取出每个指标名下全部 Step 的Value计算Max、Min、Last最大 Step 对应的值、Count、Avg均值与StdDev标准差并将Timestamp转换为带 UTC 时区的datetime。也就是说Moto 在收到指标后不仅保存原始数据还会按 SageMaker 的语义实时生成统计聚合字段。四、实战用 boto3 上报指标并读取聚合结果以下示例直接取自仓库测试 tests/test_sagemakermetrics/test_sagemakermetrics.py展示了完整的“创建 Trial Component → 上报指标 → 读取聚合”闭环import datetime import boto3 from moto import mock_aws mock_aws def test_batch_put_metrics(): trial_component_name some-trial-component-name # 1. 在 SageMaker 中创建实验组件 client_sagemaker boto3.client(sagemaker, region_nameeu-west-1) client_sagemaker.create_trial_component(TrialComponentNametrial_component_name) # 上报前的指标列表为空 describe_before_metrics client_sagemaker.describe_trial_component( TrialComponentNametrial_component_name ) assert describe_before_metrics[Metrics] [] # 2. 通过 sagemaker-metrics 客户端上报指标 client boto3.client(sagemaker-metrics, region_nameeu-west-1) given_datetime datetime.datetime(2024, 4, 21, 0, 0, 0) resp client.batch_put_metrics( TrialComponentNametrial_component_name, MetricData[ { MetricName: some-metric-name, Timestamp: given_datetime, Step: 0, Value: 123.0, }, ], ) # 3. 校验响应HTTP 200 且无错误 assert resp[ResponseMetadata][HTTPStatusCode] 200 assert resp[Errors] [] # 4. 通过 describe_trial_component 读取聚合结果 describe_after_metrics client_sagemaker.describe_trial_component( TrialComponentNametrial_component_name ) metric describe_after_metrics[Metrics][0] assert metric[MetricName] some-metric-name assert ( metric[SourceArn] arn:aws:sagemaker:eu-west-1:123456789012:experiment-trial-component/some-trial-component-name ) assert metric[TimeStamp] given_datetime.replace(tzinfodatetime.timezone.utc) assert metric[Max] metric[Min] metric[Last] metric[Avg] 123.0 assert metric[Count] 1 assert metric[StdDev] 0.0关键观察点batch_put_metrics的MetricData元素包含四个字段MetricName、Timestampdatetime 类型、Step整数步数与Value浮点值成功时响应中的Errors为空列表上报后指标立即出现在describe_trial_component的Metrics列表中SourceArn按arn:aws:sagemaker:{region}:{account_id}:experiment-trial-component/{name}格式生成统计字段Max/Min/Last/Count/Avg/StdDev均与源码中的聚合逻辑一一对应。五、错误路径Trial Component 不存在时返回 VALIDATION_ERROR仓库测试同样覆盖了校验失败的分支见 test_sagemakermetrics.py当TrialComponentName指向一个尚未创建的组件时batch_put_metrics不会抛出异常而是在响应体Errors数组中返回{Code: VALIDATION_ERROR, MetricIndex: 0}mock_aws def test_batch_put_metrics_should_return_validation_error_if_trial_component_not_found(): trial_component_name some-trial-component-name-not-existing client boto3.client(sagemaker-metrics, region_nameeu-west-1) resp client.batch_put_metrics( TrialComponentNametrial_component_name, MetricData[ { MetricName: some-metric-name, Timestamp: datetime.datetime(2015, 1, 1), Step: 0, Value: 123.0, } ], ) assert resp.get(Errors) is not None assert resp[Errors][0][Code] VALIDATION_ERROR这一行为与源码中“先在trial_components中查找未命中则填充VALIDATION_ERROR并提前返回”的逻辑完全吻合。开发者在编写测试时可以利用该行为断言异常分支而不必依赖真实 AWS 环境。六、服务模式验证独立 Server 与 URL 路由除了装饰器模式mock_awsMoto 还支持以独立 Server 方式运行服务。仓库中的 tests/test_sagemakermetrics/test_server.py 验证了该服务的 HTTP 路由与响应行为import moto.server as server def test_sagemakermetrics_batch_put_metrics(): backend server.create_backend_app(sagemaker-metrics) test_client backend.test_client() resp test_client.put(/BatchPutMetrics) assert resp.status_code 200 assert VALIDATION_ERROR in str(resp.data)该测试说明即使请求体为空、Trial Component 不存在对PUT /BatchPutMetrics的请求依然返回 HTTP 200并在响应体中携带VALIDATION_ERROR——这印证了模拟服务对不合法请求采用“业务级错误码而非 HTTP 错误码”的兼容策略与真实 SageMaker Metrics 的行为保持一致。七、注册机制与使用前提sagemaker-metrics服务通过BackendDict(SageMakerMetricsBackend, sagemaker-metrics)注册进 Moto 的后端索引见 models.py并出现在 moto/backends.py 的服务列表中。使用时无需任何额外安装步骤只要项目已安装moto在测试中引入from moto import mock_aws并创建boto3.client(sagemaker-metrics)即可。需要说明的前提与限制batch_get_metrics尚未实现若代码依赖该接口会得到 NotImplemented 之类的错误需自行规避或等待后续版本补齐指标数据依赖 SageMaker 的 Trial Component 存在性必须先通过sagemaker客户端或等价的模拟路径创建对应组件否则写入会返回VALIDATION_ERROR跨账号/跨区域的状态隔离由 Moto 的BackendDict保证测试中应保持创建组件与上报指标使用相同的region_name。八、小结moto的 sagemaker-metrics 模块提供了一个轻量但自洽的模拟实现以SageMakerMetricsBackend为核心通过共享 SageMaker 后端状态实现了batch_put_metrics的写入与聚合查询闭环并以VALIDATION_ERROR模拟真实服务的校验语义。对于需要离线测试 SageMaker 实验追踪指标管道的开发者可参照本文的示例与测试用例将指标上报流程无缝纳入本地 CI。赞分享Mock测试【免费下载链接】motoA library that allows you to easily mock out tests based on AWS infrastructure.项目地址https://gitcode.com/gh_mirrors/mo/moto点击查看免费下载相关推荐Moto 的 bedrock-runtime 服务模拟invoke_model 实现原理与测试实践Moto 的 bedrock runtime 服务模拟invoke_model 实现原理与测试实践 本文以 Moto 开源仓库中 docs/docs/servMock测试Moto 中 Amazon Managed Prometheusamp服务的模拟实现与实战指南Moto 中 Amazon Managed Prometheusamp服务的模拟实现与实战指南 Amazon Managed PrometheusAMPMock测试moto 中 emr-containers 服务的模拟实现虚拟集群与作业运行的完整 Mock 指南moto 中 emr containers 服务的模拟实现虚拟集群与作业运行的完整 Mock 指南 在基于 AWS EMR on EKS即 emr contMock测试上一篇Parler-TTS核心功能详解自然语言指导下的高保真语音合成技术下一篇DXY-COVID-19-Crawler实战构建企业级疫情监控系统的10个技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

机器学习四大学派:符号主义、贝叶斯、连接主义与进化仿生入门指南
机器学习四大学派:符号主义、贝叶斯、连接主义与进化仿生入门指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 2:20:19

安装 Claude Code 并使用国内大模型:TaoToken 统一 Key 接入 DeepSeek 配置指南
安装 Claude Code 并使用国内大模型:TaoToken 统一 Key 接入 DeepSeek 配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 2:20:00

Docker 部署 one-api 后,用 TaoToken 统一 Key 打通多模型调用
Docker 部署 one-api 后,用 TaoToken 统一 Key 打通多模型调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 2:20:00

UNet改进模型大全:37种改进分类与统一训练验证脚本实战
UNet改进模型大全:37种改进分类与统一训练验证脚本实战

简介:这份资源面向图像分割方向的深度学习学习者与研究者,系统整理了37种UNet改进方案,覆盖注意力机制、特征融合与轻量化主干等主流思路,帮助读者在语义分割任务中快速对比不同模块的增益效果。包内共370个文件,以148… · 2026/9/26 7:57:06

SpringBoot SpringCloud SpringFramework版本对应关系与迁移实战指南
SpringBoot SpringCloud SpringFramework版本对应关系与迁移实战指南

如果你手头正在维护一个 Java 后端项目,或者刚接手别人留下一堆“能跑但没人敢动”的历史代码,那你迟早会和“SpringBoot、SpringCloud、SpringFramework 三者版本对应”这件事撞个满怀。它不是面试里背出来的知识点,而是每次新建工程、每次升… · 2026/9/26 7:57:06

2026 AI智能体RAG优化实战:从切块到检索的全链路调优
2026 AI智能体RAG优化实战:从切块到检索的全链路调优

先问一个问题:2026年了,你的AI智能体是不是还在“一本正经地胡说八道”?不管是制度条例学习助手、电力设计规范查询,还是本地ERP产品检索、电影解说生成器,凡是干过这类活儿的应该都有同感——光有LLM不够,… · 2026/9/26 7:57:06

基于Django+Flask的智能物流配送管理系统设计与实践
基于Django+Flask的智能物流配送管理系统设计与实践

做物流调度最头疼的是什么?我的答案不是订单多,而是"车在外边跑,调度室里两眼一抹黑"。去年接手一个城市配送项目时,每天不到三百单,用Excel排线,靠微信群调度,司机到哪了、哪几单顺路… · 2026/9/26 7:57:06

CTF取证利器foremost:文件雕刻与隐藏信息提取实战指南
CTF取证利器foremost:文件雕刻与隐藏信息提取实战指南

在CTF杂项(Misc)和取证类题目里,文件恢复与隐藏信息提取几乎是绕不开的一环。很多新手拿到一个镜像文件或者一张看似普通的图片,第一反应是用binwalk跑一遍,结果发现只能看到几个文件头,真正需要的内容却提… · 2026/9/26 7:57:06

北大青鸟AI大模型课程深度拆解:RAG、Agent与模型微调实战
北大青鸟AI大模型课程深度拆解:RAG、Agent与模型微调实战

每年都会有人来问我北大青鸟的AI大模型课程到底值不值得学,更多人关心的是:这门课讲的东西,和市面上那些“AI提示词技巧课”到底有什么区别。我的回答向来很直接——真正的AI大模型课程,核心从来不是教你怎么和模型聊天&#xff0… · 2026/9/26 7:57:00

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码