當前位置: 華文頭條 > 推薦

透過適用於 Jetson 的 NVIDIA Metropolis 微服務將生成式 AI 引入邊緣

2024-02-03推薦

適用於 Jetson 的 NVIDIA Metropolis 微服務 提供了一套易於部署的服務,讓您能夠在采用最新 AI 方法的同時,快速構建生產級視覺 AI 套用。

本文將透過一個參考範例,介紹如何在 NVIDIA Jetson 邊緣 AI 平台上使用 Metropolis 微服務開發和部署由生成式 AI 技術賦能的套用。該範例幾乎可作為任何模型的通用方法。

該參考範例使用獨立的零樣本檢測 NanoOwl 套用,並將其與適用於 Jetson 的 Metropolis 微服務整合,如此一來,您就可以快速建立原型並將其部署到生產中。

使用生成式 AI 改造您的套用

生成式 AI 是一種新型機器學習方法。與以前的方法相比,它能讓模型以更加開放的方式理解世界。

大多數生成式 AI 的核心是一個基於轉換器的模型,該模型在互聯網規模的數據上訓練而成。這些模型對各個領域都有著更為廣泛的理解,因此可以作為各種任務的骨幹。這種靈活性使 CLIP、Owl、Llama、GPT 和 Stable Diffusion 等模型能夠理解自然語言輸入,使這些模型能夠進行零樣本或少樣本學習。

圖 1. 使用 NanoOwl 進行零樣本檢測

如需進一步了解適用於 Jetson 的生成式 AI 模型,請參閱 NVIDIA Jetson 生成式 AI 實驗室:

http://www.jetson-ai-lab.com/

利用 NVIDIA Jetson 實作生成式 AI:

https://mp.weixin.qq.com/s/d0Ey4uZNYuL5vnniz62xxw

適用於 Jetson 的 Metropolis 微服務

Metropolis 微服務可用於在 Jetson 上快速構建生產就緒型 AI 套用。Metropolis 微服務是一套易部署的模組化 Docker 容器,可用於網絡攝影機管理、系統監控、物聯網器材整合、網絡、儲存等。它們可以組合成功能強大的套用。圖 2 所示的是可供使用的微服務。

圖 2. 適用於 Jetson 的 Metropolis 微服務堆疊

欲了解更多資訊,參見 適用於 Jetson 的 Metropolis 微服務白皮書:

https://resources.nvidia.com/en-us-metropolis-microservices-for-jetson/jetson-whitepaper

整合生成式 AI 套用與 Metropolis 微服務

將 Metropolis 微服務與生成式 AI 相結合便可以獲得幾乎不需要訓練的模型。圖 3 顯示了 NanoOwl 參考範例的示意圖,該範例可作為在 Jetson 上使用 Metropolis 微服務構建生成式 AI 驅動套用的通用方法。

圖 3. 使用適用於 Jetson 的 Metropolis 微服務的生成式 AI 參考套用

使用 Metropolis 微服務自訂套用

GitHub 上有許多開源生成式 AI 模型,其中一些已經過最佳化,可以專門在 Jetson 上執行。您可以在 Jetson 生成式 AI 實驗室找到其中幾個模型。

這些模型大多有很多共同點。它們通常可以接受文本和影像輸入,首先必須與任意配置選項一起載入到記憶體中,然後,可以用一個推理函數呼叫模型,該函數使用輸入的影像和文本生成輸出。

在 Python 參考範例中,我們使用 NanoOwl 作為生成式 AI 模型。而參考範例中的通用方法幾乎適用於任何生成式 AI 模型。

圖 4. 使用 Metropolis 微服務 的生成式 AI 套用概覽圖

如要使用 Metropolis 微服務執行任何生成式 AI 模型,首先必須對齊來自其他微服務的輸入和輸出(圖 4)。

