mcpField
V
vss-deploy-video-embedding

vss-deploy-video-embedding

github.com/nvidiaクラウド・DevOps3.8k1.8k 回インストール今日更新
リポジトリ

vss-deploy-video-embedding について

VSS の動画埋め込みマイクロサービスをデプロイ、運用し、REST API でテキストや動画の埋め込みを生成するスキルです。アップロードファイル、URL、ライブ RTSP ストリームを扱い、Redis、Kafka、OpenTelemetry との任意接続も設定できます。

主な機能

  1. 01Docker Compose によるサービスのデプロイ
  2. 02テキストと動画の埋め込み生成
  3. 03アップロード、URL、RTSP ストリームの処理
  4. 04SSE による分割埋め込みの配信
  5. 05準備状態、メトリクス、アセット統計の確認

活用シーン

  1. 01動画検索用のテキスト埋め込みを生成
  2. 02アップロードした動画ファイルを埋め込み
  3. 03ライブ RTSP ストリームから埋め込みを生成
  4. 04モデルのダウンロード、GPU、ストリーム再接続の問題を調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nvidia/skills --skill vss-deploy-video-embedding

インストール後、Claude Code で/vss-deploy-video-embeddingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

BENCHMARK.md
skill-card.md
skill.oms.sig
evals/
evals.json
standalone_deploy.json
references/
deploy-vss-deploy-video-embedding.md
environment.md
integrate-vss-deploy-video-embedding.md
README.md
rest-api.md
troubleshooting.md

詳細

VSS Video Embedding(RT-Embed)

次のような場合に、このスキルを使用します。

  • Docker Compose ファイルから VSS Video Embedding マイクロサービスをデプロイする。
  • Cosmos-Embed1-448p モデルでテキストまたは動画の埋め込みを生成する。
  • アップロードしたファイル、HTTP/S3/file/data URL、またはライブ RTSP ストリームを埋め込む。
  • Redis、Kafka、OpenTelemetry とともに、VSS デプロイにサービスを組み込む。
  • レディネス、モデルのダウンロード、GPU、またはストリーム再接続の失敗を調査する。

トリガーフレーズ: vss-deploy-video-embedding、RT-Embed、rtvi-embed、video embedding service、Cosmos-Embed1、embed live stream、embed video file、generate video embeddings、text embedding for video search。

サービスの概要

  • VSS 3.2 GA スキル: vss-deploy-video-embedding。
  • 旧 3.1 名称: RT-Embed。
  • Compose サービス: rtvi-embed。
  • コンテナ名: vss-rtvi-embed。
  • イメージ: nvcr.io/nvidia/vss-core/vss-rt-embed(RTVI_EMBED_IMAGE で上書きできます)。
  • デフォルトタグ: 3.2.1(RTVI_EMBED_TAG で上書きできます)。
  • プロファイル: bp_developer_search_2d。
  • コンテナポート: 8000(ホスト側は ${RTVI_EMBED_PORT})。
  • デフォルトモデル: nvidia/Cosmos-Embed1-448p の cosmos-embed1-448p。
  • ヘルスエンドポイント: GET /v1/ready。
  • ヘルスチェックの起動猶予期間: 初回起動時は 1200s(20 分)。

前提条件

サービスを起動する前に、次を確認してください。

  1. NVIDIA ドライバーと NVIDIA Container Toolkit がインストールされ、デフォルトのランタイムが nvidia に設定されていること。
  2. Docker Engine と Docker Compose プラグインが、${VAR:+value} による条件付きボリューム置換をサポートする十分新しいバージョンであること。
  3. $oauthtoken と有効な NGC API キーを使用して、docker login nvcr.io が完了していること。
  4. ホスト環境に少なくとも RTVI_EMBED_PORT、VSS_DATA_DIR、NGC_API_KEY が設定されていること。また、Cosmos-Embed1 の重みのダウンロード中に Hugging Face の 429 レート制限エラーを回避するには、必要に応じて HF_TOKEN も設定してください。
  5. 永続キャッシュ用に、十分な空きディスク容量があること:rtvi-hf-cache、rtvi-ngc-model-cache、rtvi-triton-model-repo(数 GB)。

前提条件の全一覧については references/deploy-vss-deploy-video-embedding.md を、変数一覧については references/environment.md を参照してください。

デプロイ

スタンドアロンの RT-Embed の場合は、サービスディレクトリで作業します。

cd "{{repo_root}}/deploy/docker/services/rtvi/rtvi-embed"

このスタンドアロンデプロイでは、/vss-deploy-profile や scripts/dev-profile.sh を使用しないでください。

