-
如果我们想维持一个时间表(比如说每小时 -- 通常取决于使用情况)来触发顶点人工智能上的管道运行呢?
-
如果我们想要一个系统,在实验阶段,每当一个新的架构被发布为Pub/Sub主题时,同样的管道需要被执行(但有不同的超参数)呢?
在这篇博文的最后一半,我们将解决这些情况并讨论一些可能的解决方法。
方法
我们在图1和图2中展示了我们将实现的工作流程的图示概述。首先,我们将使用Cloud Build来。
-
从GitHub上克隆一个仓库,其中包含构建和编译TFX管道所需的所有代码,以备执行。
-
构建并推送一个自定义的Docker镜像,用于执行管道。
-
将编译好的管道上传到谷歌云存储(GCS)的一个桶中。
这在图1中得到了形象的描述。

图1:生成编译后的TFX管道的工作流程
上述管道能够接受运行时参数作为输入。例如,当你想在用不同的超参数集进行不同的实验时,保持你的管道组件不变,这就特别有帮助。因此,你将重复使用管道,而只是用不同的超参数创建不同的实验。请注意,你也可以根据新数据的可用性,使用这个相同的管道进行模型再训练。在这篇文章中,我们将保持简单,将模型的超参数(epochs的数量和优化器的学习率)作为管道的运行参数。
在图2中,我们展示了我们工作流程的另一半,它将采取编译后的TFX管道,并将其提交给Vertex AI执行。

图2:执行编译后的TFX管道的工作流程
我们可以把编译好的管道规格提交给Vertex AI执行,也可以使用触发机制来启动管道的执行。后一种情况对于处理你想连接事件和管道执行之间的桥梁的情况特别有用。这种事件的例子包括新数据的到来,新的模型架构,一组新的超参数,新的预处理逻辑,等等。基于这样的事件,你会希望有一个机制来自动触发或安排管道的执行。
我们将介绍两种解决方法。
-
其一,我们将在Pub/Sub上发布一条消息,云功能将被订阅。然后这个云功能将负责启动管道的执行。对于上下文,主题消息将包含模型的超参数和它们的值。
-
在另一个解决方案中,我们将使用云调度器安排一个工作,它将负责触发云功能的管道执行。
如果你想知道如何根据BigQuery数据库中新训练数据的到来触发模型训练管道,请参考这篇博文。
实施细节
在本节中,我们将讨论上面介绍的方法的技术细节。我们不会太深入地研究TFX的相关组件,而是专注于主要在这里发挥作用的比特。我们将为有兴趣了解这里没有详细介绍的部分的读者提供相关参考资料。
本节中显示的代码可以在这个资源库中找到。我们把这个谷歌云存储库作为我们的主要参考来源。
TFX管道和编译
在这篇文章中,我们将使用本TFX教程中的TFX管道。它使用Palmer Penguins数据集,在TensorFlow中训练一个简单的神经网络,可以预测企鹅的种类。该流水线有以下TFX组件。CsvExampleGen,Cloud AI Trainer,和Pusher。
逐位讨论管道不属于本篇文章的范围,我们请读者参考上面链接的原始教程。
管道代码首先被托管在GitHub仓库。你也可以把代码托管在BitBucket、GitLab等,甚至是云存储库。回顾图1,我们将编译这个管道,并让它上传到GCS Bucket。
我们的管道应该能够在运行时接受参数,为此,我们将使用TFX提供的RuntimeParameters。在我们的案例中,这些将是我们将使用的优化器的epochs数量和学习率。我们可以这样做。
你可以从这里参考整个管道的创建和编译代码。
但故事并没有到此结束。我们仍然要建立和推送一个自定义的Docker镜像,包括所有的实用脚本和任何其他的Python软件包。这个Docker镜像最终会被Vertex AI用来运行提交的管道。在此基础上,我们还需要将我们到目前为止讨论的所有步骤自动化,作为一种构建过程,为此我们将采用Cloud Build。
Cloud Build使用YAML规范操作,我们的规范看起来像这样。
一旦你参考了我们上面链接的YAML规范文件,这个规范文件可能会更容易阅读。以"$"为前缀的变量是我们在调用这个YAML文件时设置的,用于启动Cloud Build的构建过程。配置好这个规范文件后,我们只需要在Cloud Build上启动一次运行。
SUBSTITUTIONS 保存我们所有与管道规范相关的变量。
整个构建过程将在这个笔记本中演示。如果构建成功提交给云端构建,它在仪表板上会出现这样的情况。

