平均每車包含 100 多個傳感器,用于監測和響應重要信息。從過熱的引擎到低胎壓和不穩定的轉向,傳感器可以提供自動數據、洞察和控制。它們使駕駛行為對乘客和路上的其他人都更安全。當然,傳感器并不局限于汽車。
您當地機場的雷達系統跟蹤飛機和其他大型物體,引導航班安全地進入空中和地面。你口袋里的手機使用設備上的無線電和天線,通過以太網絡將你的聲音發送給另一個國家的朋友,沒有噪音或干擾。外科醫生使用實時內腔攝像頭來檢測異常,識別病變組織,并對軍團進行分類。
在每種情況下,傳感器從環境中收集信息,而計算機分析和處理生成的數據流。實時處理和分析的結果可用于向操作員提供反饋或自動關閉控制回路。
建筑傳感器處理應用面臨的挑戰
傳統的傳感器處理系統是硬件定義的,并且通常與前端傳感器緊密耦合。對傳感器、計算機或預先存在的應用程序的修改可能需要在整個應用程序框架中進行非平凡的升級。
例如,如果您正在為實時計算機視覺任務設計的框架上運行應用程序,那么隨著應用程序目標的擴展,輕松添加其他數據源(如語音)通常是一項挑戰。
用 AI 推理模型擴充現有傳感器處理應用程序可能更具挑戰性,因為您可能需要學習新的工具和軟件庫,以及如何優化實時流性能。
NVIDIA Holoscan 概述
NVIDIA Holoscan 是一個實時、低延遲和傳感器無關的軟件開發套件,用于原型、構建、部署和擴展流式傳感器應用程序。 Holoscan 最初是為 醫療 AI 使用案例?引入的,現在正用于多個行業的更廣泛的應用,以實現邊緣的高性能計算。使用 Holoscan , C ++或 Python 開發人員構建一個相關節點的連接圖,稱為運算符,以定義應用程序。