エージェント主導の検証では、sudo が対話形式でプロンプトを表示しないようにしてください。所有権の変更や Docker 操作で特権が必要な場合は、実行する前に references/deploy-vss-deploy-video-embedding.md と references/troubleshooting.md にある非対話型のガードを使用してください。まず通常の docker を試し、それが使えない場合は sudo -n docker を使用します。sudo -n が失敗した場合は、対話型の sudo を再試行したり権限を緩和したりせず、ホスト管理者向けの正確な手動コマンドを提示して停止してください。

docker compose up の実行前に、スタンドアロン環境に必要な最小限の変数を設定してください。sudo -n chown が失敗した場合は、docker compose up を実行する前に停止し、表示されたコマンドを実行するようホスト管理者に依頼してください。

export RTVI_EMBED_PORT=8017
export VSS_DATA_DIR="${VSS_DATA_DIR:-$(pwd)/.standalone-data}"
export NGC_API_KEY="<your-ngc-api-key>"
export HOST_IP="$(hostname -I | awk '{print $1}')"
export HF_TOKEN="${HF_TOKEN:-}"  # optional, but recommended to avoid HF 429s
export RTVI_EMBED_KAFKA_ENABLED=false
export ENABLE_REDIS_ERROR_MESSAGES=false
# Prepare VST clip-storage host dir; use `sudo -n` for ownership fixes.
CLIP_STORAGE_DIR="${VSS_DATA_DIR}/data_log/vst/clip_storage"
mkdir -p "$CLIP_STORAGE_DIR"
if ! sudo -n chown -R 1001:1001 "$CLIP_STORAGE_DIR"; then
  echo "ERROR: passwordless sudo is unavailable for host-path ownership." >&2
  echo "Ask the host owner to run: sudo chown -R 1001:1001 \"$CLIP_STORAGE_DIR\"" >&2
  echo "Do not work around this with chmod 777 or world-writable permissions." >&2
  return 1 2>/dev/null || exit 1
fi

これにより、VSS_DATA_DIR が未設定の場合にファイルシステムルートから /data_log/vst/clip_storage がマウントされるのを防ぎ、スタンドアロンモードで Kafka/Redis の接続先がないことによる起動の停滞を防ぎます。

# Bring up the service under the required Compose profile.
docker compose -f rtvi-embed-docker-compose.yml \
  --profile bp_developer_search_2d up -d rtvi-embed

Docker の操作に昇格した権限が必要な場合は、sudo -n docker compose ... を使用し、sudo -n がパスワードを要求した場合は速やかに停止してください。

# Watch logs while the model downloads and Triton repo builds.
docker compose -f rtvi-embed-docker-compose.yml logs -f rtvi-embed

初回起動では、Cosmos-Embed1 のダウンロードと Triton モデルリポジトリの構築に 20 分かかる場合があります。初回起動時に start_period: 1200s のヘルスチェックを短縮すると、コンテナの準備中に unhealthy と判定されるため、短縮しないでください。

確認
BASE_URL="http://localhost:${RTVI_EMBED_PORT}"

curl -fsS "$BASE_URL/v1/ready"               # 200 when warm.
curl -fsS "$BASE_URL/v1/ready?detailed=true" # Component-level status.
curl -fsS "$BASE_URL/v1/version"
MODELS_JSON=$(curl -fsS "$BASE_URL/v1/models")
echo "$MODELS_JSON"                          # Confirms cosmos-embed1-448p is loaded.

MODEL_ID="$(echo "$MODELS_JSON" | jq -r '.data[0].id // empty')"
test -n "$MODEL_ID" || { echo "ERROR: /v1/models has no model id — wait until /v1/ready is 200" >&2; exit 1; }

以下の API 呼び出しの各セクションでは、このブロックで設定した $BASE_URL と $MODEL_ID を使用します。

一般的な操作

アップロードしたファイルから動画の埋め込みを生成する
FILE_ID=$(curl -fsS -X POST "$BASE_URL/v1/files" \
  -F purpose=vision \
  -F media_type=video \
  -F file=@/path/to/clip.mp4 | jq -r .id)

curl -fsS -X POST "$BASE_URL/v1/generate_video_embeddings" \
  -H "Content-Type: application/json" \
  -d "{
    \"id\": \"$FILE_ID\",
    \"model\": \"$MODEL_ID\",
    \"chunk_duration\": 60,
    \"chunk_overlap_duration\": 10
  }"
テキストの埋め込みを生成する(テキストから動画を検索する場合)
curl -fsS -X POST "$BASE_URL/v1/generate_text_embeddings" \
  -H "Content-Type: application/json" \
  -d "{\"text_input\":\"a forklift moving pallets\",\"model\":\"${MODEL_ID}\"}"
