欢迎来到 dora
教程! dora
是一个强大的框架,旨在帮助您构建复杂的应用程序,尤其是那些需要处理实时数据的应用程序,例如机器人技术或 AI
应用。
但是,如何设计和管理这些需要不同组件协同工作并共享信息的应用程序呢?这就是 Dataflow 数据流
的概念!
想象一下,您正在构建一个智能系统,它通过摄像头来检测物体,然后将看到的内容可视化地展示出来。这个系统需要几个不同的模块:
这些模块之间需要相互“对话”。摄像头需要将图像发送给物体检测模块;同时,摄像头(为了显示原始图像)和物体检测模块(为了显示检测结果)都需要将信息发送给可视化模块。
那么,我们该如何描述这些模块之间“如何连接”以及它们之间流动的是“哪种信息”呢?这种描述,就是数据流 (Dataflow
)。
您可以将数据流看作是您应用程序“设计蓝图”或“管线连接图”。它本身并不包含每个模块具体“做什么”的代码(那是下一步要实现的!),但它清晰地展示了“有哪些模块”以及数据应该“如何在它们之间流动”。
在 dora
中,您可以使用 YAML
格式编写的简单文本文件来定义此数据流。YAML
是一种人类可读的数据格式,常用于配置文件。
让我们看一个基于相机、物体检测和可视化用例的简化示例。
让我们来分析一下
nodes
:此部分列出了应用程序中所有的不同的处理单位(我们称之为节点
)。- id: camera
:定义一个节点并赋予其唯一的名称(camera
)。outputs
:在节点下,列出了该节点生成的数据流。camera
节点生成的名为image
流。- id: object_detection
:定义另一个节点并赋予其唯一的名称(object_detection
)。inputs
:在节点下,列出了该节点消耗的数据流。image: camera/image
:这部分至关重要!它表示object_detection
节点的image
输入应该从camera
节点的image
输出接收数据。outputs
:object_detection
节点生成一个 bbox
流(用于边界框)。- id: plot
:定义可视化节点(plot
)。inputs
:plot
节点接收两个输入:image
和bbox
image: camera/image
:从camera
节点获取image
数据。bbox: object_detection/bbox
:从object_detection
节点获取bbox
数据。
注意inputs
部分如何使用source_node_id/source_output_id
格式来指定特定输入的数据来源。这样就创建了连接!
这个YAML
文件就是一个数据流文件。它是一个现实数据流的有向图
。
在完整示例YAML
包含了有关如何为每个节点构建和运行实际代码的更多详细信息,当我们展示的是用于连接的核心数据流结构。
即使在这个完整的示例中,inputs
和 outputs
部分也清晰的定义了数据流连接图。其它部分(build
、path
、env
等)这告诉 dora
如何设置和运行各个节点进程。
在 YAML
文件(假设为 dataflow.yml
)中定义数据流后,您可以使用 dora
命令行界面 (CLI
) 来运行它。
dora
如何使用数据流当你运行 dora run dataflow.yml
时:
dora
(具体来说涉及到 Dora daemon
和 Dora coordinator
等组件)读取 dataflow.yml
文件。camera
object_detection
plot
)。YAML
中定义的 inputs
和 outputs
以及它们的连接方式,dora
在这些正在运行的节点进程之间建立了通信通道。camera
节点生成 image
输出时,dora
会自动将该数据发送到 object_detection
节点的 image
输入和 plot
节点的 images
输入。同样 object_detection
的 bbox
数据也会发送到 plot
节点。数据流 YAML
告诉 dora
运行什么以及如何连接它们之间的数据流,而无需您编写代码来在节点内明确管理这些连接。
在本节中,我们了解到数据流是 dora
应用程序的蓝图,它定义了节点以及数据在节点之间的流动方式。它由 YAML
文件描述,类似于管道图,显示了一个节点的输出与另一个节点的输入之间的连接。当您使用 dora CLI
运行数据流时, dora
会读取此蓝图并设置必要的通信通道。
现在您已经了解了整体数据流蓝图,下一章让我们深入了解构成该蓝图的各个构建块: Node 节点
。