🎬

DGX SparkでVideo Search and Summarization (VSS)を動かす

に公開

背景

動画コンテンツの増加に伴い、映像から必要な情報を効率的に検索・要約するニーズが高まっています。NVIDIAが提供する Video Search and Summarization(VSS) は、AIを活用して動画の内容を分析し、自然言語でのクエリに対して関連するシーンを検索したり、動画全体を要約したりできるソリューションです。

今回、DGX Spark上でVSSを動かす機会がありましたので、その導入手順と所感をまとめました。

環境

項目 バージョン / 値
ハードウェア NVIDIA DGX Spark
OS NVIDIA DGX OS 7.2.3
Driver Version 580.95.05
CUDA Version 13.0
VSS Version 2.4.1

VSSとは

Video Search and Summarization(VSS) は、NVIDIAが提供するAI Blueprintの1つで、Vision Language Model(VLM)とRAG技術を組み合わせて動画コンテンツを解析・検索できるソリューションです[1]。ライセンスはApache-2.0です。

主な機能

機能 説明
動画の要約 長時間の動画を自然言語で要約。時系列に沿った出来事の整理も可能
セマンティック検索 「赤い車が通過するシーン」といった自然言語クエリで動画内を検索
Q&A(質問応答) 動画の内容に対して自然言語で質問し、関連するシーンとともに回答を取得
イベント検出 DeepStreamを使ったリアルタイムのCV(Computer Vision)パイプラインによるイベント検出
アラート管理 検出されたイベントのレビューと管理

ユースケース

VSSは以下のような分野での活用が想定されています。

  • スマートスペース監視: 小売店舗、工場、オフィスなどでの行動分析や異常検知
  • 倉庫自動化: 作業者の動線分析、安全違反の検出、在庫状況の把握
  • 標準作業手順(SOP)の検証: 製造ラインでの作業手順遵守の確認
  • 交通監視: 車両・歩行者の検出、交通パターンの分析
  • コンテンツモデレーション: 動画プラットフォームでの不適切コンテンツの検出

アーキテクチャ(CA-RAG)

VSSのコア部分は CA-RAG(Context-Aware Retrieval Augmented Generation) と呼ばれ、VLMで生成されたキャプションを基に動画の検索と要約を実現します[2]。CA-RAGは以下の2つのパイプラインで構成されています。