ライブ RTSP ストリームを埋め込む

ライブストリームには、stream: true と chunk_duration > 0 が必須です。同期呼び出しでは 400 BadParameters: "Only streaming output is supported for live-streams" が返されます。また、streams/add が返す chunk_duration: 0 はプレースホルダーです。埋め込みリクエストで上書きしないと、400 BadParameter: "chunk_duration must be greater than 0" が返されます。

POST /v1/streams/add は liveStreamUrl による重複排除を行いません。同じ URL を 2 回送信すると、異なる stream_id が 2 つ発行されます。孤立したエントリを作らないよう、追加する前に GET /v1/streams/get-stream-info を呼び出し、その URL の登録がすでに存在する場合は再利用してください。

STREAM_ID=$(curl -fsS -X POST "$BASE_URL/v1/streams/add" \
  -H "Content-Type: application/json" \
  -d '{"streams":[{"liveStreamUrl":"rtsp://host:port/live/video","description":"camera-001"}]}' \
  | jq -r '.results[0].id')

curl -N -X POST "$BASE_URL/v1/generate_video_embeddings" \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d "{
    \"id\": \"$STREAM_ID\",
    \"model\": \"$MODEL_ID\",
    \"stream\": true,
    \"chunk_duration\": 10,
    \"chunk_overlap_duration\": 2
  }"

# List registered live streams (use this to recover stream_ids across sessions).
curl -fsS "$BASE_URL/v1/streams/get-stream-info"

# Stop embedding for the stream when done (terminates SSE with data: [DONE]).
curl -fsS -X DELETE "$BASE_URL/v1/generate_video_embeddings/$STREAM_ID"

エンドポイントの全一覧、SSE ストリーミング、単一ストリームのコントロールプレーンパターンについては、references/rest-api.md を参照してください。

ログ、メトリクス、ステータス

docker compose -f rtvi-embed-docker-compose.yml ps
docker compose -f rtvi-embed-docker-compose.yml logs -f rtvi-embed
docker stats vss-rtvi-embed

curl -fsS "$BASE_URL/v1/metrics"          # Prometheus.
curl -fsS "$BASE_URL/v1/assets/stats"     # Asset storage counts and TTL.

RTVI_EMBED_LOG_DIR がホストディレクトリにバインドされている場合、ログファイルはホスト上の /opt/nvidia/rtvi/log/rtvi/ からも利用できます。

インテグレーションサーフェス

  • 入力: :${RTVI_EMBED_PORT} の REST API(POST /v1/files、POST /v1/generate_text_embeddings、POST /v1/generate_video_embeddings、ライブストリームの制御エンドポイント)。
  • 出力: 同期 REST レスポンス、チャンク化された動画埋め込み用のオプションの SSE、Kafka が有効な場合に RTVI_EMBED_KAFKA_TOPIC(コンテナー内では KAFKA_TOPIC)および RTVI_EMBED_ERROR_MESSAGE_TOPIC(コンテナー内では ERROR_MESSAGE_TOPIC)で指定されたトピックに送信されるオプションの Kafka メッセージ(ホスト側の RTVI_EMBED_KAFKA_ENABLED=true は Compose によりコンテナー内の KAFKA_ENABLED にマッピングされます)。
  • オプションの接続先: Redis(ENABLE_REDIS_ERROR_MESSAGES=true)、Kafka(ホスト側の RTVI_EMBED_KAFKA_ENABLED=true → コンテナー内の KAFKA_ENABLED)、OpenTelemetry コレクター(ホスト側の RTVI_EMBED_ENABLE_OTEL_MONITORING=true → コンテナー内の ENABLE_OTEL_MONITORING)。

インテグレーション契約の全容については、references/integrate-vss-deploy-video-embedding.md を参照してください。

エラー処理

API の失敗時には、code フィールドと message フィールドを含む JSON が返されます。

{
  "code": "BadParameter",
  "message": "chunk_duration must be greater than 0"
}

Pydantic / OpenAPI の検証失敗時には HTTP 422 が返され、code: "InvalidParameters" とフィールド単位の message が含まれます。

