google-cloud-platform - 有没有办法在不轮询 REST API 的情况下通知 Google AI Platform 训练作业的状态变化?
问题描述
现在,我通过轮询作业 REST API来监控我在 Google AI Platform(以前称为 ml 引擎)上提交的作业。我不喜欢这个解决方案有几个原因:
- 如果状态更改之间的间隔小于监控轮询率,则通常会延迟或完全错过对状态更改的感知
- 大量不必要的网络流量
- 大量不必要的函数调用
我希望在我的培训工作完成后立即收到通知。如果有某种方法可以分配挂钩或回调以在作业状态更改时运行,那就太好了。
我还考虑直接在 AI Platform 上运行的训练任务 python 包中添加对云函数的调用。但是,我认为这些函数调用不会发生在训练作业意外关闭的情况下,例如当作业被 GCP 取消或强制结束时。
有没有更好的方法来解决这个问题?
解决方案
您可以使用 Stackdriver 接收器来读取日志并将其发送到 Pub/Sub。通过 Pub/Sub,您可以连接到许多其他提供者:
1. 设置 Pub/Sub 接收器
在开始之前,请确保您有权访问您想要的主题的日志和发布权限。按照说明设置 Stackdriver -> Pub/Sub 接收器。您将希望使用此查询将事件限制为仅培训作业:
resource.type = "ml_job"
resource.labels.task_name = "service"
请注意,Stackdriver 可以进一步限制查询。例如,您可以通过添加诸如 = "..." 之类的条件或使用诸如"..." 之resource.labels.job_id
类的过滤器限制特定事件来限制特定作业jsonPayload.message
2. 回复 Pub/Sub 消息
为了知道发生了什么变化,Pub/Sub 消息的接收者可以从 ml.googleapis.com API 查询作业状态或阅读消息的文本
从 ml.googleapis.com 读取状态
收到消息后,调用https://ml.googleapis.com/v1/<project_id>/jobs/<job_id>
获取 Job 信息,将 URL 中的 [project_id] 和 [job_id] 分别替换为 Pub/Sub 消息中的 resource.label.project_id 和 resource.label.job_id 的值.
返回的 Job 对象包含一个字段state
,该字段自然地告诉作业的状态。
从消息文本中读取状态
Pub/Sub 消息将包含一个字符串,说明作业发生了什么。您可能希望工作结束时的行为。在 jsonPayload.message 中查找这些字符串:
- “作业顺利完成。”
- “工作取消。”
- “工作失败。”
推荐阅读
- python - rabbitmq, python - ack 消费者程序示例
- python - 如何使用 pandas 进行条件聚合
- selenium - 使用 WebDriver 运行代码接收时出现错误“[PHPUnit\Framework\Exception] Undefined index: ELEMENT”
- javascript - 在每个渲染上重新添加 React hooks 事件侦听器(exhaustive-deps 错误)
- python - 如何计算标签的使用次数并在 html 中显示?
- c# - 如何使用 c# 遍历文件和活动目录权限?
- javascript - 如何在外部点击时关闭 div 部分?
- java - Hibernate:通过从某个位置读取 hbm 映射文件来创建动态表
- mysql - mysqldump 用于旧版本的 mysql,从 mysql 8 到 mysql 5.7
- c++ - 为什么 C++20 模板 lambda 使用 typename 关键字?