這些運算符是靈活的,易于編程或修改,由獨立的常用任務組成。例如,網絡運營商可用于促進 UDP 以太網數據包直接接收到 GPU 而無需占用 CPU 。另一個操作員可以執行 AI 推理,例如 NVIDIA TensorRT 優化 YOLO 對象檢測器。最后一個操作員可以使用 cuFFT 在 C ++中執行 GPU 加速 FFT 。
實現運算符后,您可以指定數據如何連接到運算符和從運算符中連接出來。然后,可以保存這些運算符以供其他應用程序管道將來使用。
Holoscan 抽象了數據移動,并提供了一組簡單的 API ,以在高速傳感器數據之上使用現有 NVIDIA SDK 構建應用程序。 Holoscan 使您能夠從多個傳感器領域構建端到端、多模式、 AI 驅動的軟件管道。
有關 Holoscan 的更多信息,特別是當前 Holoscan SDK v0.4 版本中引入的功能,請參見 Rapidly Building Streaming AI Apps with Python and C++ Holoscan 。
HoloHub 的無線電、雷達等參考應用
HoloHub 是一個新的 GitHub 存儲庫,托管參考 Holoscan 應用程序和操作員。 HoloHub 旨在成為一個全面、豐富的預制運營商集合。它包括如何使用和擴展它們的示例和端到端應用程序。我們歡迎貢獻!
除了作為 Holoscan SDK v0.4 的一部分發布的參考應用程序外,以下是 HoloHub 上發布的前兩個參考應用程序,它們都是用 Python 編寫的:
- SDR FM 解調應用: 使用軟件定義無線電( SDR )進行調頻解調
- 簡單的雷達管道應用: 傳統雷達信號處理流水線
雖然這些示例側重于 Holoscan Python API ,但 C ++示例嚴格遵循相同的語法和設計原則。 Holoscan 的一個驅動理念是,數據科學家和性能工程師可以在同一個底層框架(基于 C ++的 Holoscan )上共同工作。
以下是一些示例,向您展示如何構建和部署 Holoscan 管道。
軟件定義的收音機: FM 解調
我們都熟悉汽車的收音機;你移動一個轉盤,調到你最喜歡的電臺,然后調高音量!收音機使用硬件元件進行從無線電波到語音的模擬解碼。隨著 SDR 的出現,就像廉價的 RTL-SDR 一樣,您現在有了一種機制來實現以前由硬件定義的軟件問題。
基于軟件的 FM 解調(也稱為收聽廣播)是信號處理應用的“ Hello World ”示例。許多初學者已經學會了用它編程加速器。由于其相對簡單, FM 解調可以作為一種快速檢查,您可以使用 SDR 捕獲無線電波,然后實時解調和回放結果。
In this Holoscan example ,您使用 RTL-SDR USB 加密狗和 SoapySDR 驅動程序來收集、流式傳輸和緩沖復雜值的無線電樣本。然后,該數據被傳遞到 FM 解調和重采樣運算符,該運算符使用 cuSignal. 。解調后的輸出被放置在 Python 隊列中,該隊列通過 PyAudio 觸發播放。
Holoscan 應用程序首先由Application
類組成,其中定義了現成和自定義運算符,以及它們之間的連接方式。以下代碼示例顯示了 FMDemod Application
類:
class FMDemod(Application): def __init__(self): super().__init__() def compose(self): src = SignalGeneratorOp(self, CountCondition(self, 500), name="src") demodulate = DemodulateOp(self, name="demodulate") resample = ResampleOp(self, name="resample") sink = SDRSinkOp(self, name="sink") self.add_flow(src, demodulate) self.add_flow(demodulate, resample) self.add_flow(resample, sink)
Application
類的compose
函數用于定義 Holoscan 管道中使用的運算符。在此示例中,有四個自定義運算符:
SignalGeneratorOp
:將 SDR 中的復值張量數據帶到 GPU ,并將其暴露給 Holoscan 。DemodulateOp
:使用 cuSignal 對輸入數據執行 FM 解調。ResampleOp
:將 SDR 采樣率降至 48 kHz ,即計算機音頻輸出的采樣率,以便使用 cuSignal 進行播放。SDRSinkOp
:連接到 PyAudio 以進行實時音頻播放。
源運算符SignalGeneratorOp
包括一個附加參數,用于控制 Holoscan 圖中源節點的調度和運行時間。CountCondition
選項在給定次數內運行源(在本例中為 500 次)。 Holoscan 文檔中討論了其他調度選項,這些選項在切換之前運行給定的源節點,例如BinaryCondition
。
使用add_flow(<input>, <output>)
連接操作員,創建圖形。
在本例中,這些運算符以線性方式連接:
SignalGeneratorOp
輸出饋送DemodulateOp
。DemodulateOp
輸出饋送ResampleOp
。ResampleOp
輸出饋線SDRSinkOp
。
自定義運算符基于Operator
Holoscan 類,由以下主要函數組成:
__init__
:定義自定義運算符中使用的參數。setup
:定義自定義操作員的輸入和輸出連接。compute
:執行數據轉換、計算或連接到外部庫。
為了更好地理解如何構建自定義運算符,這里有DemodulateOp
詳細介紹。
Class DemodulateOp(Operator): def __init__(self, *args, **kwargs): # Need to call the base class constructor last super().__init__(*args, **kwargs) def setup(self, spec: OperatorSpec): spec.input(“rx_sig”) spec.output("sig_out") def compute(self, op_input, op_output, context): sig = op_input.receive("rx_sig") print("In Demodulate – Got: ", sig[0:10]) op_output.emit(uSignal.fm_demod(sig), "sig_out")
在本例中,setup
函數定義操作員輸入和輸出端口。在這種情況下,一個數據流進入操作員,一個離開操作員。
操作員執行的大部分工作都在compute
功能中完成。在這里,您可以通過op_input.receive(<name_of_input>)
訪問和處理傳入的數據,并對該數據運行某種類型的操作。在本例中,我使用 uSignal 的fm_demod
函數執行 FM 解調。完成后,您將使用op_output.emit(<data>, <name_of_output>)
輸出結果。
簡單的雷達信號處理管道
雷達系統最初是在第二次世界大戰期間開發的,目的是幫助探測和跟蹤敵機。他們對盟軍在不列顛戰役中的成功起到了重要作用。
從概念上講,雷達的工作原理是發射已知信號,等待信號從物體上反彈并返回接收器。考慮時間增量和位置以及其他信號處理技術,以測量目標的位置和速度。
這里,將生成的波形與接收信號進行匹配濾波,以確定是否接收到發送信號。從那里,您可以執行各種過濾操作,以移除靜止或緩慢移動的對象(稱為 clutter ),并提高分辨率。最后,分析檢測目標并在屏幕上顯示候選位置。
在這 Holoscan 示例?,您在源運營商中使用 CuPy 動態生成流數據,但您可以輕松利用網絡運營商來攝取 UDP 以太網。與前面的 FM 解調示例一樣, cuSignal 和 CuPy 用于構建特定于應用程序的運算符。
與 FM 解調示例不同,此 Holoscan 管道包含具有多個輸入和輸出的運算符。下面的代碼示例顯示了如何在 Python 中實現這一點。setup
函數中指定了多個輸入,可以通過op_input.receive(<name_of_input>)
在compute
函數中訪問關聯的數據對象。
class PulseCompressionOp(Operator): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def setup(self, spec: OperatorSpec): spec.input("x") spec.input("waveform") spec.output("X") def compute(self, op_input, op_output, context): x = op_input.receive("x") waveform = op_input.receive("waveform") <code omitted for brevity>
接下來的步驟
FM 解調和雷達示例目前不包括 AI 推斷步驟。然而, Holoscan 的靈活性使您能夠在現有圖形中添加新運算符,而不會對應用程序性能或其可維護性產生負面影響。
當雷達管線當前處于離線狀態并使用模擬數據時,您可以添加一個網絡運營商,如前所述,而不會對計算管線的其余部分產生負面影響。有關具有 AI 推理和實時數據攝取的參考應用程序的更多信息,請參見 NVIDIA Holoscan SDK v0.4 。
要了解有關為各種領域構建流式 AI 管道的更多信息,請加入 Building High-Speed Sensor AI Pipelines using NVIDIA Holoscan 上 NVIDIA GTC 的 Holoscan Developer Day 和培訓實驗室。 GTC 是人工智能和元宇宙時代的開發者大會,是 free to attend ,將于 3 月 20-23 日舉行。
?