YonoArc provides an easy-to-use drag-and-drop interface to design and evaluate complex systems consisting of many building blocks, fully abstracted from their different environments and resource requirements.
For example, the following simple pipeline performs YOLO Object Detection on the images from a vehicle-mounted camera from the CARLA simulator. The pipeline also visualizes the vehicle speed over time.
The YonoArc Dashboard visualizing the outputs from this pipeline includes:
You can navigate to YonoArc by clicking its icon on the main view of Yonohub:
The main page of YonoArc consists of the following main parts:
YonoArc blocks can be, but are not limited to:
- Input blocks that feed data into the pipeline. For example, the Video Player block reads a video file from YonoDrive and outputs the individual images of the video. Other examples include dataset players, such as nuScenes, KITTI, and Waymo. These dataset players can encapsulate a very big and complex dataset in a single block.
- Dashboard blocks that visualize the data from the pipeline on the dashboard of YonoArc. For example, the Video Viewer block takes the individual images of a video and visualizes it as a video on the dashboard.
- Algorithmic blocks that process their input data and output their results. For example, the YOLO Object Detection block takes an image and outputs the bounding boxes of the objects detected in the image.
- Simulators such as CARLA and SUMO.
YonoArc is fully integrated with YonoDrive, the data manager of Yonohub. This means that blocks can read and write data (e.g., videos and datasets) from YonoDrive.
When you click the settings icon on the top-left corner of any block, the Block Settings Panel appears on the right. This panel includes three tabs:
A block has four icons on the bottom area, from left to right:
- The GPU icon is enabled if the block needs a GPU.
- The training icon is enabled if the block is performing machine learning training (as opposed to inference).
- The alerts icon flickers if the block is currently (or has been recently) sending alerts while running. The icon stays solid if the sent alerts are not recent. Click this icon to jump to the Alerts tab in the Block Settings Panel.
- The scaling icon is enabled if the block is scaled as explained below.
YonoArc allows you to use any block as a black box without worrying about its environment, hardware requirements, or implementation details. The only thing you have to consider while using a block is its external ports.
YonoArc allows blocks to communicate in three different ways:
- Using a publish/subscribe model in which a block sends a stream of messages on a given port regardless of whether the receiving block is able to process these messages at this speed or not. In this model, for a given connection, one of the ports is an output port and the other is an input port.
- Using a request/response model in which a block sends a message on a given port and waits for the response from the other block. In this model, for a given connection, one of the ports is a client port and the other is a server port.
- Using global parameters which is explained later here.
Hence, there are four types of ports: input, output, client, and server. Input (or output) ports are represented by circles on the left (or right) side of the block. Similarly, server (or client) ports are represented by bolded circles on the left (or right) side of the block.
Each port has a message type that defines the data on the port. For example, the output port of the Video Player has the sensor_msgs/Image message type because it outputs a single image at a time. You can see the message type of the port (as well as its name and description) by hovering over the port. This info is also available under the Help tab in the Block Settings Panel.
Message types of ports have to be considered while connecting blocks. For example, the output port of the Video Player block can be connected to the input port of the Video Viewer block because both of them have the sensor_msgs/Image message type. If you try an invalid connection, YonoArc will immediately delete the connection.
As you can see below, block properties are available under the General Properties header that is under the Properties tab in the Block Settings Panel, after you click the settings icon on the top-left corner of a block. You can see the description of a property if you hover over its name, and you also check the Help tab for all the info.
Block properties are defined by its developer, and they can be used for three purposes:
- They allow you to control the behavior of the block without writing a single line of code. Some properties can be updated while the pipeline is running, and some properties can not. If a property supports live updates, you can change its value while the pipeline is running and see the effect immediately. Otherwise, the property will be disabled while the pipeline is running.
- They can be set/updated internally by the block, and the changes will reflect immediately in YonoArc’s UI. So, they may be used for reporting the values of some internal parameters, if needed.
- They can be mapped to a global pipeline parameter, which allows blocks to communicate using global parameters. This is explained later here.
Block Advanced Properties
As you can see below, block advanced properties are available at the bottom of the Properties tab in the Block Settings Panel, after you click the settings icon on the top-left corner of a block.
A block may support multiple execution modes to select from. YonoArc supports the following execution modes:
- Async: Whenever a new message arrives at any of the input ports, the message is delivered to the block.
- Sync: The messages arriving at all the input ports are time synchronized and delivered together to the block. The interval parameter defines the delay (in seconds) with which messages can be synchronized. Note that this mode can cause messages to be dropped if they are not synchronized.
- Triggered: Whenever a new message arrives at the primary input port (selected by the developer), the message along with all the latest messages from the other ports are delivered to the block. Note that this mode means that messages on the secondary ports may be dropped or delivered multiple times.
- Periodic: Deliver the latest messages at all the input ports at a given rate (specified by the interval parameter, in seconds) regardless of how fast the messages arrive. Note that this mode means that messages can be dropped (or delivered multiple times) if they arrive faster (or slower) than the desired interval since only the latest messages are delivered every interval.
A block may have different versions. If you purchase a block from YonoStore, you get access to all its previous, current, and future versions. It is always recommended to use the latest version of a block since it has all the latest features and bug fixes. Moreover, the latest version usually gets launched faster than older versions.
The version follows the pattern Major.Minor.Patch-Architecture (Latest) where:
- Major.Minor.Patch are the numbers representing the version of the block
- Architecture is the architecture for which this version was built. The same Major.Minor.Patch may be built multiple times for different architectures, and each one will have its own entry in the Version drop-down list. Architecture of the block must match the architecture of the machine running the block, whether the machine is in the cloud or in a deployment region. All resource models in the cloud are x86_64.
- Latest is added beside the latest version for visual clarity and convenience.
To select where to deploy this block, select the:
- Deployment Region on which you would like to deploy the block. Leave it as app.yonohub.com if you wish to use the cloud. Otherwise, information about deployment regions are available here.
- Resource Model based on how much resources you would like to allocate for this block.
- The recommended resources are defined by the block developer, but can be customized by the user as well. Resources are defined as a multiple of one of the two resource models:
- C0.1 is one tenth of a single CPU core along with 0.4GB of memory.
- GK0.1 is one tenth of GK1, i.e., 0.6 CPU core and 5.6GB of memory with access to a Tesla K80 GPU.
- For example, if a block does not need a GPU and needs a single CPU core, you should select 10 multiples of C0.1.
- When Burstable is checked (default behavior), the block is allowed to consume more resources than its allocated resources if needed. If Burstable is unchecked, the resources of the block will be restricted to the resources you select.
- The recommended resources are defined by the block developer, but can be customized by the user as well. Resources are defined as a multiple of one of the two resource models:
- Special Resources which are needed by this block. Information about special resources are available here
Scaling is configured using the Number of Replicas drop-down list. YonoArc allows you to scale a block by having several replicas of the same block. YonoArc does that without adding any burden on the user or the developer. YonoArc splits the incoming data among the replicas and merges their output data in order to be used by other blocks in the pipeline. Note that the properties and advanced properties of all the replicas are the same.
Scaling saves a lot of time and money. For example, if you have a pipeline with 10 blocks. Nine blocks are able to run at 10 FPS (Frames Per Second), but only one of them can not run faster than 5 FPS. Now, you have several options:
- Use YonoStore to purchase a faster alternative block that can run at 10 FPS.
- Configure the input blocks to output data at only 5 FPS, which slows the entire pipeline.
- Scale the slow block to have 2 replicas. This will enable the block to run at 10 FPS which will save half the time and money compared to the previous option.
The developer of a block may choose to disable scaling for the block if it is not stateless. For example, a block that is tracking objects across images in a video stream needs all the images, not just a fraction of them. Note that scaling does not guarantee that the order of the outgoing messages is the same as the order of the incoming messages.
What Is a Pipeline?
A pipeline is a set of interconnected blocks. You can build a pipeline by dragging and dropping blocks to the canvas. You can connect two blocks by clicking and holding on the output (or client) port of one block and releasing on the input (or server) port of the second block. You can also connect blocks if the message types of their ports match using one of the following ways:
- Select the set of blocks you wish to connect by pressing Ctrl+A for all the blocks or using the mouse for a specific set of blocks. Then, press Ctrl+E to automatically connect all the blocks from left to right.
- Keep pressing Ctrl+E and click the blocks you wish to connect one by one. Release Ctrl+E after you are done clicking all the blocks you need.
A pipeline is saved in a .arc file. You can save the current pipeline using the toolbar at the top: File >> Save. You can open a saved pipeline using the same toolbar as well: File >> Open.
Basic Actions on Pipelines
YonoArc allows you to build pipelines whose resource requirements are far beyond the capabilities of a single machine. That is why your pipeline can use multiple resource models at the same time. While building your pipeline, you can see on the top-right corner of the canvas how many resource models are needed for the pipeline to run.
To launch the pipeline, click Launch or Express Launch on the toolbar. This allocates all the resource models and launches all the blocks of the pipeline. Since the blocks of the pipeline are independent, you will start seeing different colors for different blocks:
- Gray: Unlaunched. This is the initial state of any block.
- Yellow: Preparing the environment of the block.
- Blue: Preparing the block requirements.
- Green: Running.
- Red: Waiting due to unavailable resources. This state may take a few seconds or a few minutes depending on the availability of resources.
After Launching the pipeline, you can view its dashboard by clicking the YonoArc Dashboard button on the bottom-left corner of the canvas after the button gets enabled. The dashboard visualizes all what you need (e.g., videos and line charts) according to the dashboard blocks you use in the pipeline.
YonoArc monitors the traffic across the connections between many types of blocks. A solid connection indicates no traffic, while an animated dashed connection indicates the existence of traffic. By hovering over a connection, you can see the message rate, the traffic, how up-to-date this monitoring info is, and the window size using which the monitoring info was calculated. A small exclamation icon is shown on the connection if messages are currently being dropped on this connection.
To terminate the pipeline, click Terminate on the toolbar at the top. This releases all the resources allocated for this pipeline.
Arranging Complex Pipelines: Tunneling and Grouping
If you have a relatively-big pipeline, especially if it contains feedback connections, the pipeline may start looking messy and confusing. To arrange such pipelines, YonoArc supports tunneling and grouping. It is worth noting that both tunneling and grouping do not affect launching the pipeline in any way. Both features are only for visual clarity and convenience.
Tunneling works as follows:
- Select a connection by clicking anywhere on the connection.
- Press Ctrl+Y (or click Edit >> Tunnel/un-tunnel connection from the toolbar) to replace the straightforward connection with a tunnel which has a name as shown below.
- By default, the name of the tunnel is the name of the output port, but you can customize the name by double clicking the name, writing your preferred name, then clicking anywhere else on the canvas.
- If you would like to revert to the straightforward connection, select the tunneled connection, and click Ctrl+Y again.
- Tunneling also works with one-to-many connections (e.g., an output port connected to two different input ports), and YonoArc maintains the same name for all the tunnels.
Grouping works as follows:
- Select the set of blocks you would like to group into a bigger block. For example, the image below shows both YOLO Object Detection and Draw Boxes selected.
- Press Ctrl+G (or click Edit >> Group/ungroup blocks from the toolbar) to group the selected blocks into a group. For the above example, the result is shown below:
- Double click the Block Group to get into the group. For the above example, the result is shown below:
- You can make any changes inside the group, and when you are ready to go back to the original pipeline, click the Home button at the top-right corner.
- You can ungroup a block group by clicking it then pressing Ctrl+G again.
A block group may contain several blocks with many ports. Not all these ports need to be external in the original pipeline because not all of them are connected to external blocks outside the block group.
- For the above example, the input port of YOLO Object Detection and the output port of Draw Boxes are the only two ports that need to be external. However, all the internal ports connecting the two blocks together do not need to be external.
- External ports are bolded when you get into the block group. The boxes representing external ports (under the Ports header under the Help tab in the Block Settings Panel) are also highlighted in yellow.
- If you want to force a port to be external, although it doesn’t have external connections. Click the box representing this port under the Help tab. Clicking the box again will get it back to be internal.
One of the ways using which YonoArc blocks can communicate is global parameters. These global parameters are defined by the user on the pipeline level in the Pipeline Settings Panel, and block properties can be mapped to these parameters. This is useful for two main reasons:
- If there is a property that exists in several blocks in the pipeline, and you wish to have a single place in which you set or update the value of this property for all the blocks, you can define a single global parameter and map all the desired block properties to it.
- Allow blocks to communicate using global parameters. Since a block property can be updated by its block (not only by the end user, but also by the block itself while running), if you map two properties from two different blocks to the same global parameter, and one block updates the value of its property, the other block will get this as a live update to its own property.
Any global parameter has a single shared value, and all the blocks with the mapped properties can read/write to this shared value when they read/write to their local properties. If the value of a global parameter is updated by any block, the new value will reflect immediately in the Pipeline Settings Panel.
Global parameters can be used as follows:
- Use the Global Parameters section in the Pipeline Settings Panel to create, edit, or delete global parameters. The type of each global parameter must match the type of all the mapped block properties. The fields required to define a global parameter are the same fields required for block properties as explained here.
- Set the initial value of the global parameters at the bottom of the Pipeline Settings Panel as needed.
- For all the block properties you wish to map, click the two-arrows icon beside the property name (under the Properties tab in the Block Settings Panel), and select the global parameter from the drop-down list that appears below.
YonoArc Live Mode
YonoArc supports a comprehensive live mode that allows you to change almost everything in a pipeline while it is running and see the effects immediately. This saves your time by not having to terminate and launch the pipeline frequently. It also saves your credits by not having to use the Express Launch option since you don’t have to speed up the initial launch process. The following features are supported in live mode:
- Update the properties of a block. Properties that are selected by the developer to not support live updates are disabled while the pipeline is running. If you really need to update the values of these properties, you can use the next feature.
- Terminate and Launch a block using the corresponding buttons at the top of the Properties tab in the Block Settings Panel. This is very useful when you need to update the advanced properties of a block (e.g., resources and deployment region), update the properties that do not support live updates, or even update the source code in case of a custom block. Once you terminate a block, you can update any of its properties, advanced properties, or source code. Then, you can re-launch it with the new settings.
- Scale a block by updating the Number of Replicas in the advanced properties area.
- Drag a new block from the Blocks Panel on the left into the canvas.
- Delete an existing block from the pipeline by clicking the block then pressing the Delete key or the Backspace key.
- Add/delete/update the connections between blocks.
- Add resource models when needed by clicking the 3-dot button besides the resource models on the top-right corner of the canvas, then clicking the + or – buttons as needed. You should add more resource models when newly added blocks are red (i.e., waiting resources). New resource models will be express launched if the pipeline was also express launched.
Troubleshooting in YonoArc
While a pipeline/block is running, YonoArc supports many different ways for checking the behavior of the pipeline/block and troubleshooting for any issues:
- View YonoArc dashboard by clicking its button on the bottom-left corner of the canvas. The dashboard visualizes all what you need (e.g., videos and line charts) according to the dashboard blocks you use in the pipeline.
- YonoArc monitors the traffic across the connections between many types of blocks. A solid connection indicates no traffic, while an animated dashed connection indicates the existence of traffic. By hovering over a connection, you can see the message rate, the traffic, how up-to-date this monitoring info is, and the window size using which the monitoring info was calculated. A small exclamation icon is shown on the connection if messages are currently being dropped on this connection. Using this monitoring info, you can detect which blocks do not work as intended.
- Check any alerts sent by the block under the Alerts tab in the Block Settings Panel. Alerts are color coded to indicate the severity of the alert: green for info, yellow for warnings, and red for errors. The alerts icon on the bottom of the block flickers if the block is currently (or has been recently) sending alerts. The icon stays solid if the sent alerts are not recent. Click this icon to jump to the Alerts tab.
- Check the logs of a block you developed by clicking Show block logs near the top of the Properties tab in the Block Settings Panel. This opens a new tab showing the latest logs from the block, given the Number of Lines you specify on the bottom-right corner. If the block has multiple replicas, you can specify the replica using the Replica ID drop-down list at the bottom.
- Some YonoArc blocks may have URLs in order to view their user interface (web or desktop GUI) or gain access to them (using SSH for example). If the developer of a block exposes such URLs, you will find them near the top of the Properties tab in the Block Settings Panel. For example, you can add SSH access to your block for more advanced troubleshooting.
YonoArc Essentials Bundle
In order to help you get started, YonoArc includes an essentials bundle that is already purchased for free from YonoStore once your Yonohub account is confirmed. The essentials bundle includes many blocks, such as Video Player, CARLA, YOLO Object Detection, and Video Viewer. Click here to learn more about getting more blocks from YonoStore.