排程機制
MediaPipe 圖表中的資料處理作業會在定義為 CalculatorBase
子類別的處理節點中發生。排程系統會決定每個計算機的執行時機。
每個圖表都會至少有一個排程器佇列。每個排程器佇列只有一個executor。節點會以靜態方式指派給佇列,因此會指派給執行程式。根據預設,系統會建立一個佇列,其執行工具為執行緒集區,其具有根據系統功能擁有的多個執行緒。
每個節點都有排程狀態,可能是「尚未準備就緒」、「就緒」或「執行中」。完備性函式會判斷節點是否準備好執行。每當節點完成執行,以及節點輸入的狀態變更時,系統會在圖表初始化時叫用這個函式。
使用的完備性函式會因節點類型而異。沒有串流輸入的節點稱為「來源節點」;來源節點隨時都可以執行,直到告知架構沒有其他可輸出的資料且關閉時為止。
如果非來源節點有要處理的輸入內容,且這些輸入內容會根據節點的輸入政策所設定的條件提出有效的輸入集 (如下所述),就表示非來源節點處於就緒狀態。大部分節點都會使用預設輸入政策,但有些節點會指定不同的政策。
節點準備就緒後,系統會將工作新增至對應的排程器佇列,也就是優先順序佇列。優先順序函式目前是固定的,會將節點的靜態屬性及圖表內的拓撲排序納入考量。例如,較靠近圖表輸出側的節點,優先順序較高,而來源節點的優先順序則較低。
每個佇列都是由執行程式提供,執行程式會負責叫用計算機的程式碼以實際執行工作。您可以提供及設定不同的執行工具,藉此自訂執行資源的使用情形,例如在優先順序較低的執行緒上執行特定節點。
時間戳記同步處理
MediaPipe 圖形執行會分散處理:沒有全域時鐘,且不同的節點可以同時處理不同時間戳記的資料。即可透過管道提高處理量。
然而,時間資訊對許多認知工作流程來說非常重要。接收多個輸入串流的節點通常需要以某種方式進行協調。舉例來說,物件偵測工具可能會從影格輸出邊界矩形清單,而這項資訊可能會填入算繪節點,而轉譯節點應與原始影格一起處理。
因此,MediaPipe 架構的主要責任之一是為節點提供輸入同步處理。在架構機制方面,時間戳記的主要角色是做為「同步處理金鑰」。
此外,MediaPipe 的設計宗旨是支援確定性作業,這對許多情境 (測試、模擬、批次處理等) 都很重要,可讓圖表作者在需要滿足即時限制時放寬決定性。
同步與確定性的兩個目標在設計上有許多選擇。值得注意的是,推送至特定串流的封包必須有單調遞增的時間戳記:這不僅是許多節點的實用假設,而且還受到同步處理邏輯的依賴。每個串流都有時間戳記邊界,這是串流中新封包允許的最小時間戳記。當時間戳記為 T
的封包送達時,界限會自動推進 T+1
,以反映單調需求。這可讓架構知道,沒有時間戳記低於 T
的封包到達。
輸入政策
系統會使用節點指定的輸入政策,在每個節點上在本機處理同步處理。
由 DefaultInputStreamHandler
定義的預設輸入政策會提供確定性的輸入同步處理,但能夠保證:
如果有多個輸入串流提供時間戳記相同的封包,無論封包抵達順序為何,系統都會一起處理這些封包。
輸入集會完全依照時間戳記順序,以遞增順序處理。
不會捨棄任何封包,且處理程序完全確定。
基於上述保證,節點已準備好盡快處理資料。
為瞭解釋運作原理,我們必須引入已轉換的時間戳記定義。我們發現串流中的時間戳記如果低於時間戳記範圍,就會被「已設定」。換句話說,一旦串流顯示該時間戳記的狀態 (無法撤銷),或確定具有該時間戳記的封包無法送達,系統就會為串流設定時間戳記。
如果為每個串流設定時間戳記,就會有多個串流的時間戳記。此外,如果設定了時間戳記,即表示所有先前的時間戳記都已完成處理。因此,已固定的時間戳記能以遞增順序處理。
根據這個定義,如果所有輸入串流都設定了時間戳記,且在至少一個輸入串流中包含封包,則納入預設輸入政策的計算機就會已準備就緒。輸入政策會將已定時間戳記的所有可用封包,作為計算機的單一「輸入集」提供。
這項確定行為的其中一個結果是,如果是含有多個輸入串流的節點,理論上可能會等待時間戳記設定,而且在此期間可以緩衝處理沒有限制的封包。(假設有一個節點包含兩個輸入串流,其中一個節點會持續傳送封包,另一個則不會傳送任何封包,並且不會提前繫結)。
因此,我們也提供自訂的輸入政策。例如,將輸入分割至由 SyncSetInputStreamHandler
定義的不同的同步處理集,或者避免一起進行同步,並在輸入的內容由 ImmediateInputStreamHandler
定義時立即處理。
流量控制
主要的流程控制機制有兩種。當串流緩衝處理的封包達到 CalculatorGraphConfig::max_queue_size
定義的 (可設定) 上限時,背壓機制就會限制上游節點的執行作業。這項機制會維護確定性行為,並包含防鎖定系統,可視需要放寬已設定的限制。
第二個系統包含插入特殊節點,以便根據 FlowLimiterCalculator
定義的即時限制 (通常是使用自訂輸入政策) 捨棄封包。例如,常見的模式會在子圖表的輸入內容中放置一個流量控制節點,並將最終輸出內容的回送連線至流量控制節點。因此,流量控制節點能夠追蹤下游圖表中處理的時間戳記數量,並在達到 (可設定) 限制時捨棄封包。由於上游捨棄封包,因此可避免浪費工作的部分工作,以免浪費部分處理時間戳記,然後在中繼階段之間捨棄封包。
這項計算機方法讓圖形作者能控制封包的捨棄位置,並且讓圖形作者能依據資源限制靈活調整和自訂圖表行為。