VLMをJetson Platform Serciesを用いてreComputerで実行する

イントロダクション

Vision Language Models(VLM)は、LLMとVision Transformerを組み合わせて使用する、画像や動画、テキストをサポートするマルチモーダルモデルです。 これにより、動画や画像をクエリするためのテキストプロントをサポートできるため、動画とのチャットや自然言語ベースのアラートの定義といった機能が実現できます。

VLM AIサービスは、Jetsonプラットフォームサービスを使用して、動画インサイト(分析)アプリケーション向けのVLMを迅速にデプロイすることが可能とします。 VLMサービスは、REST APIエンドポイントを公開することで、動画ストリーム入力の設定、アラートの設定、入力された動画ストリームに関する自然言語での質問などを可能にします。

このWikiでは、reComputer J4012(Jetson Orin NX 16GB)でVLMを実行する方法のチュートリアルを提供します。

前提条件

  • Ubuntu22.04以降を実行するreComputer J4012 (Orin NX 16GB)
    • ドライバーバージョン:535.113.01
    • JetPack:6.0
    • CUDAバージョン:12.2
  • JetPackと関連するJetsonサービスパッケージをインストール済み
sudo apt-get install nvidia-jetpack
sudo apt install nvidia-jetson-services
  • RTSP経由でストリーム可能なIPカメラ、またはローカルビデオ
    RTSPストリーミングはNVStreamer tutorial(Seeed Wiki原文)の使用がおすすめです。

はじめに

ステップ1

NGC Reference Workflow and Resourceより、NGCからアプリケーションパッケージvlm-1.1.0.tar.gzをダウンロードします。 その際、NGC の資格情報を入力する必要があります。 ページ右上のDownloadメニューにある、使用可能なオプションから一つを使用します。

tar -xvf vlm-1.1.0.tar.gz
cd ~/vlm/example_1

ステップ2

VLM AIサービスは、jetson-ingressjetson-monitoringサービスを使用します。 VLM AIサービスと統合するため、これら二つのサービスを構成する必要があります。 提供されているデフォルトの構成を、対応するサービスの構成ディレクトリにコピーします。

sudo cp config/vlm-nginx.conf /opt/nvidia/jetson/services/ingress/config
sudo cp config/prometheus.yml /opt/nvidia/jetson/services/monitoring/config/prometheus.yml
sudo cp config/rules.yml /opt/nvidia/jetson/services/monitoring/config/rules.yml

ステップ3

基本サービスを実行します。

sudo systemctl start jetson-ingress
sudo systemctl start jetson-monitoring
sudo systemctl start jetson-sys-monitoring
sudo systemctl start jetson-gpu-monitoring
sudo systemctl start jetson-redis
sudo systemctl start jetson-vst

ステップ4

VLMサービスの初回開始時、VLMが自動的にダウンロード、量子化されます。 この処理には時間がかかる場合があります。 reComputer Orin NX 16GBにデプロイする場合、量子化の処理で大量のメモリを消費する可能性があるため、より多くのスワップスペースをマウントする必要がある場合があります。 より多くのスワップスペースをマウントするには、次のコマンドを実行します。

sudo fallocate -l 10G /data/10GB.swap
sudo mkswap /data/10GB.swap
sudo swapon /data/10GB.swap

ステップ5

VLM AIサービスを開始します。

cd ~/vlm/example_1
sudo docker compose up -d

必要なコンテナが全て起動しているか確認する場合には、次のコマンドを実行します。

sudo docker ps

ステップ6

ゼロショット検出AIサービスを開始します。

sudo docker compose up -d

sudo docker ps実行結果

RTSPストリーム入力を追加する

次のcurlコマンドで、VLMモデルのためのRTSPストリームを追加します。 ストリーミングにはNVStreamer tutorial(Seeed Wiki原文)の使用がおすすめです。

ステップ1

0.0.0.0を自身のreComputerのIPアドレスに置き換え、liveStreamUrlリンクをRTSPリンクに置き換え、ターミナルに次のコマンドを入力します。