コード意味よくある原因
400不正なリクエストtext_input がない、未知の file_id / stream_id / model、ライブストリームが stream: true なしで呼び出された、ライブストリームの埋め込みリクエストで chunk_duration: 0 が指定された、chunk_overlap_duration >= chunk_duration
401認証されていませんデプロイ環境で認証が必須の場合に Authorization: Bearer <token> がない、または無効
403禁止されていますfile:// URL が無効(FILE_URL_ALLOWED_DIRS が未設定)、または解決されたパスが許可リスト外(code: "Forbidden")
409競合ファイル使用中に DELETE /v1/files/{file_id} を実行した(ResourceInUse)、別のクライアントが同じライブストリームにすでに接続している(Conflict)
413ペイロードが大きすぎますアップロードされたファイルまたはデコードされた data: URI がサーバーのサイズ制限を超えている
422処理できないエンティティスキーマ検証の失敗 — UUID の形式が不正、multipart フィールドの型が不正、列挙値が無効、サポート対象のスキームで URL 形式が無効
429レート制限超過リクエストレートが上限を超過 — 指数バックオフで再試行してください
500内部サーバーエラー予期しない推論または I/O の失敗 — docker compose -f rtvi-embed-docker-compose.yml logs -f rtvi-embed を確認してください
503サービスを利用できません/v1/ready がまだ起動中(モデルのダウンロード / Triton リポジトリのビルド中)、埋め込みエンドポイントが別のファイルまたはテキストクエリで使用中、ライブストリーム数が上限に達した、推論中に CUDA OOM が発生した

初回起動時に /v1/ready が返す 503 は、Cosmos-Embed1 のダウンロードと Triton モデルリポジトリのビルドが完了するまで想定どおりです(最大約 20 分)。ヘルスチェックの start_period: 1200s が経過するまでは、アプリケーションエラーとして扱わないでください。

埋め込みエンドポイントが "Server is busy processing another file or text" または "Server is busy processing another file / live-stream." というメッセージとともに 503 を返す場合、サービスは一度に 1 件の同期埋め込みジョブを処理します — バックオフして再試行するか、インスタンス間で作業を分割してください。

エンドポイント固有の制約(ライブストリームの SSE 要件、URL スキーム、レスポンススキーマ)については、references/rest-api.md を参照してください。Compose の起動、キャッシュ、権限に関する失敗については、references/troubleshooting.md を参照してください。

トラブルシューティング

よくある失敗パターンと解決方法については、references/troubleshooting.md を参照してください。よくある問題:

  • /v1/ready が 503 のまま → NGC_API_KEY の設定漏れ、初回起動時のモデルダウンロード中に Hugging Face が 429 レート制限を返していないか(回避するには HF_TOKEN を設定)、または該当するフラグが有効な場合に Redis / Kafka の接続先に到達できるかを確認してください。
  • 最初の 20 分間にヘルスチェックが unhealthy に変わる → start_period: 1200s に戻してください。
  • バインドマウントされたキャッシュディレクトリで権限エラーが発生する → ホスト上のパスに対して sudo -n chown -R 1001:1001 を実行してください。パスワードなしの sudo が使用できない場合は、ホストの所有者に表示されたコマンドの実行を依頼してください(chmod 777 は使用しないでください)。
  • デプロイ中に sudo がパスワードを要求する → sudo -n を使い、すぐに失敗させてください。references/troubleshooting.md を参照してください。エージェントのセッションで対話形式の sudo を再試行しないでください。

アップグレードとロールバック

RTVI_EMBED_IMAGE / RTVI_EMBED_TAG を固定し、イメージを取得して、--profile bp_developer_search_2d で再作成した後、切り替え前に /v1/ready を待ちます。名前付きボリュームはイメージの切り替え後も保持されます。

手順の全容:アップグレードとロールバック。

削除

docker compose -f rtvi-embed-docker-compose.yml down でスタンドアロンのスタックを停止します。名前付きモデルキャッシュを削除する場合に限り、down -v を使用してください。

手順の全容とキャッシュに関する注意事項:削除。

参照資料

ファイル参照するタイミング
references/README.mdすべての参照ファイルの目次です。
references/deploy-vss-deploy-video-embedding.mdVision Agent のデプロイ構築に関するリファレンスです。イメージ、GPU、ストレージ、起動、前提条件、既知の問題を扱います。
references/integrate-vss-deploy-video-embedding.mdVision Agent の統合構築に関するリファレンスです。ピア、入力/出力、環境変数、ネットワーク、Compose の例を扱います。
references/rest-api.mdファイルのアップロード、動画/テキストの埋め込み、ライブストリーム、ヘルス/メトリクスに関する、実行例付きの curl を含む REST エンドポイントの完全な一覧です。
references/environment.mdホストからコンテナーへの名称変更や、シークレットに関わる環境変数を含む、環境変数の完全な一覧です。
references/troubleshooting.md起動、モデル/キャッシュ、ランタイム、可観測性に関する問題の運用診断です。

コメント