在傳輸影片時,輸入和輸出使用的是 RTSP 協定。RTSP 由影片儲存工具包(VST,一種影片攝取和管理的微服務)提供,輸出以及疊加的推理輸出則是透過 RTSP 傳輸。輸出後設資料被發送到 Redis 數據流,其他套用可在其中讀取數據。更多資訊,請觀看 采用 NVIDIA Metropolis 微服務的影片儲存工具套件演示影片: https://www.nvidia.com/en-us/on-demand/playlist/playList-238cd4a8-7f1d-42b4-9b0a-a949ade92845/

其次,由於生成式 AI 套用需要一些外部介面(如指令),因此需要套用接受 REST API 請求。

最後,套用必須容器化,以便與其他微服務無縫整合。圖 5 顯示了在 Redis 上進行 NanoOwl 物件檢測和後設資料輸出的範例。

圖 5. 執行中的生成式 AI 套用

準備生成式 AI 套用

本參考範例使用的是 NanoOwl。任何可從 Python 呼叫載入和推理函數的模型,也同樣適用這些步驟。本文透過幾個 Python 程式碼範例,介紹將生成式 AI 與 Metropolis 微服務相結合的主要思路,但為了重點介紹通用方法,我們省略了一些程式碼。如需進一步了解完整的實作方式,請參閱 /NVIDIA-AI-IOT/mmj_genai GitHub 專案上的參考範例。

如要準備與 Metropolis 微服務整合的生成式 AI 模型,請按以下步驟操作:

  1. 呼叫 predict 函數進行模型推理
  2. 使用 jetson-utils 程式庫添加 RTSP I/O
  3. 使用 Flask 添加一個用於指令更新的 REST 端點
  4. 使用 mmj_utils 生成疊加層
  5. 使用 mmj_utils 與 VST 互動以獲取數據流
  6. 使用 mmj_utils 將後設資料輸出到 Redis

呼叫預測函數進行模型推理

NanoOwl 將生成式 AI 模型封裝在一個 OwlPredictor 類中。該類例項化時,會將模型載入到記憶體中。如要對影像和文本輸入進行推理,可呼叫預測函數來獲取輸出結果。

本例中,輸出結果是檢測到的物件的邊界框和標簽列表。

import PIL.Imageimport timeimport torchfrom nanoowl.owl_predictor import OwlPredictor image = PIL.Image.open("my_image.png")prompt = ["an owl", "a person"] #Load model predictor = OwlPredictor( "google/owlvit-base-patcp2", image_encoder_engine="../data/owlvit_image_encoder_patcp2.engine" )#Embed Texttext_encodings = predictor.encode_text(text) #Inferenceoutput = predictor.predict(image=image, text=prompt, text_encodings=text_encodings, threshold=0.1, pad_square=False)

大多數生成式 AI 模型都有類似的 Python 界面。在有影像和文本輸入時,必須載入模型,模型可以從指令和影像中推理出一些輸出。如要匯入自己的生成式 AI 模型,可以將其封裝在一個類中,並實作類似 OwlPredictor 類的介面。

使用 jetson-utils 程式庫添加 RTSP 輸入/輸出

您可以使用 jetson-utils 程式庫添加 RTSP 影片流輸入。該庫提供的 videoSource 和 videoOutput 類可用於從 RTSP 流中捕獲幀,並在新的 RTSP 流中輸出幀。

from jetson_utils import videoSource, videoOutput stream_input = "rtsp://0.0.0.0:8554/input"stream_output = "rtsp://0.0.0.0:8555/output" #Create stream I/Ov_input = videoSource(stream_input)v_output = videoOutput(stream_output) while(True): image = v_input.Capture() #get image from stream output = predictor.predict(image=image, text=prompt, ...) new_image = postprocess(output) v_output.Render(new_image) #write image to stream

該程式碼範例從 RTSP 流中捕獲幀,然後將其傳遞給模型推理函數。根據模型輸出建立新影像,並呈現在輸出 RTSP 流中。

使用 Flask 添加一個用於指令更新的 REST 端點

許多生成式 AI 模型都能接受一些種類的指令或文本輸入。為了讓使用者或其他服務能夠動態更新指令,可使用 Flask 添加一個 REST 端點來接受指令更新並將其傳遞給模型。