curl --location 'http://0.0.0.0:5010/api/v1/live-stream' \
--header 'Content-Type: application/json' \
--data '{
"liveStreamUrl": "rtsp://0.0.0.0:31554/nvstream/root/store/nvstreamer_videos/car.mp4"
}'

補足: curlコマンドのほかにも、ゼロショット検出サービス開始時に、APIドキュメントページ(http://0.0.0.0:5010/docs)で確認できるREST APIで直接テストすることも可能です。

ステップ2

ステップ1を実行するとIDが返されます。 今後のステップで使用するため、このIDをメモしてください。

{"id": "a782e200-eb48-4d17-a1b9-5ac0696217f7"}

次のコマンドでIDを取得することもできます。

curl --location 'http://0.0.0.0:5010/api/v1/live-stream'

このIDでストリームを削除するには、次のコマンドを使用します。

curl --location --request DELETE 'http://0.0.0.0:5010/api/v1/live-stream/{id}'

アラートを追加する

アラートとは、VLMがライブストリーム入力を継続的に評価するための質問のことです。 それぞれのルールセットでは、VLMはライブストリームの最新フレームに基づいて、TrueかFalseかを判断しようとします。 VLMによって判断されたこれらのTrueかFalseかの状態は、WebsocketとJetson monitoringサービスに送信されます。

アラートを設定する際、アラートルールはYesかNoの質問で表現します。 例えば、「火事ですか?」や「煙はありますか?」などの質問にします。 リクエストのbodyは、前ステップでメモしたストリームIDである”id”フィールドも含まれている必要があります。

デフォルトでは、VLMサービスは最大10個のアラートルールをサポートしています。 これは構成ファイルを修正することで増やすことができます。

ステップ1

次のコマンドを実行する前に、下記項目を書き換える必要があります。

  • 0.0.0.0:自身のreComputerのIPアドレスに置き換えます。
  • alert:必要なアラートのobjectを含めるように変更します。
  • id:前のステップでメモしたIDに置き換えます。

書き換えたコマンドを実行します。

curl --location 'http://0.0.0.0:5010/api/v1/alerts' \
--header 'Content-Type: application/json' \
--data '{
    "alerts": ["is there a fire?", "is there smoke?"],
    "id": "a782e200-eb48-4d17-a1b9-5ac0696217f7"
}'

RTSPストリームの結果を確認する

検出された出力はrtsp://reComputer_ip:5011/outにストリーミングされます。 ビデオストリーム出力を可視化するため、Pythonスクリプトを提供しています。 opencv-pythonライブラリがインストールされた状態で、次のPythonスクリプトを実行する必要があります。

ステップ1

opencv-pythonライブラリをインストールします。

pip install opencv-python

ステップ2

次のPythonスクリプトを実行します。

import cv2
rtsp_url = "rtsp://reComputer_ip:5011/out"
cap = cv2.VideoCapture(rtsp_url)
if not cap.isOpened():
    print("Cannot open RTSP stream")
    exit()
while True:
    ret, frame = cap.read()
    if not ret:
        print("Failed to retrieve frame")
        break
    cv2.imshow('RTSP Stream', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

シャットダウンする

ゼロショット検出サービスを終了するには、compose.yamlファイルと同じディレクトリで、次のコマンドを入力します。

sudo docker compose down

詳細な情報

Jetson Platform ServicesによるVisual Language Models (VLM)

https://docs.nvidia.com/jetson/jps/inference-services/vlm.html

テクニカルサポートと製品に関するフォーラム

ご購入いただいた製品をスムーズにお使いいただけるよう、Seeedでは様々なサポートを提供しています。ご希望に合わせてコンタクトの方法をお選びください。


出典 : Seeed Studio資料 Wiki - How to Run VLM on reComputer with Jetson Platform Services

https://wiki.seeedstudio.com/run_vlm_on_recomputer/

*このガイドはSeeed Studioの許可を得て、スイッチサイエンスが翻訳しています。