VLMをJetson Platform Serciesを用いてreComputerで実行する
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-ingress
とjetson-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
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の許可を得て、スイッチサイエンスが翻訳しています。