單路串流相對單純,我們只要解碼串流、推論、渲染及上傳結果。可是到多路的時候,如果我們單純建立多個串流模組並且獨立運作,理論上是可行的,但背後有個隱形的殺手,那就是模型。
當我們要運行一個模型時,要將大量的權重載入GPU的VRAM,這通常是數十到數百MB,取決於模型的規模。所以如果用粗暴地複製手法,我們必須為每一路串流載入一個模型,這會造成VRAM的使用率大幅上升,並且我們是重複載入完全一樣的權重,造成資源的浪費。
在影像模型的應用中,批次是一個很有效率的做法,因為權重只要一份,但推論可以並行。視覺模型的輸入通常是影像的Tensor,維度是[batch_size, 3, height, width],就是所謂的NCHW格式,同樣的權重只要提高batch_size就可以同時推論多張影像。
昨天我們已經介紹過nvstreammux的Sink Pad,必須根據串流路數向元件請求Pad,例如4路就要請求sink_0到sink_3,分別把來源接上去。而今天我們要更進一步的去了解這個元件的作用。
這個元件有三個參數必須要設定,分別是batch-size、width、height
遇到即時串流需要額外考慮多個串流來源會有不同的限制,例如延遲不同、幀率不同,其中幀率不同會造成元件要批次影格時可能遇到某些來源還沒有影格,像是30 FPS每33 ms會進來一張影格,可是15 FPS則要66 ms才會進來一張影格,元件怎麼處理這個問題呢?
透過設定逾時,時間一到如果沒有影格(Frame),那就把當前累積的批次送往下一個元件,因此實際應用時會發現批次大小是動態變化的。
設定live-source=1,功能說明很粗暴,就是單純通知元件來源是即時串流
最後建議加上sync-inputs=1,說明是寫會拋棄超過max-latency的Buffer。官方文件有這段多路RTSP串流的說明
When using live sources:1. make sure that nvstreammux/sync-inputs is set to 1[...]
總之這個設定主要是在避免因為網路延遲或是斷網導致元件死等,而我實際使用的情況也確實如此,當我這個屬性設定為false,播出來的畫面會忽快忽慢,設定為true之後播放就會比較順暢。
官方有特別寫說這個元件的屬性該怎麼調整才能讓串流順暢,大家可以再詳細閱讀參考文件
今天的內容不算多,因為每個元件都很重要,看完文章後應該花點時間去閱讀相關資料跟用工具去了解它們。接下來幾天也是同樣輕鬆的節奏去認識每個核心元件。