NVIDIA Cosmos 3 NanoをAWSのL40S(g6e.xlarge)で動かしてみた

NVIDIA Cosmos 3 NanoをAWSのL40S(g6e.xlarge)で動かしてみた

NVIDIAの動画生成モデル「Cosmos 3 Nano」をAWSのL40S GPU(48GB)で動かしてみました。環境構築のポイントと実際の動作確認、メモリ使用量などの検証結果をお伝えします。
2026.07.03

はじめに

NVIDIAの世界基盤モデルプラットフォームCosmos 3を、AWSのGPUインスタンスで動かしてみました。

Cosmos 3をDGX Spark上で動かした先行記事はすでにありますが、今回はAWS EC2の単一GPU(NVIDIA L40S 48GB)で環境をゼロから構築し、いちばん軽いNanoで動画生成まで通すのがゴールです。

私がCosmosをいじり始めた目的としてはCosmos 3 Superで検証を行いたかったからなのですが、まずは手軽なNanoに触れて感覚を掴んでみようと思いました。

先に結論を書くと、

  • Cosmos 3 NanoはAWSのg6e.xlarge(L40S 48GB)1枚で動く(公式モデルカードの対応アーキ一覧はAmpere/Hopper/Blackwellで、検証環境もGB200/H100。L40SのAda Lovelaceは一覧に明記されていないGPUだが、実際には問題なく動いた)。
  • 720p / 45フレーム / 30ステップの生成でピークVRAMは43.7GB。48GBにギリギリ収まり、720pがL40Sでの実用上限の目安。
  • 環境構築でいくつか詰まりどころがあったので、その回避手順も残します。

DGX Spark上での実験記事
https://dev.classmethod.jp/articles/dgx-spark-cosmos3-omni-world-model-policy/

環境と方針