图3:在云端构建上的演示构建
构建的输出将是一个编译的管道规范文件(以.json ),可以提交给顶点人工智能(或其他协调器)执行。
Pub/Sub和云功能
我们现在创建一个Pub/Sub主题,并部署一个云功能,它将被订阅到这个Pub/Sub主题。
我们将向该主题发布消息,一旦完成,我们的云功能将被触发。如果你对这一点感到困惑,不要担心,一会儿就会清楚了。
云函数将负责解析发布在Pub/Sub主题上的消息,然后触发顶点AI上的管道运行,它看起来像这样。
请注意Python函数(trigger_pipeline()) ,这在部署我们的云函数时将是非常重要的。你可以从这里找到云功能的所有组件。
为了部署云功能,我们首先指定我们的环境变量,然后进行部署。
gcloud functions deploy 命令中的一些重要参数。
trigger-topic ,这是我们的Pub/Sub主题的名称,source ,这是寄存云功能特有的相关文件的目录,entry-point ,这是我们上面讨论的Python函数的名称。为了了解更多情况,source 所指向的目录包含以下文件:requirements.txt指定了云功能所需的Python包,main.py包含了trigger_pipeline() 的定义。
云功能部署后,我们可以在仪表盘上查看它,并获得一些重要的统计数据。

图4:云功能仪表板
现在我们可以向我们之前创建的Pub/Sub主题发布一条消息。一旦我们这样做,订阅该主题的云功能就会被触发,并将我们的管道和解析的参数提交给顶点AI。
我们的管道在图形上看起来像这样。

图5:顶点AI上的TFX管道的图形表示
你可以在这个笔记本中找到整个与Pub/Sub和云功能的整合。
云调度器
有很多情况下,你想定期运行管道。例如,我们可能想等待一段时间,直到我们获得足够的数据。基于此,我们可以进行批量预测,以提取嵌入或监测模型的性能。
这可以通过将Cloud Scheduler集成到现有系统中来完成。Cloud Scheduler是一个完全可管理的企业级服务,用于处理cron作业,我们可以很容易地将其连接到其他GCP服务,如Pub/Sub。
有两种方法可以为Cloud Scheduler创建一个作业。第一个选项是使用gcloud CLI工具。你需要为你的服务账户获得Cloud Scheduler的凭证。请按照这个官方文件了解如何创建服务账户和下载服务账户密钥。一旦您下载了服务账户密钥,您需要设置指向服务账户密钥JSON文件的环境变量。
gcloud命令会自动识别该环境变量。gcloud调度器作业create pubsub创建了一个定期作业,以发布带有给定消息的Pub/Sub主题。--schedule 选项的值应该根据标准的cron作业格式来设置。例如 "*/3 * * * *" 表示每三分钟运行一个任务。每三分钟运行一个MLOps管道并不能反映现实世界的情况,但它的设置只是为了展示云调度器的行为。
--topic 选项的值应该与你之前为Pub/Sub创建的主题名称相匹配。--message-body 选项可以让你以JSON格式向Pub/Sub提供额外的数据。在这个例子中,我们用它来推送超参数到云功能。当你使用Jupyter Notebook时,需要注意的一点是JSON格式的字符串应该由json.dumps方法编码。这可以确保在CLI中注入JSON格式字符串时不会被破坏。

图6:在Vertex AI上定期启动TFX管道运行
第二个选择是使用Google Cloud Scheduler的Python API。实际上,有许多API支持不同的编程语言,因为API是建立在语言中立的gRPC/Protocol缓冲器之上的。这里我们只演示在Python中的使用。
与gcloud命令相比,有三个主要区别。首先,消息应以utf-8编码。这确保了消息是以字节为单位编码的,而PubsubTarget中的数据参数要求消息是字节的。第二,Pub/Sub主题的名称应该遵循 "projects/<PROJECT-ID>/topics/<TOPIC-NAME>"格式。第三,Scheduler Job的名称应该遵循"projects/<PROJECT-ID>/locations/<REGION-ID>/jobs/<JOB-NAME>"的格式。考虑到这些差异,上面的代码应该是很容易理解的。
关于Python API的进一步细节,请查看RPC规范和Python API的官方文件。另外,你还可以找到这个笔记本中所涉及的完整演示。
成本计算
在这篇文章中,成本计算只源于顶点人工智能,因为其余的组件,如Pub/Sub,云函数的使用量非常小。在顶点人工智能上运行的每条流水线的成本为0.03美元。为了训练模型,我们选择了n1-standard-4机器类型,其价格为每小时0.19美元,我们没有使用GPU。因此,按照我们的估计,所产生的费用的上限不应超过5美元。
在任何情况下,你都应该使用这个GCP价格计算器来更好地了解你在使用GCP服务后可能产生的成本计算。
总结
在这两部分的博文中,我们介绍了如何将模型培训作为CI/CD系统。我们介绍了为完成这一任务所需的各种工具,特别是在GCP的背景下。我们希望你能获得一些见解,了解为什么这种方法在你大规模操作时可能是有益的。但这仅仅是冰山一角。有了像顶点人工智能这样的工具,可能性几乎是无限的,我们鼓励你在顶点人工智能上实现你自己的工作流程。