有没有办法在不轮询 REST API 的情况下通知 Google AI Platform 训练作业的状态变化?

Is there a way to be notified of status changes in Google AI Platform training jobs without polling the REST API?

现在我通过轮询 job REST API 在 Google AI 平台(以前的 ml 引擎)上监控我提交的作业。我不喜欢这个解决方案有几个原因:

  1. 如果状态更改之间的间隔小于监视轮询率,则通常会延迟或完全错过状态更改的感知
  2. 大量不必要的网络流量
  3. 大量不必要的函数调用

我希望在我的培训工作完成后立即收到通知。如果有某种方法可以在作业状态更改时将挂钩或回调分配给 运行,那就太好了。

我还考虑过在 AI Platform 上 运行 的训练任务 python 包中直接添加对云函数的调用。但是,我认为这些函数调用不会发生在训练作业意外关闭的情况下,例如当作业被 GCP 取消或强制结束时。

有没有更好的方法来解决这个问题?

您可以使用 Stackdriver 接收器读取日志并将其发送到 Pub/Sub。从 Pub/Sub,您可以连接到许多其他提供商:

1。设置 Pub/Sub 接收器

确保您在开始之前 access to the logs and publish rights to the topic you desire。按照说明设置 Stackdriver -> Pub/Sub 接收器。您需要使用此查询将事件限制为仅训练作业:

resource.type = "ml_job"
resource.labels.task_name = "service"

注意Stackdriver can further limit down the query。例如,您可以通过添加条件 resource.labels.job_id = "..." 来限制特定的工作,或者使用 jsonPayload.message : "..."[=17= 这样的过滤器来限制特定的事件]

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]替换为resource.label.project_id 和 resource.label.job_id 的值分别来自 Pub/Sub 消息。

返回的 Job 对象包含一个字段 state,自然会告知作业的状态。

从消息文本中读取状态

Pub/Sub 消息将包含一个字符串,说明作业发生了什么。您可能希望在工作结束时有行为。在 jsonPayload.message:

中查找这些字符串
  • "Job completed successfully."
  • "Job cancelled."
  • "Job failed."

我认为您可以在训练作业代码的末尾以编程方式发布 PubSub 消息。像这样:

from google.cloud import pubsub_v1

# publish job complete message
client = pubsub_v1.PublisherClient()
topic = client.topic_path(args.gcp_project_id, 'topic-name')
data = {
    'ACTION': 'JOB_COMPLETE',
    'SAVED_MODEL_DIR': args.job_dir
}
data_bytes = json.dumps(data).encode('utf-8')
client.publish(topic, data_bytes)

然后你可以设置一个云函数来由同一个 pubsub 主题触发。

您可以通过将 LamdbaCallback 添加到 fit() 调用来解决自定义 TF 训练作业中服务缺少回调的问题。在 on_epoch 方法中,您可以向自己发送有关作业进度的通知,并在完成时 on_train_end。

https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/LambdaCallback

正如@htappen 所说,我实现了一个 Terraform 模块。如果它能帮助你,我很高兴。但我真正希望 Google 更新具有相同功能的 AI Platform。

https://github.com/sfujiwara/terraform-google-ai-platform-notification