為使 Flask 伺服器更容易與您的模型整合,可建立一個呼叫時可在其自己的執行緒中啟動 Flask 伺服器的封裝類。更多資訊,參見 /NVIDIA-AI-IOT/mmj_genai GitHub 專案。

from flask_server import FlaskServer #Launch flask server and connect queue to receive prompt updates flask_queue = Queue() #hold prompts from flask input flask = FlaskServer(flask_queue)flask.start_flask() while(True): ... if not flask_queue.empty(): #get prompt update prompt = flask_queue.get() output = predictor.predict(image=image, text=prompt, ...) ...

透過一個佇列連線您的主指令碼和 Flask 端點,該佇列可容納任何傳入的指令更新。當向 REST 端點發送 GET 請求時,Flask 伺服器會將更新的指令放入佇列。然後,您的主迴圈就可以檢查佇列中的新指令並將其傳遞給模型,以便對更新的類進行推理。

使用 mmj_utils 生成疊加層

帶有視覺化疊加層的模型輸出對於電腦視覺任務很有幫助(圖 6)。以物件檢測模型為例,您可以將模型生成的邊界框和標簽疊加到輸入影像上,以便檢視模型檢測到每個物件的位置。

圖 6. 使用 mmj_utils 生成的檢測疊加層

為此,請使用 mmj_utils 程式庫中名為 DetectionGenerationCUDA 的實用程式類。該庫依賴於 jetson_utils,後者提供用於生成疊加層的 CUDA 加速函數。

from mmj_utils.overlay_gen import DetectionOverlayCUDA overlay_gen = DetectionOverlayCUDA(draw_bbox=True, draw_text=True, text_size=45) #make overlay object while(True): ... output = predictor.predict(image=image, text=prompt, ...) #Generate overlay and output text_labels = [objects[x] for x in output.labels] bboxes = output.boxes.tolist() image = overlay_gen(image, text_labels, bboxes)#generate overlay v_output.Render(image)

您可以使用多個關鍵字參數例項化 DetectionGenerationCUDA 物件,以便根據需要調整文字大小、邊框大小和顏色。有關使用 mmj_utils 生成疊加層的更多資訊,請參閱 /NVIDIA-AI-IOT/mmj_utils GitHub 資源庫。

如要生成覆蓋層,請呼叫該物件並傳遞輸入影像、標簽列表和模型生成的邊界框。然後,它會在輸入影像上繪制標簽和邊界框,並返回帶覆蓋層的修改後影像。修改後的影像可呈現在 RTSP 流上。

使用 mmj_utils 與 VST 互動以獲取數據流

VST 可以幫助管理 RTSP 流,並提供一個實用的 Web UI 來檢視輸入和輸出流。如要與 VST 整合,可直接使用 VST REST API 或 mmj_utils 中的 VST 類,後者封裝了 VST REST API。

請勿在 Python 指令碼中對 RTSP 輸入流進行寫死,而是從 VST 抓取 RTSP 流連結。該連結可能來自 IP 網絡攝影機或其他透過 VST 管理的影片流來源。

from mmj_utils.vst import VST vst = VST("http://0.0.0.0:81")vst_rtsp_streams = vst.get_rtsp_streams()stream_input = vst_rtsp_streams[0] v_input = videoSource(stream_input)...

這將連線到 VST 並抓取第一個有效的 RTSP 連結。可以在這裏添加更復雜的邏輯,以連線到特定來源或動態更改輸入。

使用 mmj_utils 向 Redis 輸出後設資料

生成式 AI 模型生成的後設資料可被下遊的其他服務用於生成分析和洞察。

在本例中,NanoOwl 會輸出檢測到的物件的邊界框。您可以在 Redis 數據流上以 Metropolis Schema 的形式輸出這些資訊,分析服務可以捕獲這些資訊。在 mmj_utils 程式庫中,有一個類可以幫助在 Redis 上生成檢測後設資料。