VSSアーキテクチャ概要(出典: NVIDIA-AI-Blueprints/video-search-and-summarization

Ingestion Pipeline(取り込みパイプライン)

動画を解析し、検索可能なデータとして保存するパイプラインです。

  1. 動画の分割: 動画をチャンク(短いセグメント)に分割
  2. VLMによるキャプション生成: 各チャンクをVLM(Cosmos-Reason2-8B)で解析し、シーンの内容を自然言語で記述
  3. 埋め込みベクトルの生成: キャプションをEmbeddingモデルでベクトル化
  4. ベクトルDBへの保存: 生成したベクトルをMilvus(またはNeo4j等のGraphDB)に保存し、後続の検索に使用

Retrieval Pipeline(検索パイプライン)

ユーザーのクエリに対して関連するシーンを検索し、回答を生成するパイプラインです。

  1. クエリの埋め込み: ユーザーの自然言語クエリをベクトル化
  2. 類似検索: ベクトルDBから類似度の高いチャンクを検索
  3. リランキング: Rerankerモデルで検索結果の関連性を再評価
  4. 回答生成: LLMが検索結果をコンテキストとして回答を生成

CA-RAGは複数の検索手法(Vector検索、Graph検索、VLM検索など)をサポートしており、用途に応じて使い分けることができます。

使用されるNIMモデル

VSSでは以下のNVIDIA NIMモデルが使用されます。本記事の完全ローカル構成では、すべてDGX Spark上で動作します。
Cosmos-Reason2-8BモデルのみHugging Faceからダウンロードされるため、利用規約の同意が必要になります。

モデル 役割
Cosmos-Reason2-8B VLM(動画フレームの解析・キャプション生成)
Llama 3.1 8B LLM(回答生成、要約)
llama-3.2-nv-embedqa-1b-v2 Embedding(テキストのベクトル化)
llama-3.2-nv-rerankqa-1b-v2 Reranker(検索結果の再ランキング)

デプロイオプション

VSSには4つのデプロイオプションがあります。
DGX Sparkでは、4つのデプロイオプションすべてをサポートしています。

デプロイシナリオ VLM LLM Embedding/Reranker
Remote Deployment リモート(gpt-4o) リモート リモート
Hybrid Deployment ローカル(Cosmos-Reason2-8B) リモート リモート
VSS Event Reviewer ローカル(Cosmos-Reason2-8B) 使用しない 使用しない
Fully Local Deployment: Single GPU ローカル(Cosmos-Reason2-8B) ローカル ローカル

本記事では、Fully Local Deployment: Single GPU(完全ローカル) の構成で導入します。

事前準備

NGC APIキーの取得

VSSのコンテナイメージをダウンロードするために、NGC(NVIDIA GPU Cloud)のAPIキーが必要です。

  1. NVIDIA Developer Programに登録
  2. NGC API KeysページでAPIキーを生成
  3. 生成したキーを控えておく

手順

1. VSSリポジトリのクローン

GitHubからVSSのリポジトリをクローンします。

git clone https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization.git
cd video-search-and-summarization

2. キャッシュクリーナーの起動

コンテナ操作中のメモリ使用量を最適化するために、キャッシュクリーナースクリプトを起動します。
別のターミナルで実行するか、バックグラウンドで実行してください。

# バックグラウンドで実行
sudo sh deploy/scripts/sys_cache_cleaner.sh &

3. NVIDIA Container Registryへの認証

NGC APIキーを使ってNVIDIAのコンテナレジストリにログインします。

docker login nvcr.io
# Username: $oauthtoken
# Password: <取得したNGC_API_KEY>

4. LLM NIMのデプロイ

Llama 3.1 8B NIMをデプロイします。

export NGC_API_KEY=<YOUR_NGC_API_KEY>
export LOCAL_NIM_CACHE=~/.cache/nim
mkdir -p "$LOCAL_NIM_CACHE"

docker run -d -u $(id -u) -it \
  --gpus '"device=0"' --shm-size=16GB \
  -e NGC_API_KEY=$NGC_API_KEY \
  -v "$LOCAL_NIM_CACHE:/opt/nim/.cache" \
  -p 8007:8000 -e NIM_GPU_MEM_FRACTION=0.2 \
  nvcr.io/nim/meta/llama-3.1-8b-instruct-dgx-spark:1.0

5. Embedding NIMのデプロイ

Embedding NIMをデプロイします。

docker run -d -u $(id -u) -it \
  --gpus '"device=0"' --shm-size=16GB \
  -e NGC_API_KEY=$NGC_API_KEY \
  -v "$LOCAL_NIM_CACHE:/opt/nim/.cache" \
  -p 8006:8000 -e NIM_SERVER_PORT=8000 \
  -e NIM_MODEL_PROFILE="f7391ddbcb95b2406853526b8e489fedf20083a2420563ca3e65358ff417b10f" \
  -e NIM_TRT_ENGINE_HOST_CODE_ALLOWED=1 \
  nvcr.io/nim/nvidia/llama-3.2-nv-embedqa-1b-v2:1.9.0

6. Reranker NIMのデプロイ

Reranker NIMをデプロイします。

docker run -d -u $(id -u) -it \
  --gpus '"device=0"' --shm-size=16GB \
  -e NGC_API_KEY=$NGC_API_KEY \
  -v "$LOCAL_NIM_CACHE:/opt/nim/.cache" \
  -p 8005:8000 -e NIM_SERVER_PORT=8000 \
  -e NIM_MODEL_PROFILE="f7391ddbcb95b2406853526b8e489fedf20083a2420563ca3e65358ff417b10f" \
  nvcr.io/nim/nvidia/llama-3.2-nv-rerankqa-1b-v2:1.7.0

上記3つが起動できたら、起動が出来たことを確認します。

# Llama 3.1 8B
curl -s http://localhost:8007/v1/health/ready
# Embedding
curl -s http://localhost:8006/v1/health/ready
# Reranker
curl -s http://localhost:8005/v1/health/ready

7. VSSのデプロイ

すべてのNIMが起動したら、VSS本体をデプロイします。

7.1 local_deployment_single_gpuディレクトリへ移動

cd deploy/docker/local_deployment_single_gpu/

7.2 config.yamlの編集

DGX Spark向けにconfig.yamlを編集し、Entity Extractionを無効化します。

ingestion_function:
  type: graph_ingestion
  params:
    ...
    disable_entity_extraction: True  # この行のコメントを外す

7.3 環境変数の設定

.envファイルにNGC APIキー、Hugging Faceトークン、およびDGX Spark向けの設定を追加します。

.env
NGC_API_KEY=<YOUR_NGC_API_KEY>
HF_TOKEN=<YOUR_HF_TOKEN>
VLLM_GPU_MEMORY_UTILIZATION=0.3
VLM_BATCH_SIZE=32
環境変数について
環境変数 説明
NGC_API_KEY NGCコンテナレジストリへのアクセスに使用
HF_TOKEN Hugging FaceからCosmos-Reason2-8Bモデルをダウンロードするために必要
VLLM_GPU_MEMORY_UTILIZATION VLM(vLLM)が使用するGPUメモリの割合。推奨値: 0.3
VLM_BATCH_SIZE VLMの処理バッチサイズ。推奨値: 32

7.4 VSSの起動

export IS_SBSA=1 # DGXSparkだと必要
docker compose up

動画処理のテスト

VSSの起動後、ブラウザでhttp://localhost:9100にアクセスすると以下のような画面が表示されます。

VSSの起動画面

大まかに、左側がIngestion Pipeline(取り込みパイプライン)、右側がRetrieval Pipeline(検索パイプライン) の操作画面という感じです。

各項目

  1. 画像アップロード欄
  2. 動画の処理チャンクサイズ
  3. 各種プロンプト
  4. チャット欄
  5. 実行ボタン:
    • Ask: チャット送信
    • Generate Highlight: 検出した全てのイベントのハイライト
    • Generate Senario Highlight: 指定したイベントのハイライト
    • Reset Chat: チャット履歴のリセット

プロンプトの役割

プロンプト 役割 タイミング デフォルト例(倉庫監視用)
PROMPT VLMに「何を見つけるか」を指示 各チャンク処理時 PPE未着用、転倒、箱の落下など重大イベントの検出指示
CAPTION SUMMARIZATION PROMPT VLMキャプションから「重要な部分を抽出」 バッチ処理時 重要な出来事のみをタイムスタンプ付きで抽出
SUMMARY AGGREGATION PROMPT 複数の要約を「統合・整理」 最終要約生成時 「安全違反」「作業効率低下」などカテゴリ別に集約

テストでは、サンプル「warehouse」の動画を用いてデフォルトのプロンプトを日本語訳したものを入力して処理しました。
元動画はこちらから確認できます。

サンプル設定

結果

サンプル「warehouse」の動画時間は「3分38秒」であり、取り込みの処理時間は約1分30秒ほど でした。
要約結果としては、以下のような内容が出力されました。

動画要約結果
# 動画の要約
0秒 - 30秒
- 人物が倉庫内で作業を行っている。
- 人物は黄色いヘルメットと反射ベストを着用しており、手荷物を持っており、動きながらもバランスを崩してしまいます。
- 人物は右側から画面に入り、その後左側へ移動します。
- 人物は左側の棚に近づき、片方の手で箱を持ち、もう片方の手で別の箱を持ちながら棚に立ちます。
- 人物はバランスを崩したために、片方の箱が落ちてしまいます。
- 人物は落ちた箱を見つめ、少し立ち止まります。
- 人物は再び歩き始め、遠ざかります。
30秒 - 60秒
- 男性が倉庫内で歩いています。その後、彼は床に置かれた箱を拾い上げ、棚に届けます。
- この行動は、倉庫内の物流作業の一環として行われており、特に異常な動きや不審な点は見られません。
60秒 - 90秒
- フォークリフトが倉庫内で移動しています。
- フォークリフトは倉庫内で安全に動作しています。
90秒 - 120秒
- 倉庫内で作業している人の動きが見えるようになりました。
- 黄色いヘルメットと反射ベストを着用した人が、倉庫内の通路にテープを張っています。
- 同じく黄色いヘルメットと反射ベストを着用した別の人が、そのテープの端を持ち、もう一人の人に渡しています。
- テープを受け取った人は、それを自分の手で持ちながら少し後ろに立ちます。
- テープを持つ人は、テープを地面に沿って引き伸ばしながら立ちます。
- テープを持つ人は、テープをさらに引き伸ばすためにしゃがみ込みます。
120秒 - 150秒
- 倉庫内で作業員が活動している様子です。
- 作業員は黄色いヘルメットとベストを着用しており、安全対策を行っていることがわかります。
- 倉庫内の棚には多くの箱が整然と並べられており、一部のエリアには「CAUTION」のテープが張られています。
150秒 - 180秒
- ここで観察されている活動はすべて正常です。
- 倉庫内で作業員が安全に動いていることが確認できます。
180秒 - 210秒
- ここで観察されている活動は規則正しいものであり、異常はありません。
- 倉庫内で作業をしている人は、安全に行動しており、障害物や他の物体に接触することなく動作しています。
- 倉庫内の物品も適切に配置されており、異常な動きも見られません。

動画を見てみると、所々アヤシイ箇所もありますが、「段ボール箱の落下」や「フォークリフトの移動」など、分かりやすいイベントは捉えられている印象です。ただ、180秒-210秒で立ち入り禁止テープ内に入って作業するシーンがあったのですが、それは見逃されていました。

チャットで質問

右側のチャット欄から、動画内容に関する質問を投げることができます。


チャットによる質問

試しに「箱を落としたシーンは何秒から何秒ですか?」と質問してみたところ、6.0秒〜12.0秒の範囲を正確に回答してくれました。

他にも、「この動画でフォークリフトが動いている時間を教えて」「作業員はどのような作業をしていましたか?」といった質問にも、タイムスタンプ付きで回答してくれるため、長時間の動画でも効率的に内容を把握できます。

ハイライト生成

ハイライト生成では、特定のシナリオのハイライトを動画から抽出してくれます。

「箱を落とした」というシナリオを指定してハイライトを生成したところ、動画の6秒付近の箱が落下するシーンを含む短い動画クリップが生成されました。「Generate Highlight」で動画全体の要約ハイライトを作ることもできますし、「Generate Scenario Highlight」で特定のイベントだけを抽出することも可能です。

膨大な監視映像から特定のインシデントだけを抽出してレビューするような使い方ができそうです。


箱を落としたシーン

まとめ

本記事では、NVIDIA DGX Spark上でVideo Search and Summarization(VSS)を完全ローカル構成でデプロイし、実際に動画の取り込みから検索・要約までを試しました。

  • DGX Spark1台でVLM/LLM/Embedding/Rerankerの4モデルを同時に稼働できたのは素直に驚きでした。コンパクトな筐体ながら、128GBの統合メモリを活かして動画AIパイプラインが完全ローカルで完結します。
  • 3分38秒の倉庫動画に対して、取り込み処理は約1分30秒で完了しました。段ボール箱の落下やフォークリフトの移動といった分かりやすいイベントは適切に検出できた一方、立ち入り禁止テープ内での作業など文脈的な判断が必要なシーンは見逃されるケースもありました。
  • プロンプトの設計次第で検出精度を調整できる余地があるため、ユースケースに合わせたプロンプトチューニングが実運用では重要になりそうです。

VSSはNVIDIA AI Blueprintとして手順が整備されており、DGX Sparkがあれば比較的手軽に動画AI検索の検証環境を構築できます。クラウドにデータを送れないケースや、ローカルで素早くPoCを回したい場面で有力な選択肢になるのではないでしょうか。

参考リンク

脚注
  1. https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization ↩︎

  2. https://docs.nvidia.com/vss/latest/content/context_aware_rag.html ↩︎

セリオ株式会社 テックブログ

Discussion