項目 内容
インスタンス g6e.xlarge(NVIDIA L40S 48GB × 1, 4 vCPU)
リージョン 東京(ap-northeast-1)
AMI Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 24.04)
ドライバ / CUDA 595.71.05 / CUDA 13.2対応
モデル nvidia/Cosmos3-Nano(16B: 8B reasoner + 8B generator, BF16)
実行方式 Hugging Face Diffusers(Cosmos3OmniPipeline

なぜL40S(g6e)かというと、環境構築の試行錯誤は安いインスタンスで済ませたいからです。Nanoは軽量なモデルなので、48GBのL40Sでもいけると考えました(結果的にこれは正解でした)。

単一GPUの選択肢としては、AWSには2025年8月から単一H100のp5.4xlarge(80GB)もありますが、まず動かすというフェーズではg6e.xlarge(L40S 48GB)で十分です(GPUインスタンスは高額なので、料金は起動前にリージョンごとの最新オンデマンド単価を必ず確認してください)。

手順

1. サービスクォータの確認

EC2のGPUインスタンスは、アカウント既定ではクォータ(vCPU数)が0のことが多く、増加申請が必要です。今回は既に引き上げ済みのアカウントでしたが、未申請の場合はService Quotasコンソールから以下を申請してください。

  • Running On-Demand G and VT instances

2. インスタンスの起動

CLIで進めます。(その方が読者の方が再現しやすいと思うので)まずキーペアとセキュリティグループ(自分のIPからのSSHのみ許可)を用意します。

export AWS_REGION=ap-northeast-1
KEY=cosmos-exp01 ; SG=cosmos-exp01-sg ; AZ=ap-northeast-1a
AMI=ami-xxxxxxxx   # 「Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 24.04)」の最新IDを describe-images で取得

VPC=$(aws ec2 describe-vpcs --filters "Name=isDefault,Values=true" --query 'Vpcs[0].VpcId' --output text)
SUBNET=$(aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPC" "Name=availability-zone,Values=$AZ" --query 'Subnets[0].SubnetId' --output text)

aws ec2 create-key-pair --key-name $KEY --query 'KeyMaterial' --output text > ~/.ssh/$KEY.pem
chmod 400 ~/.ssh/$KEY.pem

SGID=$(aws ec2 create-security-group --group-name $SG --description "Cosmos exp SSH" --vpc-id $VPC --query 'GroupId' --output text)
MYIP=$(curl -s https://checkip.amazonaws.com)
aws ec2 authorize-security-group-ingress --group-id $SGID --protocol tcp --port 22 --cidr ${MYIP}/32

AMIの最新IDはこう取れます。

aws ec2 describe-images --owners amazon \
  --filters "Name=name,Values=Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 24.04)*" \
  --query 'reverse(sort_by(Images,&CreationDate))[:1].[ImageId,Name]' --output table

起動します。ルートディスクはgp3 200GB(モデル重み + HFキャッシュ + 生成物)、DeleteOnTermination=trueで消し忘れによるEBSの課金を防ぎます。

ROOT=$(aws ec2 describe-images --image-ids $AMI --query 'Images[0].RootDeviceName' --output text)
IID=$(aws ec2 run-instances \
  --image-id $AMI --instance-type g6e.xlarge \
  --key-name $KEY --security-group-ids $SGID --subnet-id $SUBNET \
  --block-device-mappings "DeviceName=$ROOT,Ebs={VolumeSize=200,VolumeType=gp3,DeleteOnTermination=true}" \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=cosmos-exp01}]' \
  --count 1 --query 'Instances[0].InstanceId' --output text)
aws ec2 wait instance-running --instance-ids $IID
aws ec2 describe-instances --instance-ids $IID \
  --query 'Reservations[0].Instances[0].[State.Name,PublicIpAddress]' --output table

3. SSHしてGPUを確認

ssh -i ~/.ssh/cosmos-exp01.pem ubuntu@<PublicIP>
nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv
name, memory.total [MiB], driver_version
NVIDIA L40S, 46068 MiB, 595.71.05

L40S 48GB、ドライバ595.71.05(CUDA 13.2対応)を確認。Cosmos 3はCUDA 13.0(推奨)または12.8を前提とするので、このドライバなら問題ありません。

4. Cosmos 3のセットアップ

Cosmos 3のセットアップは、公式手順がどの経路(Diffusers/Transformers/vLLM)でもuv + Python 3.13を指定しています(uv venv --python 3.13)。今回は公式どおりuv + Python 3.13で進めて問題なく通りました。DLAMIの既定Pythonは使わず、uvに3.13の仮想環境を管理させます。長い処理があるのでtmuxの中で進めるのがおすすめです。

# システム依存(headless サーバ用の libgl 等も入れる)
sudo apt-get update
sudo apt-get install -y --no-install-recommends curl ffmpeg git-lfs libx11-dev tree wget libxcb1 libgl1 libglib2.0-0
git lfs install

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

# 仮想環境(Python 3.13)と依存インストール
mkdir -p ~/cosmos3 && cd ~/cosmos3
uv venv --python 3.13 --seed --managed-python
source .venv/bin/activate
uv pip install --torch-backend=auto \
  "diffusers @ git+https://github.com/huggingface/diffusers.git" \
  accelerate av cosmos_guardrail huggingface_hub imageio \
  imageio-ffmpeg torch torchvision transformers
+ torch==2.12.1+cu130
+ torchvision==0.27.1+cu130
+ transformers==5.12.1
...

5. Hugging Faceの認証

Cosmos3-Nano本体はOpenMDW-1.1ライセンスでオープンですが、生成時に読み込むガードレール(nvidia/Cosmos-1.0-Guardrail)はアクセス承認が必要です。HFのモデルページでAcceptしておきます。

認証はhf auth loginのブラウザdevice-codeフローを使うと、headlessサーバでは待ち時間が短くタイムアウトしがちでした。

Error: Login failed: Device code expired (timeout). Please try again.

トークンを環境変数で渡す方式にすると一発です(huggingface_hubが自動で参照します)。

export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxx   # Read 権限のトークン
hf auth whoami   # ユーザー名が出れば OK

6. 推論

推論は公式の例と同じくCosmos3OmniPipelineを使います。以下はtext-to-videoの最小スクリプトです。

import time, torch
from diffusers import Cosmos3OmniPipeline
from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler
from diffusers.utils import export_to_video

pipe = Cosmos3OmniPipeline.from_pretrained(
    "nvidia/Cosmos3-Nano", torch_dtype=torch.bfloat16, device_map="cuda",
    enable_safety_checker=True,
)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, flow_shift=10.0)

torch.cuda.reset_peak_memory_stats()
t0 = time.time()
result = pipe(
    prompt="A warehouse robot picks up a cardboard box from a shelf, cinematic, high detail.",
    num_frames=45, height=704, width=1280,
    num_inference_steps=30, guidance_scale=6.0,
    generator=torch.Generator(device="cuda").manual_seed(7),
)
export_to_video(result.video, "/tmp/cosmos3_t2v_720p.mp4", fps=16)
print(f"OK  elapsed={time.time()-t0:.1f}s  peakVRAM={torch.cuda.max_memory_allocated()/1e9:.1f}GB")

初回はNanoの重み(リポジトリ全体で約35GB)とガードレールを自動ダウンロードするので時間がかかります。実行結果はこちら。

100%|██████████████████████████| 30/30 [01:19<00:00,  2.67s/it]
OK  elapsed=102.0s  peakVRAM=43.7GB

結果と考察

https://youtu.be/IGpltkX9M_0
720p

https://youtu.be/MheHAyOiYag
スモークテストで生成したもの

設定 生成時間 ピークVRAM
480×832 / 17フレーム / 20ステップ(スモーク) 約8秒(生成ステップ)
704×1280(720p) / 45フレーム / 30ステップ 102秒 43.7GB

ポイントは720pで43.7GBという数字です。L40Sの48GBに対して余裕は約4GB。これ以上の解像度・長尺はOOMのリスクが高く、720pがL40S(48GB)での実用上限と考えてよさそうです。より高解像度・長尺を狙うなら、80GBのH100(p5.4xlarge)や、そもそもマルチGPUが要る上位のSuperクラスの出番になります。

逆に言えば、Nanoクラスでの軽い生成ならL40S 1枚でも回せるということでもあります。学習・検証用途にはありです。

なお、NVIDIAは公式にはNanoを「RTX PRO 6000などのワークステーション級コンピュート」向けと位置づけており、開発者ブログモデルカードを見てもVRAMの最小要件は明記されていません(モデルカードの対応アーキはAmpere/Hopper/Blackwell、検証環境はGB200/H100、精度はBF16のみ)。その想定より小さいL40S 48GBでも、720p・45フレームで43.7GBに収まって動作しました。「もっと高解像度・長尺・長いコンテキストを狙うなら96GB級が要る」という話であって、控えめな設定なら48GBで動く、というのが実測での結論です。

コストと後片付け

GPUインスタンスは高額なので、終わったら必ず撤去します。DeleteOnTermination=trueにしておいたので、EBSも一緒に消えます。

aws ec2 terminate-instances --instance-ids <InstanceId>
# 数分後
aws ec2 describe-instances --instance-ids <InstanceId> \
  --query 'Reservations[0].Instances[0].State.Name' --output text   # terminated を確認

使い終わったらすぐ terminate し、コンソールで残っているインスタンス・EBS・Elastic IPが無いかも確認しておくと安心です。

おわりに

NVIDIA Cosmos 3 NanoがAWSのL40S(g6e.xlarge)1枚で動くことを確認できました。環境構築の要点は、

  • Python 3.13 + uv、Diffusersはmainを使う(Cosmos3OmniPipelineを明示)。
  • HF認証はHF_TOKEN環境変数が確実。ガードレールのアクセス承認を忘れずに。
  • 720pでピーク43.7GB=L40S 48GBの実用上限の目安。

次回は、そもそもの目的だったCosmos 3 Superの環境構築に進みます。Super(64B)は単一GPUには載らず複数GPU構成が要る見込み(公式の推奨serving構成も8基)なので、そのインスタンス選定と環境づくりが主題になる予定です。


Built on NVIDIA Cosmos. 生成物はnvidia/Cosmos3-Nanoを使用しています。


製造業のクラウド活用とデジタル化を支援します

クラスメソッドの専門家による包括的なクラウド導入とデジタル化支援で、製造業の業務効率を最大化しましょう。AWSの導入から運用、最適化まで、最新技術と豊富な知見であらゆる課題に対応します。生産ラインのデジタル化やデータ活用、IoTの導入事例もございます。ぜひ、弊社の実績をご覧ください。

製造業界での支援内容を見る

この記事をシェアする

関連記事