from mmj_utils.schema_gen import SchemaGenerator schema_gen = SchemaGenerator(sensor_id=1, sensor_type="camera", sensor_loc=[10,20,30])schema_gen.connect_redis(aredis_host=0.0.0.0, redis_port=6379, redis_stream="owl") while True: ... output = predictor.predict(image=image, text=prompt, ...) #Output metadata text_labels = [objects[x] for x in output.labels]schema_gen(text_labels, bboxes)

您可以使用輸入網絡攝影機數據流的相關資訊例項化一個 SchemaGenerator 物件並連線到 Redis。然後,可以透過傳遞文本標簽和模型生成的邊界框來呼叫該物件。檢測資訊會被轉換為 Metropolis Schema 並輸出到 Redis 供其他微服務使用。

圖 7. 生成式 AI 套用

套用部署

如要部署套用,可以設定 Ingress 和 Redis 等平台服務,然後透過 docker compose 將自訂生成式 AI 容器與 VST 等套用服務相結合。

在主套用準備好所有必要的 I/O 和微服務整合後(圖 7),就可以部署套用並與 Metropolis 微服務連線。

  1. 將生成式 AI 套用容器化。
  2. 設定必要的平台服務
  3. 使用 docker compose 啟動套用
  4. 即時檢視輸出結果

將生成式 AI 套用容器化

部署的第一步是使用 Docker 對生成式 AI 套用進行容器化。

一個簡單的方法是使用 jetson-containers 專案。該專案提供了一種簡單的方法來為 Jetson 構建 Docker 容器,以支持包括生成式 AI 模型在內的機器學習套用。使用 jetson-containers 建立一個包含必要依賴項的容器,然後進一步自訂容器,在其中加入套用程式碼和執行生成式 AI 模型所需的任何其他軟件。

如需進一步了解如何構建適用於 NanoOwl 範例的容器,請參閱 GitHub 專案中的 /src/readme 檔。

設定必要的平台服務

接下來,設定 Metropolis 微服務提供的必要平台服務。這些平台服務提供了使用 Metropolis 微服務部署套用所需的許多功能。

這個參考生成式 AI 套用只需要 Ingress、Redis 和 Monitoring 平台服務。平台服務可以透過 APT 快速安裝,並使用 systemctl 啟動。

如需進一步了解如何安裝和啟動必要的平台服務,請參閱 適用於 Jetson 的 Metropolis 微服務快速入門指南:

https://docs.nvidia.com/moj/index.html

使用 docker compose 啟動套用

將套用容器化並設定好必要的平台服務後,就可以使用 docker compose 一起啟動該套用與其他套用服務(如 VST 或 Analytics 等)。

為此,需要建立一個 docker-compose.yaml 檔來定義要啟動的容器以及任何必要的啟動選項。在定義了 docker compose 檔後,就可以使用 docker compose up 和 docker compose down 命令啟動或停止套用。

如需進一步了解 docker 的部署,請參閱 GitHub 專案中的 /deploy/readme 檔。

即時檢視輸出

套用部署完成後,您可以透過 VST 添加一個 RTSP 流、透過 REST API 與生成式 AI 模型進行互動以發送指令更新,並透過觀察 RTSP 輸出即時檢視檢測變化。您還可以檢視 Redis 上的後設資料輸出。

影片載入中...

影片 1. 使用適用於 Jetson 的

NVIDIA Metropolis 微服務,

利用生成式 Al 改造邊緣 Al 套用

總結

本文介紹了如何采用生成式 AI 模型並將其與適用於 Jetson 的 Metropolis 微服務整合。借助生成式 AI 和 Metropolis 微服務,您可以快速構建既靈活又準確的智能影片分析套用。

如需進一步了解所提供的服務,請參閱 適用於 Jetson 的 Metropolis 微服務產品頁面:

https://developer.nvidia.com/metropolis-microservices

如要檢視完整的參考套用以及更加詳細的構建和部署步驟,請參閱 /NVIDIA-AI-IOT/mmj_genai GitHub 專案。