部署事件触发流的变体
考虑这个高级场景:您已经部署了两个 通过 @trigger_on_finish 互相连接的流程。
这些流程在生产环境中运行良好。在某个时刻,您想尝试一种新的建模方法。为了了解新的方法是否比当前的生产版本更有效,您希望使用相同的数据并发运行它们,也许进行 A/B 测试。
实验变体与生产版本之间不应互相干扰,这是至关重要的。从概念上讲,您希望有两个隔离的部署,如此处所示:
幸运的是,你可以通过使用 the @project
decorator 结合 @trigger_on_finish 来实现这样的独立部署。
同时使用 @project 和 @trigger_on_finish
from metaflow import FlowSpec, step, current, project
@project(name='variant_demo')
class FirstProjectFlow(FlowSpec):
@step
def start(self):
print("This deployment is called", current.project_flow_name)
self.next(self.end)
@step
def end(self):
pass
if __name__ == '__main__':
FirstProjectFlow()
和
from metaflow import FlowSpec, step, trigger_on_finish, current, project
@trigger_on_finish(flow='FirstProjectFlow')
@project(name='variant_demo')
class SecondProjectFlow(FlowSpec):
@step
def start(self):
print("This deployment is called", current.project_flow_name)
print("This run was triggered by", current.trigger.event)
self.next(self.end)
@step
def end(self):
pass
if __name__ == '__main__':
SecondProjectFlow()
在Argo Workflows上部署这两个流程:
python firstproject.py argo-workflows create
python secondproject.py argo-workflows create
并手动触发第一个:
python firstproject.py argo-workflows trigger
感谢 @project,这些流程使用一个包含分支前缀的特定名称进行部署。默认情况下,每个用户都有自己的前缀,因此 FirstProjectFlow 的 start 步骤的输出应如下所示:
The deployment is called variant_demo.user.alice.FirstProjectFlow
当FirstProjectFlow完成时,SecondProjectFlow会自动开始。
它应该显示如下输出:
This deployment is called variant_demo.user.alice.SecondProjectFlow
This run was triggered by
MetaflowEvent(name='metaflow.variant_demo.user.alice.FirstProjectFlow.end', ...)
这表示触发运行的事件是特定于Alice的。
部署并行分支
要部署一个并行变体或一个分支 - 在Git分支的意义上 - 执行以下命令:
python firstproject.py --branch new_model argo-workflows create
python secondproject.py --branch new_model argo-workflows create
并像这里一样触发分支:
python firstproject.py --branch new_model argo-workflows trigger
您应该能够看到这些运行的相应输出。重要的是,触发
new_model 分支对Alice的部署没有任何影响,部署是
完全隔离在其自己的命名空间中。
跨分支触发
如上所示, @project 确保在同一项目和分支内链接在一起的所有流程与其他部署相互隔离。然而,有时您可能希望依赖于在您的分支之外部署的上游流程。例如,您可能希望部署一个下游工作流的变体,如上面的 SecondProjectFlow,同时重用现有的上游流程的结果,如 FirstProjectFlow。
您可以通过明确指定您想要依赖的项目分支名称来实现这一点。例如,这一行使得一个流程依赖于Alice的部署,而不管该流程部署在哪个分支上:
@trigger_on_finish(flow='variant_demo.user.alice.FirstProjectFlow')