Cosmos3を用いたvideo2videoの検証

Cosmos3を用いたvideo2videoの検証

Physical AI関連の業務を通じてNVIDIAのクラウド環境Brevを利用し、Cosmos3によるvideo-to-videoデータ合成の検証を行いました。その環境構築手順と実装内容をご紹介します。
2026.07.15

お久しぶりです。インターン生のKentです。
Physical AI関連の業務に携わる中でNVIDIAが提供するクラウド環境Brevを利用し、cosmos3によるvideo-to-videoのデータ合成を検証する機会があったので、その内容をご紹介します。

NVIDIA Brevについて

今回のGPUクラウド環境として NVIDIA Brevを利用させていただきました。
このサービスは少し前に話題になったvast.aiと似ており、世界中のGPUプロバイダーから好きな時間だけGPUをレンタルできるサービスです。
NVIDIA自身が提供しているサービスという点で、安心して利用できると感じました。
メリットとしては、AWSやGoogle Cloudでホスティングするよりも安価で、環境構築が容易な点が挙げられます。
実際、AWS等ではインスタンスを立ち上げてから接続経路の確立などを行う必要がありますが、Brevでは最初からJupyter Notebookが利用できるため、クラウドに不慣れな方でも扱いやすいと思います。

cosmos3 (vLLM-Omni) の環境構築

今回はH100 (driver 580.x) を積んだインスタンス上で、.venv ネイティブ環境にvLLM-Omni経由でCosmos3-Nanoをサーブする形で構築しました。手順は以下の通りです。基本的にはGithubのNvidia/Cosmosのセットアップ手順に従っていけば大丈夫なのですが、一部追加の手順が必要となります。また、cosmosにもcosmos frameworkがnvidiaから提供されているのですが、そちらは映像の入力には執筆時(2026/07/15時点)で対応していないことに留意してください。

1. uvの用意

curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv --version

2. venvの作成 (Python 3.13)

cd /home/shadeform
uv venv --python 3.13 --seed --managed-python

3. Hugging Faceへのログイン

Cosmos3-Nanoは映像や画像の生成にセーフガードが必要で、そのセーフガードがgatedモデルのため、事前にHugging Face上でライセンスに同意しておく必要があります。利用されているモデルはこちら:Cosmon-1.0-Guardrail
同意ののち、トークンを使ってログインしておきます。生成するトークンに関しては個人所有のPCではなくレンタルクラウドということを踏まえてREADの権限のみを渡しておくと安心でしょう。

uvx --from huggingface_hub hf auth login --token $HF_TOKEN

4. vLLM-Omniをmainブランチから導入

uv pip install --torch-backend=cu130 \
  "vllm-omni @ git+https://github.com/vllm-project/vllm-omni.git@main"

5. vLLM本体を導入

step.4 ではvLLM本体が実行環境に追加されないため、こちらで入れてあげる必要があります。今回はvLLM-Omniのバージョンに合わせてversion 0.25.0を利用しています。

uv pip install --torch-backend=cu130 "vllm==0.25.0"

6. ガードレール(セーフティチェッカ)を導入

Hugging Face上でモデルの利用規約に同意していないと後のステップでエラーが発生するため、必要に応じてこちらのページを参照してください。

uv pip install --torch-backend=cu130 cosmos-guardrail

7. 動作確認

.venv/bin/vllm serve --help 2>&1 | grep -icE "Failed to load plugin|Traceback"

.venv/bin/python -c "import torch,vllm,vllm_omni; \
  print('torch',torch.__version__,'cuda',torch.cuda.is_available()); \
  print('vllm',vllm.__version__,'omni',vllm_omni.__version__)"

想定される出力は以下の通りです。

0
torch 2.11.0+cu130 cuda True
vllm 0.25.0 omni 0.25.0rc2.dev10+...

1行目の0はプラグインロードエラーが出ていないことを示し、2〜3行目でtorchがCUDA 13ビルドでGPUを認識できていること、vllmとomniのバージョンが揃っていることを確認できます。

8. サーブ起動

source .venv/bin/activate
export HF_HUB_DISABLE_XET=1
vllm serve nvidia/Cosmos3-Nano \
  --omni \
  --model-class-name Cosmos3OmniDiffusersPipeline \
  --allowed-local-media-path / \
  --port 8000 \
  --init-timeout 1800

Application startup complete. が表示されれば http://localhost:8000 でAPIが利用可能になります。

9. video-to-videoの呼び出し

POST /v1/videos/sync(同期でMP4を直接返す)または POST /v1/videos(非同期でジョブIDを返す)を利用します。video_reference はファイルアップロードではなく、{"video_url": "data:video/mp4;base64,..."} という形のJSON文字列で渡します。

映像をbase64データURL化

python -c 'import base64,json; b=open("sample_input.mp4","rb").read(); \
open("vref.json","w").write(json.dumps({"video_url":"data:video/mp4;base64,"+base64.b64encode(b).decode()}))'

video-to-videoを実行

curl -X POST http://localhost:8000/v1/videos/sync \
  -F "model=nvidia/Cosmos3-Nano" \
  -F "prompt=Replace the background with a snowy mountain landscape at sunset, keep the main subject unchanged, cinematic lighting" \
  -F "negative_prompt=blurry, distorted, low quality" \
  -F "video_reference=<vref.json" \
  -F "num_frames=17" \
  -F "num_inference_steps=20" \
  -F "fps=8" \
  -F "seed=42" \
  -o sample_output.mp4

公式ドキュメントにはvideo-to-videoに関する記述は見当たりませんでしたが、上記の方法で呼び出すことができました。

この記事をシェアする

関連記事